diff --git a/.github/workflows/CI_WEIS.yml b/.github/workflows/CI_WEIS.yml index 3935063df..dd36df048 100644 --- a/.github/workflows/CI_WEIS.yml +++ b/.github/workflows/CI_WEIS.yml @@ -24,18 +24,16 @@ jobs: # # if: false == contains( matrix.os, 'windows') # uses: awvwgk/setup-fortran@main - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - # This is the more official way to do miniconda, but it messes with the GitHub worker environment and shell quite a bit - - uses: conda-incubator/setup-miniconda@v2 + - name: Install conda/mamba + uses: conda-incubator/setup-miniconda@v2 # https://github.com/marketplace/actions/setup-miniconda with: - #miniconda-version: "latest" - #miniforge-version: "latest" - mamba-version: "*" - channels: conda-forge,defaults - channel-priority: true - #auto-update-conda: true + # To use mamba, uncomment here, comment out the miniforge line + # mamba-version: "*" + miniforge-version: "latest" + auto-update-conda: true python-version: ${{ matrix.python-version }} environment-file: environment.yml activate-environment: test @@ -45,13 +43,13 @@ jobs: - name: Add dependencies mac specific if: contains( matrix.os, 'mac') run: | - mamba install -y petsc4py mpi4py openmpi compilers + conda install -y petsc4py mpi4py openmpi compilers # Install dependencies of WISDEM specific to windows - name: Add dependencies windows specific if: contains( matrix.os, 'windows') run: | - mamba install -y m2w64-toolchain libpython + conda install -y m2w64-toolchain libpython # Install dependencies of WEIS specific to ubuntu - name: Add dependencies ubuntu specific @@ -59,12 +57,13 @@ jobs: # (if you use the shell here, cannot use 'compiler' package otherwise get link problems to system libraries # Mpi only seems to work with the shell command though, so instead rely on system compilers run: | - mamba install -y petsc4py mpi4py openmpi + conda install -y petsc4py mpi4py openmpi python -c "import platform; print(platform.node())" - name: Show custom environment run: | - mamba list + conda list + which -a gfortran printenv | sort # Debugging session @@ -80,19 +79,21 @@ jobs: # List the collected tests for debugging purposes - name: List tests run: | - pytest weis --collect-only + pytest --collect-only weis # Run all tests within WEIS, but not computationally expensive examples - name: Run tests within WEIS run: | - pytest weis --cov-config=.coverageac --cov=weis + pytest --cov-config=.coverageac --cov=weis -p no:warnings --disable-warnings weis # Run coveralls - name: Run coveralls - if: contains( matrix.os, 'ubuntu') + if: contains( matrix.os, 'ubuntu') && contains( matrix.python-version, '3.10') + uses: coverallsapp/github-action@v2 # This also works, https://github.com/AndreMiras/coveralls-python-action #uses: AndreMiras/coveralls-python-action@develop - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - coveralls --service=github + #env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + #run: | + # coveralls --service=github + diff --git a/.github/workflows/run_exhaustive_examples.yml b/.github/workflows/run_exhaustive_examples.yml index 5a7686aaa..ec067f54c 100644 --- a/.github/workflows/run_exhaustive_examples.yml +++ b/.github/workflows/run_exhaustive_examples.yml @@ -20,23 +20,47 @@ jobs: python-version: ["3.9","3.10", "3.11"] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - # Even miniconda gets bogged down- try mamba - - name: Install Conda environment with Micromamba - uses: mamba-org/provision-with-micromamba@main + - name: Install conda/mamba + uses: conda-incubator/setup-miniconda@v2 + # https://github.com/marketplace/actions/setup-miniconda with: + # To use mamba, uncomment here, comment out the miniforge line + #mamba-version: "*" + miniforge-version: "latest" + auto-update-conda: true + python-version: ${{ matrix.python-version }} environment-file: environment.yml - environment-name: test - channels: conda-forge - extra-specs: | - python=${{ matrix.python-version }} - mpi4py - petsc4py - openmpi - sel(osx): compilers - sel(win): m2w64-toolchain - sel(win): libpython` + activate-environment: test + auto-activate-base: false + + #miniforge-variant: Mambaforge + #channels: conda-forge + #extra-specs: | + # python=${{ matrix.python-version }} + # mpi4py + # petsc4py + # openmpi + # sel(osx): compilers + # sel(win): m2w64-toolchain + # sel(win): libpython` + + # # Even miniconda gets bogged down- try mamba + # - name: Install Conda environment with Micromamba + # uses: mamba-org/provision-with-micromamba@main + # with: + # environment-file: environment.yml + # environment-name: test + # channels: conda-forge + # extra-specs: | + # python=${{ matrix.python-version }} + # mpi4py + # petsc4py + # openmpi + # sel(osx): compilers + # sel(win): m2w64-toolchain + # sel(win): libpython` # This is the more official way to do miniconda, but it messes with the GitHub worker environment and shell quite a bit #- uses: conda-incubator/setup-miniconda@v2 @@ -80,13 +104,13 @@ jobs: # conda install -y m2w64-toolchain libpython # Install dependencies of WEIS specific to ubuntu - #- name: Add dependencies ubuntu specific - # if: false == contains( matrix.os, 'windows') - # # (if you use the shell here, cannot use 'compiler' package otherwise get link problems to system libraries - # # Mpi only seems to work with the shell command though, so instead rely on system compilers - # run: | - # conda install -y petsc4py mpi4py openmpi - # python -c "import platform; print(platform.node())" + - name: Add dependencies ubuntu specific + if: false == contains( matrix.os, 'windows') + # (if you use the shell here, cannot use 'compiler' package otherwise get link problems to system libraries + # Mpi only seems to work with the shell command though, so instead rely on system compilers + run: | + conda install -y petsc4py mpi4py openmpi + # python -c "import platform; print(platform.node())" - name: Show custom environment run: | @@ -105,7 +129,7 @@ jobs: - name: Test postprocessing notebooks run: | cd examples/16_postprocessing - gdown --no-check-certificate 1_FJaN-W1DoPNmO6YLSjnftvq6-7bn4VI + gdown --no-check-certificate 1AtLjjX5xpPqlHkfwDqeUj6VBMOYWcjmV unzip outputs treon plot_FAST.ipynb treon rev_DLCs_WEIS.ipynb @@ -122,7 +146,7 @@ jobs: - name: Run parallel examples rotor optimization run: | cd examples/05_IEA-3.4-130-RWT - mpirun -np 2 python weis_driver.py + mpiexec -np 2 python weis_driver.py # Run scripts within dac folder # - name: Run examples distributed aerodynamic control @@ -134,5 +158,5 @@ jobs: - name: Run examples design of experiments run: | cd examples/09_design_of_experiments - mpirun -n 2 --bind-to core python DOE_openfast.py + mpiexec -n 2 --bind-to core python DOE_openfast.py python postprocess_results.py diff --git a/MoorPy/.github/ISSUE_TEMPLATE/bug_report.md b/MoorPy/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 000000000..d005a8811 --- /dev/null +++ b/MoorPy/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,30 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +## Description +_Describe the bug here_ + +### Steps to reproduce issue +_Please provide a minimum working example (MWE) if possible_ + +1. … +2. … +3. … + +### Current behavior +… + +### Expected behavior +… + + +### Code versions +_List versions only if relevant_ +- Python +- … \ No newline at end of file diff --git a/MoorPy/.github/ISSUE_TEMPLATE/feature_request.md b/MoorPy/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 000000000..7cecc72cf --- /dev/null +++ b/MoorPy/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,14 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +# Description of feature +Describe the feature here and provide some context. Under what scenario would this be useful? + +# Potential solution +Can you think of ways to implement this? \ No newline at end of file diff --git a/MoorPy/.github/PULL_REQUEST_TEMPLATE.md b/MoorPy/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..835c623f3 --- /dev/null +++ b/MoorPy/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,28 @@ +Delete the text explanations below these headers and replace them with information about your PR. +Please first consult the [developer guide](https://weis.readthedocs.io/en/latest/how_to_contribute_code.html) to make sure your PR follows all code, testing, and documentation conventions. + +## Purpose +Explain the goal of this pull request. If it addresses an existing issue be sure to link to it. Describe the big picture of your changes here, perhaps using a bullet list if multiple changes are done to accomplish a single goal. If it accomplishes multiple goals, it may be best to create separate PR's for each. + +## Type of change +What types of change is it? +_Select the appropriate type(s) that describe this PR_ + +- [ ] Bugfix (non-breaking change which fixes an issue) +- [ ] New feature (non-breaking change which adds functionality) +- [ ] Breaking change (non-backwards-compatible fix or feature) +- [ ] Code style update (formatting, renaming) +- [ ] Refactoring (no functional changes, no API changes) +- [ ] Documentation update +- [ ] Maintenance update +- [ ] Other (please describe) + +## Testing +Explain the steps needed to test the new code to verify that it does indeed address the issue and produce the expected behavior. + +## Checklist +_Put an `x` in the boxes that apply._ + +- [ ] I have run existing tests which pass locally with my changes +- [ ] I have added new tests or examples that prove my fix is effective or that my feature works +- [ ] I have added necessary documentation \ No newline at end of file diff --git a/MoorPy/.github/workflows/CI_MoorPy.yml b/MoorPy/.github/workflows/CI_MoorPy.yml new file mode 100644 index 000000000..099a73142 --- /dev/null +++ b/MoorPy/.github/workflows/CI_MoorPy.yml @@ -0,0 +1,79 @@ +name: CI_MoorPy + +# We run CI on push commits and pull requests on all branches +on: [push, pull_request] + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + build_pip: + name: Pip Build (${{ matrix.os }}) - ${{ matrix.python-version }} + runs-on: ${{ matrix.os }} + defaults: + run: + shell: bash -l {0} + + strategy: + fail-fast: false #true + matrix: + os: ["ubuntu-latest", "macOS-latest", "windows-latest"] + python-version: ["3.9", "3.10", "3.11"] + + steps: + - name: checkout repository + uses: actions/checkout@v3 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + id: cp + with: + python-version: ${{ matrix.python-version }} + update-environment: true + + - name: Pip Install MoorPy + run: | + '${{ steps.cp.outputs.python-path }}' -m pip install -vv -e .[test] + + - name: Test run + run: | + cd tests + '${{ steps.cp.outputs.python-path }}' -m pytest . + + + build_conda: + name: Conda Build (${{ matrix.os }}) - ${{ matrix.python-version }} + runs-on: ${{ matrix.os }} + defaults: + run: + shell: bash -l {0} + + strategy: + fail-fast: false + matrix: + os: ["ubuntu-latest", "macOS-latest", "windows-latest"] + python-version: ["3.9", "3.10", "3.11"] + + steps: + - name: checkout repository + uses: actions/checkout@v3 + + - uses: conda-incubator/setup-miniconda@v2 + # https://github.com/marketplace/actions/setup-miniconda + with: + miniconda-version: "latest" + auto-update-conda: true + python-version: ${{ matrix.python-version }} + environment-file: environment.yml + channels: conda-forge + activate-environment: test + auto-activate-base: false + + # Install + - name: Conda Install MoorPy + run: | + python -m pip install -e . -vv + + - name: Test run + run: | + cd tests + pytest . + diff --git a/MoorPy/.github/workflows/Publish_MoorPy.yml b/MoorPy/.github/workflows/Publish_MoorPy.yml new file mode 100644 index 000000000..01c2cd6ae --- /dev/null +++ b/MoorPy/.github/workflows/Publish_MoorPy.yml @@ -0,0 +1,44 @@ +name: Build and upload to PyPI + +# Build on every branch push, tag push, and pull request change: +#on: [push, pull_request] +# Alternatively, to publish when a (published) GitHub Release is created, use the following: +on: + push: + pull_request: + release: + types: + - published + +jobs: + build_and_upload_pypi: + runs-on: ubuntu-latest + + # upload to PyPI on every tag starting with 'v' + #if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') + # alternatively, to publish when a GitHub Release is created, use the following rule: + if: github.event_name == 'release' && github.event.action == 'published' + steps: + - name: checkout repository + uses: actions/checkout@v3 + + - name: Set up Python + uses: actions/setup-python@v4 + id: cp + with: + python-version: "3.11" + update-environment: true + + - name: Install pypa/build + run: | + python -m pip install build + + - name: Build a binary wheel and a source tarball + run: | + python -m build . + + - uses: pypa/gh-action-pypi-publish@v1.8.5 + with: + user: __token__ + password: ${{ secrets.pypi_password }} + # To test: repository_url: https://test.pypi.org/legacy/ diff --git a/MoorPy/.gitignore b/MoorPy/.gitignore index b126e1708..d7a035a7f 100644 --- a/MoorPy/.gitignore +++ b/MoorPy/.gitignore @@ -1,6 +1,167 @@ - -*.pyc -__pycache__ +# MoorPy specifics MoorPy.egg-info +docs/build + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +.idea/ -docs/build \ No newline at end of file +# Emacs +*~ diff --git a/MoorPy/.pre-commit-config.yaml b/MoorPy/.pre-commit-config.yaml new file mode 100644 index 000000000..16038950b --- /dev/null +++ b/MoorPy/.pre-commit-config.yaml @@ -0,0 +1,72 @@ +repos: +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.4.0 + hooks: + - id: check-json + stages: [commit] + - id: check-merge-conflict + stages: [commit] + - id: check-toml + stages: [commit] + - id: check-yaml + stages: [commit] + - id: debug-statements + stages: [commit] + - id: end-of-file-fixer + stages: [commit] + - id: trailing-whitespace + stages: [commit] + + +- repo: https://github.com/psf/black + rev: '23.1.0' + hooks: + - id: black + stages: [commit] + args: [ + --config=pyproject.toml, + ] + +- repo: https://github.com/adamchainz/blacken-docs + rev: '1.13.0' + hooks: + - id: blacken-docs + stages: [commit] + args: [ + --line-length=88 + ] + +- repo: https://github.com/PyCQA/docformatter + rev: 'v1.5.0' + hooks: + - id: docformatter + stages: [commit] + args: [ + --config=pyproject.toml, + ] + +- repo: https://github.com/charliermarsh/ruff-pre-commit + rev: 'v0.0.247' + hooks: + - id: ruff + stages: [commit] + args: [ + --fix, + --show-fixes + ] + +- repo: local + hooks: + - id: pytest + language: python + name: pytest + entry: pytest + always_run: true + pass_filenames: false + stages: [push] + verbose: true + args: [ + --cov=moorpy, + --cov-report=xml, + ./tests, + ] diff --git a/MoorPy/.readthedocs.yaml b/MoorPy/.readthedocs.yaml index 0c29499c1..21f862e8c 100644 --- a/MoorPy/.readthedocs.yaml +++ b/MoorPy/.readthedocs.yaml @@ -2,7 +2,9 @@ version: 2 sphinx: configuration: docs/conf.py python: - version: 3.7 + version: 3.8 install: - method: pip path: . + extra_requirements: + - docs diff --git a/MoorPy/LICENSE.txt b/MoorPy/LICENSE.txt new file mode 100644 index 000000000..ea355a266 --- /dev/null +++ b/MoorPy/LICENSE.txt @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2021, Alliance for Sustainable Energy, LLC +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/MoorPy/README.md b/MoorPy/README.md index 7e43f7149..355886fd4 100644 --- a/MoorPy/README.md +++ b/MoorPy/README.md @@ -1,22 +1,46 @@ -# MoorPy +# MoorPy - Quasi-Static Mooring Analysis in Python MoorPy is a design-oriented mooring system library for Python based around a quasi-static modeling approach. ### Prerequisites -- Python 3 +- Python 3.9 or greater +- The following packages: NumPy, MatPlotLib, pyyaml, scipy ### Installation -For development use: - -run ```python setup.py develop``` or ```pip install -e .``` from the command line in the main MoorPy directory. - -For non-development use: - -run ```python setup.py``` or ```pip install .``` from the command line in the main MoorPy directory. - - -## Documentation - -TBD \ No newline at end of file +MoorPy is available on PyPi via: +```pycon +pip install MoorPy +``` + +For an editable install that relies on the local source code, first clone the repository. Then, from the command line in the main MoorPy directory, run the following commands (with a "-e" for "editable") based on your additional needs. +The "dev", "test", and "docs" flags will install necessary packages related to development, testing, or documentation (e.g., the docs flag installs "sphinx" for documentation). + +#### General +```pycon +pip install . +``` + +#### Development +```pycon +pip install .[dev] +``` +#### Testing +```pycon +pip install .[test] +pre-commit install --hook-type pre-commit --hook-type pre-push +``` +#### Documentation +```pycon +pip install .[docs] +``` + +MoorPy's documentation website is under development at https://moorpy.readthedocs.io + +### Citing +The MoorPy software can be cited as: +M. Hall, S. Housner, S. Sirnivas, and S. Wilson. +*MoorPy: Quasi-Static Mooring Analysis in Python.* +National Renewable Energy Laboratory, 2021. +https://doi.org/10.11578/dc.20210726.1. diff --git a/MoorPy/docs/api.rst b/MoorPy/docs/api.rst index 1def0faaa..53cc616e0 100644 --- a/MoorPy/docs/api.rst +++ b/MoorPy/docs/api.rst @@ -3,11 +3,18 @@ API This will provide a list of all callable functions, classes, and methods. -.. automodule:: moorpy - :members: - :member-order: bysource -another try +Conventions +^^^^^^^^^^^ + +As discussed in :ref:`Model Structure`, Point and Body objects can be either fixed, coupled, or free. +The object's "type" attribute describes this, with 1=fixed, 0=free, -1=coupled. These properties can +be changed after a mooring system has been created (for example, to simulate a disconnection). + + + +The System Class +^^^^^^^^^^^^^^^^ .. autoclass:: moorpy.system.System :members: diff --git a/MoorPy/docs/conf.py b/MoorPy/docs/conf.py index d41cfaaff..3deff9453 100644 --- a/MoorPy/docs/conf.py +++ b/MoorPy/docs/conf.py @@ -20,11 +20,11 @@ # -- Project information ----------------------------------------------------- project = 'MoorPy' -copyright = '2021, NREL' -author = 'NREL' +copyright = '2021, National Renewable Energy Laboratory' +author = 'NREL MoorPy team' # The full version, including alpha/beta/rc tags -release = '0.9.0' +release = '0.9.1' # -- General configuration --------------------------------------------------- diff --git a/MoorPy/docs/index.rst b/MoorPy/docs/index.rst index 9a64e215a..47c4699c8 100644 --- a/MoorPy/docs/index.rst +++ b/MoorPy/docs/index.rst @@ -8,44 +8,48 @@ :members: -MoorPy -======= - -A mooring system visualizer and quasi-static modeler written in Python. - -MoorPy is an open-source quasi-static mooring system model that can be used for a variety of mooring system applications - - .. toctree:: :maxdepth: 2 :hidden: + Home starting structure usage theory api - modules +MoorPy +======= +MoorPy is an open-source quasi-static mooring toolset that can be used for a +variety of mooring system applications. It is under ongoing development at NREL +and publicly available under an open-source license at `github.com/NREL/MoorPy `_. -Indices and tables -================== +See the pages on this site for information about the operation, usage, and theory of MoorPy. -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` +Overview +-------- -Welcome to MoorPy's (UNDER CONSTRUCTION) online documentation. -See the pages on this site for information about the operation, usage, and theory of MoorPy. +MoorPy is a quasi-static mooring model and a suite of associated functions for mooring +system analysis. The core model supports quasi-static analysis of moored floating systems +including any arrangement of mooring lines and floating platforms. It solves the distributed +position and tension of each mooring line segment using standard catenary equations. +Floating platforms can be represented with linear hydrostatic characteristics. MoorPy +automatically computes a floating system's equilibrium state and can be queried to identify +a mooring system's nonlinear force-displacement relationships. Linearized stiffness matrices +are efficiently computed using semi-analytic Jacobians. MoorPy also includes plotting +functions and a library of mooring component property and cost coefficients. MoorPy can +be used directly from Python scripts to perform mooring design and analysis tasks, or it can +be coupled with other tools to compute quasi-static mooring reactions as part of a larger +simulation. -About MoorPy -------------- +A theory paper about MoorPy is in progress. In the meantime, if you use MoorPy in your research, +the software record can be cited as follows: -MoorPy is a simple, efficient, and versatile mooring system quasi-static model designed to work -in concert with other simulation tools. It is based on a catenary line model and it -adds point-mass and rigid-body objects to enable simulation of a -wide variety of mooring and cabling arrangements. +M. Hall, S. Housner, S. Sirnivas, and S. Wilson. +*MoorPy: Quasi-Static Mooring Analysis in Python.* +National Renewable Energy Laboratory, 2021. +`doi.org/10.11578/dc.20210726.1 `_. -The MoorPy source code is available on GitHub `here `_. diff --git a/MoorPy/docs/requirements.txt b/MoorPy/docs/requirements.txt new file mode 100644 index 000000000..96160c28a --- /dev/null +++ b/MoorPy/docs/requirements.txt @@ -0,0 +1,8 @@ +# Requirements list for MoorPy (work in progress) + +matplotlib +numpy +scipy +sphinx>2.0 +numpydoc +sphinx-rtd-theme \ No newline at end of file diff --git a/MoorPy/docs/starting.rst b/MoorPy/docs/starting.rst index d428941f3..84fe788b7 100644 --- a/MoorPy/docs/starting.rst +++ b/MoorPy/docs/starting.rst @@ -8,10 +8,11 @@ Prerequisites - Python 3 - The following Python packages: NumPy, MatPlotLib, yaml, scipy + Installation ^^^^^^^^^^^^ -Clone the `MoorPy repository `. +Clone the `MoorPy GitHub repository `_. To install for development use: @@ -21,3 +22,157 @@ To install for non-development use: run ```python setup.py``` or ```pip install .``` from the command line in the main MoorPy directory. + +Examples +^^^^^^^^ + +The MoorPy repository has an examples folder containing two example scripts: + +- manual_system.py constructs a mooring system from scratch using functions for creating each line and attachment point. + +- imported_system.py creates a mooring system by reading an included MoorDyn-style input file. + +Running either of these scripts will produce a basic mooring system model that can be used in further analysis. + + +Creating a MoorPy System Manually +--------------------------------- + +MoorPy has internal functions to facilitate the orderly creation of a mooring system. The following +gives an example of how they work (from manual_system.py). + +.. code-block:: python + + + # ----- choose some system geometry parameters ----- + + depth = 600 # water depth [m] + angles = np.radians([60, 180, 300]) # line headings list [rad] + rAnchor = 1600 # anchor radius/spacing [m] + zFair = -21 # fairlead z elevation [m] + rFair = 20 # fairlead radius [m] + lineLength= 1800 # line unstretched length [m] + typeName = "chain1" # identifier string for the line type + + + # ----- set up the mooring system and floating body ----- + + # Create new MoorPy System and set its depth + ms = mp.System(depth=depth) + + # add a line type + ms.setLineType(dnommm=120, material='chain', name=typeName) # this would be 120 mm chain + + # Add a free, body at [0,0,0] to the system (including some properties to make it hydrostatically stiff) + ms.addBody(0, np.zeros(6), m=1e6, v=1e3, rM=100, AWP=1e3) + + # For each line heading, set the anchor point, the fairlead point, and the line itself + for i, angle in enumerate(angles): + + # create end Points for the line + ms.addPoint(1, [rAnchor*np.cos(angle), rAnchor*np.sin(angle), -depth]) # create anchor point (type 0, fixed) + ms.addPoint(1, [ rFair*np.cos(angle), rFair*np.sin(angle), zFair]) # create fairlead point (type 0, fixed) + + # attach the fairlead Point to the Body (so it's fixed to the Body rather than the ground) + ms.bodyList[0].attachPoint(2*i+2, [rFair*np.cos(angle), rFair*np.sin(angle), zFair]) + + # add a Line going between the anchor and fairlead Points + ms.addLine(lineLength, typeName, pointA=2*i+1, pointB=2*i+2) + + + + +Creating a MoorPy System for a MoorDyn Input File +------------------------------------------------- + +.. _inputfile: + +A MoorPy System can be initialized by reading in a MoorDyn-style input file. This is simply done by +passing the input file name when creating the System object (from imported_system.py): + +.. code-block:: python + + ms = mp.System(file='the MoorDyn-style input file.txt') + + +The format of the input file is expected to follow the +MoorDyn v2 style, an example of which is shown below: + + +.. code-block:: none + + MoorDyn v2 Input File + Sample for input to MoorPy + ---------------------- LINE TYPES -------------------------------------------------- + TypeName Diam Mass/m EA BA/-zeta EI Cd Ca CdAx CaAx + (name) (m) (kg/m) (N) (N-s/-) (N-m^2) (-) (-) (-) (-) + chain 0.2160 286.56 1.23e9 -1.0 0.00 1.00 1.00 0.00 0.00 + --------------------- ROD TYPES ----------------------------------------------------- + TypeName Diam Mass/m Cd Ca CdEnd CaEnd + (name) (m) (kg/m) (-) (-) (-) (-) + ----------------------- BODIES ------------------------------------------------------ + ID Attachment X0 Y0 Z0 r0 p0 y0 Mass CG* I* Volume CdA* Ca* + (#) (-) (m) (m) (m) (deg) (deg) (deg) (kg) (m) (kg-m^2) (m^3) (m^2) (-) + 1 coupled 0.00 0.00 -0.75 0.00 0.00 0.00 1.0e6 0.00 0.00 1.0e3 0.00 0.00 + ---------------------- RODS --------------------------------------------------------- + ID RodType Attachment Xa Ya Za Xb Yb Zb NumSegs RodOutputs + (#) (name) (#/key) (m) (m) (m) (m) (m) (m) (-) (-) + ---------------------- POINTS ------------------------------------------------------- + ID Attachment X Y Z Mass Volume CdA Ca + (#) (-) (m) (m) (m) (kg) (mˆ3) (m^2) (-) + 1 Fixed 800.00 1385.64 -600.00 0.00 0.00 0.00 0.00 + 2 Body1 10.00 17.32 -21.00 0.00 0.00 0.00 0.00 + 3 Fixed -1600.00 0.00 -600.00 0.00 0.00 0.00 0.00 + 4 Body1 -20.00 0.00 -21.00 0.00 0.00 0.00 0.00 + 5 Fixed 800.00 -1385.64 -600.00 0.00 0.00 0.00 0.00 + 6 Body1 10.00 -17.32 -21.00 0.00 0.00 0.00 0.00 + ---------------------- LINES -------------------------------------------------------- + ID LineType AttachA AttachB UnstrLen NumSegs LineOutputs + (#) (name) (#) (#) (m) (-) (-) + 1 chain 1 2 1800.000 40 p + 2 chain 3 4 1800.000 40 p + 3 chain 5 6 1800.000 40 p + ---------------------- OPTIONS ------------------------------------------------------ + 600.0 depth + --------------------- need this line ------------------------------------------------ + + +Note that some parameters are only applicable to a dynamic model like MoorDyn, and are ignored by MoorPy. +Conversely, some Body parameters used by MoorPy for hydrostatics are not captured in a MoorDyn-style file. + + + +Running the MoorPy Model +------------------------ + +Once the MoorPy System is set up, it can be analyzed, viewed, and manipulated using a handful of main +functions, as well as a variety of additional helper functions for more specialized tasks. + +Here is an example showing one of the possible functions to analyze a mooring system: + + +.. code-block:: python + + ms.initialize() # make sure everything's connected + + ms.solveEquilibrium() # equilibrate + fig, ax = ms.plot() # plot the system in original configuration + ms.unload("sample.txt") # export to MD input file + + ms.bodyList[0].f6Ext = np.array([3e6, 0, 0, 0, 0, 0]) # apply an external force on the body + ms.solveEquilibrium() # equilibrate + fig, ax = ms.plot(ax=ax, color='red') # plot the system in displaced configuration (on the same plot, in red) + + + +**Documentation Overview** + +An overview of how a mooring system is represented in MoorPy can be found in :ref:`The Model Structure page`. + +More documentation and examples of other functions that can be applied to a MoorPy mooring system can be +found in :ref:`The Usage page`. + +Detailed theory "under the hood" of the functions in MoorPy can be found in :ref:`The Theory Page`. + +Detailed inputs and outputs of MoorPy classes and functions can be found in :ref:`The API Page`. + diff --git a/MoorPy/docs/structure.rst b/MoorPy/docs/structure.rst index 7295857a6..a9c146edc 100644 --- a/MoorPy/docs/structure.rst +++ b/MoorPy/docs/structure.rst @@ -11,26 +11,51 @@ Currently it supports three objects--Lines, Points, and Bodies--which are descri Lines ^^^^^ -MoorPy uses a quasi-static catenary model to calculate the profile and tensions in a uniform length of a mooring line. -Any given Line has constant/uniform properties of unstretched length, diameter, density, and Young's modulus. -Different Lines can have different -sets of properties, and they can be connected together at the ends, enabling mooring systems with interconnected lines -or with line assemblies featuring step changes in properties. +MoorPy uses a quasi-static catenary model to calculate the profile and tensions in +a uniform length of a mooring line. +Any given Line has constant/uniform properties of unstretched length, diameter, +density, and Young's modulus. Different Lines can have different sets of properties, +and they can be connected together at the ends, enabling mooring systems with +interconnected lines or with line assemblies featuring step changes in properties. +MoorPy, like MoorDyn, keeps a dictionary of line types to describe the cross-sectional +(or per-meter) properties of the mooring lines. Each line type has an alphanumeric name +to identify it, and contains the key properties needed for a quasi-static model: wet +weight and stiffness (EA). Each Line must be assigned to have one of the line types. + +Each end of a Line most be connected to a Point object (described next). +Multi-segmented mooring lines (where different sets of properties apply over different +parts of the line) can be achieved by using multiple Line objects, with different line, +with free Point objects connecting the Lines where the properties change. + Points ^^^^^^ .. _points: -The ends of each mooring line are defined by Point objects. There are three types: +Point objects attach to the ends of Lines and can be used to connect Lines to other things +or to each other. (In MAP and older versions of MoorDyn, these objects were called Connections). +A Point has three degrees of freedom and can have any number of Lines attached to it. +There are three types of Points: + +- **Fixed**: their location is fixed to ground (stationary) or a Body object. + They can be used as anchor points or as a way to attach mooring Lines to a Body. +- **Coupled**: they move under the control of the calling program/script. + They can be used as fairlead connections when the platform is modeled externally. +- **Free**: they are free to move according to the forces acting on them, which includes + the tensions of attached lines as well as their own self weight and buoyancy, if applicable. + +Free Points facilitate more advanced mooring systems. They can be used to connect two +or more mooring lines together, to create multi-segmented lines or junctions such as in a +bridle mooring configuration. If a free Point is given nonzero volume or mass properties, +it can also represent a clump weight or float. -- 1: Fixed nodes have a certain location and never move. They can be used as anchor points. OR attached to a platform for platform-centric coupling -- -1: Coupled nodes can move under the control of an outside program. They can be used as fairlead connections. -- 0: Free nodes are not fixed in space but rather are moved according to the forces acting on them. +Key optional Point properties that can be passed as named arguments when creating a Point or +accessed afterward are as follows: -Points can be used to connect two or more mooring lines together. The forces they experience can include the forces from the attached -mooring lines as well as their own weight and buoyancy forces. + - **m**: mass [kg]. The default is 0. + - **v**: volume [m^3]. The default is 0. Bodies @@ -39,6 +64,64 @@ Bodies Body objects provide a generic 6 DOF rigid-body representation based on a lumped-parameter model of translational and rotational properties. Point objects can be added to Bodies at any location to facilitate the attachment of mooring lines. Bodies are most commonly used to represent a floating platform. For this application, bodies can be -given hydrostatic properties through waterplane-area and metacenter-location parameters.Bodies can also have external +given hydrostatic properties through waterplane-area and metacenter-location parameters. Bodies can also have external constant forces and moments applied to them. In this way, a Body can represent the complete linear hydrostatic behavior -of a floating platform including a wind turbine's steady thrust force. +of a floating platform including a wind turbine's steady thrust force. +Bodies, like Points, can be fixed (not very useful), free, or coupled. + + +Key optional Body properties that can be passed as named arguments when creating a Point or +accessed afterward are as follows: + + - **m**: mass, centered at CG [kg]. The default is 0. + - **v**: volume, centered at reference point [m^3]. The default is 0. + - **rCG**: center of gravity position in body reference frame [m]. The default is np.zeros(3). + - **AWP**: waterplane area - used for hydrostatic heave stiffness if nonzero [m^2]. + The default is 0. + - **rM**: coorindates or height of metacenter relative to body reference frame [m]. + The default is np.zeros(3). + - **f6Ext**: applied external forces and moments vector in global orientation + (not including weight/buoyancy) [N]. The default is np.zeros(6). + + + +The MoorPy System Object +------------------------ + +The System object in MoorPy is used to hold all the objects being simulated as well as additional +information like the line types dictionary, water density, and water depth. Most user +interactions with the mooring system are supported through methods of the System class. +These methods are listed on the :ref:`API` page. More description to be added here in future... + +Bathymetry +^^^^^^^^^^ + +MoorPy supports three different approaches to the seabed surface, which +are defined by the seabedMod flag: + +0. Uniform flat seabed specified by a depth value. +1. Uniform sloped seabed specified by a depth value at x,y = 0,0 along + with xSlope and ySlope valus that specify the slope (rise/run). If + only one of these values, the other is assumed to be zero. +2. A bathymetry grid where the seabed depth is interpolated as a function + of x and y coorinates based on bilinear interpolation from a rectangular + grid of depth data. This grid is usually read in from a specially formatted + file similar to MoorDyn (link to be added). + +Further usage of these features will be described in (link to usage section to be added). + +Current +^^^^^^^ + +The effect of current in terms of drag forces on the mooring lines can be +included, as controlled by the currentMod flag: + +0. No current is considered. +1. A steady uniform current is considered, specified by the System current + vector. The drag force from this current will be added to the weight + vector each time the catenary equations are used to solve the mooring + line profiles. +2. XX A steady current that is uniform in the horizontal direction but can + change with depth according to a lookup table (typically from an input + file following the same format as in MoorDyn. This feature is NOT YET + IMPLEMENTED. \ No newline at end of file diff --git a/MoorPy/docs/testnewdocs.bat b/MoorPy/docs/testnewdocs.bat new file mode 100644 index 000000000..d37c0aad7 --- /dev/null +++ b/MoorPy/docs/testnewdocs.bat @@ -0,0 +1,12 @@ +@echo off +title documentation test + +echo %%~dp0 is "%~dp0" +call "C:/Users/shousner/Anaconda3/Scripts/activate" +cd %~dp0 + +call .\make html +cd build/html +call .\index.html + +pause \ No newline at end of file diff --git a/MoorPy/docs/theory.rst b/MoorPy/docs/theory.rst index ea9eecbd1..9c0ee89d6 100644 --- a/MoorPy/docs/theory.rst +++ b/MoorPy/docs/theory.rst @@ -5,3 +5,19 @@ Theory and References The theory behind MoorPy is in the process of being written up and published. Please check back later or contact us if in need of a specific clarification. + + + +Points +^^^^^^ + +Points in MoorPy, like MoorDyn, are treated as point masses (3 degrees of freedom) +with point-mass, buoyancy, and omnidirectional hydrodynamic properties. + +However, MoorPy provides an additional feature to represent linear hydrostatic +properties so that a Point can be used to represent a surface-piercing object +that stays vertical and has a constant waterplane area over its height. The +zSpan parameter defines the lower and upper extents of the point's +height, relative to the point coordinate, r. This provides a constant +hydrostatic stiffness when the Point crosses the free surface, but has no +effect the rest of the time. diff --git a/MoorPy/docs/usage.rst b/MoorPy/docs/usage.rst index e0c6cc18a..ab05a2cf4 100644 --- a/MoorPy/docs/usage.rst +++ b/MoorPy/docs/usage.rst @@ -14,172 +14,67 @@ MoorPy Usage .. role:: stnd -Setting up a Mooring System ---------------------------- - -In MoorPy, the full moored floating system is contained in a System object, which includes -lists of Body, Point, and Line objects that make up the full assembly. This collection of -objects and their linkages can be set up manually via function calls, or they can be -generated based on reading in a MoorDyn-style input file. +Advanced Features +^^^^^^^^^^^^^^^^^ + +(A list of key functions to be added here) -Creating a MoorPy System Manually -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Variable Rope Stiffness Behavior +-------------------------------- -MoorPy has functions to facilitate the orderly creation of a mooring system. +MoorPy supports separate static and dynamic stiffness coefficients, +to approximate the variable stiffness characterisics of synthetic +fiber ropes. For using this capability, the mooring line type +information must include a static stiffness value (EAs), and a +dynamic stiffness value (EAd). An additional factor on EAd that +scales with mean tension (EAd_Lm) can also be included. When using +a mooring line properties library (i.e., a yaml file), these values +should be specified by the EA_MBL, EAd_MBL, and EAd_MBL_Lm keywords, +respectively. See the (moorprops library section to be added) for +more information. -.. code-block:: none +Two System methods control switching between static and +dynamic stiffness properties: +activateDynamicStiffness switches the mooring system model to dynamic +line stiffness values. It also adjusts the unstretched line lengths +to maintain the same tension at the current system state. If EAd has +not been set, it will not change anything (call it with display > 0 +to display a warning when this occurs). - # ----- choose some system geometry parameters ----- - - depth = 600 # water depth [m] - angles = np.radians([60, 180, 300]) # line headings list [rad] - rAnchor = 1600 # anchor radius/spacing [m] - zFair = -21 # fairlead z elevation [m] - rFair = 20 # fairlead radius [m] - lineLength= 1800 # line unstretched length [m] - typeName = "chain" # identifier string for the line type - - - # ----- set up the mooring system and floating body ----- - - # Create new MoorPy System and set its depth - ms = mp.System(depth=depth) - - # add a line type - ms.lineTypes[typeName] = getLineProps(120, name=typeName) # this would be 120 mm chain - - # Add a free, body at [0,0,0] to the system (including some properties to make it hydrostatically stiff) - ms.addBody(0, np.zeros(6), m=1e6, v=1e3, rM=100, AWP=1e3) - - # For each line heading, set the anchor point, the fairlead point, and the line itself - for i, angle in enumerate(angles): - - # create end Points for the line - ms.addPoint(1, [rAnchor*np.cos(angle), rAnchor*np.sin(angle), -depth]) # create anchor point (type 0, fixed) - ms.addPoint(1, [ rFair*np.cos(angle), rFair*np.sin(angle), zFair]) # create fairlead point (type 0, fixed) - - # attach the fairlead Point to the Body (so it's fixed to the Body rather than the ground) - ms.bodyList[0].attachPoint(2*i+2, [rFair*np.cos(angle), rFair*np.sin(angle), zFair]) - - # add a Line going between the anchor and fairlead Points - ms.addLine(lineLength, typeName, pointA=2*i+1, pointB=2*i+2) +:func:`.system.activateDynamicStiffness` +revertToStaticStiffness resets the mooring lines to use the static +stiffness values and return to their original unstretched lenths. -.. code-block:: none - - # ----- run the model to demonstrate ----- - - ms.initialize() # make sure everything's connected - - ms.solveEquilibrium() # equilibrate - fig, ax = ms.plot() # plot the system in original configuration - ms.unload("sample.txt") # export to MD input file - - ms.bodyList[0].f6Ext = np.array([3e6, 0, 0, 0, 0, 0]) # apply an external force on the body - ms.solveEquilibrium3() # equilibrate - fig, ax = ms.plot(ax=ax, color='red') # plot the system in displaced configuration (on the same plot, in red) - - print(f"Body offset position is {ms.bodyList[0].r6}") - - plt.show() +Additional Parameters in MoorPy +------------------------------- +Some of MoorPy's objects have additional parameters beyond those specified in the input file, +which can be used to add more features to the simulation. -Creating a MoorPy System for a MoorDyn Input File -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. _inputfile: - -A MoorPy System can be initialized by reading in a MoorDyn-style input file. This is simply done by -passing the input file name when creating the System object: - -.. code-block:: none - - ms = mp.System(file='the MoorDyn-style input file.txt') - - -The format of the input file is expected to follow the -MoorDyn v2 style, which is still being finalized. As a working example for reference, see below: - - -.. code-block:: none - - MoorDyn v2 Input File - Sample for input to MoorPy - ---------------------- LINE TYPES ----------------------------------------------------- - LineType Diam MassDen EA cIntDamp EI Can Cat Cdn Cdt - (-) (m) (kg/m) (N) (Pa-s) (N-m^2) (-) (-) (-) (-) - chain 0.2160 286.56 1.230e+09 -1.000e+00 0.000e+00 1.000 0.000 1.000 0.000 - ----------------------- BODIES ----------------------------------- - BodyID X0 Y0 Z0 r0 p0 y0 Xcg Ycg Zcg M V IX IY IZ CdA Ca - (-) (m) (m) (m) (deg) (deg) (deg) (m) (m) (m) (kg) (m^3) (kg-m^2) (kg-m^2) (kg-m^2) (m^2) (-) - 1Coupled 0.00 0.00 -0.75 -0.00 0.00 0.00 0.00 0.00 0.00 1.0e6 1000.0 0 0 0 0 0 - ---------------------- POINTS --------------------------------------------------------- - Node Type X Y Z M V FX FY FZ CdA Ca - (-) (-) (m) (m) (m) (kg) (m^3) (kN) (kN) (kN) (m2) () - 1 Fixed 800.00 1385.64 -600.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 - 2 Body1 10.00 17.32 -21.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 - 3 Fixed -1600.00 0.00 -600.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 - 4 Body1 -20.00 0.00 -21.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 - 5 Fixed 800.00 -1385.64 -600.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 - 6 Body1 10.00 -17.32 -21.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 - ---------------------- LINES ----------------------------------------------------- - Line LineType UnstrLen NumSegs AttachA AttachB Outputs - (-) (-) (m) (-) (-) (-) (-) - 1 chain 1800.000 40 1 2 p - 2 chain 1800.000 40 3 4 p - 3 chain 1800.000 40 5 6 p - ---------------------- OPTIONS ---------------------------------------- - 0.0002 dtM - time step to use in mooring integration - 3 WaveKin - wave kinematics flag (1=include(unsupported), 0=neglect, 3=currentprofile.txt) - 3.0e+06 kb - bottom stiffness - 3.0e+05 cb - bottom damping - 600.00 WtrDpth - water depth - 2.0 ICDfac - factor by which to scale drag coefficients during dynamic relaxation IC gen - 0.01 ICthresh - threshold for IC convergence - 10 ICTmax - threshold for IC convergence - ----------------------------OUTPUTS-------------------------------------------- - FairTen1 - FairTen2 - FairTen3 - END - --------------------- need this line ------------------ - - -Note that some parameters are only applicable to a dynamic model like MoorDyn, and are ignored by MoorPy. -Conversely, some Body parameters used by MoorPy for hydrostatics are not captured in a MoorDyn-style file. - - - -Running the MoorPy Model ------------------------- - -Once the MoorPy System is set up, it can be analyzed, viewed, and manipulated using a handful of main -functions, as well as a variety of additional helper functions for more specialized tasks. - -Here is an example showing the most important functions: - - -.. code-block:: none - - ms.initialize() # make sure everything's connected - - ms.solveEquilibrium() # equilibrate - fig, ax = ms.plot() # plot the system in original configuration - ms.unload("sample.txt") # export to MD input file - - ms.bodyList[0].f6Ext = np.array([3e6, 0, 0, 0, 0, 0]) # apply an external force on the body - ms.solveEquilibrium3() # equilibrate - fig, ax = ms.plot(ax=ax, color='red') # plot the system in displaced configuration (on the same plot, in red) - +- Body.Awp: This specifies a waterplane area for the body, which is used to provide a + vertical hydrostatic stiffness. -(A list of key functions to be added here) +- Point.zSpan: The zSpan parameter lists the lower and upper extents of the point's + volume, relative to the point coordinate, r. The Point's volume is + assumed evenly distributed between zSpan[0] and zSpan[1], and this + affects hydrostatic calculations when the Point crosses the free + surface (not used any other time). Advice and Frequent Problems ---------------------------- + +General unexpected behavior +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Whenever the system is setup or modified (e.g., adding objects), the System.initialize +method must be called to register all connected objects in the system. + Errors when running from an imported MoorDyn file ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -188,7 +83,7 @@ When initializin a MoorPy System from a MoorDyn-style input file, there are seve error: - The section headers (e.g., "--------- Lines ----------") may not have the keywords MoorPy is expecting. - Refer to the sample :ref:`above ` for a format that works. + Refer to the sample :ref:`above ` for the correct format. It has changed since 2021. - The type keywords or number of expected entries in a line may be based on earlier MoorDyn version and not match what MoorPy expects. @@ -212,6 +107,52 @@ If the system equilibrium solve is unsuccessful, some of the possible causes are example if some lines are much shorter than others, or if there are taut lines with very high stiffnesses. + +Confusion with calculating system stiffness matrices +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Stiffness matrices can be calculated for multiple mooring objects using multiple different methods in MoorPy. +The two main methods of calculating stiffnesses are through a finite difference method and an analytical method. +The finite difference method slightly perturbs each DOF of the MoorPy object and calculates the change in force +on the object before and after the perturbation. This change in force divided by the change in displacement provides +the stiffness value. The analytical stiffness method derives the stiffness of each mooring line using the Catenary +equations and translates that stiffness to whichever point (or body) the mooring line is attached to. + +- Finite difference + - The 3x3 stiffness matrix of a Point object at its given location can be found by running point.getStiffness() + - The 6x6 stiffness matrix of a Body object at its given location can be found by running body.getStiffness() + - The "nDOFtype" x "nDOFtype" stiffness matrix of a System can be found by running system.getSystemStiffness() + - The nCpldDOF x nCpldDOF stiffness matrix of a System can be found by running system.getCoupledStiffness() +- Analytical + - The 2x2 or 3x3 analytical stiffness matrix of a Line object is calculated internally when solving for the Line's end forces in line.staticSolve() + - The 3x3 analytical stiffness matrix of a Point object at its given location can be found by running point.getStiffnessA() + - The 6x6 analytical stiffness matrix of a Body object at its given location can be found by running body.getStiffnessA() + - The "nDOFtype" x "nDOFtype" analytical stiffness matrix of a System can be found by running system.getSystemStiffnessA() + +The overall mooring system stiffness matrix is usually of interest to most users. This can be found by running one of the three +System stiffness matrix methods. The one best to use depends on the types of other objects in the MoorPy System. + +- The getSystemStiffness() method calculates the combined stiffness matrix of all "DOFtype" objects in the mooring system. + It has a default value of "free" to the "DOFtype" input, meaning that it will calculate the combined stiffness matrix of + all "free" objects (e.g., points, bodies) in the system. + - For example, a three-line mooring system with two line types in each mooring line, where each connecting point between + the two line types is a "free" floating Point object, and a free floating Body object on the surface, will result in a + 15x15 stiffness matrix (a 6x6 matrix for the body and 3 3x3 matrices for the connecting points) +- The getCoupledStiffness() method calculates the system stiffness matrix for all "coupled" DOFs specifically, while + equilibrating the free, uncoupled DOFs. This would be similar to running getSystemStiffness(DOFtype="coupled"), except this method + solves for equilibrium in the free floating points while calculating the stiffness of the coupled DOFs, rather than only solving + for the stiffness matrix of all "coupled" DOFs. + - For example, using the same setup described above, except that the body is a "coupled" DOFtype, the result of running + getCoupledStiffness() will be a 6x6 matrix, since the body is the only "coupled" object in the mooring system. +- The getSystemStiffnessA() method calculates the combined analytical stiffness matrix of all "DOFtype" objects in the mooring system. + It calls the analytical stiffness calculation methods of other objects in the mooring system and combines their analytical stiffness + matrices into one global system stiffness matrix. It has a default value of "free" to the "DOFtype" input. + + + +Other errors +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + There are too many variables at play to provide decisive general guidance, but we aim to expand the advice in this section as more user feedback is received. diff --git a/MoorPy/environment.yml b/MoorPy/environment.yml new file mode 100644 index 000000000..4ae65bd5d --- /dev/null +++ b/MoorPy/environment.yml @@ -0,0 +1,15 @@ +name: test + +channels: + - conda-forge + - defaults + +dependencies: + - numpy + - matplotlib + - pip + - python + - pytest + - pyyaml + - scipy + - setuptools diff --git a/MoorPy/examples/MoorPy_Example.py b/MoorPy/examples/MoorPy_Example.py deleted file mode 100644 index 29be2f07b..000000000 --- a/MoorPy/examples/MoorPy_Example.py +++ /dev/null @@ -1,319 +0,0 @@ -# -------------------------------------------------------------------------------------------- -# MoorPy -# -# A mooring system visualizer and quasi-static modeler in Python. -# Matt Hall and Stein Housner -# -# -------------------------------------------------------------------------------------------- -# 2018-08-14: playing around with making a QS shared-mooring simulation tool, to replace what's in Patrick's work -# 2020-06-17: Trying to create a new quasi-static mooring system solver based on my Catenary function adapted from FAST v7, and using MoorDyn architecture - - -import numpy as np -import moorpy as mp -from moorpy.MoorProps import getLineProps - - - -# EXAMPLE 1: Load in a MoorDyn input file to create a MoorPy System - -ms = mp.System('lines.txt') -ms.initialize(plots=1) -ms.plot() -''' -ms = mp.System('IEA-15-240-RWT-UMaineSemi_MoorDyn_PPIb.dat', depth=850) -ms.initialize(plots=0) -for body in ms.bodyList: - body.m = 20093000 # from VolturnUS-S spec sheet - body.v = 20206 # from VolturnUS-S spec sheet - body.rCG = [0, 0, -2.3256] # see RAFT verification doc - body.AWP = 78.54 # dWL=10 from VolturnUS-S spec sheet - body.rM = [0,0, 10.886] # KB=-13.63+20=6.37, BM=It/V = It/20206, KM = KB+BM -> rM = KM-20 - # It = (np.pi/64)*d**4 + np.pi*(d/2)**2 * each xWP**2 It = 496567 -> BM = 24.516 -> KM = 30.886 -> rM = 10.886 -#ms.bodyList[0].type=1 -print(ms.bodyList[0].r6) -ms.bodyList[0].m += 450000 -ms.solveEquilibrium3(plots=0) -print(ms.bodyList[0].r6) -#anim = ms.animateSolution() -#ms.plot(colortension=True, cbar_tension=True) -#ms.plot2d(colortension=True) -#for point in ms.pointList: - #print(point.r) -''' -''' -ms = mp.System('IEA-15-240-RWT-UMaineSemi_MoorDyn_PPI.dat', depth=850) -ms.initialize(plots=0) -#ms.bodyList[0].type=1 - -for body in ms.bodyList: - body.m = 20093000 # from VolturnUS-S spec sheet - body.v = 20206 # from VolturnUS-S spec sheet - body.rCG = [0, 0, -2.3256] # see RAFT verification doc - body.AWP = 78.54 # dWL=10 from VolturnUS-S spec sheet - body.rM = [0,0, 10.886] # KB=-13.63+20=6.37, BM=It/V = It/20206, KM = KB+BM -> rM = KM-20 - #body.f6Ext = 2500000*np.array([1, 0, 0, 0, 150, 0]) -ms.solveEquilibrium3(plots=0) -for body in ms.bodyList: - heading = 0 - cosbeta = np.cos(heading*np.pi/180.0) - sinbeta = np.sin(heading*np.pi/180.0) - force = 2.5e6 - height = 150 - body.f6Ext = force*np.array([cosbeta, sinbeta, 0, -height*sinbeta, height*cosbeta, 0]) -fig, ax = ms.plot() -ms.solveEquilibrium3(plots=0) -#ms.bodyList[0].f6Ext = Fthrust*np.array([1, 0, 0, 0, hHub, 0]) -#ms.solveEquilibrium3(plots=0) -#anim = ms.animateSolution() -#ms.plot(colortension=True, cbar_tension=True) -ms.plot(ax=ax) -if heading==0: - print(ms.lineList[1].LBot) - print(ms.bodyList[0].r6[0]) -elif heading==60: - print(ms.pointList[4].r[2]) - print(np.linalg.norm([ms.bodyList[0].r6[0],ms.bodyList[0].r6[1]])) -''' - - - - - -''' -# EXAMPLE 2: Catenary Testing Calls -mp.catenary(576.2346666666667, 514.6666666666666, 800, 4809884.623076923, -2.6132152062554828, CB=-64.33333333333337, HF0=0, VF0=0, Tol=1e-05, MaxIter=50, plots=2) -print("\nTEST 2") -mp.catenary(88.91360441490338, 44.99537159734132, 100.0, 854000000.0000001, 1707.0544275185273, CB=0.0, HF0=912082.6820817506, VF0=603513.100376363, Tol=1e-06, MaxIter=50, plots=1) -print("\nTEST 3") -mp.catenary(99.81149090002897, 0.8459770263789324, 100.0, 854000000.0000001, 1707.0544275185273, CB=0.0, HF0=323638.97834178555, VF0=30602.023233123222, Tol=1e-06, MaxIter=50, plots=1) -print("\nTEST 4") -mp.catenary(99.81520776134033, 0.872357398602503, 100.0, 854000000.0000001, 1707.0544275185273, CB=0.0, HF0=355255.0943810993, VF0=32555.18285808794, Tol=1e-06, MaxIter=50, plots=1) -print("\nTEST 5") -mp.catenary(99.81149195956499, 0.8459747131565791, 100.0, 854000000.0000001, 1707.0544275185273, CB=0.0, HF0=323645.55876751675, VF0=30602.27072107738, Tol=1e-06, MaxIter=50, plots=1) -print("\nTEST 6") -mp.catenary(88.91360650151807, 44.99537139684605, 100.0, 854000000.0000001, 1707.0544275185273, CB=0.0, HF0=912082.6820817146, VF0=603513.100376342, Tol=1e-06, MaxIter=50, plots=1) -print("\nTEST 7") -mp.catenary(9.516786788834565, 2.601777402222183, 10.0, 213500000.00000003, 426.86336920488003, CB=0.0, HF0=1218627.2292202935, VF0=328435.58512892434, Tol=1e-06, MaxIter=50, plots=1) -print("\nTEST 8") -mp.catenary(9.897879983411258, 0.3124565409495972, 10.0, 213500000.00000003, 426.86336920488003, CB=0.0, HF0=2191904.191415531, VF0=69957.98566771008, Tol=1e-06, MaxIter=50, plots=1) -print("\nTEST 9") -mp.catenary(107.77260514238083, 7.381234307499085, 112.08021179445676, 6784339692.139625, 13559.120871401587, CB=0.0, HF0=672316.8532881762, VF0=-552499.1313868811, Tol=1e-06, MaxIter=50, plots=1) -print("\nTEST 9.1") -mp.catenary(107.67265157943795, 7.381234307499085, 112.08021179445676, 6784339692.139625, 13559.120871401587, CB=0.0, HF0=3752787.759641461, VF0=-1678302.5929179655, Tol=1e-06, MaxIter=50, plots=1) -print("\nTEST 9.2") -mp.catenary(107.77260514238083, 7.381234307499085, 112.08021179445676, 6784339692.139625, 13559.120871401587, CB=0.0, Tol=1e-06, MaxIter=50, plots=2, HF0= 1.35e+05,VF0= 1.13e+02) -print("\nTEST 9.3") -mp.catenary(98.6712173965359, 8.515909042185399, 102.7903150736787, 5737939634.533289, 11467.878219531065, CB=0.0, HF0=118208621.36075467, VF0=-12806834.457078349, Tol=1e-07, MaxIter=50, plots=2) -''' - - -''' -# EXAMPLE 3: Create a simple MoorPy System from scratch -test = mp.System() - -test.depth = 100 - -# Create the LineType of the line for the system -test.addLineType("main", 0.1, 100.0, 1e8) - -# add points and lines -test.addPoint(1, [ 0, 0, 0]) -test.addPoint(0, [ 100, 0, -50], DOFs=[2]) - -test.addLine(120, "main") - -# attach -test.pointList[0].attachLine(1, 1) -test.pointList[1].attachLine(1, 0) - -test.initialize(plots=1) - -test.solveEquilibrium3() - -test.plot() -''' - - - -""" -# EXAMPLE 4: Create a diagonal or orthogonal MoorPy System and compare system stiffness matrices -ms = mp.System() - -# --- diagonal scenario --- -''' -ms.depth = 600 -r6 = np.zeros(6) -#r6 = np.array([1,1,0,1,1,1]) -ms.addBody(0, r6) - -r = np.zeros(3) -#r = np.array([-2,1,3]) -ms.addPoint(1, r) -ms.bodyList[0].attachPoint(len(ms.pointList),r-r6[:3]) -#ms.addPoint(1, np.array([-10,0,0])) -#ms.bodyList[0].attachPoint(len(ms.pointList),np.array([-10,0,0])) - -ms.addPoint(1, np.array([-1000,-1000,-600])) - -ms.addLineType('main', 0.10, 40, 1e9) - -ms.addLine(1600, 'main') - -ms.pointList[0].attachLine(1, 1) -ms.pointList[1].attachLine(1, 0) - - -''' - -# --- orthogonal scenario --- -ms.depth = 100 -ms.addBody(0, np.zeros(6)) - -ms.addPoint(1, np.zeros(3)) # fairlead point -#ms.bodyList[0].attachPoint(len(ms.pointList), [0, 10, 0]) # translations good but some rotations are different -#ms.bodyList[0].attachPoint(len(ms.pointList), [10, 0, 0]) # looks good except 6,4 and 6,6 terms (just first-order vs. nonlinear?) -ms.bodyList[0].attachPoint(len(ms.pointList), [0, 0, 10]) # looks good except 4,4 and 4,6 terms (just first-order vs. nonlinear?) but 4,4 has sign flipped! - -ms.addPoint(1, [700, -380, -10]) # anchor point - -ms.addLineType('main', 0.10, 10, 1e10) - -ms.addLine(815, 'main') - -ms.pointList[0].attachLine(1, 1) -ms.pointList[1].attachLine(1, 0) - -# --- end of scenario choices --- - - -ms.initialize() -ms.plot() - -a = np.array([0.1, 0, 0, 0, 0, 0]) - - -Kbody = ms.bodyList[0].getStiffness() -Kpoint = ms.pointList[0].getStiffness() -KlineA = ms.lineList[0].getStiffnessMatrix() -KpointA = ms.pointList[0].getStiffnessA() -KbodyA = ms.bodyList[0].getStiffnessA() - -#Ksystem = ms.getSystemStiffness() -KsystemA = ms.getSystemStiffnessA() - -ms.display=3 -Ksystem = ms.getSystemStiffness(dth=0.05) - -print(ms.pointList[0].r) -print("line stiffness A") -mp.printMat(KlineA) -print("body stiffness A") -mp.printMat(KbodyA) -print("system stiffness A") -mp.printMat(KsystemA) -print("system stiffness nonlinear") -mp.printMat(Ksystem) - -""" - - - -""" -# EXAMPLE 5: Create a 3 line MoorPy System from scratch (Taken from ColorTension_example) - -depth = 600 -angle = np.arange(3)*np.pi*2/3 # line headings list -anchorR = 1600 # anchor radius/spacing -fair_depth= 21 -fairR = 20 -LineLength= 1800 -typeName = "chain" # identifier string for line type - -# --------------- set up mooring system --------------------- - -# Create blank system object -ms = mp.System() - -# Set the depth of the system to the depth of the input value -ms.depth = depth - -# add a line type -ms.lineTypes[typeName] = getLineProps(120, name=typeName) - -# Add a free, body at [0,0,0] to the system (including some properties to make it hydrostatically stiff) -ms.addBody(0, np.zeros(6), m=1e6, v=1e3, rM=100, AWP=1e3) - -# Set the anchor points of the system -anchors = [] -for i in range(len(angle)): - ms.addPoint(1, np.array([anchorR*np.cos(angle[i]), anchorR*np.sin(angle[i]), -ms.depth], dtype=float)) - anchors.append(len(ms.pointList)) - -# Set the points that are attached to the body to the system -bodypts = [] -for i in range(len(angle)): - ms.addPoint(1, np.array([fairR*np.cos(angle[i]), fairR*np.sin(angle[i]), -fair_depth], dtype=float)) - bodypts.append(len(ms.pointList)) - ms.bodyList[0].attachPoint(ms.pointList[bodypts[i]-1].number, ms.pointList[bodypts[i]-1].r - ms.bodyList[0].r6[:3]) - -# Add and attach lines to go from the anchor points to the body points -for i in range(len(angle)): - ms.addLine(LineLength, typeName) - line = len(ms.lineList) - ms.pointList[anchors[i]-1].attachLine(ms.lineList[line-1].number, 0) - ms.pointList[bodypts[i]-1].attachLine(ms.lineList[line-1].number, 1) - - -''' -ms.initialize() # make sure everything's connected -ms.solveEquilibrium3() # equilibrate -ms.unload("sample.txt") # export to MD input file -#fig, ax = ms.plot() # plot the system in original configuration - -ms.solveEquilibrium3() # equilibrate -#fig, ax = ms.plot(color='red') # plot the system in displaced configuration (on the same plot, in red) - -print(f"Body offset position is {ms.bodyList[0].r6}") - -plt.show() - -fig, ax, minten, maxten = ms.colortensions() -#fig.show() -#Read in tension data -#dataff, unitsff = ml.read_output_file("C:/code/Analyzing Outputs/Python scripts for OpenFAST outputs/FF Mooring lines/", "steadyfarm.FarmMD.MD.out") -#time = dataff['Time'] -fig, ax = plt.subplots(figsize=(6, 1)) -fig.subplots_adjust(bottom=0.5) - -cmap = mpl.colors.LinearSegmentedColormap.from_list('mycolors',['blue','red']) -bounds = range(int(minten),int(maxten), int((maxten-minten)/10)) -norm = mpl.colors.BoundaryNorm(bounds, cmap.N) - -fig.colorbar(mpl.cm.ScalarMappable(norm=norm, cmap=cmap), - cax=ax, orientation='horizontal', - label="Tension [N]") -''' -# ---------------- - -ms.initialize() -ms.solveEquilibrium3() -#ms.unload('sample.txt') -fig, ax = ms.plot(colortension=True) -""" - - - - - - - - - - - - - - - - diff --git a/MoorPy/examples/lines.txt b/MoorPy/examples/lines.txt deleted file mode 100644 index 22c53710c..000000000 --- a/MoorPy/examples/lines.txt +++ /dev/null @@ -1,43 +0,0 @@ -Sample MoorDyn or MoorPy input file! ----------------------- LINE DICTIONARY ----------------------------------------------------- -LineType Diam MassDenInAir EA cIntDamp EI cBendDamp Can Cat Cdn Cdt -(-) (m) (kg/m) (N) (Pa-s) (N-m^2) (?) (-) (-) (-) (-) -main 0.02 40 100e6 -0.8 0 0 1.0 0.0 1.6 0.05 ----------------------- ROD DICTIONARY ----------------------------------------------------- -RodType Diam MassDenInAir Can Cat Cdn Cdt -(-) (m) (kg/m) (-) (-) (-) (-) ------------------------ BODY LIST ----------------------------------- -BodyID X0 Y0 Z0 r0 p0 y0 Xcg Ycg Zcg M V IX IY IZ CdA-x,y,z Ca-x,y,z - (-) (m) (m) (m) (deg) (deg) (deg) (m) (m) (m) (kg) (m^3) (kg-m^2) (kg-m^2) (kg-m^2) (m^2) (-) - 1 0 0 -20 0 0 0 2.5 0 0 1 0 1 1 1 0 0 0 0 0 0 ----------------------- ROD PROPERTIES -------------------- -RodID Type/BodyID RodType Xa Ya Za Xb Yb Zb NumSegs Flags/Outputs -(-) (-) (-) (m) (m) (m) (m) (m) (m) (-) (-) ----------------------- POINT PROPERTIES ----------------------------------------------------- -Node Type X Y Z M V FX FY FZ CdA Ca -(-) (-) (m) (m) (m) (kg) (m^3) (kN) (kN) (kN) (m2) () -1 Fix -30.0 0.0 -40 0 0 0 0 0 0 0 -2 Fix 15.0 25.0 -40 0 0 0 0 0 0 0 -3 Fix 15.0 -25.0 -40 0 0 0 0 0 0 0 -4 Free 0.0 0.0 0 0 5 0 0 0 0 0 ----------------------- LINE PROPERTIES ----------------------------------------------------- -Line LineType UnstrLen NumSegs NodeAnch NodeFair Flags/Outputs -(-) (-) (m) (-) (-) (-) (-) -1 main 50 6 1 4 p -2 main 50 6 2 4 p -3 main 50 6 3 4 p ----------------------- SOLVER OPTIONS ---------------------------------------- -0.0002 dtM - time step to use in mooring integration -3 WaveKin - wave kinematics flag (1=include(unsupported), 0=neglect, 3=currentprofile.txt) -3.0e6 kb - bottom stiffness -3.0e5 cb - bottom damping -40 WtrDpth - water depth -2.0 ICDfac - factor by which to scale drag coefficients during dynamic relaxation IC gen -0.01 ICthresh - threshold for IC convergence -10 ICTmax - threshold for IC convergence ----------------------- FAILURE ---------------------- -Node Line(s) FailTime FailTen -() (,) (s or 0) (N or 0) -2 1 1 0 ----------------------- OUTPUT ----------------------------------------- ---------------------- need this line ------------------ \ No newline at end of file diff --git a/MoorPy/examples/lines_unload.txt b/MoorPy/examples/lines_unload.txt deleted file mode 100644 index c730b0cdb..000000000 --- a/MoorPy/examples/lines_unload.txt +++ /dev/null @@ -1,45 +0,0 @@ -------------------- MoorDyn v?.??. Input File ------------------------------------ -MoorDyn input -FALSE Echo - echo the input file data (flag) ----------------------- LINE DICTIONARY ----------------------------------------------------- -LineType Diam MassDenInAir EA cIntDamp EI Can Cat Cdn Cdt -(-) (m) (kg/m) (N) (Pa-s) (N-m^2) (-) (-) (-) (-) -main 0.0200 40.0000 1.00000e+08 -1.0000 0.000 1.000 0.000 1.000 0.000 ---------------------- ROD DICTIONARY ----------------------------------------------------- -RodType Diam MassDenInAir Can Cat Cdn Cdt -(-) (m) (kg/m) (-) (-) (-) (-) ------------------------ BODY LIST ----------------------------------- -BodyID X0 Y0 Z0 r0 p0 y0 Xcg Ycg Zcg M V IX IY IZ CdA-x,y,z Ca-x,y,z - (-) (m) (m) (m) (deg) (deg) (deg) (m) (m) (m) (kg) (m^3) (kg-m^2) (kg-m^2) (kg-m^2) (m^2) (-) - 1 0.00 0.00 -20.00 0.00 0.00 0.00 2.50 0.00 0.00 1.00 0.00 0 0 0 0 0 0 0 ----------------------- ROD LIST -------------------- -RodID Type/BodyID RodType Xa Ya Za Xb Yb Zb NumSegs Flags/Outputs -(-) (-) (-) (m) (m) (m) (m) (m) (m) (-) (-) ----------------------- POINT LIST ----------------------------------------------------- -Node Type X Y Z M V FX FY FZ CdA Ca -(-) (-) (m) (m) (m) (kg) (m^3) (kN) (kN) (kN) (m2) () -1 Fixed -30.000000000000000 0.000000000000000 -40.0000 0.00 0.00 0.00 0.00 0.00 0 0 -2 Fixed 15.000000000000000 25.000000000000000 -40.0000 0.00 0.00 0.00 0.00 0.00 0 0 -3 Fixed 15.000000000000000 -25.000000000000000 -40.0000 0.00 0.00 0.00 0.00 0.00 0 0 -4 Connect 0.000000000000000 0.000000000000000 0.0000 0.00 5.00 0.00 0.00 0.00 0 0 ----------------------- LINE LIST ----------------------------------------------------- -Line LineType UnstrLen NumSegs NodeAnch NodeFair Flags/Outputs -(-) (-) (m) (-) (-) (-) (-) -1 main 50.00 6 1 4 p -2 main 50.00 6 2 4 p -3 main 50.00 6 3 4 p ----------------------- SOLVER OPTIONS ---------------------------------------- -0.0002 dtM - time step to use in mooring integration -3 WaveKin - wave kinematics flag (1=include(unsupported), 0=neglect, 3=currentprofile.txt) -3.0e+06 kb - bottom stiffness -3.0e+05 cb - bottom damping -40.00 WtrDpth - water depth -2.0 ICDfac - factor by which to scale drag coefficients during dynamic relaxation IC gen -0.01 ICthresh - threshold for IC convergence -10 ICTmax - threshold for IC convergence -----------------------------OUTPUTS-------------------------------------------- -FairTen1 -FairTen2 -FairTen3 -END ---------------------- need this line ------------------ diff --git a/MoorPy/examples/manual_system.py b/MoorPy/examples/manual_system.py index e19e3cfbe..6b4b48788 100644 --- a/MoorPy/examples/manual_system.py +++ b/MoorPy/examples/manual_system.py @@ -15,7 +15,7 @@ zFair = -21 # fairlead z elevation [m] rFair = 20 # fairlead radius [m] lineLength= 1800 # line unstretched length [m] -typeName = "chain" # identifier string for the line type +typeName = "chain1" # identifier string for the line type # ----- set up the mooring system and floating body ----- @@ -24,7 +24,7 @@ ms = mp.System(depth=depth) # add a line type -ms.lineTypes[typeName] = getLineProps(120, name=typeName) # this would be 120 mm chain +ms.setLineType(dnommm=120, material='chain', name=typeName) # this would be 120 mm chain # Add a free, body at [0,0,0] to the system (including some properties to make it hydrostatically stiff) ms.addBody(0, np.zeros(6), m=1e6, v=1e3, rM=100, AWP=1e3) @@ -49,7 +49,7 @@ ms.solveEquilibrium() # equilibrate fig, ax = ms.plot() # plot the system in original configuration -ms.unload("sample.txt") # export to MD input file +ms.unload("sample_from_manual.txt") # export to MD input file ms.bodyList[0].f6Ext = np.array([3e6, 0, 0, 0, 0, 0]) # apply an external force on the body ms.solveEquilibrium3() # equilibrate diff --git a/MoorPy/examples/sample.txt b/MoorPy/examples/sample.txt index 583a6a18d..ff73b5e24 100644 --- a/MoorPy/examples/sample.txt +++ b/MoorPy/examples/sample.txt @@ -1,40 +1,34 @@ MoorDyn v2 Input File Sample for input to MoorPy ----------------------- LINE TYPES ----------------------------------------------------- -LineType Diam MassDen EA cIntDamp EI Can Cat Cdn Cdt - (-) (m) (kg/m) (N) (Pa-s) (N-m^2) (-) (-) (-) (-) -chain 0.2160 286.56 1.230e+09 -1.000e+00 0.000e+00 1.000 0.000 1.000 0.000 ------------------------ BODIES ----------------------------------- -BodyID X0 Y0 Z0 r0 p0 y0 Xcg Ycg Zcg M V IX IY IZ CdA Ca - (-) (m) (m) (m) (deg) (deg) (deg) (m) (m) (m) (kg) (m^3) (kg-m^2) (kg-m^2) (kg-m^2) (m^2) (-) -1Coupled 0.00 0.00 -0.75 -0.00 0.00 0.00 0.00 0.00 0.00 1.0e6 1000.0 0 0 0 0 0 ----------------------- POINTS --------------------------------------------------------- -Node Type X Y Z M V FX FY FZ CdA Ca -(-) (-) (m) (m) (m) (kg) (m^3) (kN) (kN) (kN) (m2) () -1 Fixed 800.00 1385.64 -600.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 -2 Body1 10.00 17.32 -21.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 -3 Fixed -1600.00 0.00 -600.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 -4 Body1 -20.00 0.00 -21.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 -5 Fixed 800.00 -1385.64 -600.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 -6 Body1 10.00 -17.32 -21.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 ----------------------- LINES ----------------------------------------------------- -Line LineType UnstrLen NumSegs AttachA AttachB Outputs -(-) (-) (m) (-) (-) (-) (-) -1 chain 1800.000 40 1 2 p -2 chain 1800.000 40 3 4 p -3 chain 1800.000 40 5 6 p ----------------------- OPTIONS ---------------------------------------- -0.0002 dtM - time step to use in mooring integration -3 WaveKin - wave kinematics flag (1=include(unsupported), 0=neglect, 3=currentprofile.txt) -3.0e+06 kb - bottom stiffness -3.0e+05 cb - bottom damping -600.00 WtrDpth - water depth -2.0 ICDfac - factor by which to scale drag coefficients during dynamic relaxation IC gen -0.01 ICthresh - threshold for IC convergence -10 ICTmax - threshold for IC convergence -----------------------------OUTPUTS-------------------------------------------- -FairTen1 -FairTen2 -FairTen3 -END ---------------------- need this line ------------------ +---------------------- LINE TYPES -------------------------------------------------- +TypeName Diam Mass/m EA BA/-zeta EI Cd Ca CdAx CaAx +(name) (m) (kg/m) (N) (N-s/-) (N-m^2) (-) (-) (-) (-) +chain 0.2160 286.56 1.23e9 -1.00 0.00 1.00 1.00 0.00 0.00 +--------------------- ROD TYPES ----------------------------------------------------- +TypeName Diam Mass/m Cd Ca CdEnd CaEnd +(name) (m) (kg/m) (-) (-) (-) (-) +----------------------- BODIES ------------------------------------------------------ +ID Attachment X0 Y0 Z0 r0 p0 y0 Mass CG* I* Volume CdA* Ca* +(#) (-) (m) (m) (m) (deg) (deg) (deg) (kg) (m) (kg-m^2) (m^3) (m^2) (-) +1 coupled 0.00 0.00 -0.75 0.00 0.00 0.00 1.0e6 0.00 0.00 1.0e3 0.00 0.00 +---------------------- RODS --------------------------------------------------------- +ID RodType Attachment Xa Ya Za Xb Yb Zb NumSegs RodOutputs +(#) (name) (#/key) (m) (m) (m) (m) (m) (m) (-) (-) +---------------------- POINTS ------------------------------------------------------- +ID Attachment X Y Z Mass Volume CdA Ca +(#) (-) (m) (m) (m) (kg) (mˆ3) (m^2) (-) +1 Fixed 800.00 1385.64 -600.00 0.00 0.00 0.00 0.00 +2 Body1 10.00 17.32 -21.00 0.00 0.00 0.00 0.00 +3 Fixed -1600.00 0.00 -600.00 0.00 0.00 0.00 0.00 +4 Body1 -20.00 0.00 -21.00 0.00 0.00 0.00 0.00 +5 Fixed 800.00 -1385.64 -600.00 0.00 0.00 0.00 0.00 +6 Body1 10.00 -17.32 -21.00 0.00 0.00 0.00 0.00 +---------------------- LINES -------------------------------------------------------- +ID LineType AttachA AttachB UnstrLen NumSegs LineOutputs +(#) (name) (#) (#) (m) (-) (-) +1 chain 1 2 1800.000 40 p +2 chain 3 4 1800.000 40 p +3 chain 5 6 1800.000 40 p +---------------------- OPTIONS ------------------------------------------------------ +600.0 depth +--------------------- need this line ------------------------------------------------ \ No newline at end of file diff --git a/MoorPy/moorpy/Catenary.py b/MoorPy/moorpy/Catenary.py index 07173aef7..22417ff8f 100644 --- a/MoorPy/moorpy/Catenary.py +++ b/MoorPy/moorpy/Catenary.py @@ -8,7 +8,7 @@ -def catenary(XF, ZF, L, EA, W, CB=0, HF0=0, VF0=0, Tol=0.000001, nNodes=20, MaxIter=100, plots=0): +def catenary(XF, ZF, L, EA, W, CB=0, alpha=0, HF0=0, VF0=0, Tol=0.000001, nNodes=20, MaxIter=100, plots=0): ''' The quasi-static mooring line solver. Adapted from catenary subroutine in FAST v7 by J. Jonkman. Note: this version is updated Oct 7 2020 to use the dsolve solver. @@ -25,14 +25,18 @@ def catenary(XF, ZF, L, EA, W, CB=0, HF0=0, VF0=0, Tol=0.000001, nNodes=20, MaxI Extensional stiffness of line [N] W : float Weight of line in fluid per unit length [N/m] + alpha : float + seabed incline angle along line from end A to B [deg] CB : float, optional - If positive, coefficient of seabed static friction drag. If negative, no seabed contact and the value is the distance down from end A to the seabed in m\ - NOTE: friction (CV > 0) should only be applied when end A of the line is at an anchor, otherwise assumptions are violated. + If positive, coefficient of seabed static friction drag. If negative, + no seabed contact and the value is the distance down from end A to + the seabed in m. + NOTE: friction (CV > 0) should only be applied when end A of the line + is at an anchor, otherwise assumptions are violated. HF0 : float, optional Horizontal fairlead tension. If zero or not provided, a guess will be calculated. VF0 : float, optional - Vertical fairlead tension. If zero or not provided, a guess will be calculated. - + Vertical fairlead tension. If zero or not provided, a guess will be calculated. Tol : float, optional Convergence tolerance within Newton-Raphson iteration specified as an absolute displacement error nNodes : int, optional @@ -50,11 +54,12 @@ def catenary(XF, ZF, L, EA, W, CB=0, HF0=0, VF0=0, Tol=0.000001, nNodes=20, MaxI ''' + vertical_threshold = 0.0001 # the XF/ZF ratio below which the line will be approximated as vertical to avoid catenary errors (this could become an input parameter) # make info dict to contain any additional outputs info = dict(error=False) - info['call'] = f"catenary({XF}, {ZF}, {L}, {EA}, {W}, CB={CB}, HF0={HF0}, VF0={VF0}, Tol={Tol}, MaxIter={MaxIter}, plots=1)" + info['call'] = f"catenary({XF}, {ZF}, {L}, {EA}, {W}, CB={CB}, alpha={alpha}, HF0={HF0}, VF0={VF0}, Tol={Tol}, MaxIter={MaxIter}, plots=1)" # make some arrays if needed for plotting each node @@ -64,6 +69,18 @@ def catenary(XF, ZF, L, EA, W, CB=0, HF0=0, VF0=0, Tol=0.000001, nNodes=20, MaxI Zs= np.zeros(nNodes) # Vertical locations of each line node relative to the anchor (meters) Te= np.zeros(nNodes) # Effective line tensions at each node (N) + # compute height of each end off seabed + hA = max(0, -CB) + hB = ZF + hA - XF*np.tan(np.radians(alpha)) + if abs(alpha) > 1 and abs(hB) < 0.001*L: + hB = 0 # small adjustment to allow margin for error when end B is on the seabed + if hB < 0: + breakpoint() + raise CatenaryError("End B is below the seabed.") + # >>> from this point on in the code, CB will only be used for friction + # and hA or hB will be used for height off seabed <<< + if CB < 0: + CB = 0.0 # flip line in the solver if it is buoyant if W < 0: @@ -75,21 +92,28 @@ def catenary(XF, ZF, L, EA, W, CB=0, HF0=0, VF0=0, Tol=0.000001, nNodes=20, MaxI flipFlag = False # reverse line in the solver if end A is above end B - if ZF < 0: + if ZF < 0 and (hA > 0 or flipFlag): # and if end A isn't on the seabed (unless it's a buoyant line) + #CB = -max(0, -CB) - ZF + XF*np.tan(np.radians(alpha)) + hA, hB = hB, hA ZF = -ZF + alpha = -alpha reverseFlag = True else: reverseFlag = False + # avoid issue with tolerance on the margin of full seabed contact + if ZF <= Tol: + ZF = 0 + # ensure the input variables are realistic - if XF <= 0.0: - raise CatenaryError("XF is zero or negative!") + if XF < 0.0: + raise CatenaryError("XF is negative!") if L <= 0.0: + breakpoint() raise CatenaryError("L is zero or negative!") if EA <= 0.0: raise CatenaryError("EA is zero or negative!") - # Solve for the horizontal and vertical forces at the fairlead (HF, VF) and at the anchor (HA, VA) # There are many "ProfileTypes" of a mooring line and each must be analyzed separately (1-3 are consistent with FAST v7) @@ -99,21 +123,28 @@ def catenary(XF, ZF, L, EA, W, CB=0, HF0=0, VF0=0, Tol=0.000001, nNodes=20, MaxI # ProfileType=3: A portion of the line must rest on the seabed and the anchor tension is zero # ProfileType=4: The line is negatively buoyant, seabed interaction is enabled, and the line # is longer than a full L between end points (including stretching) i.e. it is horizontal - # along the seabed from the anchor, then vertical to the fairlaed. Computes the maximum + # along the seabed from the anchor, then vertical to the fairlead. Computes the maximum # stretched length of the line with seabed interaction beyond which the line would have to # double-back on itself; the line forms an "L" between the anchor and fairlead. Then it # models it as bunched up on the seabed (instead of throwing an error) + # ProfileType=5: Similar to above but both ends are off seabed, so it's U shaped and fully slack + # ProfileType=6: Completely vertical line that is off the seabed (on the seabed is handled by 4 and 5) + # ProfileType = 7: Portion of the line is resting on the seabed, and the seabed has a slope EA_W = EA/W - # calculate what line length would be hanging it it were fully slack, vertical + # calculate the unstretched length that would be hanging if the line was fully slack (vertical down to flat on the seabed) + ''' if CB < 0: # free floating (potentially U shaped case) LHanging1 = np.sqrt(2.0*( -CB)*EA_W + EA_W*EA_W) - EA_W # unstretched hanging length at end A LHanging2 = np.sqrt(2.0*(ZF-CB)*EA_W + EA_W*EA_W) - EA_W # unstretched hanging length at end B LHanging = LHanging1+LHanging2 else: # at least one end on seabed LHanging = np.sqrt(2.0*ZF*EA_W + EA_W*EA_W) - EA_W # unstretched length of line hanging vertically to seabed - + ''' + LHanging1 = np.sqrt(2.0*hA*EA_W + EA_W*EA_W) - EA_W # unstretched hanging length at end A + LHanging2 = np.sqrt(2.0*hB*EA_W + EA_W*EA_W) - EA_W # unstretched hanging length at end B + LHanging = LHanging1 + LHanging2 # calculate a vertical stiffness estimate for an end lifting off the seabed def dV_dZ_s(z0, H): # height off seabed to evaluate at (infinite if 0), horizontal tension @@ -121,9 +152,11 @@ def dV_dZ_s(z0, H): # height off seabed to evaluate at (infinite if 0), horizo return W # returning a fully slack line approximation, # because a large value here risks adding a bad cross coupling term in the system stiffness matrix - # ProfileType 0 case - entirely along seabed - if ZF==0.0 and CB >= 0.0 and W > 0: + if ZF==0.0 and hA == 0.0 and W > 0: + + # >>> this case should be extended to support sloped seabeds <<< + if not alpha == 0: raise CatenaryError("Line along seabed but seabed is sloped - not yet supported") ProfileType = 0 @@ -183,9 +216,9 @@ def dV_dZ_s(z0, H): # height off seabed to evaluate at (infinite if 0), horizo # ProfileType 4 case - fully slack - elif (W > 0.0) and (L >= XF + LHanging): + elif (W > 0.0) and (L >= XF/np.cos(np.radians(alpha)) + LHanging): - if CB >= 0.0: + if hA == 0.0: # one end on seabed ProfileType = 4 # this is a special case that requires no iteration @@ -208,22 +241,28 @@ def dV_dZ_s(z0, H): # height off seabed to evaluate at (infinite if 0), horizo if plots > 0: + cos_alpha = np.cos(np.radians(alpha)) + tan_alpha = np.tan(np.radians(alpha)) + for I in range(nNodes): if s[I] > L-LHanging: # this node is on the suspended/hanging portion of the line Xs[I] = XF - Zs[I] = ZF - ( L-s[I] + 0.5*W/EA*(L-s[I])**2 ) # <<<< double check this - Te[I] = W*(L-s[I]) + Zs[I] = ZF - ( L-s[I] + 0.5*W/EA*(L-s[I])**2 ) + Te[I] = W*(s[I]-(L-LHanging)) else: # this node is on the seabed - Xs[I] = np.min([s[I], XF]) - Zs[I] = 0.0 + Xs[I] = np.min([s[I]*cos_alpha, XF]) + Zs[I] = Xs[I]*tan_alpha Te[I] = 0.0 else: # U shaped ProfileType = 5 + + # >>> this case should be extended to support sloped seabeds <<< + if not alpha == 0: raise CatenaryError("Skack U profile along seabed but seabed is sloped - not yet supported") HF = 0.0 VF = W*LHanging2 @@ -234,12 +273,12 @@ def dV_dZ_s(z0, H): # height off seabed to evaluate at (infinite if 0), horizo info["HF"] = HF # solution to be used to start next call (these are the solved variables, may be for anchor if line is reversed) info["VF"] = VF - info["stiffnessB"] = np.array([[0.0, 0.0], [0.0, W / np.sqrt(2.0*(ZF-CB)/EA_W + 1.0)]]) - info["stiffnessA"] = np.array([[0.0, 0.0], [0.0, W / np.sqrt(2.0*( -CB)/EA_W + 1.0)]]) + info["stiffnessB"] = np.array([[0.0, 0.0], [0.0, W / np.sqrt(2.0*hB/EA_W + 1.0)]]) + info["stiffnessA"] = np.array([[0.0, 0.0], [0.0, W / np.sqrt(2.0*hA/EA_W + 1.0)]]) info["stiffnessAB"] = np.array([[0.0, 0.0], [0.0, 0.0]]) info["LBot"] = L - LHanging info['ProfileType'] = 5 - info['Zextreme'] = CB + info['Zextreme'] = -hA if plots > 0: @@ -252,7 +291,7 @@ def dV_dZ_s(z0, H): # height off seabed to evaluate at (infinite if 0), horizo elif s[I] <= L-LHanging2: # the middle portion of the line, slack along the seabed Xs[I] = (s[I]-LHanging1)*XF/(L-LHanging1-LHanging2) - Zs[I] = CB + Zs[I] = -hA Te[I] = 0.0 else: # the 2nd suspended/hanging portion of the line @@ -260,8 +299,87 @@ def dV_dZ_s(z0, H): # height off seabed to evaluate at (infinite if 0), horizo Xs[I] = XF Zs[I] = ZF - Lms - W/EA*(LHanging2*Lms - 0.5*Lms**2 ) Te[I] = W*Lms + + + # ProfileType 6 case - vertical line without seabed contact + elif (ZF > 0 and XF/ZF < vertical_threshold): + ProfileType = 6 + + dz_hanging = L + 0.5*W/EA*L**2 # stretched length if it was hanging from one end + + # slack case + if dz_hanging >= ZF: + + # figure out how line will hang + LB = (ZF + L + W*L**2/2/EA)/(2+W*L/EA) # unstretched length of line from lowest point up to end B + hB = LB + W/2/EA*LB**2 # stretched of the above + LA = L - LB + hA = hB - ZF + + HF = 0.0 + VF = W*LB + HA = 0.0 + VA = W*LA + + info["HF"] = HF # solution to be used to start next call (these are the solved variables, may be for anchor if line is reversed) + info["VF"] = VF + info["stiffnessB"] = np.array([[ VF/ZF, 0.0], [0.0, 0.5*W]]) + info["stiffnessA"] = np.array([[ VF/ZF, 0.0], [0.0, 0.5*W]]) + info["stiffnessAB"] = np.array([[-VF/ZF, 0.0], [0.0,-0.5*W]]) + info["LBot"] = 0.0 + info['ProfileType'] = 6 + info['Zextreme'] = -hA + + + if plots > 0: + for I in range(nNodes): + if s[I] < LA: # the 1st suspended/hanging portion of the line + Xs[I] = XF*(s[I]/L) # approximate + Zs[I] = -s[I] - W/EA*(LA*s[I] - 0.5*s[I]**2 ) + Te[I] = W*(LA - s[I]) + else: # the 2nd suspended/hanging portion of the line + Lms = L - s[I] # distance from end B + Xs[I] = XF*(s[I]/L) # approximate + Zs[I] = ZF - Lms - W/EA*(LB*Lms - 0.5*Lms**2 ) + Te[I] = W*(s[I] - LA) + + # taut case + else: + + # figure out how line will hang + #LB = (ZF + L + W*L**2/2/EA)/(2+W*L/EA) # unstretched length of line from lowest point up to end B + #hB = LB + W/2/EA*LB**2 # stretched of the above + #LA = L - LB + #hA = hB - ZF + uniform_strain = (ZF - dz_hanging)/L # the constrant strain due only to stretch - to be added to weight-based strain + Tstretch = uniform_strain*EA # the constant tension component to be added to weight-based tension + + HF = 0.0 + VF = Tstretch + W*L + HA = 0.0 + VA = Tstretch + + info["HF"] = HF # solution to be used to start next call (these are the solved variables, may be for anchor if line is reversed) + info["VF"] = VF + info["stiffnessB"] = np.array([[ VF/ZF, 0.0], [0.0, EA/L]]) + info["stiffnessA"] = np.array([[ VF/ZF, 0.0], [0.0, EA/L]]) + info["stiffnessAB"] = np.array([[-VF/ZF, 0.0], [0.0,-EA/L]]) + info["LBot"] = 0.0 + info['ProfileType'] = 6 + info['Zextreme'] = 0 + + + if plots > 0: + for I in range(nNodes): + Lms = L - s[I] # distance from end B + Xs[I] = XF*(s[I]/L) # approximate + Zs[I] = ZF - Lms*(1+uniform_strain) - W/EA*(L*Lms - 0.5*Lms**2 ) + Te[I] = Tstretch + W*s[I] + + + # Use an iterable solver function to solve for the forces on the line else: @@ -301,16 +419,17 @@ def dV_dZ_s(z0, H): # height off seabed to evaluate at (infinite if 0), horizo # make sure required values are non-zero HF = np.max([ HF, Tol ]) XF = np.max([ XF, Tol ]) - ZF = np.max([ ZF, Tol ]) + if ZF > -Tol: # allow negative values + ZF = np.max([ ZF, Tol ]) # some initial values just for printing before they're filled in EXF=0 EZF=0 - + # Solve the analytical, static equilibrium equations for a catenary (or taut) mooring line with seabed interaction: X0 = [HF, VF] Ytarget = [0,0] - args = dict(cat=[XF, ZF, L, EA, W, CB, WL, WEA, L_EA, CB_EA], step=[0.15,1.0,1.5]) + args = dict(cat=[XF, ZF, L, EA, W, CB, hA, hB, alpha, WL, WEA, L_EA, CB_EA]) #, step=[0.15,1.0,1.5]) # call the master solver function #X, Y, info2 = msolve.dsolve(eval_func_cat, X0, Ytarget=Ytarget, step_func=step_func_cat, args=args, tol=Tol, maxIter=MaxIter, a_max=1.2) X, Y, info2 = dsolve2(eval_func_cat, X0, Ytarget=Ytarget, step_func=step_func_cat, args=args, @@ -342,7 +461,7 @@ def dV_dZ_s(z0, H): # height off seabed to evaluate at (infinite if 0), horizo X0 = [HF, VF] Ytarget = [0,0] - args = dict(cat=[XF, ZF, L, EA, W, CB, WL, WEA, L_EA, CB_EA], step=[0.1,0.8,1.5]) # step: alpha_min, alpha0, alphaR + args = dict(cat=[XF, ZF, L, EA, W, CB, hA, hB, alpha, WL, WEA, L_EA, CB_EA]) #, step=[0.1,0.8,1.5]) # step: alpha_min, alpha0, alphaR # call the master solver function #X, Y, info3 = msolve.dsolve(eval_func_cat, X0, Ytarget=Ytarget, step_func=step_func_cat, args=args, tol=Tol, maxIter=MaxIter, a_max=1.1) #, dX_last=info2['dX']) X, Y, info3 = dsolve2(eval_func_cat, X0, Ytarget=Ytarget, step_func=step_func_cat, args=args, @@ -350,18 +469,34 @@ def dV_dZ_s(z0, H): # height off seabed to evaluate at (infinite if 0), horizo # retry if it failed if info3['iter'] >= MaxIter-1 or info3['oths']['error']==True: - + X0 = X Ytarget = [0,0] - args = dict(cat=[XF, ZF, L, EA, W, CB, WL, WEA, L_EA, CB_EA], step=[0.1,1.0,2.0]) + args = dict(cat=[XF, ZF, L, EA, W, CB, hA, hB, alpha, WL, WEA, L_EA, CB_EA]) #, step=[0.05,1.0,1.0]) # call the master solver function #X, Y, info4 = msolve.dsolve(eval_func_cat, X0, Ytarget=Ytarget, step_func=step_func_cat, args=args, tol=Tol, maxIter=10*MaxIter, a_max=1.15) #, dX_last=info3['dX']) X, Y, info4 = dsolve2(eval_func_cat, X0, Ytarget=Ytarget, step_func=step_func_cat, args=args, ytol=Tol, stepfac=1, maxIter=MaxIter, a_max=1.2) # check if it failed - if info4['iter'] >= 10*MaxIter-1 or info4['oths']['error']==True: - + if info4['iter'] >= MaxIter-1 or info4['oths']['error']==True: + + + # ----- last-ditch attempt for a straight line ----- + d = np.sqrt(XF*XF+ZF*ZF) + sin_angle = XF/d + F_lateral = sin_angle*np.abs(W)*L + F_EA = (d/L-1)*EA + + + + print(f" F_lateral/F_EA is {F_lateral/F_EA:7.5f} !!!! and strain is {d/L-1 : 7.5f}.") + + print(f" F_lateral / (strain+tol)EA is {F_lateral/((d+Tol)/L-1)*EA:7.5f} !!!!!!") + + #breakpoint() + + print("catenary solve failed on all 3 attempts.") print(f"catenary({XF}, {ZF}, {L}, {EA}, {W}, CB={CB}, HF0={HF0}, VF0={VF0}, Tol={Tol}, MaxIter={MaxIter}, plots=1)") @@ -423,7 +558,7 @@ def dV_dZ_s(z0, H): # height off seabed to evaluate at (infinite if 0), horizo #breakpoint() ''' - raise CatenaryError("catenary solver failed.") + raise CatenaryError("catenary solver failed. "+info4['oths']['message']) else: # if the solve was successful, info.update(info4['oths']) # copy info from last solve into existing info dictionary @@ -454,7 +589,7 @@ def dV_dZ_s(z0, H): # height off seabed to evaluate at (infinite if 0), horizo # --- now that the iterative solve is over, check some things on the results, handle plotting, etc. --- # compute the Zextreme value - for a freely suspended line, if necessary, check to ensure the line doesn't droop and hit the seabed - if info['ProfileType']==1 and CB < 0 and VF-WL < 0.0: # only need to do this if the line is slack (has zero slope somewhere) + if info['ProfileType']==1 and hA > 0 and VF-WL < 0.0: # only need to do this if the line is slack (has zero slope somewhere) VFMinWL = VF - WL; LBot = L - VF/W; # unstretched length of line resting on seabed (Jonkman's PhD eqn 2-38), LMinVFOVrW @@ -476,10 +611,10 @@ def dV_dZ_s(z0, H): # height off seabed to evaluate at (infinite if 0), horizo info["Sextreme"] = 0.0 info["Zextreme"] = 0.0 info["Xextreme"] = 0.0 - + # handle special case of a U-shaped line that has seabed contact (using 2 new catenary solves) - if info['ProfileType']==1 and info["Zextreme"] < CB: + if info['ProfileType']==1 and info["Zextreme"] < -hA: # we will solve this as two separate lines to form the U shape info['ProfileType'] = 'U' @@ -489,11 +624,10 @@ def dV_dZ_s(z0, H): # height off seabed to evaluate at (infinite if 0), horizo X2_0 = XF - X1_0 L1 = info['Sextreme'] L2 = L-L1 - Z1 = CB # negative of height from seabed to original 'anchor' end [m] + Z1 = -hA # negative of height from seabed to original 'anchor' end [m] Z2 = -Z1 + ZF # height from seabed to fairlead end # set up a 1D solve for the correct choice of the anchor point so that horizontal tensions balance - def eval_func_U(X, args): info = dict(error=False) @@ -502,8 +636,8 @@ def eval_func_U(X, args): X2 = XF-X1 # note: reducing tolerances for these sub-calls <<< how much is good? <<< - (fAH1, fAV1, fBH1, fBV1, info1) = catenary(X1, Z1, L1, EA, W, CB=0, Tol=0.5*Tol, MaxIter=MaxIter) - (fAH2, fAV2, fBH2, fBV2, info2) = catenary(X2, Z2, L2, EA, W, CB=0, Tol=0.5*Tol, MaxIter=MaxIter) + (fAH1, fAV1, fBH1, fBV1, info1) = catenary(X1, Z1, L1, EA, W, CB=Z1, alpha=0, Tol=0.5*Tol, MaxIter=MaxIter) + (fAH2, fAV2, fBH2, fBV2, info2) = catenary(X2, Z2, L2, EA, W, CB=0 , alpha=0, Tol=0.5*Tol, MaxIter=MaxIter) Himbalance = fBH2 - fBH1 @@ -531,17 +665,19 @@ def step_func_U(X, args, Y, info, Ytarget, err, tols, iter, maxIter): X, Y, infoU = dsolve2(eval_func_U, [X1_0], step_func=step_func_U, ytol=0.25*Tol, stepfac=1, maxIter=20, a_max=1.2, display=0) X1 = X[0] X2 = XF-X1 + nNodes1 = int(L1/L*(nNodes-1) + 0.5) + 1 # set number of nodes in the first line by trying to keep original segment length # call one more time to get final values - (fAH1, fAV1, fBH1, fBV1, info1) = catenary(X1, Z1, L1, EA, W, CB=0, Tol=0.5*Tol, MaxIter=MaxIter, plots=plots) - (fAH2, fAV2, fBH2, fBV2, info2) = catenary(X2, Z2, L2, EA, W, CB=0, Tol=0.5*Tol, MaxIter=MaxIter, plots=plots) - + (fAH1, fAV1, fBH1, fBV1, info1) = catenary(X1, Z1, L1, EA, W, CB=Z1, alpha=0, Tol=0.5*Tol, MaxIter=MaxIter, plots=plots, nNodes=nNodes1) + (fAH2, fAV2, fBH2, fBV2, info2) = catenary(X2, Z2, L2, EA, W, CB=0, alpha=0, Tol=0.5*Tol, MaxIter=MaxIter, plots=plots, nNodes=nNodes-nNodes1+1) + if plots > 0 or (info1['error'] and info2['error']): - s = np.hstack([ info1["s" ] , info2["s" ]+L1 ]) - Xs = np.hstack([ info1["X" ] , info2["X" ]+X1 ]) - Zs = np.hstack([ info1["Z" ] , info2["Z" ]+Z1 ]) - Te = np.hstack([ info1["Te"] , info2["Te"] ]) + # concatenate nodal values (removing duplicate at the end nodes where they connect) + s = np.hstack([ info1["s" ] , info2["s" ][1:]+L1 ]) + Xs = np.hstack([ info1["X" ] , info2["X" ][1:]+X1 ]) + Zs = np.hstack([ info1["Z" ] , info2["Z" ][1:]+Z1 ]) + Te = np.hstack([ info1["Te"] , info2["Te"][1:] ]) # re-reverse line distributed data back to normal if applicable ''' @@ -571,7 +707,7 @@ def step_func_U(X, args, Y, info, Ytarget, err, tols, iter, maxIter): info['stiffnessB'] = np.array([[ dH_dX , K2[0,1] *K1[0,0]*dxdH ], [K2[1,0] *K1[0,0]*dxdH, K2[1,1] -K2[1,0]*dxdH*K2[0,1]]]) - info['stiffnessAB']= np.array([[-K1[0,0] *K2[0,0]*dxdH, -K1[0,1] *K2[0,0]*dxdH ], # this is the lower-left submatrix, A motions, B reaction forces + info['stiffnessAB']= np.array([[-K1[0,0] *K2[0,0]*dxdH, K1[0,1] *K2[0,0]*dxdH ], # this is the lower-left submatrix, A motions, B reaction forces (corrected/flipped sign of entry 0,1) [-K1[0,0] *dxdH*K2[1,0], -K1[0,1] *dxdH*K2[1,0] ]]) @@ -625,7 +761,7 @@ def step_func_U(X, args, Y, info, Ytarget, err, tols, iter, maxIter): info['LBot'] = info1['LBot'] + info2['LBot'] # not very useful outputs for this case: info["Sextreme"] = L1 - info1['LBot'] - info["Zextreme"] = CB + info["Zextreme"] = -hA info["Xextreme"] = X1 - info1['LBot'] #FxA = fAH1 @@ -678,7 +814,7 @@ def step_func_U(X, args, Y, info, Ytarget, err, tols, iter, maxIter): Zs[I] = ( SQRT1VFMinWLs_HF2 - SQRT1VFMinWL_HF2 )*HF_W + s_EA*( VFMinWL + 0.5*Ws ); Te[I] = np.sqrt( HF*HF + VFMinWLs*VFMinWLs ); - # A portion of the line must rest on the seabed and the anchor tension is zero + # A portion of the line must rest on the seabed elif ProfileType in [2,3]: if CB > 0: @@ -687,7 +823,7 @@ def step_func_U(X, args, Y, info, Ytarget, err, tols, iter, maxIter): xB = 0.0 xBlim = max(xB, 0.0) - if s[I] <= xB: # (aka Lbot - s > HF/(CB*W) ) if this node rests on the seabed and the tension is zero + if s[I] <= xB and CB > 0: # (aka Lbot - s > HF/(CB*W) ) if this node rests on the seabed and the tension is zero Xs[I] = s[I]; Zs[I] = 0.0; @@ -703,8 +839,53 @@ def step_func_U(X, args, Y, info, Ytarget, err, tols, iter, maxIter): Xs[I] = LBot + HF_W*np.log( VFMinWLs_HF + SQRT1VFMinWLs_HF2 ) + HF*s_EA + 0.5*CB*W/EA *(-LBot*LBot + xB*xBlim); Zs[I] = ( -1.0 + SQRT1VFMinWLs_HF2)*HF_W + s_EA*(VFMinWL + 0.5*Ws ) + 0.5* VFMinWL*VFMinWL/WEA; - Te[I] = np.sqrt( HF*HF + VFMinWLs*VFMinWLs ); + Te[I] = np.sqrt( HF*HF + VFMinWLs*VFMinWLs ) + # No portion of the line rests on the seabed + + # Line is paritally in contact with a sloped seabed + elif ProfileType==7: + + cos_alpha = np.cos(np.radians(alpha)) + sin_alpha = np.sin(np.radians(alpha)) + tan_alpha = sin_alpha/cos_alpha + + LBot = L - (VF - HF * tan_alpha)/W # Length of line on the seafloor + + VTD = VF - W*(L-LBot) #Vertical Force at the touchdownpoint (last point in contact with (sloped) seabed + + TTD = np.sqrt(VTD * VTD + HF * HF) #Tension at the Touchdown Point (HF is the same at fairlead as it is at touchdownpoint + + TA = TTD - W*(sin_alpha + CB)*LBot #Tension at the anchor + + X_TD = (LBot+(TA*LBot)/EA+(W*(sin_alpha + CB)*LBot*LBot)/(2*EA))*cos_alpha # X excursion from anchor to touchdown point + Z_TD = (LBot+(TA*LBot)/EA+(W*(sin_alpha + CB)*LBot*LBot)/(2*EA))*sin_alpha # Z excursion from anchor to the touchdown point + + if CB > 0: + xB = LBot - TTD/(W*(sin_alpha + CB)) # location of point at which line tension reaches zero (WWest Check this!!!!) + else: + xB = 0.0 + + xBlim = max(xB, 0.0) + + if s[I] <= xB and CB > 0: # (aka Lbot - s > HF/(CB*W) ) if this node rests on the seabed and the tension is zero + + Xs[I] = cos_alpha*s[I]; + Zs[I] = sin_alpha*s[I]; + Te[I] = 0.0; + + elif( s[I] <= LBot ): # // .TRUE. if this node rests on the seabed and the tension is nonzero + + Xs[I] = (s[I]+(TA*s[I])/EA+(W*(sin_alpha + CB)*s[I]*s[I])/(2*EA))*cos_alpha + Zs[I] = (s[I]+(TA*s[I])/EA+(W*(sin_alpha + CB)*s[I]*s[I])/(2*EA))*sin_alpha + Te[I] = TA + W*(sin_alpha + CB)*s[I]; + + else: # // LBot < s <= L ! This node must be above the seabed + + Xs[I] = X_TD + HF_W*(np.arcsinh((VTD+W*(s[I]-LBot))/HF)-np.arcsinh(VTD/HF))+(HF*(s[I]-LBot))/EA; + Zs[I] = Z_TD + HF_W*(np.sqrt(1+((VTD+W*(s[I]-LBot))/HF)*((VTD+W*(s[I]-LBot))/HF))-np.sqrt(1+(VTD/HF)*(VTD/HF)))+(1/EA)*(VTD*(s[I]-LBot)+(W*(s[I]-LBot)*(s[I]-LBot))/2); + Te[I] = np.sqrt( HF*HF + VFMinWLs*VFMinWLs ) + if plots > 0: # re-reverse line distributed data back to normal if applicable if reverseFlag: @@ -733,7 +914,7 @@ def step_func_U(X, args, Y, info, Ytarget, err, tols, iter, maxIter): info['stiffnessA'] = np.array(info['stiffnessB']) info['stiffnessAB'] = -info['stiffnessB'] - elif ProfileType in [2,3]: + elif ProfileType in [2,3,7]: if CB == 0.0: info['stiffnessA'] = np.array([[info['stiffnessB'][0,0], 0], [0, dV_dZ_s(Tol, HF)]]) # vertical term is very approximate info['stiffnessAB'] = np.array([[-info['stiffnessB'][0,0], 0], [0, 0]]) # note: A and AB stiffnesses for this case only valid if zero friction @@ -795,13 +976,13 @@ def step_func_U(X, args, Y, info, Ytarget, err, tols, iter, maxIter): def eval_func_cat(X, args): '''returns target outputs and also secondary outputs for constraint checks etc.''' - info = dict(error=False) # a dict of extra outputs to be returned + info = dict(error=False, message='') # a dict of extra outputs to be returned ## Step 1. break out design variables and arguments into nice names HF = X[0] VF = X[1] - [XF, ZF, L, EA, W, CB, WL, WEA, L_EA, CB_EA] = args['cat'] + [XF, ZF, L, EA, W, CB, hA, hB, alpha, WL, WEA, L_EA, CB_EA] = args['cat'] ## Step 2. do the evaluation (this may change mutable things in args) @@ -825,14 +1006,15 @@ def eval_func_cat(X, args): # determine line profile type - if(( CB < 0.0) or ( W < 0.0) or ( VFMinWL > 0.0 ) ): # no portion of the line rests on the seabed + if hA > 0.0 or W < 0.0 or VFMinWL > np.tan(np.radians(alpha)) : # no portion of the line rests on the seabed ProfileType = 1 - elif( -CB*VFMinWL < HF ): # a portion of the line rests on the seabed and the anchor tension is nonzero + elif not alpha==0: # a portion of line rests along a *sloped* seabed + ProfileType = 7 + elif -CB*VFMinWL < HF: # a portion of the line rests on the seabed and the anchor tension is nonzero ProfileType = 2 else: # must be 0.0 < HF <= -CB*VFMinWL, meaning a portion of the line must rest on the seabed and the anchor tension is zero ProfileType = 3 - - + # Compute the error functions (to be zeroed) and the Jacobian matrix # (these depend on the anticipated configuration of the mooring line): @@ -920,7 +1102,75 @@ def eval_func_cat(X, args): dZFdHF = ( SQRT1VF_HF2 - 1.0 - VF_HF2 /SQRT1VF_HF2 )/ W dZFdVF = ( VF_HF /SQRT1VF_HF2 )/ W + VF_WEA + ## Line Profile Type 7: Line partially on a sloped seabed + elif ProfileType==7: + + if (VF_HF + SQRT1VF_HF2 <= 0): + info['error'] = True + info['message'] = "ProfileType 7: VF_HF + SQRT1VF_HF2 <= 0" + + elif HF*1000000 < VF: + info['error'] = True + info['message'] = "ProfileType 7: HF << VF, line is slack, not supported yet" + breakpoint() + + else: + + + LBot = L - (VF - HF * np.tan(np.pi*alpha/180))/W # Lb on the seafloor + + VTD = VF - W*(L-LBot) #Vertical Force at the touchdownpoint + + TTD = np.sqrt(VTD * VTD + HF * HF) #Tension at the Touchdown Point + + TA = TTD - W*(np.sin(np.pi*alpha/180)+CB)*LBot #Tension at the anchor + + if CB > 0: + xB = LBot - TTD/(W*(np.sin(np.pi*alpha/180)+CB)) # location of point at which line tension reaches zero (WWest Check this!!!!) + else: + xB = 0.0 + xBlim = max(xB, 0.0) + + TA = max(0,TA) #Anchor Tension Cannot be Negative + + #X and Z Excursions along the sloped seabed + X_TD = (LBot+(TA*LBot)/EA+(W*(np.sin(np.pi*alpha/180)+CB)*LBot*LBot)/(2*EA))*np.cos(np.pi*alpha/180) + Z_TD = (LBot+(TA*LBot)/EA+(W*(np.sin(np.pi*alpha/180)+CB)*LBot*LBot)/(2*EA))*np.sin(np.pi*alpha/180) + # WWest Comment: Could clean this up for readibility (Will do at somepoint) + EXF = HF_W*(np.arcsinh((VTD+W*(L-LBot))/HF)-np.arcsinh(VTD/HF))+(HF*(L-LBot))/EA + X_TD - XF # error in horizontal distance + + EZF = HF_W*(np.sqrt(1+((VTD+W*(L-LBot))/HF)*((VTD+W*(L-LBot))/HF))-np.sqrt(1+(VTD/HF)*(VTD/HF)))+(1/EA)*(VTD*(L-LBot)+(W*(L-LBot)*(L-LBot))/2) + Z_TD - ZF # error in vertical distance + + #Line stiffness values + #Re-assign some helpful values + VFMinWL = VF - W*(L-LBot) # = VTD Point, the vertical anchor load (positive-up, but VF is positive-down) + L_EA = (L-LBot)/EA + VFMinWL_HF = VFMinWL/HF + VFMinWL_HF2 = VFMinWL_HF*VFMinWL_HF + SQRT1VFMinWL_HF2 = np.sqrt( 1.0 + VFMinWL_HF2 ) + + #Line stiffness values + dXFdHF = (( np.log( VF_HF + SQRT1VF_HF2 ) - np.log( VFMinWL_HF + SQRT1VFMinWL_HF2 ) )/ W - + ( ( VF_HF + VF_HF2 /SQRT1VF_HF2 )/( VF_HF + SQRT1VF_HF2 ) + - ( VFMinWL_HF + VFMinWL_HF2/SQRT1VFMinWL_HF2 )/( VFMinWL_HF + SQRT1VFMinWL_HF2 ) )/ W + L_EA) + + dXFdVF = (( ( 1.0 + VF_HF /SQRT1VF_HF2 )/( VF_HF + SQRT1VF_HF2 ) + - ( 1.0 + VFMinWL_HF /SQRT1VFMinWL_HF2 )/( VFMinWL_HF + SQRT1VFMinWL_HF2 ) )/ W) + + dZFdHF = ( SQRT1VF_HF2 - SQRT1VFMinWL_HF2 )/ W - ( VF_HF2 /SQRT1VF_HF2 - VFMinWL_HF2/SQRT1VFMinWL_HF2 )/ W + + dZFdVF = ( VF_HF /SQRT1VF_HF2 - VFMinWL_HF /SQRT1VFMinWL_HF2 )/ W + L_EA + + #Ensure LBot is not less than zero + LBot = max(LBot, 0) + + + # if there was an error, send the stop signal + if info['error']==True: + #breakpoint() + return np.zeros(2), info, True + # Now compute the tensions at the anchor if ProfileType==1: # No portion of the line rests on the seabed @@ -935,12 +1185,10 @@ def eval_func_cat(X, args): HA = 0.0 VA = 0.0 + elif ProfileType==7: # A portion of the line must rest on the seabed and the anchor tension is zero or non-zero + HA = TA*np.cos(np.pi*alpha/180) + VA = TA*np.sin(np.pi*alpha/180) - # if there was an error, send the stop signal - if info['error']==True: - #breakpoint() - return np.zeros(2), info, True - ## Step 3. group the outputs into objective function value and others Y = np.array([EXF, EZF]) # objective function @@ -956,7 +1204,7 @@ def eval_func_cat(X, args): info["ProfileType"] = ProfileType #print("EX={:5.2e}, EZ={:5.2e}".format(EXF, EZF)) - + return Y, info, False @@ -970,30 +1218,21 @@ def step_func_cat(X, args, Y, info, Ytarget, err, tols, iter, maxIter): info - the info dict created by the main catenary function ''' - [XF, ZF, L, EA, W, CB, WL, WEA, L_EA, CB_EA] = args['cat'] + [XF, ZF, L, EA, W, CB, hA, hB, alpha, WL, WEA, L_EA, CB_EA] = args['cat'] - #if abs( err[1] + ZF ) < 0.0001: - # breakpoint() - - - - [alpha_min, alpha0, alphaR] = args['step'] # get minimum alpha, initial alpha, and alpha reduction rate from passed arguments - - #J = info['jacobian'] - #dX = -np.matmul(np.linalg.inv(J), err) dX = -np.matmul(info['stiffnessB'], err) - # ! Reduce dHF by factor (between 1 at I = 1 and 0 at I = MaxIter) that reduces linearly with iteration count # to ensure that we converge on a solution even in the case were we obtain a nonconvergent cycle about the # correct solution (this happens, for example, if we jump to quickly between a taut and slack catenary) - alpha = 1.0 #M<<<<<<<< np.max([alpha_min, alpha0*(1.0 - alphaR*iter/maxIter)]) - - #exponential approach alpha = alpha0 * np.exp( iter/maxIter * np.log(alpha_min/alpha0 ) ) - - dX[0] = dX[0]*alpha #dHF*( 1.0 - Tol*I ) - dX[1] = dX[1]*alpha #dVF*( 1.0 - Tol*I ) + # options for adaptive step size: + if 'step' in args: + [alpha_min, alpha0, alphaR] = args['step'] # get minimum alpha, initial alpha, and alpha reduction rate from passed arguments + alpha = np.max([alpha_min, alpha0*(1.0 - alphaR*iter/maxIter)]) + alpha = alpha0 * np.exp( iter/maxIter * np.log(alpha_min/alpha0 ) ) + dX[0] = dX[0]*alpha #dHF*( 1.0 - Tol*I ) + dX[1] = dX[1]*alpha #dVF*( 1.0 - Tol*I ) # To avoid an ill-conditioned situation, make sure HF does not go less than or equal to zero by having a lower limit of Tol*HF # [NOTE: the value of dHF = ( Tol - 1.0 )*HF comes from: HF = HF + dHF = Tol*HF when dHF = ( Tol - 1.0 )*HF] @@ -1056,16 +1295,29 @@ def step_func_cat(X, args, Y, info, Ytarget, err, tols, iter, maxIter): #(fAH, fAV, fBH, fBV, info) = catenary(205, -3.9, 250, 1229760000.0, 2442, CB=-55, Tol=1e-06, MaxIter=50, plots=3) - (fAH1, fAV1, fBH1, fBV1, info1) = catenary( 400, 100, 470, 1e12, 100.0, CB=-10, Tol=0.001, MaxIter=50, plots=4) + #(fAH1, fAV1, fBH1, fBV1, info1) = catenary( 400, 100, 470, 1e12, 100.0, CB=-10, Tol=0.001, MaxIter=50, plots=4) #(fAH1, fAV1, fBH1, fBV1, info1) = catenary(2306.4589923684835, 1.225862496312402e-05, 1870.0799339749528, 203916714.02425563, 405.04331583394304, CB=0.0, HF0=58487689.78903873, VF0=0.0, Tol=4.000000000000001e-06, MaxIter=50, plots=1) #(fAH1, fAV1, fBH1, fBV1, info1) = catenary(459.16880261639346, 0.0004792939078015479, 447.67890341877506, 2533432597.6567926, 5032.201233267459, CB=0.0, HF0=65021800.32966018, VF0=17487.252675845888, Tol=4.000000000000001e-06, MaxIter=50, plots=1) #(fAH1, fAV1, fBH1, fBV1, info1) = catenary(0.00040612281105723014, 391.558570722038, 400.0, 3300142385.3140063, 6555.130220040344, CB=-287.441429277962, HF0=2127009.4122708915, VF0=10925834.69512347, Tol=4.000000000000001e-06, MaxIter=100, plots=1) #(fAH1, fAV1, fBH1, fBV1, info1) = catenary(0.0004959907076624859, 69.87150531147275, 110.89397565668423, 80297543.26800226, 146.26820268238743, CB=-509.12849468852727, HF0=1322712.3676957292, VF0=1045583.1849462093, Tol=4.000000000000001e-06, MaxIter=50, plots=1) + #(fAH1, fAV1, fBH1, fBV1, info1) = catenary(2.203138228651369e-05, 378.2807133834522, 383.34011790636976, 260525391.7172965, 474.5672065262173, CB=-7.719286616547777, + # HF0=0.012438428537800724, VF0=179721.2163869108, Tol=4.000000000000001e-06, MaxIter=100, plots=1) + """ + (fAH1, fAV1, fBH1, fBV1, info1) = catenary(406.77, -21.22, 410, 854000000.00, 1820.205, CB=0, alpha=-26.7, + HF0=1300157.2, VF0=931582.2, Tol=1e-06, MaxIter=100, plots=1) + plt.plot(info1['X'], info1['Z'] ) #plt.plot(infoU['X'], infoU['Z'] ) plt.axis('equal') + + XF = 406.77 + ZF = -21.22 + alpha = -26.7 + plt.plot([0, XF], [0, XF*np.tan(np.radians(alpha))], 'g--') + plt.plot(XF, ZF, 'b*') + ''' plt.figure() plt.plot(info1['s'], info1['Te'] ) @@ -1076,10 +1328,68 @@ def step_func_cat(X, args, Y, info, Ytarget, err, tols, iter, maxIter): print('') from moorpy.helpers import printMat - printMat(info1['K']) - print('') printMat(info1['stiffnessA']) print('') printMat(info1['stiffnessB']) + """ + ''' + # sloped case + (fAH1, fAV1, fBH1, fBV1, info1) = catenary(147.0, -25.8, 160.0, 854e7, 6523.0, + CB=0.0, alpha=-27.73, HF0=725968.57, VF0=667765.24, + Tol=0.0001, MaxIter=100, plots=1) + ''' + # simple U case (fAH1, fAV1, fBH1, fBV1, info1) = catenary(200, 30, 260.0, 8e9, 6500, CB=-50, nNodes=21, plots=1) + + #tricky cable + ''' + (fAH1, fAV1, fBH1, fBV1, info1) = catenary(266.66666666666674, 195.33333333333337, + 400.0, 700000.0, -15.807095300087719, CB=0.0, alpha=-0.0, + #HF0=3815675.5094567537, VF0=-1038671.8978986739, + Tol=0.0001, MaxIter=100, plots=1) + ''' + #fAH1, fAV1, fBH1, fBV1, info1) = catenary(231.8516245613182, 248.3746210557402, 339.7721054751881, 70000000000.0, 34.91060469991227, + #(fAH1, fAV1, fBH1, fBV1, info1) = catenary(231.8, 248.3, 339.7, 70000000000.0, 34.91060469991227, + # CB=0.0, HF0=2663517010.1, VF0=2853338140.1, Tol=0.0001, MaxIter=100, plots=2) + + #(fAH1, fAV1, fBH1, fBV1, info1) = catenary(246.22420940032947, 263.55766330843164, 360.63566262396927, 700000000.0, 3.087350845602259, + # CB=0.0, HF0=9216801.959569097, VF0=9948940.060081193, Tol=2e-05, MaxIter=100, plots=1) + #catenary(400.0000111513176, 2e-05, 400.0, 70000000000.0, 34.91060469991227, + # CB=0.0, HF0=4224.074763303775, VF0=0.0, Tol=2e-05, MaxIter=100, plots=1) + + + Tol =2e-05 + + XF=231.8516245613182 + ZF=248.3746210557402 + L = 339.7721054751881 #- Tol + EA=7e8 + W=34.91 + ''' + XF=40.0 + ZF=30.0 + L = 50 - 0.001 + EA=7e9 + W=3 + ''' + d = np.sqrt(XF*XF+ZF*ZF) + sin_angle = XF/d + F_lateral = sin_angle*np.abs(W)*L + F_EA = (d/L-1)*EA + + #L = d + + print(f" F_lateral/F_EA is {F_lateral/F_EA:6.2e} !!!! and strain is {d/L-1 : 7.5f}.") + + print(f" F_lateral / ((strain+tol)EA) is {F_lateral/(((d+Tol)/L-1)*EA):6.2e} !!!!!!") + print(f" F_lateral / ((strain-tol)EA) is {F_lateral/(((d-Tol)/L-1)*EA):6.2e} !!!!!!") + + (fAH1, fAV1, fBH1, fBV1, info1) = catenary(XF, ZF, L, EA, W, CB=-20, Tol=Tol, MaxIter=40, plots=2) + + print((fAH1, fAV1, fBH1, fBV1)) + + plt.plot(info1['X'], info1['Z'] ) + #plt.plot(info1['s'], info1['X'] ) + #plt.axis('equal') + plt.show() diff --git a/MoorPy/moorpy/MoorProps.py b/MoorPy/moorpy/MoorProps.py index e3762a179..870321019 100644 --- a/MoorPy/moorpy/MoorProps.py +++ b/MoorPy/moorpy/MoorProps.py @@ -8,6 +8,7 @@ import numpy as np import moorpy as mp +import math def getLineProps(dmm, type="chain", stud="studless", source="Orcaflex-altered", name=""): @@ -139,7 +140,13 @@ def getLineProps(dmm, type="chain", stud="studless", source="Orcaflex-altered", EA = 1.06e6*d**2*1000 #[N] MBL = 105990*d**2*1000 #[N] d_vol = 0.80*d #[m] - cost = (0.42059603*MBL/1000/9.81) + 109.5 # [$/m] from old NREL-internal + cost = 1.0*((0.42059603*MBL/1000/9.81) + 109.5) # [$/m] from old NREL-internal + elif type=="hmpe": + massden = 0.4526*d**2*1000 #[kg/m] + EA = 38.17e6*d**2*1000 #[N] + MBL = 619000*d**2*1000 #[N] + d_vol = 1.01*d #[m] + cost = (0.01*MBL/1000/9.81) # [$/m] from old NREL-internal elif type=="wire-fiber" or type=="fiber": massden = 3.6109*d**2*1000 #[kg/m] EA = 3.67e7*d**2*1000 #[N] @@ -189,12 +196,318 @@ def getLineProps(dmm, type="chain", stud="studless", source="Orcaflex-altered", return mp.LineType(typestring, d_vol, massden, EA, MBL=MBL, cost=cost, notes=notes, input_type=type, input_d=dmm) +#----NOTES---- + +#def getAnchorProps(value, anchor="drag-embedment", soil_type='medium clay',uhc_mode = True, method = 'static', display=0): + # need to make 'value' input all the same as either Mass or UHC + #'value' can be both capacity or mass, 'uhc_mode' defines what it is. However, this method does not take into account fx, fz loading directions or safety factor + +# applied safety factors make input UHC smaller resulting in smaller mass > uhc_mode = True, calulating for capacity | INPUT: mass | does not account for this + #added 'capacity_sf' variable: outputs capacity for applied safety factor, while showing original input capacities (fx,fz) + +# VLA calculation for thickness may be wrong: may not need to divide by 4. When we dont it matched STEVMANTA table (in excel sheet) + +# Do i want to scale fx,fz by 20% when considering dynamic loads like in Moorpy 'capacity_x = 1,2*fx ; capacity_z = 1.2*fz + +# Need to validate suction curves and compare to Ahmed's curves. His is pure horizontal while these ones are for both horizontal and vertical + +#-------------- + +def getAnchorMass( uhc_mode = True, fx=0, fz=0, mass_int=0, anchor="drag-embedment", soil_type='medium clay', method = 'static', display=0): + '''Calculates anchor required capacity, mass, and cost based on specified loadings and anchor type + + Parameters + ---------- + uhc_mode: boolean + True: INPUT Mass to find UHC + False: INPUT fx,fz to find Mass and UHC + fx : float + horizontal maximum anchor load [N] + fz : float + vertical maximum anchor load [N] + massint : float + anchor mass [kg] + anchor : string + anchor type name + soil_type: string + soil type name + method: string + anchor analysis method for applied safety factors + + Returns + ------- + UHC: float + required anchor ultimate holding capacity [N] + mass: float + anchor mass [kg] + info: float + dictionary + ''' + + #--MAGIC NUMBERS -- assign varibles to values + density_st = 7.85*1000 #[kg/m^3] + gravity = 9.81 #[m/sec^2]? or [N/kg], if so may need to add conversion *1000 so [kN/mT] + info = {} + + + # Define anchor type + if anchor == "drag-embedment": + + # Define soil type (coefficients are from Vryhof for Stevpris MK6) + if soil_type == 'soft clay': + a, b = 509.96, 0.93 + elif soil_type == 'medium clay': + a, b = 701.49, 0.93 + elif soil_type == 'hard clay' or soil_type == 'sand': + a, b = 904.21, 0.92 + else: + raise ValueError('Error: Invalid soil type') + + # Define mode + # Calculate capacity | INPUT: Mass in kg + if uhc_mode: + uhc = a * (mass_int/1000)**b*1000 #[N] (from Vryhof eqn) + # y = m*(x)^b + + print(f"Mass input: {mass_int} -- UHC: {uhc}") + info["Mass"] = mass_int #[kg] + info["UHC"] = uhc #[N] + + + # Calculate mass | INPUT: UHC + else: + # Define method for safety factor + if method == 'static': + uhc = 1.8*fx #[N] + elif method == 'dynamic': + uhc = 1.5*fx #[N] + else: + raise Exception("Error - invalid method") + + mass = (uhc /1000 /a)**(1/b)*1000 # [kg] (from Vryhof eqn) + + print(f"UHC input: {fx} -- Mass: {mass}") + info["UHC"] = uhc #[N] + info["Mass"] = mass #[kg] + + elif anchor == "VLA": + + # Vryhof coefficients + if soil_type == 'soft clay': + c, d = 0.003, -0.2 + elif soil_type == 'medium clay': + c, d = 0.0017, -0.32 + else: + raise ValueError('Error: Invalid soil type') + + if uhc_mode: # Calculate capacity | INPUT: Mass + #t2_m_ratio = 20933.3 #[m^2] + + #Ericka note - I don't know where this ratio is coming from. Matt may have estimated from Vryhof manual + t2_m_ratio = 1308.33 + + #Ericka note -not sure about this equation - should it be to the 1/2 power? + thickness = (mass_int/1000 / t2_m_ratio)**(1/3) #[m] #DONE: magic number - assign to variable (think its from t^2/A = 6000; thickness ratio) + area = mass_int/ (thickness * density_st) #[m^2] Area (1-30) + uhc = (area - d) / c * 1000 #[N] Vryhof equation + + + print(f"Mass input: {mass_int} -- UHC: {uhc}, Area: {area}") + info["Mass"] = mass_int #[kg] + info["UHC"] = uhc #[N] + info["Area"] = area #[m^2] + + else: # Calculate mass | INPUT: UHC + capacity_x = 2.0 * fx # N + capacity_z = 2.0 * fz # N + uhc = np.linalg.norm([capacity_x,capacity_z]) + + #Vryhof equation + area = c * uhc/1000 + d #[m^2] Vryhof equation + # y = m*x + b + + #Ericka note - I don't know where this ratio is coming from. Matt may have estimated from Vryhof manual + t2_a_ratio = 0.006 #[m^2] + if area < 0: + thickness = 0 + raise ValueError ("Error: Negative area)") + else: + #thickness = math.sqrt(t2_a_ratio * area)/4 #[m] #### why divide by 4 - looking at this in exel sheet + thickness = math.sqrt(t2_a_ratio * area) + mass = area * thickness * density_st #[kg] + + + print(f"UHC input: fx:{fx} fz:{fz} -- Mass: {mass}, Area: {area}") + info["UHC"] = uhc #[N] + info["Mass"] = mass #[kg] + info["Area"] = area #[m^2] + + + ###### VERIFICATION REQUIRED, THESE CURVES CONSIDER INCLINED LOADS -> While Ahmed's is pure horizontal + elif anchor == "suction": + + # c and d numbers are from ABS FOWT Anchor Report + # m and b numbers are from Brian's excel sheet curve fit to Mass vs UHC graph + if soil_type == 'soft clay': + m = 88.152 + b = 1.1058 + c_L, d_L = 1.1161, 0.3442 + c_D, d_D = 0.3095, 0.2798 + c_T, d_T = 2.058, 0.2803 + + elif soil_type == 'medium clay': + m = 384.15 + b = 0.8995 + c_L, d_L = 0.5166, 0.3995 + c_D, d_D = 0.126, 0.3561 + c_T, d_T = 0.8398, 0.3561 + + else: + raise ValueError("Invalid Soil Type") + + + if uhc_mode: # Calculate capacity | INPUT: Mass + + ### ABS (Matts curves) slightly off (from Brian's excel sheet curve fit for Mass vs UHC) + uhc = m * (mass_int/1000) ** b * 1000 # [N] + + + print(f"Mass INPUT: {mass_int} -- UHC: {uhc}") + info["Mass"] = mass_int #[kg] + info["UHC"] = uhc #[N] + else: # Calculate mass | INPUT: UHC + + capacity_x = 1.6*fx #[N] + #capacity_x = fx + capacity_z = 2.0*fz #[N] + uhc = np.linalg.norm([capacity_x, capacity_z]) #[kN] + + # Equations from ABS Anchors Report + L = c_L * (uhc/1000) **d_L #[m] + D = c_D * (uhc/1000) **d_D #[m] + T = (c_T * (uhc/1000) **d_T) /1000 #[m] + + # y = m*(x)^b + + # volume of one end + open cylinder wall + volume = (math.pi/4 * D ** 2 + math.pi * D * L) * T #[m^3] + mass = volume * density_st #[kg] + print(f"UHC input: fx:{fx} fz:{fz} -- Mass: {mass}") + info["UHC"] = uhc #[N] + info["Mass"] = mass #[kg] + #info["Length"] = L + + + + + #-----IN PROGRESS ----------------------------------- + + elif anchor == "SEPLA": + # Ericka note - we think these coefficients come from Ahmed's intermediate model + if soil_type == 'soft clay': + c_B, d_B = 0.0225, 0.5588 + c_L, d_L = 0.0450, 0.5588 + c_T, d_T = 0.0006, 0.5588 + + else: + raise ValueError("Invalid Soil Type") + + if uhc_mode: # Calculate UHC | INPUT: Mass ### A little bit off from uhc = FALSE + + # from excel + m = 1557.4 + b = 0.5956 + uhc = m *(mass_int/1000) ** b *10000 # [N] + + + print(f'Work in progress -- Mass input: {mass_int} -- UHC {uhc}') + info["Mass"] = mass_int + info["UHC"] = uhc + + else: # Calculate Mass | INPUT: UHC + capacity_x = 2.0*fx + uhc = capacity_x + + B = c_B * (uhc/1000) ** d_B #[m] + L = c_L * (uhc/1000) ** d_L #[m] + T = c_T * (uhc/1000) ** d_T #[m] + # y = m*(x)^b + + area = B*L #[m^2] + volume = area * T #[m^3] + mass = volume * density_st #[mT] + + + print(f"UHC input: fx:{fx} fz:{fz} -- Mass {mass}") + info["UHC"] = uhc #[N] + info["Mass"] = mass #[kg] + info["Area"] = area #[m^2] + + elif anchor == "micropile": + raise ValueError ("Not supported yet") + + + else: + return Exception("Error - invalid anchor type") + + + + if uhc_mode: + mass = mass_int + + return uhc, mass, info + #return info + + +def getAnchorCost(fx, fz, type="drag-embedment",soil_type='medium clay', method = 'static'): + ''' applies factors to material cost ''' + + + uhc, mass, info = getAnchorMass( uhc_mode = False, fx=fx, fz=fz, anchor= type, soil_type=soil_type, method = method) + euros2dollars = 1.18 # the number of dollars there currently are in a euro (3-31-21) + + if type == "drag-embedment": + + + anchorMatCost = 6.7*mass # $ per kg mass + anchorInstCost = 163548*euros2dollars # installation cost + anchorDecomCost = 228967*euros2dollars # decommissioning cost + + elif type == "suction": + + anchorMatCost = 10.25 *mass # $ per kg mass + anchorInstCost = 179331*euros2dollars # installation cost + anchorDecomCost = 125532*euros2dollars # decommissioning cost + + + elif type == "micropile": + + raise ValueError('Micropile material costs are not yet supported') + #anchorMatCost = 0.48 * mass # $ per kg mass + anchorInstCost = 0 # installation cost + anchorDecomCost = 0 # decommissioning cost + + elif type == "plate": # cross between suction and plate + + raise ValueError('Plate material costs are not yet supported') + #anchorMatCost = 0.45 * mass# $ per kg mass + anchorInstCost = 0 # installation cost + anchorDecomCost = 0 # decommissioning cost + + else: + raise ValueError(f'getAnchorProps received an unsupported anchor type ({type})') + + # mooring line sizing: Tension limit for QS: 50% MBS. Or FOS = 2 + + + return anchorMatCost, anchorInstCost, anchorDecomCost # [USD] + def getAnchorProps(fx, fz, type="drag-embedment", display=0): - ''' Calculates anchor required capacity and cost based on specified loadings and anchor type''' + ''' ****OLD VERSION**** Calculates anchor required capacity and cost based on specified loadings and anchor type''' # for now this is based on API RP-2SK guidance for static analysis of permanent mooring systems # fx and fz are horizontal and vertical load components assumed to come from a dynamic (or equivalent) analysis. @@ -204,8 +517,8 @@ def getAnchorProps(fx, fz, type="drag-embedment", display=0): # coefficients in front of fx and fz in each anchorType are the SF for that anchor for quasi-static (pages 30-31 of RP-2SK) # scale QS loads by 20% to approximate dynamic loads - fx = 1.2*fx - fz = 1.2*fz + # fx = 1.2*fx + # fz = 1.2*fz # note: capacity is measured here in kg force @@ -231,6 +544,23 @@ def getAnchorProps(fx, fz, type="drag-embedment", display=0): anchorInstCost = 179331*euros2dollars # installation cost anchorDecomCost = 125532*euros2dollars # decommissioning cost + elif type == 'deadweight-granite': + capacity_x = 1.6*fx/9.81 # no safety factors given explicitly for deadweight anchors in the standards; assuming these safety factors are the same as piles/gravity/plates + capacity_z = 2.0*fz/9.81 # no safety factors given explicitly for deadweight anchors in the standards; assuming these safety factors are the same as piles/gravity/plates + capacity = np.linalg.norm([capacity_x, capacity_z]) + anchorMatCost = 0.05*capacity # cost of a granite deadweight anchor is about $50 per ton (from Senu) + anchorInstCost = 0 + anchorDecomCost = 0 + + elif type == 'deadweight-concrete': + capacity_x = 1.6*fx/9.81 # no safety factors given explicitly for deadweight anchors in the standards; assuming these safety factors are the same as piles/gravity/plates + capacity_z = 2.0*fz/9.81 # no safety factors given explicitly for deadweight anchors in the standards; assuming these safety factors are the same as piles/gravity/plates + capacity = np.linalg.norm([capacity_x, capacity_z]) + anchorMatCost = 0.075*capacity # cost of a concrete deadweight anchor is about $75 per ton (from Senu) + # reinforced concrete is about $1000 per ton ($1 per kg), but we don't need reinforced concrete for deadweight anchors + anchorInstCost = 0 + anchorDecomCost = 0 + elif type == "plate": capacity_x = 2.0*fx/9.81 capacity_z = 2.0*fz/9.81 diff --git a/MoorPy/moorpy/MoorProps_default.yaml b/MoorPy/moorpy/MoorProps_default.yaml new file mode 100644 index 000000000..19429199f --- /dev/null +++ b/MoorPy/moorpy/MoorProps_default.yaml @@ -0,0 +1,99 @@ +# Default mooring line property coefficients for MoorPy +# The following is YAML syntax and follows a heirarchy of +# lineProps -> [line material name] -> [line material coefficients] + +# All possible lineProps coefficients are as follow: +# mass_d2 : # linear mass density per diameter^2 [kg/m^3] +# +# MBL_0 : # minimum breaking load offset [N] +# MBL_d : # minimum breaking load per diameter [N/m] +# MBL_d2 : # minimum breaking load per diameter^2 [N/m^2] +# MBL_d3 : # minimum breaking load per diameter^3 [N/m^3] +# +# EA_0 : # stiffness offset [N] +# EA_d : # stiffness per diameter [N/m] +# EA_d2 : # stiffness per diameter^2 [N/m^2] +# EA_d3 : # stiffness per diameter^3 [N/m^3] +# EA_MBL : # (quasi-static) stiffness per MBL [N/N] (aka Kr, Krs) +# EAd_MBL : # dynamic stiffness per MBL [N/N] (aka Krd or Krd_alpha) +# EAd_MBL_Lm: # dynamic stiffness per MBL per fraction of mean load (not %) [N/N] (aka or Krd_beta) +# +# dvol_dnom : # volume-equivalent diameter per nominal diameter [-] +# density : # density of the line material [kg/m^3] (e.g., chain density = 7850 kg/m^3) +# NOTE: Only one of the above three variables can be used as input! +# +# cost_0 : # cost offset [$/m] +# cost_d : # cost per diameter [$/m^2] +# cost_d2 : # cost per diameter^2 [$/m^3] +# cost_d3 : # cost per diameter^2 [$/m^4] +# cost_mass : # cost per mass [$/kg] +# cost_EA : # cost per stiffness [$/m/N] +# cost_MBL : # cost per MBL [$/m/N] + +# Chain Notes +# - The MBLs between studless and studlink chains are the same, for every grade +# - The masses between different grades of chain are the same (for now...different grades might correspond to different material densities) +# - If the user needs a different grade of chain, they will have to add another section and include those properties here. This default file only considers R4 chain +# - This default yaml uses R4 studless chain as the default style of chain +# - The chain MBL uses a cubic function, so be aware if you are researching theoretical chains with diameters greater than about 360mm, as the MBL will then decrease +# - Chain EA values not provided in manufacturer catalogs, so the below coefficients are taken from DNV-OS-E301 2013 + + + +lineProps: + + chain : # R4 grade studless chain (the default chain that will be used when linetypename='chain') + mass_d2 : 20.01e3 # linear mass density per diameter^2 [kg/m/m^2] + EA_d3 : -3.927e7 # stiffness per diameter^3 [N/m^3] + EA_d2 : 85.61e9 # stiffness per diameter^2 [N/m^2] + MBL_d3 : -2.192e9 # minimum breaking load per diameter^3 [N/m^3] + MBL_d2 : 1.206e9 # minimum breaking load per diameter^2 [N/m^2] + MBL_d : 9.107e2 # minimum breaking load per diameter [N/m] + dvol_dnom : 1.801 # volume-equivalent diameter per nominal diameter [-] (assumes 7,850 kg/m^3 material density) + cost_mass : 2.585 # cost per mass [$/kg] + + chain_studlink : # R4 grade studlink chain + mass_d2 : 21.9e3 # linear mass density per diameter^2 [kg/m/m^2] + EA_d2 : 87.97e9 # stiffness per diameter^2 [N/m^2] + MBL_d3 : -2.192e9 # minimum breaking load per diameter^3 [N/m^3] + MBL_d2 : 1.206e9 # minimum breaking load per diameter^2 [N/m^2] + MBL_d : 9.107e2 # minimum breaking load per diameter [N/m] + dvol_dnom : 1.885 # volume-equivalent diameter per nominal diameter [-] (assumes 7,850 kg/m^3 material density) + cost_mass : 2.585 # cost per mass [$/kg] + + + polyester : # polyester synthetic rope + mass_d2 : 678.75 # linear mass density per diameter^2 [kg/m/m^2] + MBL_d2 : 308.2e6 # minimum breaking load per diameter^2 [N/m^2] + EA_MBL : 14 # quasi-static stiffness per MBL [N/N] + EAd_MBL : 11.615 # dynamic stiffness per MBL [N/N] + EAd_MBL_Lm : 39.6 # dynamic stiffness per MBL per fraction of mean load (not %) [N/N] (beta term to be multiplied with the absolute mean tension) + density : 1380 # density of the polyester material [kg/m^3] (taken from specific gravity of 1.38, relative to 1000 kg/m^3) + cost_MBL : 1.65e-05 # cost per MBL [$/m/N] + + nylon : # nylon synthetic rope + mass_d2 : 585.15 # linear mass density per diameter^2 [kg/m/m^2] + MBL_d3 : 230.29e6 # minimum breaking load per diameter^3 [N/m^2] + MBL_d2 : 207.0e6 # minimum breaking load per diameter^2 [N/m^2] + EA_MBL : 5 # quasi-static stiffness per MBL [N/N] (can range from 1 to 10) + EAd_MBL : 2.08 # dynamic stiffness per MBL [N/N] + EAd_MBL_Lm : 39.0 # dynamic stiffness per MBL per fraction of mean load (not %) [N/N] (beta term to be multiplied with the absolute mean tension) + density : 1140 # density of the nylon material [kg/m^3] (taken from specific gravity of 1.14, relative to 1000 kg/m^3) + cost_MBL : 4.29e-05 # cost per MBL [$/m/N] + + hmpe : # high modulus polyethylene synthetic rope + mass_d2 : 495.72 # linear mass density per diameter^2 [kg/m/m^2] + MBL_d3 : 650.65e6 # minimum breaking load per diameter^3 [N/m^2] + MBL_d2 : 579.5e6 # minimum breaking load per diameter^2 [N/m^2] + EA_MBL : 56.54 # quasi-static stiffness per MBL [N/N] + EAd_MBL : 59 # dynamic stiffness per MBL [N/N] + EAd_MBL_Lm : 54.0 # dynamic stiffness per MBL per fraction of mean load (not %) [N/N] (beta term to be multiplied with the absolute mean tension) + density : 975 # density of the hmpe/dyneema material [kg/m^3] (taken from specific gravity of 0.975, relative to 1000 kg/m^3 + + + + + + + + diff --git a/MoorPy/moorpy/__init__.py b/MoorPy/moorpy/__init__.py index fa7d3b6f0..6fde5e087 100644 --- a/MoorPy/moorpy/__init__.py +++ b/MoorPy/moorpy/__init__.py @@ -11,3 +11,7 @@ from moorpy.helpers import * from moorpy.Catenary import catenary +from moorpy.MoorProps import * + +import os +moorpy_dir = os.path.dirname(os.path.realpath(__file__)) diff --git a/MoorPy/moorpy/body.py b/MoorPy/moorpy/body.py index 6f22d3021..1b714a316 100644 --- a/MoorPy/moorpy/body.py +++ b/MoorPy/moorpy/body.py @@ -8,7 +8,8 @@ class Body(): '''A class for any object in the mooring system that will have its own reference frame''' - def __init__(self, mooringSys, num, type, r6, m=0, v=0, rCG=np.zeros(3), AWP=0, rM=np.zeros(3), f6Ext=np.zeros(6)): + def __init__(self, mooringSys, num, type, r6, m=0, v=0, rCG=np.zeros(3), AWP=0, rM=np.zeros(3), + f6Ext=np.zeros(6), I=np.zeros(3), CdA=np.zeros(3), Ca=np.zeros(3)): '''Initialize Body attributes Parameters @@ -33,6 +34,12 @@ def __init__(self, mooringSys, num, type, r6, m=0, v=0, rCG=np.zeros(3), AWP=0, coorindates or height of metacenter relative to body reference frame [m]. The default is np.zeros(3). f6Ext : array, optional applied external forces and moments vector in global orientation (not including weight/buoyancy) [N]. The default is np.zeros(6). + I : array, optional + Mass moment of inertia about 3 axes. + CdA : array, optional + Product of drag coefficient and frontal area in three directions [m^2]. + Ca : array, optional + Added mass coefficient in three directions. attachedP: list, int list of ID numbers of any Points attached to the Body rPointRel: list, float @@ -56,15 +63,32 @@ def __init__(self, mooringSys, num, type, r6, m=0, v=0, rCG=np.zeros(3), AWP=0, if np.isscalar(rM): self.rM = np.array([0,0,rM], dtype=np.float_) # coordinates of body metacenter relative to body reference frame [m] else: - self.rM = np.array(rM, dtype=np.float_) + self.rM = np.array(rM, dtype=np.float_) + + # >>> should streamline the below <<< + if np.isscalar(I): + self.I = np.array([I,I,I], dtype=float) + else: + self.I = np.array(I, dtype=float) + + if np.isscalar(CdA): + self.CdA = np.array([CdA,CdA,CdA], dtype=float) + else: + self.CdA = np.array(CdA, dtype=float) + + if np.isscalar(Ca): + self.Ca = np.array([Ca,Ca,Ca], dtype=float) + else: + self.Ca = np.array(Ca, dtype=float) - self.f6Ext = np.array(f6Ext, dtype=np.float_) # for adding external forces and moments in global orientation (not including weight/buoyancy) + self.f6Ext = np.array(f6Ext, dtype=float) # for adding external forces and moments in global orientation (not including weight/buoyancy) self.attachedP = [] # ID numbers of any Points attached to the Body self.rPointRel = [] # coordinates of each attached Point relative to the Body reference frame self.attachedR = [] # ID numbers of any Rods attached to the Body (not yet implemented) + self.r6RodRel = [] # coordinates and unit vector of each attached Rod relative to the Body reference frame self.R = np.eye(3) # body orientation rotation matrix #print("Created Body "+str(self.number)) @@ -89,8 +113,33 @@ def attachPoint(self, pointID, rAttach): self.attachedP.append(pointID) self.rPointRel.append(np.array(rAttach)) - #print("attached Point "+str(pointID)+" to Body "+str(self.number)) + if self.sys.display > 1: + print("attached Point "+str(pointID)+" to Body "+str(self.number)) + + + def attachRod(self, rodID, endCoords): + '''Adds a Point to the Body, at the specified relative position on the body. + + Parameters + ---------- + rodID : int + The identifier ID number of a point + endCoords : array + The position of the Rods two ends relative to the body reference frame [m] + + Returns + ------- + None. + + ''' + k = (endCoords[3:]-endCoords[:3])/np.linalg.norm(endCoords[3:]-endCoords[:3]) + + self.attachedR.append(rodID) + self.r6RodRel.append(np.hstack([ endCoords[:3], k])) + + print("attached Rod "+str(rodID)+" to Body "+str(self.number)) + def setPosition(self, r6): '''Sets the position of the Body, along with that of any dependent objects. @@ -122,6 +171,13 @@ def setPosition(self, r6): for PointID,rPointRel in zip(self.attachedP,self.rPointRel): rPoint = np.matmul(self.R, rPointRel) + self.r6[:3] # rPoint = transformPosition(rPointRel, r6) self.sys.pointList[PointID-1].setPosition(rPoint) + + # update the position of any attached Rods + for rodID,r6Rel in zip(self.attachedR,self.r6RodRel): + rA = np.matmul(self.R, r6Rel[:3]) + self.r6[:3] + k = np.matmul(self.R, r6Rel[3:]) + self.sys.rodList[rodID-1].rA = rA + self.sys.rodList[rodID-1].rB = rA + k*self.sys.rodList[rodID-1].L if self.sys.display > 3: printVec(rPoint) @@ -131,6 +187,8 @@ def setPosition(self, r6): def getForces(self, lines_only=False): '''Sums the forces and moments on the Body, including its own plus those from any attached objects. + Forces and moments are aligned with global x/y/z directions but are relative + to the body's local reference point. Parameters ---------- @@ -175,21 +233,19 @@ def getForces(self, lines_only=False): # All forces and moments on the body should now be summed, and are in global/unrotated orientations. - + ''' # For application to the body DOFs, convert the moments to be about the body's local/rotated x/y/z axes <<< do we want this in all cases? rotMat = rotationMatrix(*self.r6[3:]) # get rotation matrix for body moment_about_body_ref = np.matmul(rotMat.T, f6[3:]) # transform moments so that they are about the body's local/rotated axes f6[3:] = moment_about_body_ref # use these moments - - + ''' return f6 def getStiffness(self, X = [], tol=0.0001, dx = 0.1): '''Gets the stiffness matrix of a Body due only to mooring lines with all other objects free to equilibriate. - The rotational indicies of the stiffness matrix correspond to the local/rotated axes of the body rather than - the global x/y/z directions. + The rotational indices of the stiffness matrix correspond to the global x/y/z directions. Parameters ---------- @@ -252,11 +308,11 @@ def getStiffnessA(self, lines_only=False): 6x6 analytic stiffness matrix. ''' - - #print("Getting Body "+str(self.number)+" stiffness matrix...") - + K = np.zeros([6,6]) + + # stiffness contributions from attached points (and any of their attached lines) for PointID,rPointRel in zip(self.attachedP,self.rPointRel): r = rotatePosition(rPointRel, self.r6[3:]) # relative position of Point about body ref point in unrotated reference frame @@ -267,12 +323,12 @@ def getStiffnessA(self, lines_only=False): H = getH(r) K[:3,:3] += K3 K[:3,3:] += np.matmul(K3, H) # only add up one off-diagonal sub-matrix for now, then we'll mirror at the end - K[3:,3:] += np.matmul(np.matmul(H, K3), H.T) + np.matmul( getH(f3), H.T) - #K[3:,3:] += np.matmul(np.matmul(H, K3), H.T) - np.matmul( getH(f3), H) # <<< should be the same - + K[3:,3:] += -np.matmul(getH(f3), H) - np.matmul(H, np.matmul(K3,H)) # updated 2023-05-02 + K[3:,:3] = K[:3,3:].T # copy over other off-diagonal sub-matrix + # body's own stiffness components if lines_only == False: # rotational stiffness effect of weight @@ -288,6 +344,7 @@ def getStiffnessA(self, lines_only=False): K[3:,3:] += Kw + Kb K[2 ,2 ] += Kwp + return K @@ -352,7 +409,3 @@ def redraw(self): ''' return linebit - - -# - \ No newline at end of file diff --git a/MoorPy/moorpy/helpers.py b/MoorPy/moorpy/helpers.py index 90b5e72df..8b2063557 100644 --- a/MoorPy/moorpy/helpers.py +++ b/MoorPy/moorpy/helpers.py @@ -1,8 +1,9 @@ import numpy as np import time - - +import yaml +import os +import re # base class for MoorPy exceptions @@ -71,6 +72,63 @@ def printVec(vec): print( "\t".join(["{:+9.4e}"]*len(vec)).format( *vec )) + +def unitVector(r): + '''Returns the unit vector along the direction of input vector r.''' + + L = np.linalg.norm(r) + + return r/L + + + +def getInterpNums(xlist, xin, istart=0): # should turn into function in helpers + ''' + Paramaters + ---------- + xlist : array + list of x values + xin : float + x value to be interpolated + istart : int + first lower index to try + + Returns + ------- + i : int + lower index to interpolate from + fout : float + fraction to return such that y* = y[i] + fout*(y[i+1]-y[i]) + ''' + + nx = len(xlist) + + if xin <= xlist[0]: # below lowest data point + i = 0 + fout = 0.0 + + elif xlist[-1] <= xin: # above highest data point + i = nx-1 + fout = 0.0 + + else: # within the data range + + # if istart is below the actual value, start with it instead of + # starting at 0 to save time, but make sure it doesn't overstep the array + if xlist[min(istart,nx)] < xin: + i1 = istart + else: + i1 = 0 + + for i in range(i1, nx-1): + if xlist[i+1] > xin: + fout = (xin - xlist[i] )/( xlist[i+1] - xlist[i] ) + break + + return i, fout + + + def getH(r): '''function gets the alternator matrix, H, that when multiplied with a vector, returns the cross product of r and that vector @@ -156,7 +214,7 @@ def transformPosition(rRelPoint, r6): rRelPoint : array x,y,z coordinates of a point relative to a local frame [m] r6 : array - 6DOF position vector of the origin of the local frame, in the global frame coorindates [m] + 6DOF position vector of the origin of the local frame, in the global frame coorindates [m, rad] Returns ------- @@ -200,6 +258,41 @@ def translateForce3to6DOF(r, Fin): return Fout +def set_plot_center(ax, x=None, y=None, z=None): + '''Sets the center point in x and y of a 3d plot''' + + # adjust the center point of the figure if requested, by moving out one of the bounds + if not x is None: + xlims = ax.get_xlim3d() + if x > np.mean(xlims): ax.set_xlim([xlims[0], x + (x - xlims[0])]) + elif x < np.mean(xlims): ax.set_xlim([x - (xlims[1] - x), xlims[1]]) + + if not y is None: + ylims = ax.get_ylim3d() + if y > np.mean(ylims): ax.set_ylim([ylims[0], y + (y - ylims[0])]) + elif y < np.mean(ylims): ax.set_ylim([y - (ylims[1] - y), ylims[1]]) + + if not z is None: + zlims = ax.get_zlim3d() + if z > np.mean(zlims): ax.set_zlim([zlims[0], z + (z - zlims[0])]) + elif z < np.mean(zlims): ax.set_zlim([z - (zlims[1] - z), zlims[1]]) + + # make sure the aspect ratio stays equal + set_axes_equal(ax) + + ''' + # set the AXIS bounds on the axis (changing these bounds can change the perspective of the matplotlib figure) + if xbounds != None: + ax.set_xbound(xbounds[0], xbounds[1]) + ax.autoscale(enable=False, axis='x') + if ybounds != None: + ax.set_ybound(ybounds[0], ybounds[1]) + ax.autoscale(enable=False, axis='y') + if zbounds != None: + ax.set_zbound(zbounds[0], zbounds[1]) + ax.autoscale(enable=False, axis='x') + ''' + def set_axes_equal(ax): '''Sets 3D plot axes to equal scale @@ -221,7 +314,16 @@ def set_axes_equal(ax): ax.set_box_aspect([rangex, rangey, rangez]) # note: this may require a matplotlib update +def quiver_data_to_segments(X, Y, Z, u, v, w, scale=1): + '''function to help with animation of 3d quivers''' + + if scale < 0.0: # negative scale input will be treated as setting the desired RMS quiver length + scale = -scale/np.sqrt(np.mean(u**2 + v**2 + w**2)) + segments = (X, Y, Z, X+u*scale, Y+v*scale, Z+w*scale) + segments = np.array(segments).reshape(6,-1) + return [[[x1, y1, z1], [x2, y2, z2]] for x1, y1, z1, x2, y2, z2 in zip(*list(segments))] + def dsolve2(eval_func, X0, Ytarget=[], step_func=None, args=[], tol=0.0001, ytol=0, maxIter=20, Xmin=[], Xmax=[], a_max=2.0, dX_last=[], stepfac=4, display=0, dodamping=False): @@ -406,7 +508,6 @@ def step_func(X, args, Y, oths, Ytarget, err, tols, iter, maxIter): if display > 2: print(" limiting oscillation with alpha="+str(alpha)) print(f" dX_last was {dX_last}, dX was going to be {dX}, now it'll be {alpha*dX}") - print(f" dX_last was {dX_last/1000}, dX was going to be {dX/1000}, now it'll be {alpha*dX/1000}") dX = alpha*dX # scale down dX @@ -493,6 +594,448 @@ def step_func(X, args, Y, oths, Ytarget, err, tols, iter, maxIter): X = X + dX + # truncate empty parts of these arrays + Xs = Xs [:iter+1] + Es = Es [:iter+1] + dXlist = dXlist [:iter+1] + dXlist2 = dXlist2[:iter+1] return X, Y, dict(iter=iter, err=err, dX=dX_last, oths=oths, Xs=Xs, Es=Es, success=success, dXlist=dXlist, dXlist2=dXlist2) + +def dsolvePlot(info): + '''Plots dsolve or dsolve solution process based on based dict of dsolve output data''' + + import matplotlib.pyplot as plt + + n = info['Xs'].shape[1] # number of variables + + if n < 8: + fig, ax = plt.subplots(2*n, 1, sharex=True) + for i in range(n): + ax[ i].plot(info['Xs'][:info['iter']+1,i]) + ax[n+i].plot(info['Es'][:info['iter']+1,i]) + ax[-1].set_xlabel("iteration") + else: + fig, ax = plt.subplots(n, 2, sharex=True) + for i in range(n): + ax[i,0].plot(info['Xs'][:info['iter']+1,i]) + ax[i,1].plot(info['Es'][:info['iter']+1,i]) + ax[-1,0].set_xlabel("iteration, X") + ax[-1,1].set_xlabel("iteration, Error") + plt.show() + + + +def getLineProps(dnommm, material, lineProps=None, source=None, name="", rho=1025.0, g=9.81, **kwargs): + '''Sets up a dictionary that represents a mooring line type based on the + specified diameter and material type. The returned dictionary can serve as + a MoorPy line type. Data used for determining these properties is a MoorPy + lineTypes dictionary data structure, created by loadLineProps. This data + can be passed in via the lineProps parameter, or a new data set can be + generated based on a YAML filename or dictionary passed in via the source + parameter. The lineProps dictionary should be error-checked at creation, + so it is not error check in this function for efficiency. + + Parameters + ---------- + dnommm : float + nominal diameter [mm]. + material : string + string identifier of the material type be used. + lineProps : dictionary + A MoorPy lineProps dictionary data structure containing the property scaling coefficients. + source : dict or filename (optional) + YAML file name or dictionary containing line property scaling coefficients + name : any dict index (optional) + Identifier for the line type (otherwise will be generated automatically). + rho : float (optional) + Water density used for computing apparent (wet) weight [kg/m^3]. + g : float (optional) + Gravitational constant used for computing weight [m/s^2]. + ''' + + if lineProps==None and source==None: + raise Exception("Either lineProps or source keyword arguments must be provided") + + # deal with the source (is it a dictionary, or reading in a new yaml?) + if not source==None: + lineProps = loadLineProps(source) + if not lineProps==None: + print('Warning: both lineProps and source arguments were passed to getLineProps. lineProps will be ignored.') + + # raise an error if the material isn't in the source dictionary + if not material in lineProps: + raise ValueError(f'Specified mooring line material, {material}, is not in the database.') + + # calculate the relevant properties for this specific line type + mat = lineProps[material] # shorthand for the sub-dictionary of properties for the material in question + d = dnommm*0.001 # convert nominal diameter from mm to m + mass = mat['mass_d2']*d**2 + MBL = mat[ 'MBL_0'] + mat[ 'MBL_d']*d + mat[ 'MBL_d2']*d**2 + mat[ 'MBL_d3']*d**3 + EA = mat[ 'EA_0'] + mat[ 'EA_d']*d + mat[ 'EA_d2']*d**2 + mat[ 'EA_d3']*d**3 + mat['EA_MBL']*MBL + cost =(mat['cost_0'] + mat['cost_d']*d + mat['cost_d2']*d**2 + mat['cost_d3']*d**3 + + mat['cost_mass']*mass + mat['cost_EA']*EA + mat['cost_MBL']*MBL) + + # internally calculate the volumetric diameter using a ratio + d_vol = mat['dvol_dnom']*d # [m] + + # use the volumetric diameter to calculate the apparent weight per unit length + w = (mass - np.pi/4*d_vol**2 *rho)*g + + # stiffness values for viscoelastic approach + EAd = mat['EAd_MBL']*MBL # dynamic stiffness constant: Krd alpha term x MBL [N] + EAd_Lm = mat['EAd_MBL_Lm'] # dynamic stiffness Lm slope: Krd beta term (to be multiplied by mean load) [-] + + # Set up a main identifier for the linetype unless one is provided + if name=="": + typestring = f"{type}{dnommm:.0f}" + else: + typestring = name + + notes = f"made with getLineProps" + + lineType = dict(name=typestring, d_vol=d_vol, m=mass, EA=EA, w=w, + MBL=MBL, EAd=EAd, EAd_Lm=EAd_Lm, input_d=d, + cost=cost, notes=notes, input_type=type, material=material) + + lineType.update(kwargs) # add any custom arguments provided in the call to the lineType's dictionary + + return lineType + + +def loadLineProps(source): + '''Loads a set of MoorPy mooring line property scaling coefficients from + a specified YAML file or passed dictionary. Any coefficients not included + will take a default value (zero for everything except diameter ratio, + which is 1). It returns a dictionary containing the complete mooring line + property scaling coefficient set to use for any provided mooring line types. + + Parameters + ---------- + source : dict or filename + YAML file name or dictionary containing line property scaling coefficients + + Returns + ------- + dictionary + LineProps dictionary listing each supported mooring line type and + subdictionaries of scaling coefficients for each. + ''' + + if type(source) is dict: + source = source + + elif source is None or source=="default": + import os + mpdir = os.path.dirname(os.path.realpath(__file__)) + with open(os.path.join(mpdir,"MoorProps_default.yaml")) as file: + source = yaml.load(file, Loader=yaml.FullLoader) + + elif type(source) is str: + with open(source) as file: + source = yaml.load(file, Loader=yaml.FullLoader) + + else: + raise Exception("loadLineProps supplied with invalid source") + + if 'lineProps' in source: + lineProps = source['lineProps'] + else: + raise Exception("YAML file or dictionary must have a 'lineProps' field containing the data") + + + output = dict() # output dictionary combining default values with loaded coefficients + + # combine loaded coefficients and default values into dictionary that will be saved for each material + for mat, props in lineProps.items(): + output[mat] = {} + output[mat]['mass_d2' ] = getFromDict(props, 'mass_d2') # mass must scale with d^2 + output[mat]['EA_0' ] = getFromDict(props, 'EA_0' , default=0.0) + output[mat]['EA_d' ] = getFromDict(props, 'EA_d' , default=0.0) + output[mat]['EA_d2' ] = getFromDict(props, 'EA_d2' , default=0.0) + output[mat]['EA_d3' ] = getFromDict(props, 'EA_d3' , default=0.0) + output[mat]['EA_MBL' ] = getFromDict(props, 'EA_MBL' , default=0.0) + output[mat]['EAd_MBL' ] = getFromDict(props, 'EAd_MBL' , default=0.0) + output[mat]['EAd_MBL_Lm']= getFromDict(props, 'EAd_MBL_Lm',default=0.0) + + output[mat]['MBL_0' ] = getFromDict(props, 'MBL_0' , default=0.0) + output[mat]['MBL_d' ] = getFromDict(props, 'MBL_d' , default=0.0) + output[mat]['MBL_d2' ] = getFromDict(props, 'MBL_d2' , default=0.0) + output[mat]['MBL_d3' ] = getFromDict(props, 'MBL_d3' , default=0.0) + output[mat]['dvol_dnom'] = getFromDict(props, 'dvol_dnom', default=1.0) + + # special handling if material density is provided + if 'density' in props: + if 'dvol_dnom' in props: + raise ValueError("Only one parameter can be specified to calculate the volumetric diameter. Choose either 'dvol_dnom' or 'density'.") + else: + mass_d2 = output[mat]['mass_d2'] + material_density = getFromDict(props, 'density') + output[mat]['dvol_dnom'] = np.sqrt((mass_d2/material_density)*(4/np.pi)) + + # cost coefficients + output[mat]['cost_0' ] = getFromDict(props, 'cost_0' , default=0.0) + output[mat]['cost_d' ] = getFromDict(props, 'cost_d' , default=0.0) + output[mat]['cost_d2' ] = getFromDict(props, 'cost_d2' , default=0.0) + output[mat]['cost_d3' ] = getFromDict(props, 'cost_d3' , default=0.0) + output[mat]['cost_mass'] = getFromDict(props, 'cost_mass', default=0.0) + output[mat]['cost_EA' ] = getFromDict(props, 'cost_EA' , default=0.0) + output[mat]['cost_MBL' ] = getFromDict(props, 'cost_MBL' , default=0.0) + + return output + + +def getFromDict(dict, key, shape=0, dtype=float, default=None): + ''' + Function to streamline getting values from design dictionary from YAML file, including error checking. + + Parameters + ---------- + dict : dict + the dictionary + key : string + the key in the dictionary + shape : list, optional + The desired shape of the output. If not provided, assuming scalar output. If -1, any input shape is used. + dtype : type + Must be a python type than can serve as a function to format the input value to the right type. + default : number, optional + The default value to fill in if the item isn't in the dictionary. Otherwise will raise error if the key doesn't exist. + ''' + # in future could support nested keys if type(key)==list: ... + + if key in dict: + val = dict[key] # get the value from the dictionary + if shape==0: # scalar input expected + if np.isscalar(val): + return dtype(val) + else: + raise ValueError(f"Value for key '{key}' is expected to be a scalar but instead is: {val}") + elif shape==-1: # any input shape accepted + if np.isscalar(val): + return dtype(val) + else: + return np.array(val, dtype=dtype) + else: + if np.isscalar(val): # if a scalar value is provided and we need to produce an array (of any shape) + return np.tile(dtype(val), shape) + + elif np.isscalar(shape): # if expecting a 1D array + if len(val) == shape: + return np.array([dtype(v) for v in val]) + else: + raise ValueError(f"Value for key '{key}' is not the expected size of {shape} and is instead: {val}") + + else: # must be expecting a multi-D array + vala = np.array(val, dtype=dtype) # make array + + if list(vala.shape) == shape: # if provided with the right shape + return vala + elif len(shape) > 2: + raise ValueError("Function getFromDict isn't set up for shapes larger than 2 dimensions") + elif vala.ndim==1 and len(vala)==shape[1]: # if we expect an MxN array, and an array of size N is provided, tile it M times + return np.tile(vala, [shape[0], 1] ) + else: + raise ValueError(f"Value for key '{key}' is not a compatible size for target size of {shape} and is instead: {val}") + + else: + if default == None: + raise ValueError(f"Key '{key}' not found in input file...") + else: + if shape==0 or shape==-1: + return default + else: + return np.tile(default, shape) + + +def addToDict(dict1, dict2, key1, key2, default=None): + ''' + Function to streamline getting values from one dictionary and + putting them in another dictionary (potentially under a different key), + including error checking. + + Parameters + ---------- + dict1 : dict + the input dictionary + dict2 : dict + the output dictionary + key1 : string + the key in the input dictionary + key2 : string + the key in the output dictionary + default : number, optional + The default value to fill in if the item isn't in the input dictionary. + Otherwise will raise error if the key doesn't exist. + ''' + + if key1 in dict1: + val = dict1[key1] + else: + if default == None: + raise ValueError(f"Key '{key1}' not found in input dictionary...") + else: + val = default + + dict2[key2] = val + + +def makeTower(twrH, twrRad): + '''Sets up mesh points for visualizing a cylindrical structure (should align with RAFT eventually.''' + + n = 8 + X = [] + Y = [] + Z = [] + ax=np.zeros(n+1) + ay=np.zeros(n+1) + for jj in range(n+1): + ax[jj] = np.cos(float(jj)/float(n)*2.0*np.pi) + ay[jj] = np.sin(float(jj)/float(n)*2.0*np.pi) + + for ii in range(int(len(twrRad)-1)): + z0 = twrH*float(ii)/float(len(twrRad)-1) + z1 = twrH*float(ii+1)/float(len(twrRad)-1) + for jj in range(n+1): + X.append(twrRad[ii]*ax[jj]) + Y.append(twrRad[ii]*ay[jj]) + Z.append(z0) + X.append(twrRad[ii+1]*ax[jj]) + Y.append(twrRad[ii+1]*ay[jj]) + Z.append(z1) + + Xs = np.array(X) + Ys = np.array(Y) + Zs = np.array(Z) + + return Xs, Ys, Zs + + +def read_mooring_file(dirName,fileName): + # Taken from line system.... maybe should be a helper function? + # load data from time series for single mooring line + + print('attempting to load '+dirName+fileName) + + f = open(dirName+fileName, 'r') + + channels = [] + units = [] + data = [] + i=0 + + for line in f: # loop through lines in file + + if (i == 0): + for entry in line.split(): # loop over the elemets, split by whitespace + channels.append(entry) # append to the last element of the list + + elif (i == 1): + for entry in line.split(): # loop over the elemets, split by whitespace + units.append(entry) # append to the last element of the list + + elif len(line.split()) > 0: + data.append([]) # add a new sublist to the data matrix + import re + r = re.compile(r"(?<=\d)\-(?=\d)") # catch any instances where a large negative exponent has been written with the "E" + line2 = r.sub("E-",line) # and add in the E + + + for entry in line2.split(): # loop over the elemets, split by whitespace + data[-1].append(entry) # append to the last element of the list + + else: + break + + i+=1 + + f.close() # close data file + + # use a dictionary for convenient access of channel columns (eg. data[t][ch['PtfmPitch'] ) + ch = dict(zip(channels, range(len(channels)))) + + data2 = np.array(data) + + data3 = data2.astype(float) + + return data3, ch, channels, units + +def read_output_file(dirName,fileName, skiplines=-1, hasunits=1, chanlim=999, dictionary=True): + + # load data from FAST output file + # looks for channel names, then units (if hasunits==1), then data lines after first skipping [skiplines] lines. + # skiplines == -1 signals to search for first channel names line based on starting channel "Time". + +# print('attempting to load '+dirName+fileName) + f = open(dirName+fileName, 'r') + + channels = [] + units = [] + data = [] + i=0 + + for line in f: # loop through lines in file + + if (skiplines == -1): # special case signalling to search for "Time" at start of channel line + entries = line.split() # split elements by whitespace + print(entries) + if entries[0].count('Time') > 0 or entries[0].count('time') > 0: # if we find the time keyword + skiplines = i + print("got skiplines="+str(i)) + else: + pass + + if (i < skiplines or skiplines < 0): # if we haven't gotten to the first channel line or we're in search mode, skip + pass + + elif (i == skiplines): + for entry in line.split(): # loop over the elemets, split by whitespace + channels.append(entry) # append to the last element of the list + + elif (i == skiplines+1 and hasunits == 1): + for entry in line.split(): # loop over the elemets, split by whitespace + if entry.count('kN') > 0 and entry.count('m') > 0: # correct for a possible weird character + entry = '(kN-m)' + + units.append(entry) # append to the last element of the list + + elif len(line.split()) > 0: + data.append([]) # add a new sublist to the data matrix + + r = re.compile(r"(?<=\d)\-(?=\d)") # catch any instances where a large negative exponent has been written with the "E" + line2 = r.sub("E-",line) # and add in the E + + j=0 + for entry in line2.split(): # loop over the elements, split by whitespace + if j > chanlim: + break + j+=1 + data[-1].append(entry) # append to the last element of the list + + else: + break + + i+=1 + + f.close() # close data file + + + # use a dictionary for convenient access of channel columns (eg. data[t][ch['PtfmPitch'] ) + ch = dict(zip(channels, range(len(channels)))) + + #print ch['WindVxi'] + + data2 = np.array(data) + + data3 = data2.astype(float) + + if dictionary: + dataDict = {} + unitDict = {} + for i in range(len(channels)): + dataDict[channels[i]] = data3[:,i] + unitDict[channels[i]] = units[i] + return dataDict, unitDict + else: + return data3, ch, channels, units \ No newline at end of file diff --git a/MoorPy/moorpy/line.py b/MoorPy/moorpy/line.py index eca86706d..9b20252e4 100644 --- a/MoorPy/moorpy/line.py +++ b/MoorPy/moorpy/line.py @@ -1,16 +1,19 @@ - +import pdb import numpy as np from matplotlib import cm from moorpy.Catenary import catenary -from moorpy.helpers import LineError, CatenaryError, rotationMatrix - +from moorpy.nonlinear import nonlinear +from moorpy.helpers import (unitVector, LineError, CatenaryError, + rotationMatrix, makeTower, read_mooring_file, + quiver_data_to_segments, printVec, printMat) +from os import path class Line(): '''A class for any mooring line that consists of a single material''' - def __init__(self, mooringSys, num, L, lineTypeName, nSegs=100, cb=0, isRod=0, attachments = [0,0]): + def __init__(self, mooringSys, num, L, lineType, nSegs=100, cb=0, isRod=0, attachments = [0,0]): '''Initialize Line attributes Parameters @@ -21,8 +24,8 @@ def __init__(self, mooringSys, num, L, lineTypeName, nSegs=100, cb=0, isRod=0, a indentifier number L : float line unstretched length [m] - lineTypeName : string - string identifier of LineType object that this Line is to be + lineType : dict + dictionary containing the coefficients needed to describe the line (could reference an entry of System.lineTypes). nSegs : int, optional number of segments to split the line into. Used in MoorPy just for plotting. The default is 100. cb : float, optional @@ -30,7 +33,7 @@ def __init__(self, mooringSys, num, L, lineTypeName, nSegs=100, cb=0, isRod=0, a isRod : boolean, optional determines whether the line is a rod or not. The default is 0. attachments : TYPE, optional - ID numbers of any Points attached to the Line. The default is [0,0]. + ID numbers of any Points attached to the Line. The default is [0,0]. << consider removing Returns ------- @@ -43,12 +46,15 @@ def __init__(self, mooringSys, num, L, lineTypeName, nSegs=100, cb=0, isRod=0, a self.number = num self.isRod = isRod + self.L = L # line unstretched length (may be modified if using nonlinear elasticity) [m] + self.L0 = L # line reference unstretched length [m] + self.type = lineType # dictionary of a System.lineTypes entry - self.L = L # line unstretched length - self.type = lineTypeName # string that should match a lineTypes dict entry + self.EA = self.type['EA'] # use the default stiffness value for now (may be modified if using nonlinear elasticity) [N] self.nNodes = int(nSegs) + 1 self.cb = float(cb) # friction coefficient (will automatically be set negative if line is fully suspended) + self.sbnorm = [] # Seabed Normal Vector (to be filled with a 3x1 normal vector describing seabed orientation) self.rA = np.zeros(3) # end coordinates self.rB = np.zeros(3) @@ -56,7 +62,7 @@ def __init__(self, mooringSys, num, L, lineTypeName, nSegs=100, cb=0, isRod=0, a self.fB = np.zeros(3) #Perhaps this could be made less intrusive by defining it using a line.addpoint() method instead, similar to point.attachline(). - self.attached = attachments # ID numbers of the Points at the Line ends [a,b] >>> NOTE: not fully supported <<<< + #self.attached = attachments # ID numbers of the Points at the Line ends [a,b] >>> NOTE: not fully supported <<<< self.th = 0 # heading of line from end A to B self.HF = 0 # fairlead horizontal force saved for next solve self.VF = 0 # fairlead vertical force saved for next solve @@ -65,206 +71,306 @@ def __init__(self, mooringSys, num, L, lineTypeName, nSegs=100, cb=0, isRod=0, a self.info = {} # to hold all info provided by catenary self.qs = 1 # flag indicating quasi-static analysis (1). Set to 0 for time series data - + self.show = True # a flag that will be set to false if we don't want to show the line (e.g. if results missing) #print("Created Line "+str(self.number)) + self.color = 'k' + self.lw=0.5 + + self.fCurrent = np.zeros(3) # total current force vector on the line [N] - def loadData(self, dirname, rootname): + def loadData(self, dirname, rootname, sep='.MD.'): '''Loads line-specific time series data from a MoorDyn output file''' self.qs = 0 # signals time series data - - # load time series data - if self.isRod > 0: - data, ch, channels, units = self.read_mooring_file(dirname+rootname+".MD.", "Rod"+str(self.number)+".out") # remember number starts on 1 rather than 0 - else: - data, ch, channels, units = self.read_mooring_file(dirname+rootname+".MD.", "Line"+str(self.number)+".out") # remember number starts on 1 rather than 0 - - # get time info - if ("Time" in ch): - self.Tdata = data[:,ch["Time"]] - self.dt = self.Tdata[1]-self.Tdata[0] - else: - raise LineError("loadData: could not find Time channel for mooring line "+str(self.number)) - - - nT = len(self.Tdata) # number of time steps - # check for position data <<<<<< + if self.isRod==1: + strtype='Rod' + elif self.isRod==0: + strtype='Line' + + filename = dirname+rootname+sep+strtype+str(self.number)+'.out' - self.xp = np.zeros([nT,self.nNodes]) - self.yp = np.zeros([nT,self.nNodes]) - self.zp = np.zeros([nT,self.nNodes]) + if path.exists(filename): + + + # try: + # load time series data + data, ch, channels, units = read_mooring_file("", filename) # remember number starts on 1 rather than 0 + + # get time info + if ("Time" in ch): + self.Tdata = data[:,ch["Time"]] + self.dt = self.Tdata[1]-self.Tdata[0] + else: + raise LineError("loadData: could not find Time channel for mooring line "+str(self.number)) - for i in range(self.nNodes): - self.xp[:,i] = data[:, ch['Node'+str(i)+'px']] - self.yp[:,i] = data[:, ch['Node'+str(i)+'py']] - self.zp[:,i] = data[:, ch['Node'+str(i)+'pz']] - if self.isRod==0: - self.Te = np.zeros([nT,self.nNodes-1]) # read in tension data if available - if "Seg1Te" in ch: + nT = len(self.Tdata) # number of time steps + + # check for position data <<<<<< + + self.xp = np.zeros([nT,self.nNodes]) + self.yp = np.zeros([nT,self.nNodes]) + self.zp = np.zeros([nT,self.nNodes]) + + + for i in range(self.nNodes): + self.xp[:,i] = data[:, ch['Node'+str(i)+'px']] + self.yp[:,i] = data[:, ch['Node'+str(i)+'py']] + self.zp[:,i] = data[:, ch['Node'+str(i)+'pz']] + + ''' + if self.isRod==0: + self.Te = np.zeros([nT,self.nNodes-1]) # read in tension data if available + if "Seg1Te" in ch: + for i in range(self.nNodes-1): + self.Te[:,i] = data[:, ch['Seg'+str(i+1)+'Te']] + + self.Ku = np.zeros([nT,self.nNodes]) # read in curvature data if available + if "Node0Ku" in ch: + for i in range(self.nNodes): + self.Ku[:,i] = data[:, ch['Node'+str(i)+'Ku']] + else: + # read in Rod buoyancy force data if available + if "Node0Box" in ch: + self.Bx = np.zeros([nT,self.nNodes]) + self.By = np.zeros([nT,self.nNodes]) + self.Bz = np.zeros([nT,self.nNodes]) + for i in range(self.nNodes): + self.Bx[:,i] = data[:, ch['Node'+str(i)+'Box']] + self.By[:,i] = data[:, ch['Node'+str(i)+'Boy']] + self.Bz[:,i] = data[:, ch['Node'+str(i)+'Boz']] + + if "Node0Ux" in ch: + self.Ux = np.zeros([nT,self.nNodes]) # read in fluid velocity data if available + self.Uy = np.zeros([nT,self.nNodes]) + self.Uz = np.zeros([nT,self.nNodes]) + for i in range(self.nNodes): + self.Ux[:,i] = data[:, ch['Node'+str(i)+'Ux']] + self.Uy[:,i] = data[:, ch['Node'+str(i)+'Uy']] + self.Uz[:,i] = data[:, ch['Node'+str(i)+'Uz']] + + #Read in tension data if available + if "Seg1Ten" in ch: + self.Ten = np.zeros([nT,self.nNodes-1]) + for i in range(self.nNodes-1): + self.Ten[:,i] = data[:, ch['Seg'+str(i+1)+'Ten']] + ''' + + + + # --- Read in additional data if available --- + + # segment tension <<< to be changed to nodal tensions in future MD versions + if "Seg1Ten" in ch: + self.Tendata = True + self.Te = np.zeros([nT,self.nNodes-1]) + for i in range(self.nNodes-1): + self.Te[:,i] = data[:, ch['Seg'+str(i+1)+'Ten']] + elif "Seg1Te" in ch: + self.Tendata = True + self.Te = np.zeros([nT,self.nNodes-1]) for i in range(self.nNodes-1): self.Te[:,i] = data[:, ch['Seg'+str(i+1)+'Te']] - - self.Ku = np.zeros([nT,self.nNodes]) # read in curvature data if available + else: + self.Tendata = False + + # curvature at node if "Node0Ku" in ch: + self.Kudata = True + self.Ku = np.zeros([nT,self.nNodes]) for i in range(self.nNodes): self.Ku[:,i] = data[:, ch['Node'+str(i)+'Ku']] - - self.Ux = np.zeros([nT,self.nNodes]) # read in fluid velocity data if available - self.Uy = np.zeros([nT,self.nNodes]) - self.Uz = np.zeros([nT,self.nNodes]) - if "Node0Ux" in ch: - for i in range(self.nNodes): - self.Ux[:,i] = data[:, ch['Node'+str(i)+'Ux']] - self.Uy[:,i] = data[:, ch['Node'+str(i)+'Uy']] - self.Uz[:,i] = data[:, ch['Node'+str(i)+'Uz']] - - - self.xpi= self.xp[0,:] - self.ypi= self.yp[0,:] - self.zpi= self.zp[0,:] - - # calculate the dynamic LBot !!!!!!! doesn't work for sloped bathymetry yet !!!!!!!!!! - for i in range(len(self.zp[0])): - if np.max(self.zp[:,i]) > self.zp[0,0]: - inode = i - break else: - inode = i - self.LBotDyn = (inode-1)*self.L/(self.nNodes-1) - - # get length (constant) - self.L = np.sqrt( (self.xpi[-1]-self.xpi[0])**2 + (self.ypi[-1]-self.ypi[0])**2 + (self.zpi[-1]-self.zpi[0])**2 ) - # ^^^^^^^ why are we changing the self.L value to not the unstretched length specified in MoorDyn? - # moved this below the dynamic LBot calculation because I wanted to use the original self.L - - - # check for tension data <<<<<<< - - def read_mooring_file(self, dirName,fileName): - - # load data from time series for single mooring line - - print('attempting to load '+dirName+fileName) - - f = open(dirName+fileName, 'r') - - channels = [] - units = [] - data = [] - i=0 - - for line in f: # loop through lines in file - - if (i == 0): - for entry in line.split(): # loop over the elemets, split by whitespace - channels.append(entry) # append to the last element of the list - - elif (i == 1): - for entry in line.split(): # loop over the elemets, split by whitespace - units.append(entry) # append to the last element of the list - - elif len(line.split()) > 0: - data.append([]) # add a new sublist to the data matrix - import re - r = re.compile(r"(?<=\d)\-(?=\d)") # catch any instances where a large negative exponent has been written with the "E" - line2 = r.sub("E-",line) # and add in the E + self.Kudata = False + + # water velocity data + if "Node0Ux" in ch: + self.Udata = True + self.Ux = np.zeros([nT,self.nNodes]) + self.Uy = np.zeros([nT,self.nNodes]) + self.Uz = np.zeros([nT,self.nNodes]) + for i in range(self.nNodes): + self.Ux[:,i] = data[:, ch['Node'+str(i)+'Ux']] + self.Uy[:,i] = data[:, ch['Node'+str(i)+'Uy']] + self.Uz[:,i] = data[:, ch['Node'+str(i)+'Uz']] + else: + self.Udata = False + # buoyancy force data + if "Node0Box" in ch: + self.Bdata = True + self.Bx = np.zeros([nT,self.nNodes]) + self.By = np.zeros([nT,self.nNodes]) + self.Bz = np.zeros([nT,self.nNodes]) + for i in range(self.nNodes): + self.Bx[:,i] = data[:, ch['Node'+str(i)+'Box']] + self.By[:,i] = data[:, ch['Node'+str(i)+'Boy']] + self.Bz[:,i] = data[:, ch['Node'+str(i)+'Boz']] + else: + self.Bdata = False - for entry in line2.split(): # loop over the elemets, split by whitespace - data[-1].append(entry) # append to the last element of the list + # hydro drag data + if "Node0Dx" in ch: + self.Ddata = True + self.Dx = np.zeros([nT,self.nNodes]) # read in fluid velocity data if available + self.Dy = np.zeros([nT,self.nNodes]) + self.Dz = np.zeros([nT,self.nNodes]) + for i in range(self.nNodes): + self.Dx[:,i] = data[:, ch['Node'+str(i)+'Dx']] + self.Dy[:,i] = data[:, ch['Node'+str(i)+'Dy']] + self.Dz[:,i] = data[:, ch['Node'+str(i)+'Dz']] + else: + self.Ddata = False + # weight data + if "Node0Wx" in ch: + self.Wdata = True + self.Wx = np.zeros([nT,self.nNodes]) # read in fluid velocity data if available + self.Wy = np.zeros([nT,self.nNodes]) + self.Wz = np.zeros([nT,self.nNodes]) + for i in range(self.nNodes): + self.Wx[:,i] = data[:, ch['Node'+str(i)+'Wx']] + self.Wy[:,i] = data[:, ch['Node'+str(i)+'Wy']] + self.Wz[:,i] = data[:, ch['Node'+str(i)+'Wz']] else: - break - - i+=1 - - f.close() # close data file - - # use a dictionary for convenient access of channel columns (eg. data[t][ch['PtfmPitch'] ) - ch = dict(zip(channels, range(len(channels)))) - - data2 = np.array(data) - - data3 = data2.astype(float) + self.Wdata = False + + + + # initialize positions (is this used?) + self.xpi= self.xp[0,:] + self.ypi= self.yp[0,:] + self.zpi= self.zp[0,:] + + # calculate the dynamic LBot !!!!!!! doesn't work for sloped bathymetry yet !!!!!!!!!! + for i in range(len(self.zp[0])): + if np.max(self.zp[:,i]) > self.zp[0,0]: + inode = i + break + else: + inode = i + self.LBotDyn = (inode-1)*self.L/(self.nNodes-1) + + # get length (constant) + #self.L = np.sqrt( (self.xpi[-1]-self.xpi[0])**2 + (self.ypi[-1]-self.ypi[0])**2 + (self.zpi[-1]-self.zpi[0])**2 ) + # ^^^^^^^ why are we changing the self.L value to not the unstretched length specified in MoorDyn? + # moved this below the dynamic LBot calculation because I wanted to use the original self.L + # >>> this is probably needed for Rods - should look into using for Rods only <<< + + # check for tension data <<<<<<< + + self.show = True + + else: + self.Tdata = [] + self.show = False + print(f"Error geting data for {'Rod' if self.isRod else 'Line'} {self.number}: {filename}") + print("dirname: {} or rootname: {} is incorrect".format(dirname, rootname)) + + + # >>> this was another option for handling issues - maybe no longer needed <<< + #except Exception as e: + # # don't fail if there's an issue finding data, just flag that the line shouldn't be shown/plotted + # print(f"Error geting data for {'Rod' if self.isRod else 'Line'} {self.number}: ") + # print(e) + # self.show = False - return data3, ch, channels, units - - + def setL(self, L): + '''Sets the line unstretched length [m], and saves it for use with + static-dynamic stiffness adjustments. Also reverts to static + stiffness to avoid an undefined state of having changing the line + length in a state with adjusted dynamic EA and L values.''' + self.L = L + self.L0 = L + self.revertToStaticStiffness() + + def getTimestep(self, Time): '''Get the time step to use for showing time series data''' if Time < 0: - ts = np.int(-Time) # negative value indicates passing a time step index + ts = np.int_(-Time) # negative value indicates passing a time step index else: # otherwise it's a time in s, so find closest time step - for index, item in enumerate(self.Tdata): - #print "index is "+str(index)+" and item is "+str(item) - ts = -1 - if item > Time: - ts = index - break - if ts==-1: - raise LineError("getTimestep: requested time likely out of range") + if len(self.Tdata) > 0: + for index, item in enumerate(self.Tdata): + ts = -1 + if item > Time: + ts = index + break + if ts==-1: + raise LineError(self.number, "getTimestep: requested time likely out of range") + else: + raise LineError(self.number, "getTimestep: zero time steps are stored") - return ts - def getLineCoords(self, Time, n=0): # formerly UpdateLine + def getLineCoords(self, Time, n=0, segmentTensions=False): '''Gets the updated line coordinates for drawing and plotting purposes.''' if n==0: n = self.nNodes - # if a quasi-static analysis, just call the catenary function to return the line coordinates - if self.qs==1: - - depth = self.sys.depth + # special temporary case to draw a rod for visualization. This assumes the rod end points have already been set somehow + if self.qs==1 and self.isRod > 0: - dr = self.rB - self.rA - LH = np.hypot(dr[0], dr[1]) # horizontal spacing of line ends - LV = dr[2] # vertical offset from end A to end B + # make points for appropriately sized cylinder + d = self.type['d_vol'] + Xs, Ys, Zs = makeTower(self.L, np.array([d/2, d/2])) # add in makeTower method once you start using Rods + + # get unit vector and orientation matrix + k = (self.rB-self.rA)/self.L + Rmat = np.array(rotationMatrix(0, np.arctan2(np.hypot(k[0],k[1]), k[2]), np.arctan2(k[1],k[0]))) + + # translate and rotate into proper position for Rod + coords = np.vstack([Xs, Ys, Zs]) + newcoords = np.matmul(Rmat,coords) + Xs = newcoords[0,:] + self.rA[0] + Ys = newcoords[1,:] + self.rA[1] + Zs = newcoords[2,:] + self.rA[2] - if np.min([self.rA[2],self.rB[2]]) > -depth: - self.cb = -depth - np.min([self.rA[2],self.rB[2]]) # if this line's lower end is off the seabed, set cb negative and to the distance off the seabed - elif self.cb < 0: # if a line end is at the seabed, but the cb is still set negative to indicate off the seabed - self.cb = 0.0 # set to zero so that the line includes seabed interaction. + return Xs, Ys, Zs, None - try: - (fAH, fAV, fBH, fBV, info) = catenary(LH, LV, self.L, self.sys.lineTypes[self.type].EA, - self.sys.lineTypes[self.type].w, self.cb, HF0=self.HF, VF0=self.VF, nNodes=n, plots=1) - except CatenaryError as error: - raise LineError(self.number, error.message) + + # if a quasi-static analysis, just call the catenary function to return the line coordinates + elif self.qs==1: + + self.staticSolve(profiles=1) # call with flag to tell Catenary to return node info - Xs = self.rA[0] + info["X"]*dr[0]/LH - Ys = self.rA[1] + info["X"]*dr[1]/LH - Zs = self.rA[2] + info["Z"] - Ts = info["Te"] + #Xs = self.rA[0] + self.info["X"]*self.cosBeta + #Ys = self.rA[1] + self.info["X"]*self.sinBeta + #Zs = self.rA[2] + self.info["Z"] + #Ts = self.info["Te"] + Xs = self.Xs + Ys = self.Ys + Zs = self.Zs + Ts = self.Ts return Xs, Ys, Zs, Ts # otherwise, count on read-in time-series data else: + # figure out what time step to use ts = self.getTimestep(Time) # drawing rods if self.isRod > 0: - k1 = np.array([ self.xp[ts,-1]-self.xp[ts,0], self.yp[ts,-1]-self.yp[ts,0], self.zp[ts,-1]-self.zp[ts,0] ]) / self.length # unit vector + k1 = np.array([ self.xp[ts,-1]-self.xp[ts,0], self.yp[ts,-1]-self.yp[ts,0], self.zp[ts,-1]-self.zp[ts,0] ]) / self.L # unit vector k = np.array(k1) # make copy Rmat = np.array(rotationMatrix(0, np.arctan2(np.hypot(k[0],k[1]), k[2]), np.arctan2(k[1],k[0]))) # <<< should fix this up at some point, MattLib func may be wrong # make points for appropriately sized cylinder - d = self.sys.lineTypes[self.type].d - Xs, Ys, Zs = makeTower(self.length, np.array([d, d])) # add in makeTower method once you start using Rods + d = self.type['d_vol'] + Xs, Ys, Zs = makeTower(self.L, np.array([d/2, d/2])) # add in makeTower method once you start using Rods # translate and rotate into proper position for Rod coords = np.vstack([Xs, Ys, Zs]) @@ -278,7 +384,16 @@ def getLineCoords(self, Time, n=0): # formerly UpdateLine # drawing lines else: - return self.xp[ts,:], self.yp[ts,:], self.zp[ts,:], self.Tdata[ts:] + # handle whether or not there is tension data + try: # use average to go from segment tension to node tensions <<< can skip this once MD is updated to output node tensions + if segmentTensions: + Te = self.Te[ts,:] # return tensions of segments rather than averaging to get tensions of nodes + else: + Te = 0.5*(np.append(self.Te[ts,0], self.Te[ts,:]) +np.append(self.Te[ts,:], self.Te[ts,-1])) + except: # otherwise return zeros to avoid an error (might want a warning in some cases?) + Te = np.zeros(self.nNodes) + + return self.xp[ts,:], self.yp[ts,:], self.zp[ts,:], Te def getCoordinate(self, s, n=100): @@ -299,7 +414,7 @@ def getCoordinate(self, s, n=100): - def drawLine2d(self, Time, ax, color="k", Xuvec=[1,0,0], Yuvec=[0,0,1], colortension=False, cmap='rainbow'): + def drawLine2d(self, Time, ax, color="k", Xuvec=[1,0,0], Yuvec=[0,0,1], Xoff=0, Yoff=0, colortension=False, cmap='rainbow', plotnodes=[], plotnodesline=[], label="", alpha=1.0): '''Draw the line on 2D plot (ax must be 2D) Parameters @@ -342,29 +457,33 @@ def drawLine2d(self, Time, ax, color="k", Xuvec=[1,0,0], Yuvec=[0,0,1], colorten linebit.append(ax.plot(Xs2d[[2*i+1,2*i+3]],Ys2d[[2*i+1,2*i+3]], lw=0.5, color=color)) # end B edges # drawing lines... - else: - + else: + # >>> can probably streamline the next bit of code a fair bit <<< if self.qs==1: - Xs, Ys, Zs, tensions = self.getLineCoords(Time) + Xs, Ys, Zs, Ts = self.getLineCoords(Time) elif self.qs==0: Xs, Ys, Zs, Ts = self.getLineCoords(Time) self.rA = np.array([Xs[0], Ys[0], Zs[0]]) self.rB = np.array([Xs[-1], Ys[-1], Zs[-1]]) - tensions = self.getLineTens() # apply any 3D to 2D transformation here to provide desired viewing angle - Xs2d = Xs*Xuvec[0] + Ys*Xuvec[1] + Zs*Xuvec[2] - Ys2d = Xs*Yuvec[0] + Ys*Yuvec[1] + Zs*Yuvec[2] + Xs2d = Xs*Xuvec[0] + Ys*Xuvec[1] + Zs*Xuvec[2] + Xoff + Ys2d = Xs*Yuvec[0] + Ys*Yuvec[1] + Zs*Yuvec[2] + Yoff if colortension: # if the mooring lines want to be plotted with colors based on node tensions - maxt = np.max(tensions); mint = np.min(tensions) + maxT = np.max(Ts); minT = np.min(Ts) for i in range(len(Xs)-1): # for each node in the line - color_ratio = ((tensions[i] + tensions[i+1])/2 - mint)/(maxt - mint) # ratio of the node tension in relation to the max and min tension + color_ratio = ((Ts[i] + Ts[i+1])/2 - minT)/(maxT - minT) # ratio of the node tension in relation to the max and min tension cmap_obj = cm.get_cmap(cmap) # create a cmap object based on the desired colormap rgba = cmap_obj(color_ratio) # return the rbga values of the colormap of where the node tension is linebit.append(ax.plot(Xs2d[i:i+2], Ys2d[i:i+2], color=rgba)) else: - linebit.append(ax.plot(Xs2d, Ys2d, lw=1, color=color)) # previously had lw=1 (linewidth) + linebit.append(ax.plot(Xs2d, Ys2d, lw=1, color=color, label=label, alpha=alpha)) # previously had lw=1 (linewidth) + + if len(plotnodes) > 0: + for i,node in enumerate(plotnodes): + if self.number==plotnodesline[i]: + linebit.append(ax.plot(Xs2d[node], Ys2d[node], 'o', color=color, markersize=5)) self.linebit = linebit # can we store this internally? @@ -400,6 +519,9 @@ def drawLine(self, Time, ax, color="k", endpoints=False, shadow=True, colortensi list of axes and points on which the line can be plotted ''' + if not self.show: # exit if this line isn't set to be shown + return 0 + if color == 'self': color = self.color # attempt to allow custom colors lw = self.lw @@ -410,6 +532,9 @@ def drawLine(self, Time, ax, color="k", endpoints=False, shadow=True, colortensi if self.isRod > 0: + if color==None: + color = [0.3, 0.3, 0.3] # if no color provided, default to dark grey rather than rainbow rods + Xs, Ys, Zs, Ts = self.getLineCoords(Time) for i in range(int(len(Xs)/2-1)): @@ -418,24 +543,23 @@ def drawLine(self, Time, ax, color="k", endpoints=False, shadow=True, colortensi linebit.append(ax.plot(Xs[[2*i+1,2*i+3]],Ys[[2*i+1,2*i+3]],Zs[[2*i+1,2*i+3]], color=color)) # end B edges # scatter points for line ends - if endpoints == True: - linebit.append(ax.scatter([Xs[0], Xs[-1]], [Ys[0], Ys[-1]], [Zs[0], Zs[-1]], color = color)) + #if endpoints == True: + # linebit.append(ax.scatter([Xs[0], Xs[-1]], [Ys[0], Ys[-1]], [Zs[0], Zs[-1]], color = color)) # drawing lines... else: - + # >>> can probably streamline the next bit of code a fair bit <<< if self.qs==1: # returns the node positions and tensions of the line, doesn't matter what time Xs, Ys, Zs, tensions = self.getLineCoords(Time) elif self.qs==0: # returns the node positions and time data at the given time - Xs, Ys, Zs, Ts = self.getLineCoords(Time) + Xs, Ys, Zs, tensions = self.getLineCoords(Time) self.rA = np.array([Xs[0], Ys[0], Zs[0]]) self.rB = np.array([Xs[-1], Ys[-1], Zs[-1]]) - tensions = self.getLineTens() if colortension: # if the mooring lines want to be plotted with colors based on node tensions - maxt = np.max(tensions); mint = np.min(tensions) + maxT = np.max(tensions); minT = np.min(tensions) for i in range(len(Xs)-1): # for each node in the line - color_ratio = ((tensions[i] + tensions[i+1])/2 - mint)/(maxt - mint) # ratio of the node tension in relation to the max and min tension + color_ratio = ((tensions[i] + tensions[i+1])/2 - minT)/(maxT - minT) # ratio of the node tension in relation to the max and min tension cmap_obj = cm.get_cmap(cmap_tension) # create a cmap object based on the desired colormap rgba = cmap_obj(color_ratio) # return the rbga values of the colormap of where the node tension is linebit.append(ax.plot(Xs[i:i+2], Ys[i:i+2], Zs[i:i+2], color=rgba, zorder=100)) @@ -448,15 +572,25 @@ def drawLine(self, Time, ax, color="k", endpoints=False, shadow=True, colortensi if endpoints == True: linebit.append(ax.scatter([Xs[0], Xs[-1]], [Ys[0], Ys[-1]], [Zs[0], Zs[-1]], color = color)) - # drawing water velocity vectors (not for Rods for now) <<< should handle this better (like in getLineCoords) <<< - if self.qs == 0: + + # draw additional data if available (should make this for rods too eventually - drawn along their axis nodes) + if self.qs == 0: ts = self.getTimestep(Time) - Ux = self.Ux[ts,:] - Uy = self.Uy[ts,:] - Uz = self.Uz[ts,:] - self.Ubits = ax.quiver(Xs, Ys, Zs, Ux, Uy, Uz) # make quiver plot and save handle to line object - + if self.Tendata: + pass + if self.Kudata: + pass + if self.Udata: + self.Ubits = ax.quiver(Xs, Ys, Zs, self.Ux[ts,:], self.Uy[ts,:], self.Uz[ts,:], color="blue") # make quiver plot and save handle to line object + if self.Bdata: + self.Bbits = ax.quiver(Xs, Ys, Zs, self.Bx[ts,:], self.By[ts,:], self.Bz[ts,:], color="red") + if self.Ddata: + self.Dbits = ax.quiver(Xs, Ys, Zs, self.Dx[ts,:], self.Dy[ts,:], self.Dz[ts,:], color="green") + if self.Wdata: + self.Wbits = ax.quiver(Xs, Ys, Zs, self.Wx[ts,:], self.Wy[ts,:], self.Wz[ts,:], color="orange") + + self.linebit = linebit # can we store this internally? self.X = np.array([Xs, Ys, Zs]) @@ -468,7 +602,7 @@ def drawLine(self, Time, ax, color="k", endpoints=False, shadow=True, colortensi - def redrawLine(self, Time, colortension=False, cmap_tension='rainbow'): #, linebit): + def redrawLine(self, Time, colortension=False, cmap_tension='rainbow', drawU=True): #, linebit): '''Update 3D line drawing based on instantaneous position''' linebit = self.linebit @@ -494,12 +628,11 @@ def redrawLine(self, Time, colortension=False, cmap_tension='rainbow'): #, line if colortension: self.rA = np.array([Xs[0], Ys[0], Zs[0]]) # update the line ends based on the MoorDyn data self.rB = np.array([Xs[-1], Ys[-1], Zs[-1]]) - tensions = self.getLineTens() # get the tensions of the line calculated quasi-statically - maxt = np.max(tensions); mint = np.min(tensions) + maxT = np.max(Ts); minT = np.min(Ts) cmap_obj = cm.get_cmap(cmap_tension) # create the colormap object for i in range(len(Xs)-1): # for each node in the line, find the relative tension of the segment based on the max and min tensions - color_ratio = ((tensions[i] + tensions[i+1])/2 - mint)/(maxt - mint) + color_ratio = ((Ts[i] + Ts[i+1])/2 - minT)/(maxT - minT) rgba = cmap_obj(color_ratio) linebit[i][0]._color = rgba # set the color of the segment to a new color based on its updated tension linebit[i][0].set_data(Xs[i:i+2],Ys[i:i+2]) # set the x and y coordinates @@ -511,14 +644,25 @@ def redrawLine(self, Time, colortension=False, cmap_tension='rainbow'): #, line - # drawing water velocity vectors (not for Rods for now) + # draw additional data if available (should make this for rods too eventually - drawn along their axis nodes) if self.qs == 0: - ts = self.getTimestep(Time) - Ux = self.Ux[ts,:] - Uy = self.Uy[ts,:] - Uz = self.Uz[ts,:] - #segments = quiver_data_to_segments(Xs, Ys, Zs, Ux, Uy, Uz, scale=2) - #self.Ubits.set_segments(segments) + ts = self.getTimestep(Time) + s = 0.0002 + + if self.Tendata: + pass + if self.Kudata: + pass + if self.Udata: + self.Ubits.set_segments(quiver_data_to_segments(Xs, Ys, Zs, self.Ux[ts,:], self.Uy[ts,:], self.Uz[ts,:], scale=10.)) + if self.Bdata: + self.Bbits.set_segments(quiver_data_to_segments(Xs, Ys, Zs, self.Bx[ts,:], self.By[ts,:], self.Bz[ts,:], scale=s)) + if self.Ddata: + self.Dbits.set_segments(quiver_data_to_segments(Xs, Ys, Zs, self.Dx[ts,:], self.Dy[ts,:], self.Dz[ts,:], scale=s)) + if self.Wdata: + self.Wbits.set_segments(quiver_data_to_segments(Xs, Ys, Zs, self.Wx[ts,:], self.Wy[ts,:], self.Wz[ts,:], scale=s)) + + return linebit @@ -579,83 +723,192 @@ def staticSolve(self, reset=False, tol=0.0001, profiles=0): ''' - depth = self.sys.depth + # deal with horizontal tension starting point + if self.HF < 0: + raise LineError("Line HF cannot be negative") # this could be a ValueError too... + + if reset==True: # Indicates not to use previous fairlead force values to start catenary + self.HF = 0 # iteration with, and insteady use the default values. - dr = self.rB - self.rA - LH = np.hypot(dr[0], dr[1]) # horizontal spacing of line ends - LV = dr[2] # vertical offset from end A to end B + + # ensure line profile information is computed if needed for computing current loads + if self.sys.currentMod == 1 and profiles == 0: + profiles = 1 - if self.rA[2] < -depth: - raise LineError("Line {} end A is lower than the seabed.".format(self.number)) - elif self.rB[2] < -depth: + # get seabed depth and slope under each line end + depthA, nvecA = self.sys.getDepthFromBathymetry(self.rA[0], self.rA[1]) + depthB, nvecB = self.sys.getDepthFromBathymetry(self.rB[0], self.rB[1]) + + # deal with height off seabed issues + if self.rA[2] < -depthA: + self.rA[2] = -depthA + self.cb = 0 + #raise LineError("Line {} end A is lower than the seabed.".format(self.number)) <<< temporarily adjust to seabed depth + elif self.rB[2] < -depthB: raise LineError("Line {} end B is lower than the seabed.".format(self.number)) - elif np.min([self.rA[2],self.rB[2]]) > -depth: - self.cb = -depth - np.min([self.rA[2],self.rB[2]]) # if this line's lower end is off the seabed, set cb negative and to the distance off the seabed - elif self.cb < 0: # if a line end is at the seabed, but the cb is still set negative to indicate off the seabed - self.cb = 0.0 # set to zero so that the line includes seabed interaction. + else: + self.cb = -depthA - self.rA[2] # when cb < 0, -cb is defined as height of end A off seabed (in catenary) + + # ----- Perform rotation/transformation to 2D plane of catenary ----- - if self.HF < 0: # or self.VF < 0: <<<<<<<<<<< it shouldn't matter if VF is negative - this could happen for buoyant lines, etc. - raise LineError("Line HF cannot be negative") # this could be a ValueError too... - - if reset==True: # Indicates not to use previous fairlead force values to start catenary - self.HF = 0 # iteration with, and insteady use the default values. - - try: - (fAH, fAV, fBH, fBV, info) = catenary(LH, LV, self.L, self.sys.lineTypes[self.type].EA, self.sys.lineTypes[self.type].w, - CB=self.cb, Tol=tol, HF0=self.HF, VF0=self.VF, plots=profiles) # call line model - except CatenaryError as error: - raise LineError(self.number, error.message) + dr = self.rB - self.rA + + # if a current force is present, include it in the catenary solution + if np.sum(np.abs(self.fCurrent)) > 0: + + # total line exernal force per unit length vector (weight plus current drag) + w_vec = self.fCurrent/self.L + np.array([0, 0, -self.type["w"]]) + w = np.linalg.norm(w_vec) + w_hat = w_vec/w - self.th = np.arctan2(dr[1],dr[0]) # probably a more efficient way to handle this <<< + # get rotation matrix from gravity down to w_vec being down + if w_hat[0] == 0 and w_hat[1] == 0: + if w_hat[2] < 0: + R_curr = np.eye(3,3) + else: + R_curr = -np.eye(3,3) + else: + R_curr = RotFrm2Vect(w_hat, np.array([0, 0, -1])) # rotation matrix to make w vertical + + # vector from A to B needs to be put into the rotated frame + dr = np.matmul(R_curr, dr) + + # if no current force, things are simple + else: + R_curr = np.eye(3,3) + w = self.type["w"] + + + # apply a rotation about Z' to align the line profile with the X'-Z' plane + theta_z = -np.arctan2(dr[1], dr[0]) + R_z = rotationMatrix(0, 0, theta_z) + + # overall rotation matrix (global to catenary plane) + R = np.matmul(R_z, R_curr) + + # figure out slope in plane (only if contacting the seabed) + if self.rA[2] <= -depthA or self.rB[2] <= -depthB: + nvecA_prime = np.matmul(R, nvecA) + + dz_dx = -nvecA_prime[0]*(1.0/nvecA_prime[2]) # seabed slope components + dz_dy = -nvecA_prime[1]*(1.0/nvecA_prime[2]) # seabed slope components + # we only care about dz_dx since the line is in the X-Z plane in this rotated situation + alpha = np.degrees(np.arctan(dz_dx)) + cb = self.cb + else: + if np.sum(np.abs(self.fCurrent)) > 0 or nvecA[2] < 1: # if there is current or seabed slope + alpha = 0 + cb = min(0, dr[2]) - 100 # put the seabed out of reach (model limitation) + else: # otherwise proceed as usual (this is the normal case) + alpha = 0 + cb = self.cb + + # horizontal and vertical dimensions of line profile (end A to B) + LH = np.linalg.norm(dr[:2]) + LV = dr[2] + + + # ----- call catenary function or alternative and save results ----- + + #If EA is found in the line properties we will run the original catenary function + if 'EA' in self.type: + try: + (fAH, fAV, fBH, fBV, info) = catenary(LH, LV, self.L, self.EA, w, + CB=cb, alpha=alpha, HF0=self.HF, VF0=self.VF, + Tol=tol, nNodes=self.nNodes, plots=profiles) + except CatenaryError as error: + raise LineError(self.number, error.message) + #If EA isnt found then we will use the ten-str relationship defined in the input file + else: + (fAH, fAV, fBH, fBV, info) = nonlinear(LH, LV, self.L, self.type['Str'], self.type['Ten'],np.linalg.norm(w)) + + + # save line profile coordinates in global frame (involves inverse rotation) + if profiles > 0: + # note: instantiating new arrays rather than writing directly to self.Xs + # seems to be necessary to avoid plots auto-updating to the current + # profile of the Line object. + Xs = np.zeros(self.nNodes) + Ys = np.zeros(self.nNodes) + Zs = np.zeros(self.nNodes) + # apply inverse rotation to node positions + for i in range(0,self.nNodes): + temp_array = np.array([info['X'][i], 0 ,info['Z'][i]]) + unrot_pos = np.matmul(temp_array, R) + + Xs[i] = self.rA[0] + unrot_pos[0] + Ys[i] = self.rA[1] + unrot_pos[1] + Zs[i] = self.rA[2] + unrot_pos[2] + + self.Xs = Xs + self.Ys = Ys + self.Zs = Zs + self.Ts = info["Te"] + + # save fairlead tension components for use as ICs next iteration self.HF = info["HF"] self.VF = info["VF"] - self.KA2 = info["stiffnessA"] - self.KB2 = info["stiffnessB"] + + # save other important info self.LBot = info["LBot"] self.info = info - - self.fA[0] = fAH*dr[0]/LH - self.fA[1] = fAH*dr[1]/LH - self.fA[2] = fAV - self.fB[0] = fBH*dr[0]/LH - self.fB[1] = fBH*dr[1]/LH - self.fB[2] = fBV - self.TA = np.sqrt(fAH*fAH + fAV*fAV) # end tensions - self.TB = np.sqrt(fBH*fBH + fBV*fBV) - # ----- compute 3d stiffness matrix for both line ends (3 DOF + 3 DOF) ----- + # save forces in global reference frame + self.fA = np.matmul(np.array([fAH, 0, fAV]), R) + self.fB = np.matmul(np.array([fBH, 0, fBV]), R) + self.TA = np.linalg.norm(self.fA) # end tensions + self.TB = np.linalg.norm(self.fB) - # solve for required variables to set up the perpendicular stiffness. Keep it horizontal - #L_xy = np.linalg.norm(self.rB[:2] - self.rA[:2]) - #T_xy = np.linalg.norm(self.fB[:2]) + # save 3d stiffness matrix in global orientation for both line ends (3 DOF + 3 DOF) + self.KA = from2Dto3Drotated(info['stiffnessA'], -fBH, LH, R.T) # reaction at A due to motion of A + self.KB = from2Dto3Drotated(info['stiffnessB'], -fBH, LH, R.T) # reaction at B due to motion of B + self.KAB = from2Dto3Drotated(info['stiffnessAB'], fBH, LH, R.T) # reaction at B due to motion of A + + # may want to skip stiffness calcs when just getting profiles for plotting... - # create the rotation matrix based on the heading angle that the line is from the horizontal - R = rotationMatrix(0,0,self.th) - # initialize the line's analytic stiffness matrix in the "in-line" plane then rotate the matrix to be about the global frame [K'] = [R][K][R]^T - def from2Dto3Drotated(K2D, Kt): - K2 = np.array([[K2D[0,0], 0 , K2D[0,1]], - [ 0 , Kt, 0 ], - [K2D[1,0], 0 , K2D[1,1]]]) - return np.matmul(np.matmul(R, K2), R.T) + # ----- calculate current loads if applicable, for use next time ----- - self.KA = from2Dto3Drotated(info['stiffnessA'], -fBH/LH) # stiffness matrix describing reaction force on end A due to motion of end A - self.KB = from2Dto3Drotated(info['stiffnessB'], -fBH/LH) # stiffness matrix describing reaction force on end B due to motion of end B - self.KAB = from2Dto3Drotated(info['stiffnessAB'], fBH/LH) # stiffness matrix describing reaction force on end B due to motion of end A + if self.sys.currentMod == 1: + + U = self.sys.current # 3D current velocity [m/s] (could be changed to depth-dependent profile) + + fCurrent = np.zeros(3) # total current force on line in x, y, z [N] + + # Loop through each segment along the line and add up the drag forces. + # This is in contrast to MoorDyn calculating for nodes. + for i in range(self.nNodes-1): + #For each segment find the tangent vector and then calculate the current loading + dr_seg = np.array([self.Xs[i+1] - self.Xs[i], + self.Ys[i+1] - self.Ys[i], + self.Zs[i+1] - self.Zs[i]]) # segment vector + ds_seg = np.linalg.norm(dr_seg) - #self.K6 = np.block([[ from2Dto3Drotated(self.KA), from2Dto3Drotated(self.KAB.T)], - # [ from2Dto3Drotated(self.KAB), from2Dto3Drotated(self.KB) ]]) - - - + if ds_seg > 0: # only include if segment length > 0 + q = dr_seg/ds_seg + # transverse and axial current velocity components + Uq = np.dot(U, q) * q + Up = U - Uq + # transverse and axial drag forces on segment + dp = 0.5*self.sys.rho*self.type["Cd"] *self.type["d_vol"]*ds_seg*np.linalg.norm(Up)*Up + dq = 0.5*self.sys.rho*self.type["CdAx"]*np.pi*self.type["d_vol"]*ds_seg*np.linalg.norm(Uq)*Uq + # add to total current force on line + fCurrent += dp + dq + + self.fCurrent = fCurrent # save for use next call + else: + self.fCurrent = np.zeros(3) # if no current, ensure this force is zero + + + # ----- plot the profile if requested ----- if profiles > 1: import matplotlib.pyplot as plt - plt.plot(info['X'], info['Z']) + plt.plot(self.info['X'], self.info['Z']) plt.show() - - + + """ These 3 functions no longer used - can delete def getEndForce(self, endB): '''Returns the force of the line at the specified end based on the endB value @@ -684,7 +937,6 @@ def getEndForce(self, endB): raise LineError("getEndForce: endB value has to be either 1 or 0") - def getStiffnessMatrix(self): '''Returns the stiffness matrix of a line derived from analytic terms in the jacobian of catenary @@ -733,33 +985,16 @@ def getStiffnessMatrix(self): KB_rot = np.matmul(np.matmul(R, KB), R.T) return KA_rot, KB_rot - + def getLineTens(self): '''Calls the catenary function to return the tensions of the Line for a quasi-static analysis''' - - # >>> this can probably be done using data already generated by static Solve <<< - - depth = self.sys.depth - - dr = self.rB - self.rA - LH = np.hypot(dr[0], dr[1]) # horizontal spacing of line ends - LV = dr[2] # vertical offset from end A to end B - if np.min([self.rA[2],self.rB[2]]) > -depth: - self.cb = -depth - np.min([self.rA[2],self.rB[2]]) # if this line's lower end is off the seabed, set cb negative and to the distance off the seabed - elif self.cb < 0: # if a line end is at the seabed, but the cb is still set negative to indicate off the seabed - self.cb = 0.0 # set to zero so that the line includes seabed interaction. - - try: - (fAH, fAV, fBH, fBV, info) = catenary(LH, LV, self.L, self.sys.lineTypes[self.type].EA, - self.sys.lineTypes[self.type].w, self.cb, HF0=self.HF, VF0=self.VF, nNodes=self.nNodes, plots=1) - except CatenaryError as error: - raise LineError(self.number, error.message) + self.staticSolve(profiles=1) # call with flag to tell Catenary to return node info (may be unnecessary) - Ts = info["Te"] + Ts = self.info["Te"] return Ts - + """ def getTension(self, s): '''Returns tension at a given point along the line @@ -821,4 +1056,88 @@ def getPosition(self, s): return np.vstack([ Xs, Ys, Zs]) + def attachLine(self, lineID, endB): + pass + + + def activateDynamicStiffness(self, display=0): + '''Switch mooring line model to dynamic line stiffness + value, including potential unstretched line length + adjustment. This only works when dynamic line properties + are used.''' + + if self.type['EAd'] > 0: + # switch to dynamic stiffness value + EA_old = self.type['EA'] + EA_new = self.type['EAd'] + self.type['EAd_Lm']*np.mean([self.TA, self.TB]) # this implements the sloped Krd = alpha + beta*Lm + self.EA = np.max([EA_new, EA_old]) # only if the dynamic stiffness is higher than the static stiffness, activate the dynamic stiffness + + # adjust line length to maintain current tension (approximate) + self.L = self.L0 * (1 + self.TB/EA_old)/(1 + self.TB/EA_new) + + else: + if display > 0: + print(f'Line {self.number} has zero dynamic stiffness coefficient so activateDynamicStiffness does nothing.') + + + def revertToStaticStiffness(self): + '''Switch mooring line model to dynamic line stiffness + values, including potential unstretched line length + adjustment. This only works when dynamic line properties + are used.''' + + # switch to static/default stiffness value + self.EA = self.type['EA'] + + # revert to original line length + self.L = self.L0 + + +def from2Dto3Drotated(K2D, F, L, R): + '''Initialize a line end's analytic stiffness matrix in the + plane of the catenary then rotate the matrix to be about the + global frame using [K'] = [R][K][R]^T + + Parameters + ---------- + K2D : 2x2 matrix + Planar stiffness matrix of line end [N/m] + F : float + Line horizontal tension component [N] + L : float + Line horizontal distance end-to-end [m] + R : 3x3 matrix + Rotation matrix from global frame to plane to the local + X-Z plane of the line + + Returns + ------- + 3x3 stiffness matrix in global orientation [N/m]. + ''' + + if L > 0: + Kt = F/L # transverse stiffness term + else: + Kt = 0.0 + + K2 = np.array([[K2D[0,0], 0 , K2D[0,1]], + [ 0 , Kt, 0 ], + [K2D[1,0], 0 , K2D[1,1]]]) + + return np.matmul(np.matmul(R, K2), R.T) + + + +def RotFrm2Vect( A, B): + '''Rodriguez rotation function, which returns the rotation matrix + that transforms vector A into Vector B. + ''' + v = np.cross(A,B) + ssc = np.array([[0, -v[2], v[1]], + [v[2], 0, -v[0]], + [-v[1], v[0], 0]]) + + R = np.eye(3,3) + ssc + np.matmul(ssc,ssc)*(1-np.dot(A,B))/(np.linalg.norm(v)*np.linalg.norm(v)) + + return R \ No newline at end of file diff --git a/MoorPy/moorpy/lineType.py b/MoorPy/moorpy/lineType.py index 3ae46d873..03b5c7ee7 100644 --- a/MoorPy/moorpy/lineType.py +++ b/MoorPy/moorpy/lineType.py @@ -37,7 +37,7 @@ def __init__(self, name, d, massden, EA, MBL=0.0, cost=0.0, notes="", input_d=0. ''' self.name = name # identifier string self.d = d # volume-equivalent diameter [m] - self.mlin = massden # linear desnity [kg/m] + self.m = massden # linear desnity [kg/m] self.w = (massden - np.pi/4*d*d*1025)*9.81 # wet weight [N/m] self.EA = EA # extensional stiffness [N] self.MBL = MBL # minimum breaking load [N] diff --git a/MoorPy/moorpy/nonlinear.py b/MoorPy/moorpy/nonlinear.py new file mode 100644 index 000000000..204d7bb9f --- /dev/null +++ b/MoorPy/moorpy/nonlinear.py @@ -0,0 +1,164 @@ +import numpy as np +import matplotlib.pyplot as plt +from matplotlib import cm +from moorpy.helpers import CatenaryError + + + +def nonlinear(XF, ZF, L, Str, Ten, W, nNodes=20, plots=0): + ''' + nonlinear mooring line solver. The nonlinear module is assumed to be off of the seafloor, and have no bending. The nonlinear module is called by + putting a tension-strain file in the place of linestiffness (EA). Unlike the catenary solver no iterative method is needed, but this function is heavily + borrows from the catenary function. + + Parameters + ---------- + XF : float + Horizontal distance from end 1 to end 2 [m] + ZF : float + Vertical distance from end 1 to end 2 [m] (positive up) + L : float + Unstretched length of line [m] + Str : dictionary + vector of strains from the tension-strain input file [-] + Ten : dictionary + vector of of tensions from the tension-strain input file [N] + W : float + Weight of line in fluid per unit length [N/m] + nNodes : int, optional + Number of nodes to describe the line + plots : int, optional + 1: plot output, 0: don't + + + Returns + ------- + : tuple + (end 1 horizontal tension, end 1 vertical tension, end 2 horizontal tension, end 2 vertical tension, info dictionary) [N] (positive up) + + ''' + #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + # The following is originally from the catenary.py function but applies to this one aswell + #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + # make info dict to contain any additional outputs + info = dict(error=False) + + # make some arrays if needed for plotting each node + if plots > 0: + s = np.linspace(0,L,nNodes) # Unstretched arc distance along line from anchor to each node where the line position and tension can be output (meters) + Xs= np.zeros(nNodes) # Horizontal locations of each line node relative to the anchor (meters) + Zs= np.zeros(nNodes) # Vertical locations of each line node relative to the anchor (meters) + Te= np.zeros(nNodes) # Effective line tensions at each node (N) + + + # flip line in the solver if it is buoyant + if W < 0: + W = -W + ZF = -ZF + CB = -10000. # <<< TODO: set this to the distance to sea surface <<< + flipFlag = True + else: + flipFlag = False + + # reverse line in the solver if end A is above end B + if ZF < 0: + ZF = -ZF + reverseFlag = True + else: + reverseFlag = False + + # ensure the input variables are realistic + if XF < 0.0: + raise CatenaryError("XF is negative!") + if L <= 0.0: + breakpoint() + raise CatenaryError("L is zero or negative!") + + #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + # New Code + #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + #Determine the stretched length of the nonlinear element based on the horizontal and vertical fairlead excursions + str_L = np.sqrt(XF*XF+ZF*ZF) + + #Based on the stretched length and the horizontal fairlead excursions define cos/sin and products for transformation matrix + #Define cosine and sine + c = XF/str_L + s = ZF/str_L + #Define all the products of sine and cosine + c2 = c*c + s2 = s*s + cs = c*s + + #Determine the strain in the segment with stretched length and original length + str_seg = (str_L/L - 1) + + #Make the input dictionarys for str and ten a vector of floats + Str = [float(x) for x in Str] + Ten = [float(x) for x in Ten] + + #Strain in the line cant be less than zero (cant push a rope so to speak) + if str_seg < 0: + str_seg = 0 + + ten_seg = np.interp(str_seg,Str,Ten) + #small change is strain for a finite difference + d_str = 1e-5 + #finite difference to take derivative of ten-strain curve (dT/dstr = EA) + EA_est = ((np.interp(str_seg+d_str,Str,Ten)-np.interp(str_seg,Str,Ten))/d_str) + + #Breakdown the horizontal components of the tension + FxA = ten_seg*c + FxB = -FxA + + #Breakdown the vertical components of the tension and subtract the weight of the nonlinear element + FzA = ten_seg*s - 0.5*W*L + FzB = -ten_seg*s - 0.5*W*L + + #Tension at both ends of the line + TA = np.sqrt(FxA*FxA + FzA*FzA) + TB = np.sqrt(FxB*FxB + FzB*FzB) + + #Estimate Stiffness Numerically (Potentially find something better) + #could also be hard to do because the input tension strain files are arbitrary + + + + #Stiffness matrcies for the ends of the line (In this case since we already assume the element can only deform axially + # this is essentially just a truss element with the nonlinear stiffness that we calculated + #Ka = (EA_est/L)*np.array([[c2, cs],[cs, s2]]) + #Kb = (EA_est/L)*np.array([[c2, cs],[cs, s2]]) + #Kab = -(EA_est/L)*np.array([[c2, cs],[cs, s2]]) + + Ka = np.array([[c2*(EA_est/str_L)+s2*ten_seg/(L*(1+str_seg)), cs*(EA_est/str_L)-cs*ten_seg/(L*(1+str_seg))],[ cs*(EA_est/str_L)-cs*ten_seg/(L*(1+str_seg)), s2*(EA_est/str_L)+c2*ten_seg/(L*(1+str_seg))]]) + Kb = Ka + Kab = -Ka + + + #Assign values to info + #Fairlead forces + info["HF"] = -FxB + info["VF"] = -FzB + info["HA"] = FxA + info["VA"] = FzA + #Line stiffnesses + info["stiffnessA"] = Ka + info["stiffnessB"] = Kb + info["stiffnessAB"] = Kab + #Length on the bottom is zero as we assumed earlier + info["LBot"] = 0 + #self.info = info + #For plotting (assumed straight line so no issue and tension varies linearly + info["X" ] = np.linspace(0,XF,nNodes) + info["Z" ] = np.linspace(0,ZF,nNodes) + info["s" ] = np.linspace(0,str_L,nNodes) + info["Te"] = np.linspace(TA,TB,nNodes) + + print(info["stiffnessA"]) + print(info["stiffnessB"]) + print(info["stiffnessAB"]) + + + return (FxA, FzA, FxB, FzB, info) + + \ No newline at end of file diff --git a/MoorPy/moorpy/point.py b/MoorPy/moorpy/point.py index 9157f6309..2f4b7b3ad 100644 --- a/MoorPy/moorpy/point.py +++ b/MoorPy/moorpy/point.py @@ -7,7 +7,7 @@ class Point(): '''A class for any object in the mooring system that can be described by three translational coorindates''' - def __init__(self, mooringSys, num, type, r, m=0, v=0, fExt=np.zeros(3), DOFs=[0,1,2]): + def __init__(self, mooringSys, num, type, r, m=0, v=0, fExt=np.zeros(3), DOFs=[0,1,2], d=0, zSpan=[-1,1], CdA=0.0, Ca=0.0): '''Initialize Point attributes Parameters @@ -23,11 +23,21 @@ def __init__(self, mooringSys, num, type, r, m=0, v=0, fExt=np.zeros(3), DOFs=[0 m : float, optional mass [kg]. The default is 0. v : float, optional - volume [m^3]. The default is 0. + submerged volume [m^3]. The default is 0. + CdA : float, optional + Product of drag coefficient and cross sectional area in any direction [m^2]. The default is 0. + Ca : float, optional + Added mass coefficient in any direction. fExt : array, optional applied external force vector in global orientation (not including weight/buoyancy). The default is np.zeros(3). DOFs: list list of which coordinate directions are DOFs for this point (default 0,1,2=x,y,z). E.g. set [2] for vertical motion only. + d : float, optional + diameter [m]. The default is 0. + zSpan : [float, float], optional + The lower and upper limits of the Point's volume relative to its coordinate [m]. + This only affects the change in buoyancy when crossing the free surface. The + default is [-1,1], i.e. a 2-m tall volume. Returns ------- @@ -41,8 +51,10 @@ def __init__(self, mooringSys, num, type, r, m=0, v=0, fExt=np.zeros(3), DOFs=[0 self.type = type # 1: fixed/attached to something, 0 free to move, or -1 coupled externally self.r = np.array(r, dtype=np.float_) - self.m = np.float_(m) - self.v = np.float_(v) + self.m = float(m) + self.v = float(v) + self.CdA= float(CdA) + self.Ca = float(Ca) self.fExt = fExt # external forces plus weight/buoyancy self.fBot = 10.0 # this is a seabed contact force that will be added if a point is specified below the seabed self.zSub = 0.0 # this is the depth that the point is positioned below the seabed (since r[2] will be capped at the depth) @@ -51,10 +63,16 @@ def __init__(self, mooringSys, num, type, r, m=0, v=0, fExt=np.zeros(3), DOFs=[0 self.DOFs = DOFs self.nDOF = len(DOFs) + self.d = d # the diameter of the point, if applicable. Used for hydrostatics [m] self.attached = [] # ID numbers of any Lines attached to the Point self.attachedEndB = [] # specifies which end of the line is attached (1: end B, 0: end A) + if len(zSpan)==2: + self.zSpan = np.array(zSpan, dtype=float) + else: + raise ValueError("Point zSpan parameter must contain two numbers.") + #print("Created Point "+str(self.number)) @@ -127,8 +145,10 @@ def setPosition(self, r): raise ValueError(f"Point setPosition method requires an argument of size 3 or nDOF, but size {len(r):d} was provided") # update the point's depth and position based on relation to seabed - self.zSub = np.max([-self.zTol, -self.r[2] - self.sys.depth]) # depth of submergence in seabed if > -zTol - self.r = np.array([self.r[0], self.r[1], np.max([self.r[2], -self.sys.depth])]) # don't let it sink below the seabed + depth, _ = self.sys.getDepthFromBathymetry(self.r[0], self.r[1]) + + self.zSub = np.max([-self.zTol, -self.r[2] - depth]) # depth of submergence in seabed if > -zTol + self.r = np.array([self.r[0], self.r[1], np.max([self.r[2], -depth])]) # don't let it sink below the seabed # update the position of any attached Line ends for LineID,endB in zip(self.attached,self.attachedEndB): @@ -160,27 +180,42 @@ def getForces(self, lines_only=False, seabed=True, xyz=False): ''' f = np.zeros(3) # create empty force vector on the point - - if lines_only==False: + if lines_only==False: + ''' + radius = self.d/2 # can do this, or find the radius using r=(3*self.v/(4*np.pi))**(1/3) + x = max(0, radius**2 - self.r[2]**2) + dWP = 2*np.sqrt(x) # diameter at the waterplane [m] + AWP = np.pi/4 * dWP**2 # waterplane area [m] + #v_half = (4/3)*np.pi*(np.sqrt(x)**3) * 0.5 # volume of the half sphere that is cut by the waterplane [m^3] + #v = abs(-min(0, np.sign(self.r[2]))*self.v - v_half) # submerged volume of the point [m^3] + ''' f[2] += -self.m*self.sys.g # add weight - - if self.r[2] < -1: # add buoyancy if fully submerged - f[2] += self.v*self.sys.rho*self.sys.g - elif self.r[2] < 1: # imagine a +/-1 m band at z=0 where buoyancy tapers to zero - f[2] += self.v*self.sys.rho*self.sys.g * (0.5 - 0.5*self.r[2]) + + #f[2] += self.v*self.sys.rho*self.sys.g # add buoyancy using submerged volume + + if self.r[2] + self.zSpan[1] < 0.0: # add buoyancy if fully submerged + f[2] += self.v*self.sys.rho*self.sys.g + elif self.r[2] + self.zSpan[0] < 0.0: # add some buoyancy if part-submerged (linear variation, constant Awp) + f[2] += self.v*self.sys.rho*self.sys.g * (self.r[2] + self.zSpan[0])/(self.zSpan[0]-self.zSpan[1]) + # (no buoyancy force added if it's fully out of the water, which would be very exciting for the Point) f += np.array(self.fExt) # add external forces - + #f[2] -= self.sys.rho*self.sys.g*AWP*self.r[2] # hydrostatic heave stiffness + # handle case of Point resting on or below the seabed, to provide a restoring force # add smooth transition to fz=0 at seabed (starts at zTol above seabed) f[2] += max(self.m - self.v*self.sys.rho, 0)*self.sys.g * (self.zSub + self.zTol)/self.zTol - + # add forces from attached lines for LineID,endB in zip(self.attached,self.attachedEndB): - f += self.sys.lineList[LineID-1].getEndForce(endB) - + # f += self.sys.lineList[LineID-1].getEndForce(endB) + if endB: + f += self.sys.lineList[LineID-1].fB + else: + f += self.sys.lineList[LineID-1].fA + if xyz: return f else: @@ -286,9 +321,9 @@ def getStiffnessA(self, lines_only=False, xyz=False): # add seabed or hydrostatic terms if needed if lines_only==False: - # if within a +/-1 m band from z=0, apply a hydrostatic stiffness based on buoyancy - if abs(self.r[2]) < 1: - K[2,2] += self.v*self.sys.rho*self.sys.g * 0.5 + # if partially submerged, apply a hydrostatic stiffness based on buoyancy + if self.r[2] + self.zSpan[1] > 0.0 and self.r[2] + self.zSpan[0] < 0.0: + K[2,2] += self.sys.rho*self.sys.g * self.v/(self.zSpan[1]-self.zSpan[0]) # assumes volume is distributed evenly across zSpan # if less than zTol above the seabed (could even be below the seabed), apply a stiffness (should bring wet weight to zero at seabed) if self.r[2] < self.zTol - self.sys.depth: diff --git a/MoorPy/moorpy/subsystem.py b/MoorPy/moorpy/subsystem.py new file mode 100644 index 000000000..5501f4c65 --- /dev/null +++ b/MoorPy/moorpy/subsystem.py @@ -0,0 +1,141 @@ + +import numpy as np +import yaml + +from moorpy.system import System +from moorpy.body import Body +from moorpy.point import Point +from moorpy.line import Line +from moorpy.lineType import LineType +from moorpy.helpers import (rotationMatrix, rotatePosition, getH, printVec, + set_axes_equal, dsolve2, SolveError, MoorPyError, + loadLineProps, getLineProps, read_mooring_file, + printMat, printVec, getInterpNums, unitVector, + getFromDict, addToDict) + + + +class Subsystem(System, Line): + '''A class for a mooring line or dynamic cable subsystem. + It includes Line sections but also can fit into a larger System + the same way a Line can. + + A subsystem tracks its own objects in its local coordinate system. + This local coordinate system puts the x axis along the line heading, + from anchor to fairlead, with the anchor at x=0. + + For a multi-section line or cable (the main reason to use a SubSystem), + the free DOFs of the points are contained in the SubSystem and are not + seen by the parent System. Solving their equilibrium is an internal + solve nested within the larger System's equilibrium solve. + + Key adjustments: replace staticSolve from Line to do an internal equilibrium solve using System.solveEquilibrium + ''' + + + def __init__(self, depth=0, rho=1025, g=9.81, qs=1, Fortran=True, lineProps=None, **kwargs): + '''Shortened initializer for just the SubSystem aspects.''' + + # lists to hold mooring system objects + self.bodyList = [] + self.rodList = [] + self.pointList = [] + self.lineList = [] + self.lineTypes = {} + self.rodTypes = {} + + # load mooring line property scaling coefficients for easy use when creating line types + self.lineProps = loadLineProps(lineProps) + + # the ground body (number 0, type 1[fixed]) never moves but is the parent of all anchored things + self.groundBody = Body(self, 0, 1, np.zeros(6)) + + # constants used in the analysis + self.depth = depth # water depth [m] + self.rho = rho # water density [kg/m^3] + self.g = g # gravitational acceleration [m/s^2] + + # water current - currentMod 0 = no current; 1 = steady uniform current + self.currentMod = 0 # flag for current model to use + self.current = np.zeros(3) # current velocity vector [m/s] + if 'current' in kwargs: + self.currentMod = 1 + self.current = getFromDict(kwargs, 'current', shape=3) + + # seabed bathymetry - seabedMod 0 = flat; 1 = uniform slope, 2 = grid + self.seabedMod = 0 + + if 'xSlope' in kwargs or 'ySlope' in kwargs: + self.seabedMod = 1 + self.xSlope = getFromDict(kwargs, 'xSlope', default=0) + self.ySlope = getFromDict(kwargs, 'ySlope', default=0) + + if 'bathymetry' in kwargs: + self.seabedMod = 2 + self.bathGrid_Xs, self.bathGrid_Ys, self.bathGrid = self.readBathymetryFile(kwargs['bathymetry']) + + + # initializing variables and lists + self.nDOF = 0 # number of (free) degrees of freedom of the mooring system (needs to be set elsewhere) + self.freeDOFs = [] # array of the values of the free DOFs of the system at different instants (2D list) + + self.nCpldDOF = 0 # number of (coupled) degrees of freedom of the mooring system (needs to be set elsewhere) + self.cpldDOFs = [] # array of the values of the coupled DOFs of the system at different instants (2D list) + + self.display = 0 # a flag that controls how much printing occurs in methods within the System (Set manually. Values > 0 cause increasing output.) + + self.MDoptions = {} # dictionary that can hold any MoorDyn options read in from an input file, so they can be saved in a new MD file if need be + + + + def setEndPosition(self, r, endB): + '''Sets the end position of the line based on the input endB value. + + Parameters + ---------- + r : array + x,y,z coorindate position vector of the line end [m]. + endB : boolean + An indicator of whether the r array is at the end or beginning of the line + + Raises + ------ + LineError + If the given endB value is not a 1 or 0 + + Returns + ------- + None. + + ''' + + if endB == 1: + self.rB = np.array(r, dtype=np.float_) + elif endB == 0: + self.rA = np.array(r, dtype=np.float_) + else: + raise LineError("setEndPosition: endB value has to be either 1 or 0") + + + def staticSolve(self, reset=False, tol=0.0001, profiles=0): + + # transform end positions to SubSystem internal coordinate system + # inputs are self.rA, rB in global frame + # outputs should be pointList[0] and [N] .r + + # get equilibrium + self(System).solveEquilibrium(...) + + # transform coordinates and forces back into global frame + + + def getDOFs(self): + '''need any wrapper or custom function here?''' + + def drawLine2d(self, Time, ax, color="k", Xuvec=[1,0,0], Yuvec=[0,0,1], Xoff=0, Yoff=0, colortension=False, cmap='rainbow', plotnodes=[], plotnodesline=[], label="", alpha=1.0): + '''wrapper to System.plot2d with some transformation applied''' + + + def drawLine(self, Time, ax, color="k", endpoints=False, shadow=True, colortension=False, cmap_tension='rainbow'): + '''wrapper to System.plot with some transformation applied''' + diff --git a/MoorPy/moorpy/system.py b/MoorPy/moorpy/system.py index 94723573a..014bdb66b 100644 --- a/MoorPy/moorpy/system.py +++ b/MoorPy/moorpy/system.py @@ -8,6 +8,7 @@ from mpl_toolkits.mplot3d.art3d import Poly3DCollection import yaml import warnings +from os import path from scipy.sparse import csr_matrix from scipy.sparse.linalg import spsolve @@ -19,7 +20,11 @@ from moorpy.lineType import LineType import matplotlib as mpl #import moorpy.MoorSolve as msolve -from moorpy.helpers import rotationMatrix, rotatePosition, getH, printVec, set_axes_equal, dsolve2, SolveError, MoorPyError +from moorpy.helpers import (rotationMatrix, rotatePosition, getH, printVec, + set_axes_equal, dsolve2, SolveError, MoorPyError, + loadLineProps, getLineProps, read_mooring_file, + printMat, printVec, getInterpNums, unitVector, + getFromDict, addToDict) @@ -29,7 +34,7 @@ class System(): # >>> note: system module will need to import Line, Point, Body for its add/creation routines # (but line/point/body modules shouldn't import system) <<< - def __init__(self, file="", dirname="", rootname="", depth=0, rho=1025, g=9.81, qs=1): + def __init__(self, file="", dirname="", rootname="", depth=0, rho=1025, g=9.81, qs=1, Fortran=True, lineProps=None, **kwargs): '''Creates an empty MoorPy mooring system data structure and will read an input file if provided. Parameters @@ -51,10 +56,15 @@ def __init__(self, file="", dirname="", rootname="", depth=0, rho=1025, g=9.81, # lists to hold mooring system objects self.bodyList = [] - # self.RodList = [] <<< TODO: add support for Rods eventually, for compatability with MoorDyn systems + self.rodList = [] # note: Rods are currently only fully supported when plotting MoorDyn output, not in MoorPy modeling + # <<< TODO: add support for Rods eventually, for compatability with MoorDyn systems self.pointList = [] self.lineList = [] self.lineTypes = {} + self.rodTypes = {} + + # load mooring line property scaling coefficients for easy use when creating line types + self.lineProps = loadLineProps(lineProps) # the ground body (number 0, type 1[fixed]) never moves but is the parent of all anchored things self.groundBody = Body(self, 0, 1, np.zeros(6)) # <<< implementation not complete <<<< be careful here if/when MoorPy is split up @@ -64,6 +74,27 @@ def __init__(self, file="", dirname="", rootname="", depth=0, rho=1025, g=9.81, self.rho = rho # water density [kg/m^3] self.g = g # gravitational acceleration [m/s^2] + # water current - currentMod 0 = no current; 1 = steady uniform current + self.currentMod = 0 # flag for current model to use + self.current = np.zeros(3) # current velocity vector [m/s] + if 'current' in kwargs: + self.currentMod = 1 + self.current = getFromDict(kwargs, 'current', shape=3) + + # seabed bathymetry - seabedMod 0 = flat; 1 = uniform slope, 2 = grid + self.seabedMod = 0 + + if 'xSlope' in kwargs or 'ySlope' in kwargs: + self.seabedMod = 1 + self.xSlope = getFromDict(kwargs, 'xSlope', default=0) + self.ySlope = getFromDict(kwargs, 'ySlope', default=0) + + if 'bathymetry' in kwargs: + self.seabedMod = 2 + self.bathGrid_Xs, self.bathGrid_Ys, self.bathGrid = self.readBathymetryFile(kwargs['bathymetry']) + + + # initializing variables and lists self.nDOF = 0 # number of (free) degrees of freedom of the mooring system (needs to be set elsewhere) self.freeDOFs = [] # array of the values of the free DOFs of the system at different instants (2D list) @@ -72,6 +103,9 @@ def __init__(self, file="", dirname="", rootname="", depth=0, rho=1025, g=9.81, self.display = 0 # a flag that controls how much printing occurs in methods within the System (Set manually. Values > 0 cause increasing output.) + self.MDoptions = {} # dictionary that can hold any MoorDyn options read in from an input file, so they can be saved in a new MD file if need be + + # read in data from an input file if a filename was provided if len(file) > 0: self.load(file) @@ -79,16 +113,33 @@ def __init__(self, file="", dirname="", rootname="", depth=0, rho=1025, g=9.81, # set the quasi-static/dynamic toggle for the entire mooring system self.qs = qs if self.qs==0: # if the mooring system is desired to be used as a portrayal of MoorDyn data - if len(file)==0 or len(dirname)==0 or len(rootname)==0: - raise ValueError("The directory location of the MoorDyn output files needs to be given OR the name of the .fst file needs to be given, without the .fst") + # Load main mooring file + if Fortran: + self.loadData(dirname, rootname, sep='.MD.') + else: + self.loadData(dirname, rootname, sep='_') + + if len(file)==0 or len(rootname)==0: + raise ValueError("The MoorDyn input file name and the root name of the MoorDyn output files (e.g. the .fst file name without extension) need to be given.") # load in the MoorDyn data for each line to set the xp,yp,zp positions of each node in the line # Each row in the xp matrix is a time step and each column is a node in the line for line in self.lineList: - try: - line.loadData(dirname, rootname) - except: - raise ValueError("There is likely not a .MD.Line#.out file in the directory. Make sure Line outputs are set to 'p' in the MoorDyn input file") - + #try: + if Fortran: # for output filename style for MD-F + line.loadData(dirname, rootname, sep='.MD.') + #line.loadData(dirname, rootname, sep='.') + else: # for output filename style for MD-C + line.loadData(dirname, rootname, sep='_') + #except: + # raise ValueError("There is likely not a .MD.Line#.out file in the directory. Make sure Line outputs are set to 'p' in the MoorDyn input file") + + for rod in self.rodList: + if isinstance(rod, Line): + if Fortran: # for output filename style for MD-F + rod.loadData(dirname, rootname, sep='.MD.') + else: # for output filename style for MD-C + rod.loadData(dirname, rootname, sep='_') + def addBody(self, mytype, r6, m=0, v=0, rCG=np.zeros(3), AWP=0, rM=np.zeros(3), f6Ext=np.zeros(6)): '''Convenience function to add a Body to a mooring system @@ -123,7 +174,34 @@ def addBody(self, mytype, r6, m=0, v=0, rCG=np.zeros(3), AWP=0, rM=np.zeros(3), # handle display message if/when MoorPy is reorganized by classes - def addPoint(self, mytype, r, m=0, v=0, fExt=np.zeros(3), DOFs=[0,1,2]): + def addRod(self, rodType, rA, rB, nSegs=1, bodyID=0): + '''draft method to add a quasi-Rod to the system. Rods are not yet fully figured out for MoorPy''' + + if not isinstance(rodType, dict): + if rodType in self.rodTypes: + rodType = self.rodTypes[rodType] + else: + ValueError("The specified rodType name does not correspond with any rodType stored in this MoorPy System") + + rA = np.array(rA) + rB = np.array(rB) + + if nSegs==0: # this is the zero-length special case + lUnstr = 0 + self.rodList.append( Point(self, len(self.pointList)+1, 0, rA) ) + else: + lUnstr = np.linalg.norm(rB-rA) + self.rodList.append( Line(self, len(self.rodList)+1, lUnstr, rodType, nSegs=nSegs, isRod=1) ) + + if bodyID > 0: + self.bodyList[bodyID-1].attachRod(len(self.rodList), np.hstack([rA,rB])) + + else: # (in progress - unsure if htis works) <<< + self.rodList[-1].rA = rA #.setEndPosition(rA, 0) # set initial end A position + self.rodList[-1].rB = rB #.setEndPosition(rB, 1) # set initial end B position + + + def addPoint(self, mytype, r, m=0, v=0, fExt=np.zeros(3), DOFs=[0,1,2], d=0, body=0): '''Convenience function to add a Point to a mooring system Parameters @@ -140,6 +218,8 @@ def addPoint(self, mytype, r, m=0, v=0, fExt=np.zeros(3), DOFs=[0,1,2]): applied external force vector in global orientation (not including weight/buoyancy) [N]. The default is np.zeros(3). DOFs : list, optional list of which coordinate directions are DOFs for this point (default 0,1,2=x,y,z). E.g. set [2] for vertical motion only.. The default is [0,1,2]. + body : int, optional + ID of body that point is attached to, in which case r is the relative position on the body. Returns ------- @@ -147,20 +227,29 @@ def addPoint(self, mytype, r, m=0, v=0, fExt=np.zeros(3), DOFs=[0,1,2]): ''' - self.pointList.append( Point(self, len(self.pointList)+1, mytype, r, m=m, v=v, fExt=fExt, DOFs=DOFs) ) + self.pointList.append( Point(self, len(self.pointList)+1, mytype, r, m=m, v=v, fExt=fExt, DOFs=DOFs, d=d) ) + + if body > 0: + if body <= len(self.bodyList): + self.bodyList[body-1].attachPoint(self.pointList[-1].number, r) + else: + raise Exception(f"Provided body ID of {body} exceeds number of bodies in the system.") + + + return len(self.pointList) # return the index of the added point #print("Created Point "+str(self.pointList[-1].number)) # handle display message if/when MoorPy is reorganized by classes - - def addLine(self, lUnstr, type_string, nSegs=40, pointA=0, pointB=0, cb=0): + + def addLine(self, lUnstr, lineType, nSegs=40, pointA=0, pointB=0, cb=0): '''Convenience function to add a Line to a mooring system Parameters ---------- lUnstr : float unstretched line length [m]. - type_string : string - string identifier of LineType object that this Line is to be. + lineType : string or dict + string identifier of lineType for this line already added to the system, or dict specifying custom line type. nSegs : int, optional number of segments to split the line into. The default is 20. pointA int, optional @@ -174,7 +263,13 @@ def addLine(self, lUnstr, type_string, nSegs=40, pointA=0, pointB=0, cb=0): ''' - self.lineList.append( Line(self, len(self.lineList)+1, lUnstr, self.lineTypes[type_string].name, nSegs=nSegs, cb=cb) ) + if not isinstance(lineType, dict): # If lineType is not a dict, presumably it is a key for System.LineTypes. + if lineType in self.lineTypes: # So make sure it matches up with a System.LineType + lineType = self.lineTypes[lineType] # in which case that entry will get passed to Line.init + else: + raise ValueError(f"The specified lineType name ({lineType}) does not correspond with any lineType stored in this MoorPy System") + + self.lineList.append( Line(self, len(self.lineList)+1, lUnstr, lineType, nSegs=nSegs, cb=cb) ) if pointA > 0: if pointA <= len(self.pointList): @@ -211,8 +306,9 @@ def removeLine(self, lineID): """ - def addLineType(self, type_string, d, massden, EA ): - '''Convenience function to add a LineType to a mooring system + def addLineType(self, type_string, d, mass, EA, name=""): + '''Convenience function to add a LineType to a mooring system or adjust + the values of an existing line type if it has the same name/key. Parameters ---------- @@ -220,7 +316,7 @@ def addLineType(self, type_string, d, massden, EA ): string identifier of the LineType object that is to be added. d : float volume-equivalent diameter [m]. - massden : float + mass : float mass of line per length, or mass density [kg/m], used to calculate weight density (w) [N/m] EA : float extensional stiffness [N]. @@ -230,19 +326,91 @@ def addLineType(self, type_string, d, massden, EA ): None. ''' + if len(name)==0: + name=type_string+str(d) - self.lineTypes[type_string] = LineType(type_string, d, massden, EA) - # handle display message if/when MoorPy is reorganized by classes + w = (mass - np.pi/4*d**2 *self.rho)*self.g - - def load(self, filename): + lineType = dict(name=name, d_vol=d, w=w, m=mass, EA=EA, material=type_string) # make dictionary for this line type + + lineType['material'] = 'unspecified' # fill this in so it's available later + + if type_string in self.lineTypes: # if there is already a line type with this name + self.lineTypes[type_string].update(lineType) # update the existing dictionary values rather than overwriting with a new dictionary + else: + self.lineTypes[type_string] = lineType + + # <<< the "name" keyword in this method is confusing in that it isn't the index key. Does it have a purpose? <<< + + + def setLineType(self, dnommm, material, source=None, name="", **kwargs): + '''Add or update a System lineType using the new dictionary-based method. + + Parameters + ---------- + dnommm : float + nominal diameter [mm]. + material : string + string identifier of the material type be used. + source : dict or filename (optional) + YAML file name or dictionary containing line property scaling coefficients. If not provided, + whatever has already been loaded into the MoorPy system will be used. + name : string (optional) + Identifier for the line type (otherwise will be generated automatically). + + Returns + ------- + None. + ''' + + # compute the actual values for this line type + if source==None: + lineType = getLineProps(dnommm, material, lineProps=self.lineProps, name=name, rho=self.rho, g=self.g) + else: + lineType = getLineProps(dnommm, material, source=source, name=name, rho=self.rho, g=self.g) + + lineType.update(kwargs) # add any custom arguments provided in the call to the lineType's dictionary + + # add the dictionary to the System's lineTypes master dictionary + if lineType['name'] in self.lineTypes: # if there is already a line type with this name + self.lineTypes[lineType['name']].update(lineType) # update the existing dictionary values rather than overwriting with a new dictionary + else: + self.lineTypes[lineType['name']] = lineType # otherwise save a new entry + + return lineType # return the dictionary in case it's useful separately + + + def setRodType(self, d, name="", **kwargs): + '''hasty replication of setLineType for rods''' + + # compute the actual values for this line type + + if len(name)==0: + name = len(self.rodList)+1 + + rodType = dict(name=name, d_vol=d, w=0, m=0) # make dictionary for this rod type + + rodType.update(kwargs) # add any custom arguments provided in the call + + # add the dictionary to the System's lineTypes master dictionary + if rodType['name'] in self.rodTypes: # if there is already a line type with this name + self.rodTypes[rodType['name']].update(rodType) # update the existing dictionary values rather than overwriting with a new dictionary + else: + self.rodTypes[rodType['name']] = rodType # otherwise save a new entry + + return rodType # return the dictionary in case it's useful separately + + + def load(self, filename, clear=True): '''Loads a MoorPy System from a MoorDyn-style input file Parameters ---------- filename : string the file name of a MoorDyn-style input file. + clear : boolean + Starts from a clean slate when true. When false, will build on existing mooring system objects. Raises ------ @@ -256,15 +424,15 @@ def load(self, filename): ''' # create/empty the lists to start with + if clear: + RodDict = {} # create empty dictionary for rod types + self.lineTypes = {} # create empty dictionary for line types + self.rodTypes = {} # create empty dictionary for line types - RodDict = {} # create empty dictionary for rod types - self.lineTypes = {} # create empty dictionary for line types - - # ensure the mooring system's object lists are empty before adding to them - self.bodyList = [] - #self.RodList = [] - self.pointList= [] - self.lineList = [] + self.bodyList = [] + self.rodList = [] + self.pointList= [] + self.lineList = [] # figure out if it's a YAML file or MoorDyn-style file based on the extension, then open and process @@ -286,28 +454,99 @@ def load(self, filename): for line in f: # loop through each line in the file - # get line type property sets if line.count('---') > 0 and (line.upper().count('LINE DICTIONARY') > 0 or line.upper().count('LINE TYPES') > 0): line = next(f) # skip this header line, plus channel names and units lines line = next(f) line = next(f) while line.count('---') == 0: - entries = line.split() - self.lineTypes[entries[0]] = LineType(entries[0], np.float_(entries[1]), np.float_(entries[2]), np.float_(entries[3])) + entries = line.split() # entries: TypeName Diam Mass/m EA BA/-zeta EI Cd Ca CdAx CaAx + #self.addLineType(entries[0], float(entries[1]), float(entries[2]), float(entries[3])) + + type_string = entries[0] + d = float(entries[1]) + mass = float(entries[2]) + w = (mass - np.pi/4*d**2 *self.rho)*self.g + lineType = dict(name=type_string, d_vol=d, w=w, m=mass) # make dictionary for this rod type + + # support linear (EA) or nonlinear (filename string) option for elasticity + #if there is a text file in the EA input + if entries[3].find(".txt") != -1: + #Then we read in ten-strain file + ten_str_fname = entries[3] + ten_str = open(ten_str_fname[1:-1], 'r') + + #Read line in ten-strain file until we hit '---' signifying the end of the file + for line in ten_str: + #skip first 3 lines (Header for input file) + line = next(ten_str) + line = next(ten_str) + line = next(ten_str) + #Preallocate Arrays + str_array = [] + ten_array = [] + #Loop through lines until you hit '---' signifying the end of the file + while line.count('---') == 0: + ten_str_entries = line.split() #split entries ten_str_entries: strain tension + str_array.append(ten_str_entries[0]) #First one is strain + ten_array.append(ten_str_entries[1]) #Second one is tension + line = next(ten_str) #go to next line + lineType['Str'] = str_array #make new entry in the dictionary to carry tension and strain arrays + lineType['Ten'] = ten_array + + else: + + try: + lineType['EA'] = float(entries[3].split('|')[0]) # get EA, and only take first value if multiples are given + except: + lineType['EA'] = 1e9 + print('EA entry not recognized - using placeholder value of 1000 MN') + if len(entries) >= 10: # read in other elasticity and hydro coefficients as well if enough columns are provided + lineType['BA' ] = float(entries[4].split('|')[0]) + lineType['EI' ] = float(entries[5]) + lineType['Cd' ] = float(entries[6]) + lineType['Ca' ] = float(entries[7]) + lineType['CdAx'] = float(entries[8]) + lineType['CaAx'] = float(entries[9]) + lineType['material'] = type_string + + if type_string in self.lineTypes: # if there is already a line type with this name + self.lineTypes[type_string].update(lineType) # update the existing dictionary values rather than overwriting with a new dictionary + else: + self.lineTypes[type_string] = lineType + line = next(f) - # get line type property sets + # get rod type property sets if line.count('---') > 0 and (line.upper().count('ROD DICTIONARY') > 0 or line.upper().count('ROD TYPES') > 0): line = next(f) # skip this header line, plus channel names and units lines line = next(f) line = next(f) while line.count('---') == 0: - entries = line.split() + entries = line.split() # entries: TypeName Diam Mass/m Cd Ca CdEnd CaEnd #RodTypesName.append(entries[0]) # name string #RodTypesD.append( entries[1]) # diameter #RodDict[entries[0]] = entries[1] # add dictionary entry with name and diameter + + type_string = entries[0] + d = float(entries[1]) + mass = float(entries[2]) + w = (mass - np.pi/4*d**2 *self.rho)*self.g + + rodType = dict(name=type_string, d_vol=d, w=w, m=mass) # make dictionary for this rod type + + if len(entries) >= 7: # read in hydro coefficients as well if enough columns are provided + rodType['Cd' ] = float(entries[3]) + rodType['Ca' ] = float(entries[4]) + rodType['CdEnd'] = float(entries[5]) + rodType['CaEnd'] = float(entries[6]) + + if type_string in self.rodTypes: # if there is already a rod type with this name + self.rodTypes[type_string].update(rodType) # update the existing dictionary values rather than overwriting with a new dictionary + else: + self.rodTypes[type_string] = rodType + line = next(f) @@ -317,13 +556,15 @@ def load(self, filename): line = next(f) line = next(f) while line.count('---') == 0: - entries = line.split() - entry0 = entries[0].lower() - - num = np.int("".join(c for c in entry0 if not c.isalpha())) # remove alpha characters to identify Body # + entries = line.split() # entries: ID Attachment X0 Y0 Z0 r0 p0 y0 M CG* I* V CdA* Ca* + num = int(entries[0]) + entry0 = entries[1].lower() + #num = np.int_("".join(c for c in entry0 if not c.isalpha())) # remove alpha characters to identify Body # if ("fair" in entry0) or ("coupled" in entry0) or ("ves" in entry0): # coupled case bodyType = -1 + elif ("fix" in entry0) or ("anchor" in entry0): # fixed case + bodyType = 1 elif ("con" in entry0) or ("free" in entry0): # free case bodyType = 0 else: # for now assuming unlabeled free case @@ -331,13 +572,50 @@ def load(self, filename): # if we detected there were unrecognized chars here, could: raise ValueError(f"Body type not recognized for Body {num}") #bodyType = -1 # manually setting the body type as -1 for FAST.Farm SM investigation - r6 = np.array(entries[1:7], dtype=float) # initial position and orientation [m, rad] + r6 = np.array(entries[2:8], dtype=float) # initial position and orientation [m, rad] r6[3:] = r6[3:]*np.pi/180.0 # convert from deg to rad - rCG = np.array(entries[7:10], dtype=float) # location of body CG in body reference frame [m] - m = np.float_(entries[10]) # mass, centered at CG [kg] + #rCG = np.array(entries[7:10], dtype=float) # location of body CG in body reference frame [m] + m = np.float_(entries[8]) # mass, centered at CG [kg] v = np.float_(entries[11]) # volume, assumed centered at reference point [m^3] - self.bodyList.append( Body(self, num, bodyType, r6, m=m, v=v, rCG=rCG) ) + # process CG + strings_rCG = entries[ 9].split("|") # split by braces, if any + if len(strings_rCG) == 1: # if only one entry, it is the z coordinate + rCG = np.array([0.0, 0.0, float(strings_rCG[0])]) + elif len(strings_rCG) == 3: # all three coordinates provided + rCG = np.array(strings_rCG, dtype=float) + else: + raise Exception(f"Body {num} CG entry (col 10) must have 1 or 3 numbers.") + + # process mements of inertia + strings_I = entries[10].split("|") # split by braces, if any + if len(strings_I) == 1: # if only one entry, use it for all directions + Inert = np.array(3*strings_I, dtype=float) + elif len(strings_I) == 3: # all three coordinates provided + Inert = np.array(strings_I, dtype=float) + else: + raise Exception(f"Body {num} inertia entry (col 11) must have 1 or 3 numbers.") + + # process drag ceofficient by area product + strings_CdA = entries[12].split("|") # split by braces, if any + if len(strings_CdA) == 1: # if only one entry, use it for all directions + CdA = np.array(3*strings_CdA, dtype=float) + elif len(strings_CdA) == 3: # all three coordinates provided + CdA = np.array(strings_CdA, dtype=float) + else: + raise Exception(f"Body {num} CdA entry (col 13) must have 1 or 3 numbers.") + + # process added mass coefficient + strings_Ca = entries[13].split("|") # split by braces, if any + if len(strings_Ca) == 1: # if only one entry, use it for all directions + Ca = np.array(strings_Ca, dtype=float) + elif len(strings_Ca) == 3: #all three coordinates provided + Ca = np.array(strings_Ca, dtype=float) + else: + raise Exception(f"Body {num} Ca entry (col 14) must have 1 or 3 numbers.") + + # add the body + self.bodyList.append( Body(self, num, bodyType, r6, m=m, v=v, rCG=rCG, I=Inert, CdA=CdA, Ca=Ca) ) line = next(f) @@ -348,32 +626,50 @@ def load(self, filename): line = next(f) line = next(f) while line.count('---') == 0: - entries = line.split() - entry0 = entries[0].lower() + entries = line.split() # entries: RodID RodType Attachment Xa Ya Za Xb Yb Zb NumSegs Flags/Outputs + num = int(entries[0]) + rodType = self.rodTypes[entries[1]] + attachment = entries[2].lower() + dia = rodType['d_vol'] # find diameter based on specified rod type string + rA = np.array(entries[3:6], dtype=float) + rB = np.array(entries[6:9], dtype=float) + nSegs = int(entries[9]) + # >>> note: this is currently only set up for use with MoorDyn output data <<< - num = np.int("".join(c for c in entry0 if not c.isalpha())) # remove alpha characters to identify Rod # - lUnstr = 0 # not specified directly so skip for now - dia = RodDict[entries[2]] # find diameter based on specified rod type string - nSegs = np.int(entries[9]) - - # additional things likely missing here <<< - - #RodList.append( Line(dirName, num, lUnstr, dia, nSegs, isRod=1) ) + if nSegs==0: # this is the zero-length special case + lUnstr = 0 + self.rodList.append( Point(self, num, 0, rA) ) + else: + lUnstr = np.linalg.norm(rB-rA) + self.rodList.append( Line(self, num, lUnstr, rodType, nSegs=nSegs, isRod=1) ) + + if ("body" in attachment) or ("turbine" in attachment): + # attach to body here + BodyID = int("".join(filter(str.isdigit, attachment))) + if len(self.bodyList) < BodyID: + self.bodyList.append( Body(self, 1, 0, np.zeros(6))) + + self.bodyList[BodyID-1].attachRod(num, np.hstack([rA,rB])) + + else: # (in progress - unsure if htis works) <<< + self.rodList[-1].rA = rA #.setEndPosition(rA, 0) # set initial end A position + self.rodList[-1].rB = rB #.setEndPosition(rB, 1) # set initial end B position + line = next(f) # get properties of each Point - if line.count('---') > 0 and (line.upper().count('POINTS') > 0 or line.upper().count('POINT LIST') > 0 or line.upper().count('POINT PROPERTIES') > 0): + if line.count('---') > 0 and (line.upper().count('POINTS') > 0 or line.upper().count('POINT LIST') > 0 or line.upper().count('POINT PROPERTIES') > 0 or line.upper().count('CONNECTION PROPERTIES') > 0 or line.upper().count('NODE PROPERTIES') > 0): line = next(f) # skip this header line, plus channel names and units lines line = next(f) line = next(f) while line.count('---') == 0: - entries = line.split() + entries = line.split() # entries: ID Attachment X Y Z Mass Volume CdA Ca entry0 = entries[0].lower() entry1 = entries[1].lower() - num = np.int("".join(c for c in entry0 if not c.isalpha())) # remove alpha characters to identify Point # + num = np.int_("".join(c for c in entry0 if not c.isalpha())) # remove alpha characters to identify Point # if ("anch" in entry1) or ("fix" in entry1): @@ -387,21 +683,25 @@ def load(self, filename): BodyID = int("".join(filter(str.isdigit, entry1))) if len(self.bodyList) < BodyID: self.bodyList.append( Body(self, 1, 0, np.zeros(6))) + print("New body added") # <<< should add consistent warnings in these cases rRel = np.array(entries[2:5], dtype=float) self.bodyList[BodyID-1].attachPoint(num, rRel) - elif ("fair" in entry1) or ("ves" in entry1): - pointType = -1 + elif ("fair" in entry1) or ("ves" in entry1) or ("couple" in entry1): + # for coupled point type, just set it up that same way in MoorPy (attachment to a body not needed, right?) + pointType = -1 + ''' # attach to a generic platform body (and make it if it doesn't exist) if len(self.bodyList) > 1: - raise ValueError("Generic Fairlead/Vessel-type points aren't supported when bodies are defined.") + raise ValueError("Generic Fairlead/Vessel-type points aren't supported when multiple bodies are defined.") if len(self.bodyList) == 0: #print("Adding a body to attach fairlead points to.") self.bodyList.append( Body(self, 1, 0, np.zeros(6)))#, m=m, v=v, rCG=rCG) ) rRel = np.array(entries[2:5], dtype=float) self.bodyList[0].attachPoint(num, rRel) + ''' elif ("con" in entry1) or ("free" in entry1): pointType = 0 @@ -411,10 +711,11 @@ def load(self, filename): if 'seabed' in entries[4]: entries[4] = -self.depth r = np.array(entries[2:5], dtype=float) - m = np.float_(entries[5]) - v = np.float_(entries[6]) - fExt = np.array(entries[7:10], dtype=float) - self.pointList.append( Point(self, num, pointType, r, m=m, v=v, fExt=fExt) ) + m = float(entries[5]) + v = float(entries[6]) + CdA= float(entries[7]) + Ca = float(entries[8]) + self.pointList.append( Point(self, num, pointType, r, m=m, v=v, CdA=CdA, Ca=Ca) ) line = next(f) @@ -424,44 +725,82 @@ def load(self, filename): line = next(f) line = next(f) while line.count('---') == 0: - entries = line.split() - - #print(entries) - - num = np.int(entries[0]) - #dia = lineTypes[entries[1]].d # find diameter based on specified rod type string - lUnstr = np.float_(entries[2]) - nSegs = np.int(entries[3]) - #w = lineTypes[entries[1]].w # line wet weight per unit length - #EA= lineTypes[entries[1]].EA + entries = line.split() # entries: ID LineType AttachA AttachB UnstrLen NumSegs Outputs + + num = np.int_(entries[0]) + lUnstr = np.float_(entries[4]) + lineType = self.lineTypes[entries[1]] + nSegs = np.int_(entries[5]) #lineList.append( Line(dirName, num, lUnstr, dia, nSegs) ) - self.lineList.append( Line(self, num, lUnstr, self.lineTypes[entries[1]].name, nSegs=nSegs, attachments = [np.int(entries[4]),np.int(entries[5])]) ) + self.lineList.append( Line(self, num, lUnstr, lineType, nSegs=nSegs)) #attachments = [int(entries[4]), int(entries[5])]) ) - # attach ends - self.pointList[np.int(entries[4])-1].attachLine(num, 0) - self.pointList[np.int(entries[5])-1].attachLine(num, 1) - - line = next(f) + # attach end A + numA = int("".join(filter(str.isdigit, entries[2]))) # get number from the attachA string + if entries[2][0] in ['r','R']: # if id starts with an "R" or "Rod" + if numA <= len(self.rodList) and numA > 0: + if entries[2][-1] in ['a','A']: + self.rodList[numA-1].attachLine(num, 0) # add line (end A, denoted by 0) to rod >>end A, denoted by 0<< + elif entries[2][-1] in ['b','B']: + self.rodList[numA-1].attachLine(num, 0) # add line (end A, denoted by 0) to rod >>end B, denoted by 1<< + else: + raise ValueError(f"Rod end (A or B) must be specified for line {num} end A attachment. Input was: {entries[2]}") + else: + raise ValueError(f"Rod ID ({numA}) out of bounds for line {num} end A attachment.") + else: # if J starts with a "C" or "Con" or goes straight ot the number then it's attached to a Connection + if numA <= len(self.pointList) and numA > 0: + self.pointList[numA-1].attachLine(num, 0) # add line (end A, denoted by 0) to Point + else: + raise ValueError(f"Point ID ({numA}) out of bounds for line {num} end A attachment.") + + # attach end B + numB = int("".join(filter(str.isdigit, entries[3]))) # get number from the attachA string + if entries[3][0] in ['r','R']: # if id starts with an "R" or "Rod" + if numB <= len(self.rodList) and numB > 0: + if entries[3][-1] in ['a','A']: + self.rodList[numB-1].attachLine(num, 1) # add line (end B, denoted by 1) to rod >>end A, denoted by 0<< + elif entries[3][-1] in ['b','B']: + self.rodList[numB-1].attachLine(num, 1) # add line (end B, denoted by 1) to rod >>end B, denoted by 1<< + else: + raise ValueError(f"Rod end (A or B) must be specified for line {num} end B attachment. Input was: {entries[2]}") + else: + raise ValueError(f"Rod ID ({numB}) out of bounds for line {num} end B attachment.") + else: # if J starts with a "C" or "Con" or goes straight ot the number then it's attached to a Connection + if numB <= len(self.pointList) and numB > 0: + self.pointList[numB-1].attachLine(num, 1) # add line (end B, denoted by 1) to Point + else: + raise ValueError(f"Point ID ({numB}) out of bounds for line {num} end B attachment.") + + line = next(f) # advance to the next line + # get options entries if line.count('---') > 0 and "options" in line.lower(): #print("READING OPTIONS") line = next(f) # skip this header line + while line.count('---') == 0: entries = line.split() entry0 = entries[0].lower() entry1 = entries[1].lower() - - #print(entries) - + + # grab any parameters used by MoorPy if entry1 == "g" or entry1 == "gravity": - self.g = np.float_(entry0) - elif entries[1] == "WtrDpth" or entries[1] == "depth": - self.depth = np.float_(entry0) + self.g = float(entry0) + + elif entry1 == "wtrdepth" or entry1 == "depth" or entry1 == "wtrdpth": + try: + self.depth = float(entry0) + except: + self.depth = 0.0 + print("Warning: non-numeric depth in input file - MoorPy will ignore it.") + elif entry1=="rho" or entry1=="wtrdnsty": - self.rho = np.float_(entry0) + self.rho = float(entry0) + + # also store a dict of all parameters that can be regurgitated during an unload + self.MDoptions[entry1] = entry0 line = next(f) @@ -493,16 +832,38 @@ def parseYAML(self, data): ''' + + # get options entries + if 'water_depth' in data: + self.depth = data['water_depth'] + + if 'rho' in data: + self.rho = data['rho'] + elif 'water_density' in data: + self.rho = data['water_density'] + + # check if a MoorDyn input file is specified, in which case load it + if 'file' in data: + if len(data['file']) > 0: + self.load(data['file']) + + return # stop here. Otherwise, proceed and load mooring system objects from YAML dictionary + # line types for d in data['line_types']: + name = d['name'] dia = float(d['diameter'] ) - w = float(d['mass_density']) + w = float(d['mass_density'])*self.g EA = float(d['stiffness'] ) - if d['breaking_load']: - MBL = float(d['breaking_load']) - else: - MBL = 0 - self.lineTypes[d['name']] = LineType(d['name'], dia, w, EA, MBL=MBL) + self.lineTypes[name] = dict(name=name, d_vol=dia, w=w, EA=EA) + + addToDict(d, self.lineTypes[name], 'breaking_load' , 'MBL' , default=0) + addToDict(d, self.lineTypes[name], 'cost' , 'cost', default=0) + addToDict(d, self.lineTypes[name], 'transverse_drag' , 'Cd' , default=0) + addToDict(d, self.lineTypes[name], 'tangential_drag' , 'CdAx', default=0) + addToDict(d, self.lineTypes[name], 'transverse_added_mass', 'Ca' , default=0) + addToDict(d, self.lineTypes[name], 'tangential_added_mass', 'CaAx', default=0) + # rod types TBD @@ -521,7 +882,7 @@ def parseYAML(self, data): entry0 = d['name'].lower() entry1 = d['type'].lower() - #num = np.int("".join(c for c in entry0 if not c.isalpha())) # remove alpha characters to identify Point # + #num = np.int_("".join(c for c in entry0 if not c.isalpha())) # remove alpha characters to identify Point # num = i+1 # not counting on things being numbered in YAML files if ("anch" in entry1) or ("fix" in entry1): @@ -575,22 +936,12 @@ def parseYAML(self, data): lUnstr = np.float_(d['length']) - self.lineList.append( Line(self, num, lUnstr, self.lineTypes[d['type']].name) ) + self.lineList.append( Line(self, num, lUnstr, self.lineTypes[d['type']]) ) # attach ends (name matching here) self.pointList[pointDict[d['endA']]].attachLine(num, 0) self.pointList[pointDict[d['endB']]].attachLine(num, 1) - - - # get options entries - if 'water_depth' in data: - self.depth = data['water_depth'] - - if 'rho' in data: - self.rho = data['rho'] - elif 'water_density' in data: - self.rho = data['water_density'] - + def readBathymetryFile(self, filename): f = open(filename, 'r') @@ -605,7 +956,7 @@ def readBathymetryFile(self, filename): # allocate the Xs, Ys, and main bathymetry grid arrays bathGrid_Xs = np.zeros(nGridX) bathGrid_Ys = np.zeros(nGridY) - bathGrid = np.zeros([nGridX, nGridY]) + bathGrid = np.zeros([nGridY, nGridX]) # MH swapped order June 30 # read in the fourth line to the Xs array line = next(f) bathGrid_Xs = [float(line.split()[i]) for i in range(nGridX)] @@ -620,15 +971,19 @@ def readBathymetryFile(self, filename): - def unload(self, fileName, MDversion=2, **kwargs): + def unload(self, fileName, MDversion=2, line_dL=0, rod_dL=0, flag='p', outputList=[]): '''Unloads a MoorPy system into a MoorDyn-style input file Parameters ---------- fileName : string file name of output file to hold MoorPy System. - **kwargs : TYPE - DESCRIPTION. + line_dL : float, optional + Optional specified for target segment length when discretizing Lines + rod_dL : float, optional + Optional specified for target segment length when discretizing Rods + outputList : list of strings, optional + Optional list of additional requested output channels Returns ------- @@ -640,142 +995,120 @@ def unload(self, fileName, MDversion=2, **kwargs): #Collection of default values, each can be customized when the method is called - #Settings - Echo = False #Echo input data to .ech (flag) - dtm = 0.001 - kbot = 3e6 - cbot = 3e5 - dtIC = 2 - TmaxIC = 600 - CdScaleIC = 10 - threshIC = 0.01 - - #Line Properties - cIntDamp = -0.8 - EI = 0.0 - Can = 1.0 - Cat = 0.0 - Cdn = 1.6 - Cdt = 0.05 - - #Body Properties (for each body in bodyList) - #! Add Comments - IX = 0 - IY = 0 - IZ = 0 - CdA_xyz = [0,0,0] - Ca_xyz = [0,0,0] - - #Rod List Properties - - #Point Properties (for each point in pointList) - #! Add Comments - CdA = 0. - Ca = 0. + # Set up the dictionary that will be used to write the OPTIONS section + MDoptionsDict = dict(dtM=0.001, kb=3.0e6, cb=3.0e5, TmaxIC=60) # start by setting some key default values + # Other available options: Echo=False, dtIC=2, CdScaleIC=10, threshIC=0.01 + MDoptionsDict.update(self.MDoptions) # update the dict with any settings saved from an input file + MDoptionsDict.update(dict(g=self.g, WtrDepth=self.depth, rho=self.rho)) # lastly, apply any settings used by MoorPy + MDoptionsDict.update(dict(WriteUnits=0)) # need this for WEC-Sim + + # Some default settings to fill in if coefficients aren't set + #lineTypeDefaults = dict(BA=-1.0, EI=0.0, Cd=1.2, Ca=1.0, CdAx=0.2, CaAx=0.0) + lineTypeDefaults = dict(BA=-1.0, cIntDamp=-0.8, EI=0.0, Can=1.0, Cat=1.0, Cdn=1.0, Cdt=0.5) + rodTypeDefaults = dict(Cd=1.2, Ca=1.0, CdEnd=1.0, CaEnd=1.0) - #Line Properties - flag = "p" # "-" + # bodyDefaults = dict(IX=0, IY=0, IZ=0, CdA_xyz=[0,0,0], Ca_xyz=[0,0,0]) - #If a custom value was given, use that instead of the default value(For some reason this doesnt work) - #The exec method isn't working and isn't encouraged. perhaps we have to save all the above variables in a dictionary, and update that dictioanry with kwargs. - for key in kwargs: - print('Using Custom value for', key,kwargs[key]) - #vars()[key] = kwargs[key] - #exec(key + ' = ' + str(kwargs[key])) - #eval(key + ' = ' + str(kwargs[key])) + # Figure out mooring line attachments (Create a ix2 array of connection points from a list of m points) + connection_points = np.empty([len(self.lineList),2]) #First column is Anchor Node, second is Fairlead node + for point_ind,point in enumerate(self.pointList,start = 1): #Loop through all the points + for (line,line_pos) in zip(point.attached,point.attachedEndB): #Loop through all the lines #s connected to this point + if line_pos == 0: #If the A side of this line is connected to the point + connection_points[line -1,0] = point_ind #Save as as an Anchor Node + #connection_points[line -1,0] = self.pointList.index(point) + 1 + elif line_pos == 1: #If the B side of this line is connected to the point + connection_points[line -1,1] = point_ind #Save as a Fairlead node + #connection_points[line -1,1] = self.pointList.index(point) + 1 #Outputs List - #Outputs = ["FairTen1","FairTen2","FairTen3","FairTen4","FairTen5","FairTen6","FairTen7","FairTen8","FairTen9","FairTen10","FairTen11","FairTen12"] - #Outputs = ["FairTen1","FairTen2","FairTen3"]; - Outputs = ["FairTen1","FairTen2","FairTen3","FairTen4","FairTen5","FairTen6","FairTen7","FairTen8","FairTen9","Con2Fz","Con3Fz","Con6Fz","Con7Fz","Con10Fz","Con11Fz","L3N20T","L6N20T","L9N20T"] - - #! Standard Option (Fairing Tenstion for num of lines) - + Outputs = [f"FairTen{i+1}" for i in range(len(self.lineList))] # for now, have a fairlead tension output for each line + #Outputs.append("Con2Fz","Con3Fz","Con6Fz","Con7Fz","Con10Fz","Con11Fz","L3N20T","L6N20T","L9N20T") + + print('attempting to write '+fileName +' for MoorDyn v'+str(MDversion)) #Array to add strings to for each line of moordyn input file L = [] - #Input File Header - L.append(f"---------------- MoorDyn v{MDversion} Input File ------------------") - if "description" in locals(): - L.append("MoorDyn input for " + description) - else: - L.append("Generated by MoorPy") - - L.append("{:5} Echo - echo the input file data (flag)".format(str(Echo).upper())) - - #Line Dictionary Header - L.append("---------------------- LINE TYPES -----------------------------------------------------") - L.append(f"{len(self.lineTypes)} NTypes - number of LineTypes") - L.append("LineType Diam MassDen EA cIntDamp EI Can Cat Cdn Cdt") - L.append(" (-) (m) (kg/m) (N) (Pa-s) (N-m^2) (-) (-) (-) (-)") - - #Line Dicationary Table - for key in self.lineTypes: - #for key,value in self.lineTypes.items(): (Another way to iterate through dictionary) - L.append("{:<15} {:7.3f} {:8.3f} {:8.1f} " - .format(key,self.lineTypes[key].d,self.lineTypes[key].mlin,self.lineTypes[key].EA) - + "{:7.1f} {:<7.1f} {:<7.1f} {:<7.1f} {:<7.2f}" - .format(cIntDamp,Can,Cat,Cdn,Cdt)) - - #Point Properties Header - L.append("---------------------- POINTS ---------------------------------------------------------") - L.append(f"{len(self.pointList)} NConnects - number of connections including anchors and fairleads") - L.append("Node Type X Y Z M V FX FY FZ CdA Ca ") - L.append("(-) (-) (m) (m) (m) (kg) (m^3) (kN) (kN) (kN) (m2) ()") - - #Point Properties Table + + # Generate text for the MoorDyn input file + L.append('Mooring line data file for MoorDyn in Lines.dll') + #L.append(f"MoorDyn v{MDversion} Input File ") + #L.append("Generated by MoorPy") + #L.append("{:5} Echo - echo the input file data (flag)".format(str(Echo).upper())) + + + #L.append("---------------------- LINE TYPES -----------------------------------------------------") + L.append("---------------------- LINE DICTIONARY -----------------------------------------------------") + #L.append(f"{len(self.lineTypes)} NTypes - number of LineTypes") + #L.append("LineType Diam MassDen EA cIntDamp EI Can Cat Cdn Cdt") + #L.append(" (-) (m) (kg/m) (N) (Pa-s) (N-m^2) (-) (-) (-) (-)") + L.append("LineType Diam MassDenInAir EA BA/-zeta Can Cat Cdn Cdt") + L.append(" (-) (m) (kg/m) (N) (Pa-s/-) (-) (-) (-) (-)") + + for key, lineType in self.lineTypes.items(): + di = lineTypeDefaults.copy() # start with a new dictionary of just the defaults + di.update(lineType) # then copy in the lineType's existing values + #L.append("{:<12} {:7.4f} {:8.2f} {:7.3e} {:7.3e} {:7.3e} {:<7.3f} {:<7.3f} {:<7.2f} {:<7.2f}".format( + #key, di['d_vol'], di['m'], di['EA'], di['cIntDamp'], di['EI'], di['Can'], di['Cat'], di['Cdn'], di['Cdt'])) + L.append("{:<12} {:7.4f} {:8.2f} {:7.3e} {:7.3e} {:<7.3f} {:<7.3f} {:<7.2f} {:<7.2f}".format( + key, di['d_vol'], di['m'], di['EA'], di['BA'], di['Can'], di['Cat'], di['Cdn'], di['Cdt'])) + + + #L.append("---------------------- POINTS ---------------------------------------------------------") + L.append("---------------------- NODE PROPERTIES ---------------------------------------------------------") + #L.append(f"{len(self.pointList)} NConnects - number of connections including anchors and fairleads") + L.append("Node Type X Y Z M V FX FY FZ CdA CA ") + L.append("(-) (-) (m) (m) (m) (kg) (m^3) (kN) (kN) (kN) (m^2) (-)") + #L.append("ID Attachment X Y Z Mass Volume CdA Ca") + #L.append("(#) (-) (m) (m) (m) (kg) (m^3) (m^2) (-)") + for point in self.pointList: - point_pos = point.r #Define point position in global reference frame - if point.type == 1: #point is Fized or attached (anch, body, fix) + point_pos = point.r # get point position in global reference frame to start with + if point.type == 1: # point is fixed or attached (anch, body, fix) point_type = 'Fixed' - #import pdb - #pdb.set_trace() #Check if the point is attached to body for body in self.bodyList: for attached_Point in body.attachedP: + if attached_Point == point.number: #point_type = "Body" + str(body.number) point_type = "Vessel" - point_pos = body.rPointRel[body.attachedP.index(attached_Point)] #Redefine point position in the body reference frame + point_pos = body.rPointRel[body.attachedP.index(attached_Point)] # get point position in the body reference frame - if point.type == 0: #point is Coupled Externally (con, free) + elif point.type == 0: # point is coupled externally (con, free) point_type = 'Connect' - if point.type == -1: #point is free to move (fair, ves) + elif point.type == -1: # point is free to move (fair, ves) point_type = 'Vessel' - L.append("{:<4d} {:12} {:8.2f} {:8.2f} {:8.2f} {:6.2f} {:6.2f} {:6.2f} {:6.2f} {:6.2f} {:6.2f} {:6.2f}" - .format(point.number,point_type,point_pos[0],point_pos[1],point_pos[2],point.m,point.v,point.fExt[0],point.fExt[1],point.fExt[2],CdA,Ca)) + L.append("{:<4d} {:9} {:8.2f} {:8.2f} {:8.2f} {:9.2f} {:6.2f} {:6.2f} {:6.2f} {:6.2f} {:6.2f} {:6.2f}".format( + point.number,point_type, point_pos[0],point_pos[1],point_pos[2], point.m, point.v, point.fExt[0],point.fExt[1],point.fExt[2], point.CdA, point.Ca)) - #Line Properties Header - L.append("---------------------- LINES -----------------------------------------------------") - L.append(f"{len(self.lineList)} NLines - number of line objects") - L.append("Line LineType UnstrLen NumSegs AttachA AttachB Outputs") - L.append("(-) (-) (m) (-) (-) (-) (-)") - - #Line Properties Table - #(Create a ix2 array of connection points from a list of m points) - connection_points = np.empty([len(self.lineList),2]) #First column is Anchor Node, second is Fairlead node - for point_ind,point in enumerate(self.pointList,start = 1): #Loop through all the points - for (line,line_pos) in zip(point.attached,point.attachedEndB): #Loop through all the lines #s connected to this point - if line_pos == 0: #If the A side of this line is connected to the point - connection_points[line -1,0] = point_ind #Save as as an Anchor Node - #connection_points[line -1,0] = self.pointList.index(point) + 1 - elif line_pos == 1: #If the B side of this line is connected to the point - connection_points[line -1,1] = point_ind #Save as a Fairlead node - #connection_points[line -1,1] = self.pointList.index(point) + 1 - #Populate text - for i in range(len(self.lineList)): + #L.append("---------------------- LINES -----------------------------------------------------") + L.append("---------------------- LINE PROPERTIES -----------------------------------------------------") + #L.append(f"{len(self.lineList)} NLines - number of line objects") + #L.append("Line LineType UnstrLen NumSegs AttachA AttachB Outputs") + #L.append("(-) (-) (m) (-) (-) (-) (-)") + #L.append("ID LineType AttachA AttachB UnstrLen NumSegs LineOutputs") + #L.append("(#) (name) (#) (#) (m) (-) (-)") + L.append("Line LineType UnstrLen NumSegs NodeAnch NodeFair Flags/Outputs") + L.append("(-) (-) (m) (-) (-) (-) (-)") + + for i,line in enumerate(self.lineList): L.append("{:<4d} {:<15} {:8.3f} {:5d} {:7d} {:8d} {}" - .format(self.lineList[i].number,self.lineList[i].type,self.lineList[i].L,self.lineList[i].nNodes - 1,int(connection_points[i,0]),int(connection_points[i,1]),flag)) + .format(line.number, line.type['name'], line.L, line.nNodes-1, int(connection_points[i,0]), int(connection_points[i,1]), flag)) + - #Solver Options Header - L.append("---------------------- OPTIONS ----------------------------------------") + #L.append("---------------------- OPTIONS ----------------------------------------") + L.append("---------------------- SOLVER OPTIONS ----------------------------------------") + + for key, val in MDoptionsDict.items(): + L.append(f"{val:<15} {key}") + """ #Solver Options L.append("{:<9.3f}dtM - time step to use in mooring integration (s)".format(float(dtm))) L.append("{:<9.0e}kbot - bottom stiffness (Pa/m)".format(kbot)) @@ -785,22 +1118,21 @@ def unload(self, fileName, MDversion=2, **kwargs): L.append("{:<9.0f}CdScaleIC - factor by which to scale drag coefficients during dynamic relaxation (-)".format(int(CdScaleIC))) L.append("{:<9.2f}threshIC - threshold for IC convergence (-)".format(threshIC)) - """ #Failure Header - #Failure Table """ - #Outputs Header - L.append("----------------------------OUTPUTS--------------------------------------------") + L.append("--------------------------- OUTPUTS --------------------------------------------") + + Outputs = Outputs+outputList # add any user-specified outputs passed to unload - #Outputs List for Output in Outputs: L.append(Output) - L.append("END") + #L.append("END") + - #Final Line L.append('--------------------- need this line ------------------') + #Write the text file with open(fileName, 'w') as out: for x in range(len(L)): @@ -809,6 +1141,8 @@ def unload(self, fileName, MDversion=2, **kwargs): print('Successfully written '+fileName +' input file using MoorDyn v1') + + elif MDversion==2: #For version MoorDyn v?.?? @@ -818,195 +1152,150 @@ def unload(self, fileName, MDversion=2, **kwargs): #version = #description = - #Settings - Echo = False #Echo input data to .ech (flag) - dtm = 0.0002 #time step to use in mooring integration - WaveKin = 3 #wave kinematics flag (1=include(unsupported), 0=neglect, 3=currentprofile.txt - kb = 3.0e6 #bottom stiffness - cb = 3.0e5 #bottom damping - ICDfac = 2.0 #factor by which to scale drag coefficients during dynamic relaxation IC gen - ICthresh = 0.01 #threshold for IC convergence - ICTmax = 10 #threshold for IC convergence + # Set up the dictionary that will be used to write the OPTIONS section + MDoptionsDict = dict(dtM=0.001, kb=3.0e6, cb=3.0e5, TmaxIC=60) # start by setting some key default values + MDoptionsDict.update(self.MDoptions) # update the dict with any settings saved from an input file + MDoptionsDict.update(dict(g=self.g, depth=self.depth, rho=self.rho)) # lastly, apply any settings used by MoorPy - #Line Properties - #! Add Comments - cIntDamp = -1.0 - EI = 0.0 - Can = 1.0 - Cat = 0.0 - Cdn = 1.0 - Cdt = 0.0 - - #Body Properties (for each body in bodyList) - #! Add Comments - IX = 0 - IY = 0 - IZ = 0 - CdA_xyz = [0,0,0] - Ca_xyz = [0,0,0] - - #Rod List Properties - - #Point Properties (for each point in pointList) - #! Add Comments - CdA = 0. - Ca = 0. + # Some default settings to fill in if coefficients aren't set + lineTypeDefaults = dict(BA=-1.0, EI=0.0, Cd=1.2, Ca=1.0, CdAx=0.2, CaAx=0.0) + rodTypeDefaults = dict(Cd=1.2, Ca=1.0, CdEnd=1.0, CaEnd=1.0) + + # Figure out mooring line attachments (Create a ix2 array of connection points from a list of m points) + connection_points = np.empty([len(self.lineList),2]) #First column is Anchor Node, second is Fairlead node + for point_ind,point in enumerate(self.pointList,start = 1): #Loop through all the points + for (line,line_pos) in zip(point.attached,point.attachedEndB): #Loop through all the lines #s connected to this point + if line_pos == 0: #If the A side of this line is connected to the point + connection_points[line -1,0] = point_ind #Save as as an Anchor Node + #connection_points[line -1,0] = self.pointList.index(point) + 1 + elif line_pos == 1: #If the B side of this line is connected to the point + connection_points[line -1,1] = point_ind #Save as a Fairlead node + #connection_points[line -1,1] = self.pointList.index(point) + 1 #Line Properties flag = "p" # "-" - #If a custom value was given, use that instead of the default value(For some reason this doesnt work) - #The exec method isn't working and isn't encouraged. perhaps we have to save all the above variables in a dictionary, and update that dictioanry with kwargs. - for key in kwargs: - print('Using Custom value for', key,kwargs[key]) - #vars()[key] = kwargs[key] - #exec(key + ' = ' + str(kwargs[key])) - #eval(key + ' = ' + str(kwargs[key])) - #Outputs List - #Outputs = ["FairTen1","FairTen2","FairTen3","FairTen4","FairTen5","FairTen6","FairTen7","FairTen8","FairTen9","FairTen10","FairTen11","FairTen12"] - Outputs = ["FairTen1","FairTen2","FairTen3"]; - #! Standard Option (Fairing Tenstion for num of lines) + Outputs = [f"FairTen{i+1}" for i in range(len(self.lineList))] # for now, have a fairlead tension output for each line + Outputs = Outputs+outputList # add any user-specified outputs passed to unload print('attempting to write '+fileName +' for MoorDyn v'+str(MDversion)) #Array to add strings to for each line of moordyn input file L = [] - #Input File Header - L.append(f" MoorDyn v{MDversion} Input File ") - if "description" in locals(): - L.append("MoorDyn input for " + description) - else: - L.append("Generated by MoorPy") - - #L.append("{:5} Echo - echo the input file data (flag)" - # .format(str(Echo).upper())) - - #Line Dictionary Header - L.append("---------------------- LINE TYPES -----------------------------------------------------") - L.append("LineType Diam MassDen EA cIntDamp EI Can Cat Cdn Cdt") - L.append(" (-) (m) (kg/m) (N) (Pa-s) (N-m^2) (-) (-) (-) (-)") - - #Line Dicationary Table - for key in self.lineTypes: - #for key,value in self.lineTypes.items(): (Another way to iterate through dictionary) - L.append("{:<15} {:7.4f} {:8.2f} {:7.3e} " - .format(key,self.lineTypes[key].d,self.lineTypes[key].mlin,self.lineTypes[key].EA) - + "{:7.3e} {:7.3e} {:<7.3f} {:<7.3f} {:<7.3f} {:<7.3f}" - .format(cIntDamp,EI,Can,Cat,Cdn,Cdt)) - - # Rod Dictionary Header + + # Generate text for the MoorDyn input file + + L.append(f"MoorDyn v{MDversion} Input File ") + #if "description" in locals(): + #L.append("MoorDyn input for " + description) + #else: + L.append("Generated by MoorPy") + + + L.append("---------------------- LINE TYPES --------------------------------------------------") + L.append("TypeName Diam Mass/m EA BA/-zeta EI Cd Ca CdAx CaAx") + L.append("(name) (m) (kg/m) (N) (N-s/-) (N-m^2) (-) (-) (-) (-)") + + for key, lineType in self.lineTypes.items(): + di = lineTypeDefaults.copy() # start with a new dictionary of just the defaults + di.update(lineType) # then copy in the lineType's existing values + L.append("{:<12} {:7.4f} {:8.2f} {:7.3e} {:7.3e} {:7.3e} {:<7.3f} {:<7.3f} {:<7.2f} {:<7.2f}".format( + key, di['d_vol'], di['m'], di['EA'], di['BA'], di['EI'], di['Cd'], di['Ca'], di['CdAx'], di['CaAx'])) + + L.append("--------------------- ROD TYPES -----------------------------------------------------") - L.append("RodType Diam MassDenInAir Can Cat Cdn Cdt ") - L.append("(-) (m) (kg/m) (-) (-) (-) (-) ") + L.append("TypeName Diam Mass/m Cd Ca CdEnd CaEnd") + L.append("(name) (m) (kg/m) (-) (-) (-) (-)") + + for key, rodType in self.rodTypes.items(): + di = rodTypeDefaults.copy() + di.update(rodType) + L.append("{:<15} {:7.4f} {:8.2f} {:<7.3f} {:<7.3f} {:<7.3f} {:<7.3f}".format( + key, di['d_vol'], di['m'], di['Cd'], di['Ca'], di['CdEnd'], di['CaEnd'])) - """ - # Rod Dictionary Table - for i, rod_type in enumerate(self.lineTypes,start=1): - """ - #Body List Header - L.append("----------------------- BODIES -----------------------------------") - L.append("BodyID X0 Y0 Z0 r0 p0 y0 Xcg Ycg Zcg M V IX IY IZ CdA-x,y,z Ca-x,y,z") - L.append(" (-) (m) (m) (m) (deg) (deg) (deg) (m) (m) (m) (kg) (m^3) (kg-m^2) (kg-m^2) (kg-m^2) (m^2) (-)") + L.append("----------------------- BODIES ------------------------------------------------------") + L.append("ID Attachment X0 Y0 Z0 r0 p0 y0 Mass CG* I* Volume CdA* Ca*") + L.append("(#) (-) (m) (m) (m) (deg) (deg) (deg) (kg) (m) (kg-m^2) (m^3) (m^2) (-)") - #Body List Table for body in self.bodyList: - L.append(" {:<4d} {:<5.2f} {:<5.2f} {:<6.2f} {:<6.2f} {:<6.2f} {:<6.2f} {:<6.2f} {:<6.2f} {:<8.2f} {:<7.2f} {:<11.2f}" - .format(body.number,body.r6[0],body.r6[1],body.r6[2],np.rad2deg(body.r6[3]),np.rad2deg(body.r6[4]),np.rad2deg(body.r6[5]),body.rCG[0],body.rCG[1],body.rCG[2],body.m,body.v) - + "{:<9d} {:<9d} {:<7d} {:<2d} {:<2d} {:<8d} {:<1d}" - .format(IX,IY,IZ,CdA_xyz[0],CdA_xyz[1],CdA_xyz[2],Ca_xyz[0],Ca_xyz[1],Ca_xyz[2])) + attach = ['coupled','free','fixed'][[-1,0,1].index(body.type)] # pick correct string based on body type + L.append("{:<4d} {:10} {:<6.2f} {:<6.2f} {:<6.2f} {:<6.2f} {:<6.2f} {:<6.2f} ".format( + body.number, attach, body.r6[0],body.r6[1],body.r6[2],np.rad2deg(body.r6[3]),np.rad2deg(body.r6[4]),np.rad2deg(body.r6[5]) + )+ "{:<9.4e} {:.2f}|{:.2f}|{:.2f} {:9.3e} {:6.2f} {:6.2f} {:5.2f}".format( + body.m, body.rCG[0],body.rCG[1],body.rCG[2], body.I[0], body.v, body.CdA[0], body.Ca[0])) + + # below is a more thorough approach to see about in future + #)+ "{:<9.2f} {:<5.2f}|{:<5.2f}|{:<5.2f} {:<5.2f}|{:<5.2f}|{:<5.2f} {:<5.2f} {:<5.2f}|{:<5.2f}|{:<5.2f} {:<5.2f}|{:<5.2f}|{:<5.2f}".format( + #body.m, body.rCG[0],body.rCG[1],body.rCG[2], body.I[0],body.I[1],body.I[2], + #body.v, body.CdA[0],body.CdA[1],body.CdA[2], body.Ca[0],body.Ca[1],body.Ca[2])) - #Rod Properties Header - L.append("---------------------- RODS --------------------") - L.append("RodID Type/BodyID RodType Xa Ya Za Xb Yb Zb NumSegs Flags/Outputs") - L.append("(-) (-) (-) (m) (m) (m) (m) (m) (m) (-) (-) ") - """ - #Rod Properties Table - """ + L.append("---------------------- RODS ---------------------------------------------------------") + L.append("ID RodType Attachment Xa Ya Za Xb Yb Zb NumSegs RodOutputs") + L.append("(#) (name) (#/key) (m) (m) (m) (m) (m) (m) (-) (-)") + + # Rod Properties Table TBD <<< + - #Point Properties Header - L.append("---------------------- POINTS ---------------------------------------------------------") - L.append("Node Type X Y Z M V FX FY FZ CdA Ca ") - L.append("(-) (-) (m) (m) (m) (kg) (m^3) (kN) (kN) (kN) (m2) ()") + L.append("---------------------- POINTS -------------------------------------------------------") + L.append("ID Attachment X Y Z Mass Volume CdA Ca") + L.append("(#) (-) (m) (m) (m) (kg) (mˆ3) (m^2) (-)") - #Point Properties Table for point in self.pointList: - point_pos = point.r #Define point position in global reference frame - if point.type == 1: #point is Fized or attached (anch, body, fix) + point_pos = point.r # get point position in global reference frame to start with + if point.type == 1: # point is fixed or attached (anch, body, fix) point_type = 'Fixed' - #import pdb - #pdb.set_trace() #Check if the point is attached to body for body in self.bodyList: for attached_Point in body.attachedP: if attached_Point == point.number: point_type = "Body" + str(body.number) - point_pos = body.rPointRel[body.attachedP.index(attached_Point)] #Redefine point position in the body reference frame + point_pos = body.rPointRel[body.attachedP.index(attached_Point)] # get point position in the body reference frame - if point.type == 0: #point is Coupled Externally (con, free) - point_type = 'Connect' + elif point.type == 0: # point is coupled externally (con, free) + point_type = 'Free' - if point.type == -1: #point is free to move (fair, ves) - point_type = 'Vessel' + elif point.type == -1: # point is free to move (fair, ves) + point_type = 'Coupled' - L.append("{:<4d} {:12} {:8.2f} {:8.2f} {:8.2f} {:6.2f} {:6.2f} {:6.2f} {:6.2f} {:6.2f} {:6.2f} {:6.2f}" - .format(point.number,point_type,point_pos[0],point_pos[1],point_pos[2],point.m,point.v,point.fExt[0],point.fExt[1],point.fExt[2],CdA,Ca)) + L.append("{:<4d} {:9} {:8.2f} {:8.2f} {:8.2f} {:9.2f} {:6.2f} {:6.2f} {:6.2f}".format( + point.number,point_type, point_pos[0],point_pos[1],point_pos[2], point.m, point.v, point.CdA, point.Ca)) - #Line Properties Header - L.append("---------------------- LINES -----------------------------------------------------") - L.append("Line LineType UnstrLen NumSegs AttachA AttachB Outputs") - L.append("(-) (-) (m) (-) (-) (-) (-)") + L.append("---------------------- LINES --------------------------------------------------------") + L.append("ID LineType AttachA AttachB UnstrLen NumSegs LineOutputs") + L.append("(#) (name) (#) (#) (m) (-) (-)") - #Line Properties Table - #(Create a ix2 array of connection points from a list of m points) - connection_points = np.empty([len(self.lineList),2]) #First column is Anchor Node, second is Fairlead node - for point_ind,point in enumerate(self.pointList,start = 1): #Loop through all the points - for (line,line_pos) in zip(point.attached,point.attachedEndB): #Loop through all the lines #s connected to this point - if line_pos == 0: #If the A side of this line is connected to the point - connection_points[line -1,0] = point_ind #Save as as an Anchor Node - #connection_points[line -1,0] = self.pointList.index(point) + 1 - elif line_pos == 1: #If the B side of this line is connected to the point - connection_points[line -1,1] = point_ind #Save as a Fairlead node - #connection_points[line -1,1] = self.pointList.index(point) + 1 - #Populate text - for i in range(len(self.lineList)): - L.append("{:<4d} {:<15} {:8.3f} {:5d} {:7d} {:8d} {}" - .format(self.lineList[i].number,self.lineList[i].type,self.lineList[i].L,self.lineList[i].nNodes - 1,int(connection_points[i,0]),int(connection_points[i,1]),flag)) + for i,line in enumerate(self.lineList): + nSegs = int(np.ceil(line.L/line_dL)) if line_dL>0 else line.nNodes-1 # if target dL given, set nSegs based on it instead of line.nNodes - #Solver Options Header - L.append("---------------------- OPTIONS ----------------------------------------") + L.append("{:<4d} {:<15} {:^5d} {:^5d} {:8.3f} {:4d} {}".format( + line.number, line.type['name'], int(connection_points[i,0]), int(connection_points[i,1]), line.L, nSegs, flag)) + + + L.append("---------------------- OPTIONS ------------------------------------------------------") + + for key, val in MDoptionsDict.items(): + L.append(f"{val:<15} {key}") - #Solver Options - L.append("{:<9.4f}dtM - time step to use in mooring integration".format(float(dtm))) - L.append("{:<9d}WaveKin - wave kinematics flag (1=include(unsupported), 0=neglect, 3=currentprofile.txt)".format(int(WaveKin))) - L.append("{:<9.1e}kb - bottom stiffness".format(kb)) - L.append("{:<9.1e}cb - bottom damping".format(cb)) - L.append("{:<9.2f}WtrDpth - water depth".format(self.depth)) - L.append("{:<9.1f}ICDfac - factor by which to scale drag coefficients during dynamic relaxation IC gen".format(int(ICDfac))) - L.append("{:<9.2f}ICthresh - threshold for IC convergence".format(ICthresh)) - L.append("{:<9d}ICTmax - threshold for IC convergence".format(int(ICTmax))) - - """ #Failure Header #Failure Table - """ - #Outputs Header - L.append("----------------------------OUTPUTS--------------------------------------------") - #Outputs List + L.append("----------------------- OUTPUTS -----------------------------------------------------") + for Output in Outputs: L.append(Output) L.append("END") - #Final Line - L.append('--------------------- need this line ------------------') + + L.append('--------------------- need this line ------------------------------------------------') + #Write the text file with open(fileName, 'w') as out: @@ -1016,149 +1305,7 @@ def unload(self, fileName, MDversion=2, **kwargs): print('Successfully written '+fileName +' input file using MoorDyn v2') - def unload_farm(self, fileName, depth=600): - '''Unloads a MoorPy system into a MoorDyn FAST.Farm input file''' - - # Settings - Echo = False #Echo input data to .ech (flag) - dtm = 0.001 - kbot = 3e6 - cbot = 3e5 - dtIC = 2 - TmaxIC = 10 - CdScaleIC = 4.0 - threshIC = 0.01 - - # Line Type Properties - BA = -1.0 - Can = 0.8 - Cat = 0.25 - Cdn = 2.0 - Cdt = 0.4 - - # Point Properties - CdA = 0 - Ca = 0 - - # Line Properties - flag = "-" - - # For when we want to specify the above settings using kwargs - #for key in kwargs: - #print('Using Custom value for', key,kwargs[key]) - - # Outputs List - Outputs = ["FairTen1","FairTen2","FairTen3"]; - - - print('attempting to write '+fileName +' for MoorDyn FAST.Farm input file') - - # Array to add strings to for each line of moordyn input file - L = [] - - # Input File Header - L.append(f"---------------- MoorDyn FAST.Farm Input File ------------------") - L.append("Generated by MoorDesign") - - L.append("{:5} Echo - echo the input file data (flag)".format(str(Echo).upper())) - - # Line Dictionary Header - L.append("---------------------- LINE TYPES -----------------------------------------------------") - L.append(f"{len(self.lineTypes)} NTypes - number of LineTypes") - L.append("LineType Diam MassDen EA BA/-zeta Can Cat Cdn Cdt") - L.append(" (-) (m) (kg/m) (N) (N-s/-) (-) (-) (-) (-)") - - # Line Dictionary Table - for key in self.lineTypes: - L.append("{:<15} {:7.4f} {:8.3f} {:<10.1f} " - .format(key, self.lineTypes[key].d, self.lineTypes[key].mlin, self.lineTypes[key].EA) - + "{:<7.1f} {:<7.1f} {:<7.2f} {:<7.1f} {:<7.2f}" - .format(BA, Can, Cat, Cdn, Cdt)) - - # Point Properties Header - L.append("---------------------- POINTS ---------------------------------------------------------") - L.append(f"{len(self.pointList)} NConnects - number of connections including anchors and fairleads") - L.append("Node Type X Y Z M V FX FY FZ CdA Ca ") - L.append("(-) (-) (m) (m) (m) (kg) (m^3) (kN) (kN) (kN) (m^2) ()") - - #Point Properties Table - for point in self.pointList: - point_pos = point.r #Define point position in global reference frame - if point.type == 1: #point is Fized or attached (anch, body, fix) - point_type = 'Fixed' - - for body in self.bodyList: - if point.number in body.attachedP: - point_type = "Turbine"+str(body.number) - point_pos = body.rPointRel[body.attachedP.index(point.number)] - - if point.type == 0: #point is Coupled Externally (con, free) - point_type = 'Connect' - - #if point.type == -1: # I haven't seen a point.type = -1 yet - - L.append("{:<4d} {:12} {:8.2f} {:8.2f} {:8.2f} {:8.2f} {:6.2f} {:6.2f} {:6.2f} {:6.2f} {:6.2f} {:6.2f}" - .format(point.number,point_type,point_pos[0],point_pos[1],point_pos[2],point.m,point.v,point.fExt[0],point.fExt[1],point.fExt[2],CdA,Ca)) - - - # Line Properties Header - L.append("---------------------- LINES -----------------------------------------------------") - L.append(f"{len(self.lineList)} NLines - number of line objects") - L.append("Line LineType UnstrLen NumSegs NodeAnch NodeFair Outputs CtrlChan") - L.append("(-) (-) (m) (-) (-) (-) (-) (-)") - - for line in self.lineList: - if line.L < 100: - line.nNodes = 4 - #Line Properties Table - #(Create a ix2 array of connection points from a list of m points) - connection_points = np.empty([len(self.lineList),2]) #First column is Anchor Node, second is Fairlead node - for point_ind,point in enumerate(self.pointList,start = 1): #Loop through all the points - for (line,line_pos) in zip(point.attached,point.attachedEndB): #Loop through all the lines #s connected to this point - if line_pos == 0: #If the A side of this line is connected to the point - connection_points[line -1,0] = point_ind #Save as as an Anchor Node - #connection_points[line -1,0] = self.pointList.index(point) + 1 - elif line_pos == 1: #If the B side of this line is connected to the point - connection_points[line -1,1] = point_ind #Save as a Fairlead node - #connection_points[line -1,1] = self.pointList.index(point) + 1 - #Populate text - for i in range(len(self.lineList)): - L.append("{:<4d} {:<15} {:8.3f} {:5d} {:8d} {:9d} {} {}" - .format(self.lineList[i].number,self.lineList[i].type,self.lineList[i].L,self.lineList[i].nNodes-1,int(connection_points[i,0]),int(connection_points[i,1]),flag, 0)) - - #Solver Options Header - L.append("---------------------- OPTIONS ----------------------------------------") - - #Solver Options - L.append("{:<9.3f}dtM - time step to use in mooring integration (s)".format(float(dtm))) - L.append("{:<9.1f}wtrdpth - water depth (m) <<< must be specified for farm-level mooring".format(float(depth))) - L.append("{:<9.1e}kbot - bottom stiffness (Pa/m)".format(kbot)) - L.append("{:<9.1e}cbot - bottom damping (Pa-s/m)".format(cbot)) - L.append("{:<9.1f}dtIC - time interval for analyzing convergence during IC gen (s)".format(int(dtIC))) - L.append("{:<9.1f}TmaxIC - max time for ic gen (s)".format(int(TmaxIC))) - L.append("{:<9.1f}CdScaleIC - factor by which to scale drag coefficients during dynamic relaxation (-)".format(int(CdScaleIC))) - L.append("{:<9.2f}threshIC - threshold for IC convergence (-)".format(threshIC)) - - #Outputs Header - L.append("----------------------------OUTPUTS--------------------------------------------") - - #Outputs List - for Output in Outputs: - L.append(Output) - L.append("END") - - #Final Line - L.append('--------------------- need this line ------------------') - - #Write the text file - with open(fileName, 'w') as out: - for x in range(len(L)): - out.write(L[x]) - out.write('\n') - - print('Successfully written '+fileName +' MoorDyn FAST.Farm input file') - def getDOFs(self): '''returns updated nDOFs and nCpldDOFs if the body and point types ever change @@ -1172,18 +1319,27 @@ def getDOFs(self): ''' - nDOF = 0 - nCpldDOF = 0 + nDOF = 0 # number of (free) degrees of freedom + nCpldDOF = 0 # number of coupled degrees of freedom + DOFtypes = [] # list of each DOF and whether it is free (0) or coupled (-1) for body in self.bodyList: - if body.type == 0: nDOF += 6 - if body.type ==-1: nCpldDOF += 6 + if body.type == 0: + nDOF += 6 + DOFtypes += [0]*6 + if body.type ==-1: + nCpldDOF += 6 + DOFtypes += [-1]*6 for point in self.pointList: - if point.type == 0: nDOF += point.nDOF - if point.type ==-1: nCpldDOF += point.nDOF - - return nDOF, nCpldDOF + if point.type == 0: + nDOF += point.nDOF + DOFtypes += [0]*point.nDOF + if point.type ==-1: + nCpldDOF += point.nDOF + DOFtypes += [-1]*point.nDOF + + return nDOF, nCpldDOF, DOFtypes def initialize(self, plots=0): @@ -1200,7 +1356,7 @@ def initialize(self, plots=0): ''' - self.nDOF, self.nCpldDOF = self.getDOFs() + self.nDOF, self.nCpldDOF, _ = self.getDOFs() for body in self.bodyList: body.setPosition(body.r6) @@ -1343,7 +1499,7 @@ def setPositions(self, X, DOFtype="free"): i = 0 # index used to split off input positions X for each free object # check to ensure len(X) matches nDOF, nCpldDOF or nDOF+nCpldDOF - nDOF, nCpldDOF = self.getDOFs() + nDOF, nCpldDOF, _ = self.getDOFs() if DOFtype=="free": types = [0] if len(X) != nDOF: @@ -1392,7 +1548,7 @@ def getForces(self, DOFtype="free", lines_only=False): ''' - nDOF, nCpldDOF = self.getDOFs() + nDOF, nCpldDOF, _ = self.getDOFs() # initialize force array based on DOFtype specified if DOFtype == "free": @@ -1675,7 +1831,7 @@ def solveEquilibrium(self, DOFtype="free", plots=0, tol=0.05, rmsTol=0.0, maxIte self.DOFtype_solve_for = DOFtype # create arrays for the initial positions of the objects that need to find equilibrium, and the max step sizes - X0, db = self.getPositions(DOFtype=DOFtype, dXvals=[100, 0.3]) + X0, db = self.getPositions(DOFtype=DOFtype, dXvals=[30, 0.02]) # temporary for backwards compatibility <<<<<<<<<< ''' @@ -1710,7 +1866,7 @@ def solveEquilibrium(self, DOFtype="free", plots=0, tol=0.05, rmsTol=0.0, maxIte i+=6 rtol = tol/max([np.linalg.norm(rpr) for rpr in body.rPointRel]) # estimate appropriate body rotational tolerance based on attachment point radii tols += 3*[tol] + 3*[rtol] - + for point in self.pointList: if point.type in types: if 2 in point.DOFs: @@ -1737,65 +1893,247 @@ def solveEquilibrium(self, DOFtype="free", plots=0, tol=0.05, rmsTol=0.0, maxIte def eval_func_equil(X, args): - Y = self.mooringEq(X, DOFtype=DOFtype, tol=lineTol) - oths = dict(status=1) # other outputs - returned as dict for easy use + Y = self.mooringEq(X, DOFtype=DOFtype, tol=lineTol) + oths = dict(status=1) # other outputs - returned as dict for easy use + + self.Xs.append(X) # temporary + self.Es.append(Y) + + return Y, oths, False + + def step_func_equil(X, args, Y, oths, Ytarget, err, tol_, iter, maxIter): + + # get stiffness matrix + if finite_difference: + K = self.getSystemStiffness(DOFtype=DOFtype) + else: + K = self.getSystemStiffnessA(DOFtype=DOFtype) + + # adjust positions according to stiffness matrix to move toward net zero forces + + ''' + detK = np.linalg.det(K) + if detK < 0: + for i in range(n): + K[i,i] += K[i,i] # double the diagonal entries as a hack + + print(f'doubled K diagonals to avoid negative det of {detK:8.2e}') + detK = np.linalg.det(K) + print(f' now it is {detK:8.2e}') + + # >>>> since det is expensive, could replace the if statement with a check for sum(y*dX) < 0 + breakpoint() + ''' + + """ + # ------ modified approach 1 -------- + detK = np.linalg.det(K) + if detK < 0: + for i in range(n): + K[i,i] += K[i,i] # double the diagonal entries as a hack + + print(f'doubled K diagonals to avoid negative det of {detK:8.2e}') + detK = np.linalg.det(K) + print(f' now it is {detK:8.2e}') + #breakpoint() + #else: # Normal case where all DOFs are adjusted + try: # try the normal solve first to avoid calculating the determinant every time + + if detK == 0.0: # if the stiffness matrix is singular, we will modify the approach + + # >>> consider adjusting order relative to detK < 0 check <<< + + # first try ignoring any DOFs with zero stiffness + indices = list(range(n)) # list of DOF indices that will remain active for this step + mask = [True]*n # this is a mask to be applied to the array K indices + + for i in range(n-1, -1, -1): # go through DOFs and flag any with zero stiffness for exclusion + if K[i,i] == 0: + mask[i] = False + del indices[i] + + K_select = K[mask,:][:,mask] + Y_select = Y[mask] + + + + if np.linalg.det(K_select) == 0.0: + dX_select = Y_select/np.diag(K_select) # last-ditch attempt to get a step despite matrix singularity + else: + if n > 20: # if huge, count on the system being sparse and use a sparse solver + Kcsr = csr_matrix(K_select) + dX_select = spsolve(Kcsr, Y_select) + else: + dX_select = np.linalg.solve(K_select, Y_select) + + dX = np.zeros(n) + dX[indices] = dX_select # assign active step DOFs, other DOFs will be zero + + elif n > 20: # if huge, count on the system being sparse and use a sparse solver + #with warnings.catch_warnings(): + # warnings.simplefilter("error", category=MatrixRankWarning) + Kcsr = csr_matrix(K) + dX = spsolve(Kcsr, Y) + + else: + dX = np.linalg.solve(K, Y) # calculate position adjustment according to Newton's method + except: + + #else: + raise Exception("why did it fail even though det isn't zero?") + + + + + + """ + # ------ modified approach 2 -------- + kmean = np.mean(K.diagonal()) # mean value of diagonal stiffness entries + + # first check for any DOFs with zero stiffness, and also DOFs on seabed + indices = list(range(n)) # list of DOF indices that will remain active for this step + mask = [True]*n # this is a mask to be applied to the array K indices + + for i in range(n-1, -1, -1): # go through DOFs and flag any with zero stiffness for exclusion + + + # ignore any vertical DOFs that are happily resting on the seabed and not gonna lift off + if i in zInds: # if this is a z coordinate + if X[i] <= -self.depth and Y[i] <= 0.0: + mask[i] = False + del indices[i] + + + elif K[i,i] == 0: + if abs(Y[i]) == 0: # if no applied force and no stiffness, remove the DOF <<< just a try + mask[i] = False + del indices[i] + else: # if applied force, set some stiffness + K[i,i] = kmean + + elif K[i,i] < 0: + pass #breakpoint() + + K_select = K[mask,:][:,mask] + Y_select = Y[mask] + + n_select = len(Y_select) + + + if n_select < n: #could streamline for typical case with something like this <<< + n2 = n_select + K2 = K_select + Y2 = Y_select + else: + n2 = n + K2 = K + Y2 = Y + + ''' + kmean = np.mean(K.diagonal()) # mean value of diagonal stiffness entries + for i in range(n): + if K[i,i] == 0: + K[i,i] = kmean + n2 = n + K2 = K + Y2 = Y + ''' + try: + if n2 > 20: # if huge, count on the system being sparse and use a sparse solver + with warnings.catch_warnings(): + warnings.simplefilter("error", category=MatrixRankWarning) + Kcsr = csr_matrix(K2) + dX2 = spsolve(Kcsr, Y2) + ''' + for iTry in range(10): + if sum(dX2*Y2) < 0: + print(f"sum(dX2*Y2) is negative so enlarging the diagonals {sum(dX2*Y2):.2e}") + for i in range(n2): + K2[i,i] += 0.1*abs(K2[i,i]) # double the diagonal entries as a hack + + Kcsr = csr_matrix(K2) + dX2 = spsolve(Kcsr, Y2) + else: + print(f" UPDATEdet is sum of dx*y is {sum(dX2*Y2):.2e} after {iTry} adjustments") + break + ''' + + + else: + + dX2 = np.linalg.solve(K2, Y2) # calculate position adjustment according to Newton's method + + + if np.linalg.det(K2) < 0: + print(f" Determinant is {np.linalg.det(K2)} while sum of dx*y is {sum(dX2*Y2)}") + #breakpoint() + + # check sign for backward result (potentially a result of bad numerics?) and strengthen diagonals if so to straighten it out + for iTry in range(10): + if sum(dX2*Y2) < 0: + print("sum(dX2*Y2) is negative so enlarging the diagonals") + for i in range(n2): + K2[i,i] += 0.1*abs(K2[i,i]) # double the diagonal entries as a hack + + dX2 = np.linalg.solve(K2, Y2) + else: + #>>>print(f" UPDATEdet is {np.linalg.det(K2)} while sum of dx*y is {sum(dX2*Y2)} after {iTry} adjustments") + break + + #if + + + except Exception as ex: + print(f"EXCEPTION n2 is {n2} "+str(ex)) + + #print("trying to enlarge the diagonals") + for i in range(n2): + K2[i,i] += K2[i,i] # double the diagonal entries as a hack + + try: + #with warnings.catch_warnings(): + # warnings.simplefilter("error", category=MatrixRankWarning) + Kcsr = csr_matrix(K2) + dX2 = spsolve(Kcsr, Y2) + #print('worked') + except Exception as e2: + dX2 = Y2/np.diag(K2) + print('failed'+str(e2)+" after "+str(ex)) + + dX = np.zeros(n) + dX[indices] = dX2 # dX_select + #dX = dX2 - self.Xs.append(X) # temporary - self.Es.append(Y) - return Y, oths, False - - def step_func_equil(X, args, Y, oths, Ytarget, err, tol_, iter, maxIter): - - # get stiffness matrix - if finite_difference: - K = self.getSystemStiffness(DOFtype=DOFtype) - else: - K = self.getSystemStiffnessA(DOFtype=DOFtype) - # adjust positions according to stiffness matrix to move toward net zero forces + + #breakpoint() + + ''' + if np.linalg.det(K_select) == 0.0: + dX_select = Y_select/np.diag(K_select) # last-ditch attempt to get a step despite matrix singularity + else: + dX_select = np.linalg.solve(K_select, Y_select) + dX[indices] = dX_select # assign active step DOFs, other DOFs will be zero - #else: # Normal case where all DOFs are adjusted + # Normal case where all DOFs are adjusted try: # try the normal solve first to avoid calculating the determinant every time - if n > 20: # if huge, count on the system being sparse and use a sparse solver - #with warnings.catch_warnings(): - # warnings.simplefilter("error", category=MatrixRankWarning) - Kcsr = csr_matrix(K) - dX = spsolve(Kcsr, Y) - else: - dX = np.linalg.solve(K, Y) # calculate position adjustment according to Newton's method + except: - - if np.linalg.det(K) == 0.0: # if the stiffness matrix is singular, we will modify the approach + if detK == 0.0: # if the stiffness matrix is singular, we will modify the approach - # first try ignoring any DOFs with zero stiffness - indices = list(range(n)) # list of DOF indices that will remain active for this step - mask = [True]*n # this is a mask to be applied to the array K indices - - for i in range(n-1, -1, -1): # go through DOFs and flag any with zero stiffness for exclusion - if K[i,i] == 0: - mask[i] = False - del indices[i] - - K_select = K[mask,:][:,mask] - Y_select = Y[mask] - - dX = np.zeros(n) - - if np.linalg.det(K_select) == 0.0: - dX_select = Y_select/np.diag(K_select) # last-ditch attempt to get a step despite matrix singularity - else: - dX_select = np.linalg.solve(K_select, Y_select) - dX[indices] = dX_select # assign active step DOFs, other DOFs will be zero + else: raise Exception("why did it fail even though det isn't zero?") + ''' # but limit adjustment magnitude (still preserve direction) to keep things under control overratio = np.max(np.abs(dX)/db) if overratio > 1.0: dX = dX/overratio + if iter in [177,178,179,180]: print("overatio") ''' for i in range(n): if dX[i] > db[i]: @@ -1808,7 +2146,25 @@ def step_func_equil(X, args, Y, oths, Ytarget, err, tol_, iter, maxIter): for i in zInds: if X[i] + dX[i] <= -self.depth or (X[i] <= -self.depth and Y[i] <= 0.0): dX[i] = -self.depth - X[i] - + + + #print(f" LBot {self.lineList[1].LBot:6.2f} dz1 {dX[2]:7.2f} dz2 {dX[5]:7.2f} detK {np.linalg.det(K2):8.2e}") + ''' + if iter in [177,178,179,180]: + + + print('x '); printVec(X) + #print('k '); printMat(K) + print('y '); printVec(Y) + print('dx '); printVec(dX) + #breakpoint() + if iter==180: + self.plot() + plt.show() + + breakpoint() + ''' + #if iter > 100: # print(iter) # breakpoint() @@ -1890,7 +2246,7 @@ def plotEQsolve(self, iter=-1): - def getSystemStiffness(self, DOFtype="free", dx = 0.1, dth = 0.1, solveOption=1, lines_only=False, plots=0): + def getSystemStiffness(self, DOFtype="free", dx=0.1, dth=0.1, solveOption=1, lines_only=False, plots=0): '''Calculates the stiffness matrix for all selected degrees of freedom of a mooring system whether free, coupled, or both (other DOFs are considered fixed). @@ -2018,8 +2374,8 @@ def getSystemStiffness(self, DOFtype="free", dx = 0.1, dth = 0.1, solveOption=1, raise ValueError("getSystemStiffness was called with an invalid solveOption (only 0 and 1 are supported)") - # ----------------- restore the system back to previous positions ------------------ - self.setPositions(X1, DOFtype=DOFtype) + # ----------------- restore the system back to previous state ------------------ + self.mooringEq(X1, DOFtype=DOFtype) # this restores positions and recalculates forces # show an animation of the stiffness perturbations if applicable if plots > 0: @@ -2058,7 +2414,7 @@ def getCoupledStiffness(self, dx=0.1, dth=0.1, solveOption=1, lines_only=False, nCpldDOF x nCpldDOF stiffness matrix of the system ''' - self.nDOF, self.nCpldDOF = self.getDOFs() + self.nDOF, self.nCpldDOF, _ = self.getDOFs() if self.display > 2: print("Getting mooring system stiffness matrix...") @@ -2093,7 +2449,7 @@ def getCoupledStiffness(self, dx=0.1, dth=0.1, solveOption=1, lines_only=False, X2 = np.array(X1, dtype=np.float_) X2[i] += dX[i] # perturb positions by dx in each DOF in turn self.setPositions(X2, DOFtype="coupled") # set the perturbed coupled DOFs - self.solveEquilibrium() # let the system settle into equilibrium + self.solveEquilibrium() # let the system settle into equilibrium (note that this might prompt a warning if there are no free DOFs) F2p = self.getForces(DOFtype="coupled", lines_only=lines_only) # get resulting coupled DOF net force/moment response if tensions: T2p = self.getTensions() @@ -2186,7 +2542,59 @@ def getCoupledStiffness(self, dx=0.1, dth=0.1, solveOption=1, lines_only=False, return K + + def getCoupledStiffnessA(self, lines_only=False, tensions=False, nTries=3, plots=0): + '''Calculates the stiffness matrix for coupled degrees of freedom of a mooring system + with free uncoupled degrees of freedom equilibrated - analytical appraoch. + + Parameters + ---------- + plots : boolean, optional + Determines whether the stiffness calculation process is plotted and/or animated or not. The default is 0. + lines_only : boolean + Whether to consider only line forces and ignore body/point properties. + tensions : boolean + Whether to also compute and return mooring line tension jacobians + + Returns + ------- + K : matrix + nCpldDOF x nCpldDOF stiffness matrix of the system + + ''' + + self.nDOF, self.nCpldDOF, DOFtypes = self.getDOFs() + + n = self.nDOF + self.nCpldDOF + + if self.display > 2: + print("Getting mooring system stiffness matrix...") + + # get full system stiffness matrix + K_all = self.getSystemStiffnessA(DOFtype="both", lines_only=lines_only) + + # invert matrix + K_inv_all = np.linalg.inv(K_all) + + # remove free DOFs (this corresponds to saying that the same of forces on these DOFs will remain zero) + #indices = list(range(n)) # list of DOF indices that will remain active for this step + mask = [True]*n # this is a mask to be applied to the array K indices + + for i in range(n-1, -1, -1): # go through DOFs and flag free ones for exclusion + if DOFtypes[i] == 0: + mask[i] = False + #del indices[i] + K_inv_coupled = K_inv_all[mask,:][:,mask] + + # invert reduced matrix to get coupled stiffness matrix (with free DOFs assumed to equilibrate linearly) + K_coupled = np.linalg.inv(K_inv_coupled) + + #if tensions: + # return K_coupled, J + #else: + return K_coupled + def getSystemStiffnessA(self, DOFtype="free", lines_only=False, rho=1025, g=9.81): @@ -2221,7 +2629,7 @@ def getSystemStiffnessA(self, DOFtype="free", lines_only=False, rho=1025, g=9.81 # find the total number of free and coupled DOFs in case any object types changed - self.nDOF, self.nCpldDOF = self.getDOFs() + self.nDOF, self.nCpldDOF, _ = self.getDOFs() #self.solveEquilibrium() # should we make sure the system is in equilibrium? @@ -2384,8 +2792,231 @@ def getSystemStiffnessA(self, DOFtype="free", lines_only=False, rho=1025, g=9.81 return K + def getAnchorLoads(self, sfx, sfy, sfz, N): + ''' Calculates anchor loads + Parameters + ---------- + sfx : float + Safety factor for forces in X direction + sfy : float + Safety factor for forces in Y direction + sfz : float + Safety factor for forces in Z direction + N : int + Number of timesteps to skip for transients + Returns + ------- + Array of maximum anchor loads in order of fixed points (tons) + + ''' + anchorloads = [] + for point in self.pointList: + + #Only calculate anchor load if point is fixed + if point.type == 1: + confz = self.data[N:,self.ch["CON"+str(point.number)+"FZ"]]/1000 + confy = self.data[N:,self.ch["CON"+str(point.number)+"FY"]]/1000 + confx = self.data[N:,self.ch["CON"+str(point.number)+"FZ"]]/1000 + convec = np.linalg.norm([(confz*sfz), (confx*sfx), (confy*sfy)], axis = 0)/9.81 + anchorloads.append(max(convec)) + return(anchorloads) + + def ropeContact(self, lineNums, N): + ''' Determines whether Node 1 is off the ground for lines in lineNums + Parameters + ---------- + lineNums : list of integers + Line number to calculate rope contact for corresponds to MoorDyn file ***STARTS AT 1 + N : int + Number of timesteps to skip for transients + Returns + ------- + min_node1_z: list of floats + Minimum height of node 1 above seabed for lines in lineNums (m) + + ''' + + #iterate through lines in line list.... would be nice to automatically iterate through lines that are attached to fixed points + min_node1_z = [] + for line in self.lineList: + if line.number in lineNums: + anchorzs = line.zp[N:,1] + float(self.MDoptions['wtrdpth']) #Does not work for bathymetries + min_node1_z.append(min(anchorzs)) + return(min_node1_z) + + + def sagDistance(self,lineNums,N): + ''' Calculates sag distance for center node for each line in lineNums + Parameters + ---------- + lineNums : list of integers + Line number to calculate sag distance for corresponds to MoorDyn file ***STARTS AT 1 + N : int + Number of timesteps to skip for transients + Returns + ------- + minsagz: list of floats + Minimum distance below waterline for center node in order of lines in lineNums(m) + maxsagz: list of floats + Maximum distance below waterline for center node in order of lines in lineNums (m) + ''' + maxsagz = [] + minsagz = [] + for line in self.lineList: + if line.number in lineNums: + sagz = -line.zp[N:,int(line.nNodes/2)] # maybe add something to handle odd number of nodes + maxsagz.append(max(sagz)) + minsagz.append(min(sagz)) + return minsagz, maxsagz + + def checkTensions(self, N = None): + '''Checks the line tensions and MBLs of a MoorPy system in its current state with the quasi-static model. + Returns: list of tension/MBL for each line. + Parameters + ---------- + N : int, only required if qs == 0 + Number of timesteps to skip for transients + ''' + + # NOTE this function has very limited functionality because imported systems will not have line MBLs.... still thinking about the best way to handle this + if self.qs == 1: + ratios = [] + for line in self.lineList: + if hasattr(line.type,'MBL'): + ratios.append(max(line.TA, line.TB)/line.type['MBL']) + else: + print('Line does not have an MBL') + return + return(ratios) + else: + ratios = [] + for line in self.lineList: + + #Only works if tensions are in lineN.MD.out files + if hasattr(line,'Ten'): + + if hasattr(line.type,'MBL'): + ratios.append(np.amax(line.Ten[N:,:])/line.type['MBL']) + else: + print('Line does not have an MBL') + return + else: + print('Line does not hold tension data') + return + return(ratios) + + + def activateDynamicStiffness(self, display=0): + '''Switch mooring system model to dynamic line stiffness + values and adjust the unstretched line lengths to maintain the + same tensions. This only has an effect when dynamic line properties + are used.''' + + for line in self.lineList: + line.activateDynamicStiffness(display=display) + + + def revertToStaticStiffness(self): + '''Revert mooring system model back to the static stiffness + values and the original unstretched lenths.''' + + for line in self.lineList: + line.revertToStaticStiffness() + + def getDepthFromBathymetry(self, x, y): #BathymetryGrid, BathGrid_Xs, BathGrid_Ys, LineX, LineY, depth, nvec) + ''' interpolates local seabed depth and normal vector + + Parameters + ---------- + x, y : float + x and y coordinates to find depth and slope at [m] + + Returns + ------- + depth : float + local seabed depth (positive down) [m] + nvec : array of size 3 + local seabed surface normal vector (positive out) + ''' + + # if no bathymetry info stored, just return uniform depth + if self.seabedMod == 0: + return self.depth, np.array([0,0,1]) + + if self.seabedMod == 1: + depth = self.depth - self.xSlope*x - self.ySlope*y + nvec = unitVector([-self.xSlope, -self.ySlope, 1]) + return depth, nvec + + if self.seabedMod == 2: + # get interpolation indices and fractions for the relevant grid panel + ix0, fx = getInterpNums(self.bathGrid_Xs, x) + iy0, fy = getInterpNums(self.bathGrid_Ys, y) + + + # handle end case conditions + if fx == 0: + ix1 = ix0 + else: + ix1 = min(ix0+1, self.bathGrid.shape[1]) # don't overstep bounds + + if fy == 0: + iy1 = iy0 + else: + iy1 = min(iy0+1, self.bathGrid.shape[0]) # don't overstep bounds + + + # get corner points of the panel + c00 = self.bathGrid[iy0, ix0] + c01 = self.bathGrid[iy1, ix0] + c10 = self.bathGrid[iy0, ix1] + c11 = self.bathGrid[iy1, ix1] + + # get interpolated points and local value + cx0 = c00 *(1.0-fx) + c10 *fx + cx1 = c01 *(1.0-fx) + c11 *fx + c0y = c00 *(1.0-fy) + c01 *fy + c1y = c10 *(1.0-fy) + c11 *fy + depth = cx0 *(1.0-fy) + cx1 *fy + + # get local slope + dx = self.bathGrid_Xs[ix1] - self.bathGrid_Xs[ix0] + dy = self.bathGrid_Ys[iy1] - self.bathGrid_Ys[iy0] + + if dx > 0.0: + dc_dx = (c1y-c0y)/dx + else: + dc_dx = 0.0 # maybe this should raise an error + + if dx > 0.0: + dc_dy = (cx1-cx0)/dy + else: + dc_dy = 0.0 # maybe this should raise an error + + nvec = unitVector([dc_dx, dc_dy, 1.0]) # compute unit vector + return depth, nvec + + + def loadData(self, dirname, rootname, sep='.MD.'): + '''Loads time series data from main MoorDyn output file (for example driver.MD.out) + Parameters + ---------- + dirname: str + Directory name + rootname: str + MoorDyn output file rootname + sep: str + MoorDyn file name seperator + ''' + + # Temporarily storing all data in main output file in system.data ..... probably will want to change this at some point + if path.exists(dirname+rootname+'.MD.out'): + + self.data, self.ch, self.channels, self.units = read_mooring_file(dirname+rootname+sep, "out") # remember number starts on 1 rather than 0 + + def plot(self, ax=None, bounds='default', rbound=0, color=None, **kwargs): '''Plots the mooring system objects in their current positions Parameters @@ -2420,25 +3051,37 @@ def plot(self, ax=None, bounds='default', rbound=0, color=None, **kwargs): ''' - hidebox = kwargs.get('hidebox' , False ) # toggles whether to show the axes or not + # kwargs that can be used for plot or plot2d title = kwargs.get('title' , "" ) # optional title for the plot time = kwargs.get("time" , 0 ) # the time in seconds of when you want to plot linelabels = kwargs.get('linelabels' , False ) # toggle to include line number labels in the plot pointlabels = kwargs.get('pointlabels' , False ) # toggle to include point number labels in the plot - endpoints = kwargs.get('endpoints' , False ) # toggle to include the line end points in the plot + draw_body = kwargs.get("draw_body" , True ) # toggle to draw the Bodies or not + draw_clumps = kwargs.get('draw_clumps' , False ) # toggle to draw clump weights and float of the mooring system + draw_anchors = kwargs.get('draw_anchors' , False ) # toggle to draw the anchors of the mooring system or not bathymetry = kwargs.get("bathymetry" , False ) # toggle (and string) to include bathymetry or not. Can do full map based on text file, or simple squares - water = kwargs.get("water" , 0 ) # option to plot water surface (if > 0) + args_bath = kwargs.get("args_bath" , {} ) # dictionary of optional plot_surface arguments + ''' cmap_bath = kwargs.get("cmap" , 'ocean' ) # matplotlib colormap specification alpha = kwargs.get("opacity" , 1.0 ) # the transparency of the bathymetry plot_surface - draw_body = kwargs.get("draw_body" , True ) # toggle to draw the Bodies or not - shadow = kwargs.get("shadow" , True ) # toggle to draw the mooring line shadows or not + ''' rang = kwargs.get('rang' , 'hold' ) # colorbar range: if range not used, set it as a placeholder, it will get adjusted later cbar_bath = kwargs.get('cbar_bath' , False ) # toggle to include a colorbar for a plot or not - cbar_bath_size = kwargs.get('colorbar_size' , 1.0 ) # the scale of the colorbar. Not the same as aspect. Aspect adjusts proportions colortension = kwargs.get("colortension" , False ) # toggle to draw the mooring lines in colors based on node tensions cmap_tension = kwargs.get('cmap_tension' , 'rainbow' ) # the type of color spectrum desired for colortensions cbar_tension = kwargs.get('cbar_tension' , False ) # toggle to include a colorbar of the tensions when colortension=True - + figsize = kwargs.get('figsize' , (6,4) ) # the dimensions of the figure to be plotted + # kwargs that are currently only used in plot + hidebox = kwargs.get('hidebox' , False ) # toggles whether to show the axes or not + endpoints = kwargs.get('endpoints' , False ) # toggle to include the line end points in the plot + waterplane = kwargs.get("waterplane" , False ) # option to plot water surface + shadow = kwargs.get("shadow" , True ) # toggle to draw the mooring line shadows or not + cbar_bath_size = kwargs.get('colorbar_size' , 1.0 ) # the scale of the colorbar. Not the same as aspect. Aspect adjusts proportions + # bound kwargs + xbounds = kwargs.get('xbounds' , None ) # the bounds of the x-axis. The midpoint of these bounds determines the origin point of orientation of the plot + ybounds = kwargs.get('ybounds' , None ) # the bounds of the y-axis. The midpoint of these bounds determines the origin point of orientation of the plot + zbounds = kwargs.get('zbounds' , None ) # the bounds of the z-axis. The midpoint of these bounds determines the origin point of orientation of the plot + center = kwargs.get('center' , None ) # x and y coordinates to be at center of image (shifts center to zoom/rotate about) # sort out bounds xs = [] @@ -2453,7 +3096,7 @@ def plot(self, ax=None, bounds='default', rbound=0, color=None, **kwargs): # if axes not passed in, make a new figure if ax == None: - fig = plt.figure() + fig = plt.figure(figsize=figsize) #fig = plt.figure(figsize=(20/2.54,12/2.54), dpi=300) ax = plt.axes(projection='3d') else: @@ -2461,9 +3104,12 @@ def plot(self, ax=None, bounds='default', rbound=0, color=None, **kwargs): # set bounds if rbound==0: - rbound = max([max(xs), max(ys), -min(xs), -min(ys)]) # this is the most extreme coordinate - - + if len(xs) > 0: + rbound = max([max(xs), max(ys), -min(xs), -min(ys)]) # this is the most extreme coordinate + else: + rbound = self.depth + + # set the DATA bounds on the axis if bounds=='default': ax.set_zlim([-self.depth, 0]) elif bounds=='rbound': @@ -2474,33 +3120,86 @@ def plot(self, ax=None, bounds='default', rbound=0, color=None, **kwargs): ax.set_xlim([-rbound,0]) ax.set_ylim([-rbound/2,rbound/2]) ax.set_zlim([-self.depth, 0]) - + + # adjust the center point of the figure if requested, by moving out one of the bounds >>> should put this and the next section into helper functions <<< + if not center is None: + xlims = ax.get_xlim3d() + if center[0] > np.mean(xlims): ax.set_xlim([xlims[0], center[0] + (center[0]-xlims[0])]) + elif center[0] < np.mean(xlims): ax.set_xlim([center[0] - (xlims[0] - center[0]), xlims[1]]) + ylims = ax.get_ylim3d() + if center[1] > np.mean(ylims): ax.set_ylim([ylims[0], center[1] + (center[1]-ylims[0])]) + elif center[1] < np.mean(ylims): ax.set_ylim([center[1] - (ylims[0] - center[1]), ylims[1]]) + + # set the AXIS bounds on the axis (changing these bounds can change the perspective of the matplotlib figure) + if xbounds != None: + ax.set_xlim(xbounds[0], xbounds[1]) + #ax.autoscale(enable=False, axis='x') + if ybounds != None: + ax.set_ylim(ybounds[0], ybounds[1]) + #ax.autoscale(enable=False, axis='y') + if zbounds != None: + ax.set_zlim(zbounds[0], zbounds[1]) + #ax.autoscale(enable=False, axis='x') + # draw things if draw_body: for body in self.bodyList: body.draw(ax) + for rod in self.rodList: + if len(self.rodList)==0: # usually, there are no rods in the rodList + pass + else: + #if self.qs==0 and len(rod.Tdata) == 0: + # pass + if isinstance(rod, Line) and rod.show: + rod.drawLine(time, ax, color=color, shadow=shadow) + #if isinstance(rod, Point): # zero-length special case + # not plotting points for now + + if draw_clumps: + for point in self.pointList: + if point.v*self.rho > point.m: # if it has positive buoyancy + ax.plot([point.r[0]],[point.r[1]],[point.r[2]], markerfacecolor='b', markeredgecolor='k', marker='o', markersize=5) + elif point.m > 0: # if it is a weight + ax.plot([point.r[0]],[point.r[1]],[point.r[2]], markerfacecolor='r', markeredgecolor='k', marker='o', markersize=5) + + if draw_anchors: + for line in self.lineList: + if line.zp[0,0]==-self.depth: + itime = int(time/line.dt) + r = [line.xp[itime,0], line.yp[itime,0], line.zp[itime,0]] + if color==None: + c='tab:blue' + else: + c=color + plt.plot(r[0], r[1], r[2], 'v', color=c, markersize=5) + j = 0 for line in self.lineList: - j = j + 1 - if color==None and isinstance(line.type, str): - if 'chain' in line.type: - line.drawLine(time, ax, color=[.1, 0, 0], endpoints=endpoints, shadow=shadow, colortension=colortension, cmap_tension=cmap_tension) - elif 'rope' in line.type or 'polyester' in line.type: - line.drawLine(time, ax, color=[.3,.5,.5], endpoints=endpoints, shadow=shadow, colortension=colortension, cmap_tension=cmap_tension) - else: - line.drawLine(time, ax, color=[0.2,0.2,0.2], endpoints=endpoints, shadow=shadow, colortension=colortension, cmap_tension=cmap_tension) + if self.qs==0 and len(line.Tdata) == 0: + pass else: - line.drawLine(time, ax, color=color, endpoints=endpoints, shadow=shadow, colortension=colortension, cmap_tension=cmap_tension) - + j = j + 1 + if color==None and 'material' in line.type: + if 'chain' in line.type['material']: + line.drawLine(time, ax, color=[.1, 0, 0], endpoints=endpoints, shadow=shadow, colortension=colortension, cmap_tension=cmap_tension) + elif 'rope' in line.type['material'] or 'polyester' in line.type['material']: + line.drawLine(time, ax, color=[.3,.5,.5], endpoints=endpoints, shadow=shadow, colortension=colortension, cmap_tension=cmap_tension) + elif 'nylon' in line.type['material']: + line.drawLine(time, ax, color=[.8,.8,.2], endpoints=endpoints, shadow=shadow, colortension=colortension, cmap_tension=cmap_tension) + else: + line.drawLine(time, ax, color=[0.5,0.5,0.5], endpoints=endpoints, shadow=shadow, colortension=colortension, cmap_tension=cmap_tension) + else: + line.drawLine(time, ax, color=color, endpoints=endpoints, shadow=shadow, colortension=colortension, cmap_tension=cmap_tension) + + # Add line labels + if linelabels == True: + ax.text((line.rA[0]+line.rB[0])/2, (line.rA[1]+line.rB[1])/2, (line.rA[2]+line.rB[2])/2, j) - # Add line labels - if linelabels == True: - ax.text((line.rA[0]+line.rB[0])/2, (line.rA[1]+line.rB[1])/2, (line.rA[2]+line.rB[2])/2, j) - if cbar_tension: - maxten = max([max(line.getLineTens()) for line in self.lineList]) # find the max tension in the System - minten = min([min(line.getLineTens()) for line in self.lineList]) # find the min tension in the System + maxten = max([max(line.Ts) for line in self.lineList]) # find the max tension in the System + minten = min([min(line.Ts) for line in self.lineList]) # find the min tension in the System bounds = range(int(minten),int(maxten), int((maxten-minten)/256)) norm = mpl.colors.BoundaryNorm(bounds, 256) # set the bounds in a norm object, with 256 being the length of all colorbar strings fig.colorbar(cm.ScalarMappable(norm=norm, cmap=cmap_tension), label='Tension (N)') # add the colorbar @@ -2523,7 +3222,7 @@ def plot(self, ax=None, bounds='default', rbound=0, color=None, **kwargs): Z = np.array(points) verts = [[Z[0],Z[1],Z[2],Z[3]]] - ax.add_collection3d(Poly3DCollection(verts, facecolors='limegreen', linewidths=1, edgecolors='g', alpha=alpha)) + ax.add_collection3d(Poly3DCollection(verts, facecolors='limegreen', linewidths=1, edgecolors='g', alpha=1.0)) if isinstance(bathymetry, str): # or, if it's a string, load in the bathymetry file @@ -2547,7 +3246,8 @@ def plot(self, ax=None, bounds='default', rbound=0, color=None, **kwargs): ''' # Second method: plot a 3D surface, plot_surface X, Y = np.meshgrid(bathGrid_Xs, bathGrid_Ys) - bath = ax.plot_surface(X,Y,-bathGrid, cmap=cmap_bath, vmin=rang[0], vmax=rang[1], alpha=alpha) + + bath = ax.plot_surface(X,Y,-bathGrid, vmin=rang[0], vmax=rang[1], **args_bath) if cbar_bath_size!=1.0: # make sure the colorbar is turned on just in case it isn't when the other colorbar inputs are used cbar_bath=True @@ -2555,8 +3255,12 @@ def plot(self, ax=None, bounds='default', rbound=0, color=None, **kwargs): fig.colorbar(bath, shrink=cbar_bath_size, label='depth (m)') # draw water surface if requested - #if water > 0: - + if waterplane: + waterXs = np.array([min(xs), max(xs)]) + waterYs = np.array([min(ys), max(ys)]) + waterX, waterY = np.meshgrid(waterXs, waterYs) + ax.plot_surface(waterX, waterY, np.array([[-50,-50],[-50,-50]]), alpha=0.5) + fig.suptitle(title) @@ -2596,48 +3300,94 @@ def plot2d(self, Xuvec=[1,0,0], Yuvec=[0,0,1], ax=None, color=None, **kwargs): ''' - title = kwargs.get('title' , "" ) # optional title for the plot - time = kwargs.get("time" , 0 ) # the time in seconds of when you want to plot - linelabels = kwargs.get('linelabels' , False ) # toggle to include line number labels in the plot - pointlabels = kwargs.get('pointlabels' , False ) # toggle to include point number labels in the plot - bathymetry = kwargs.get("bathymetry" , False ) # toggle (and string) to include bathymetry contours or not based on text file - draw_body = kwargs.get("draw_body" , False ) # toggle to draw the Bodies or not - cmap_bath = kwargs.get("cmap_bath" , 'ocean' ) # matplotlib colormap specification - alpha = kwargs.get("opacity" , 1.0 ) # the transparency of the bathymetry plot_surface - levels = kwargs.get("levels" , 7 ) # the number (or array) of levels in the contour plot - rang = kwargs.get('rang' , 'hold' ) # colorbar range: if range not used, set it as a placeholder, it will get adjusted later - cbar_bath = kwargs.get('colorbar' , False ) # toggle to include a colorbar for a plot or not - cbar_bath_aspect = kwargs.get('cbar_bath_aspect', 20 ) # the proportion of the colorbar. Default is 20 height x 1 width - cbar_bath_ticks = kwargs.get('cbar_bath_ticks' , None ) # the desired tick labels on the colorbar (can be an array) - colortension = kwargs.get("colortension" , False ) # toggle to draw the mooring lines in colors based on node tensions - cmap_tension = kwargs.get('cmap_tension' , 'rainbow' ) # the type of color spectrum desired for colortensions - cbar_tension = kwargs.get('cbar_tension' , False ) # toggle to include a colorbar of the tensions when colortension=True + # kwargs that can be used for plot or plot2d + title = kwargs.get('title' , "" ) # optional title for the plot + time = kwargs.get("time" , 0 ) # the time in seconds of when you want to plot + linelabels = kwargs.get('linelabels' , False ) # toggle to include line number labels in the plot + pointlabels = kwargs.get('pointlabels' , False ) # toggle to include point number labels in the plot + draw_body = kwargs.get("draw_body" , False ) # toggle to draw the Bodies or not + draw_anchors = kwargs.get('draw_anchors' , False ) # toggle to draw the anchors of the mooring system or not + bathymetry = kwargs.get("bathymetry" , False ) # toggle (and string) to include bathymetry contours or not based on text file + cmap_bath = kwargs.get("cmap_bath" , 'ocean' ) # matplotlib colormap specification + alpha = kwargs.get("opacity" , 1.0 ) # the transparency of the bathymetry plot_surface + rang = kwargs.get('rang' , 'hold' ) # colorbar range: if range not used, set it as a placeholder, it will get adjusted later + cbar_bath = kwargs.get('colorbar' , False ) # toggle to include a colorbar for a plot or not + colortension = kwargs.get("colortension" , False ) # toggle to draw the mooring lines in colors based on node tensions + cmap_tension = kwargs.get('cmap_tension' , 'rainbow' ) # the type of color spectrum desired for colortensions + cbar_tension = kwargs.get('cbar_tension' , False ) # toggle to include a colorbar of the tensions when colortension=True + figsize = kwargs.get('figsize' , (6,4) ) # the dimensions of the figure to be plotted + # kwargs that are currently only used in plot2d + levels = kwargs.get("levels" , 7 ) # the number (or array) of levels in the contour plot + cbar_bath_aspect = kwargs.get('cbar_bath_aspect', 20 ) # the proportion of the colorbar. Default is 20 height x 1 width + cbar_bath_ticks = kwargs.get('cbar_bath_ticks' , None ) # the desired tick labels on the colorbar (can be an array) + plotnodes = kwargs.get('plotnodes' , [] ) # the list of node numbers that are desired to be plotted + plotnodesline = kwargs.get('plotnodesline' , [] ) # the list of line numbers that match up with the desired node to be plotted + label = kwargs.get('label' , "" ) # the label/marker name of a line in the System + draw_fairlead = kwargs.get('draw_fairlead' , False ) # toggle to draw large points for the fairleads + # if axes not passed in, make a new figure if ax == None: - fig, ax = plt.subplots(1,1) + fig, ax = plt.subplots(1,1, figsize=figsize) else: - fig = plt.gcf() # will this work like this? <<< + fig = ax.get_figure() if draw_body: for body in self.bodyList: #body.draw(ax) - plt.plot(body.r6[0],body.r6[1],'ko',markersize=5) + r = body.r6[0:3] + x = r[Xuvec.index(1)] + y = r[Yuvec.index(1)] + plt.plot(x, y, 'ko', markersize=5) + + for rod in self.rodList: + if isinstance(rod, Line): + rod.drawLine2d(time, ax, color=color, Xuvec=Xuvec, Yuvec=Yuvec) + + if draw_fairlead: + for line in self.lineList: + if line.number==1: + itime = int(time/line.dt) + r = [line.xp[itime,-1], line.yp[itime,-1], line.zp[itime,-1]] + x = r[Xuvec.index(1)] + y = r[Yuvec.index(1)] + if color==None: + c='tab:blue' + else: + c=color + plt.plot(x, y, 'o', color=c, markersize=5) + + + if draw_anchors: + for line in self.lineList: + if line.zp[0,0]==-self.depth: + itime = int(time/line.dt) + r = [line.xp[itime,0], line.yp[itime,0], line.zp[itime,0]] + x = r[Xuvec.index(1)] + y = r[Yuvec.index(1)] + if color==None: + c='tab:blue' + else: + c=color + plt.plot(x, y, 'v', color=c, markersize=5) + j = 0 for line in self.lineList: + if line!=self.lineList[0]: + label="" j = j + 1 - if color==None and isinstance(line.type, str): - if 'chain' in line.type: - line.drawLine2d(time, ax, color=[.1, 0, 0], Xuvec=Xuvec, Yuvec=Yuvec, colortension=colortension, cmap=cmap_tension) - elif 'rope' in line.type or 'polyester' in line.type: - line.drawLine2d(time, ax, color=[.3,.5,.5], Xuvec=Xuvec, Yuvec=Yuvec, colortension=colortension, cmap=cmap_tension) + if color==None and 'material' in line.type: + if 'chain' in line.type['material']: + line.drawLine2d(time, ax, color=[.1, 0, 0], Xuvec=Xuvec, Yuvec=Yuvec, colortension=colortension, cmap=cmap_tension, plotnodes=plotnodes, plotnodesline=plotnodesline, label=label, alpha=alpha) + elif 'rope' in line.type['material'] or 'polyester' in line.type['material']: + line.drawLine2d(time, ax, color=[.3,.5,.5], Xuvec=Xuvec, Yuvec=Yuvec, colortension=colortension, cmap=cmap_tension, plotnodes=plotnodes, plotnodesline=plotnodesline, label=label, alpha=alpha) else: - line.drawLine2d(time, ax, color=[0.3,0.3,0.3], Xuvec=Xuvec, Yuvec=Yuvec, colortension=colortension, cmap=cmap_tension) + line.drawLine2d(time, ax, color=[0.3,0.3,0.3], Xuvec=Xuvec, Yuvec=Yuvec, colortension=colortension, cmap=cmap_tension, plotnodes=plotnodes, plotnodesline=plotnodesline, label=label, alpha=alpha) else: - line.drawLine2d(time, ax, color=color, Xuvec=Xuvec, Yuvec=Yuvec, colortension=colortension, cmap=cmap_tension) - + line.drawLine2d(time, ax, color=color, Xuvec=Xuvec, Yuvec=Yuvec, colortension=colortension, cmap=cmap_tension, plotnodes=plotnodes, plotnodesline=plotnodesline, label=label, alpha=alpha) + # Add Line labels if linelabels == True: xloc = np.dot([(line.rA[0]+line.rB[0])/2, (line.rA[1]+line.rB[1])/2, (line.rA[2]+line.rB[2])/2],Xuvec) @@ -2645,8 +3395,8 @@ def plot2d(self, Xuvec=[1,0,0], Yuvec=[0,0,1], ax=None, color=None, **kwargs): ax.text(xloc,yloc,j) if cbar_tension: - maxten = max([max(line.getLineTens()) for line in self.lineList]) # find the max tension in the System - minten = min([min(line.getLineTens()) for line in self.lineList]) # find the min tension in the System + maxten = max([max(line.Ts) for line in self.lineList]) # find the max tension in the System + minten = min([min(line.Ts) for line in self.lineList]) # find the min tension in the System bounds = range(int(minten),int(maxten), int((maxten-minten)/256)) norm = mpl.colors.BoundaryNorm(bounds, 256) # set the bounds in a norm object, with 256 being the length of all colorbar strings fig.colorbar(cm.ScalarMappable(norm=norm, cmap=cmap_tension), label='Tension (N)') # add the colorbar @@ -2768,7 +3518,7 @@ def animate(self, ts): body.setPosition(X[i:i+6]) # update position of free Body i += 6 body.redraw() # redraw Body - + # update position of free Points for point in self.pointList: if point.type in types: @@ -2788,8 +3538,25 @@ def animate(self, ts): + def updateCoords(self, tStep, colortension, cmap_tension, label, dt): + '''Update animation function. This gets called by animateLines every iteration of the animation and + redraws the lines and rods in their next positions.''' + + for rod in self.rodList: + + if isinstance(rod, Line) and rod.show: # draw it if MoorPy is representing it as as Rod-Line object, and it's set to be shown + rod.redrawLine(-tStep) + + for line in self.lineList: + if len(line.Tdata) > 0: + line.redrawLine(-tStep, colortension=colortension, cmap_tension=cmap_tension) + + label.set_text(f'time={np.round(tStep*dt,1)}') + + return + - def animatelines(self, interval=200, repeat=True, delay=0, runtime=-1, **kwargs): + def animateLines(self, figure=None, axis=None, color=None, interval=200, repeat=True, delay=0, runtime=-1, **kwargs): ''' Parameters ---------- @@ -2803,6 +3570,8 @@ def animatelines(self, interval=200, repeat=True, delay=0, runtime=-1, **kwargs) Whether or not to repeat the animation. The default is True. delay : int, optional The time between consecutive animation runs in milliseconds. The default is 0. + runtime: int, optional + The desired time that the animation should run to in seconds. The default is -1, which means to run the full simulation Returns ------- @@ -2815,26 +3584,26 @@ def animatelines(self, interval=200, repeat=True, delay=0, runtime=-1, **kwargs) opacity = kwargs.get('opacity' , 1.0 ) # the transparency of the bathymetry plot_surface hidebox = kwargs.get('hidebox' , False ) # toggles whether to show the axes or not rang = kwargs.get('rang' , 'hold' ) # colorbar range: if range not used, set it as a placeholder, it will get adjusted later - res = kwargs.get('res' , 10 ) # the resolution of the animation; how fluid the animation is. Higher res means spottier animation. counter-intuitive + speed = kwargs.get('speed' , 10 ) # the resolution of the animation; how fluid/speedy the animation is colortension = kwargs.get("colortension" , False ) # toggle to draw the mooring lines in colors based on node tensions cmap_tension = kwargs.get('cmap_tension' , 'rainbow' ) # the type of color spectrum desired for colortensions + draw_body = kwargs.get('draw_body' , True ) + # bound kwargs + xbounds = kwargs.get('xbounds' , None ) # the bounds of the x-axis. The midpoint of these bounds determines the origin point of orientation of the plot + ybounds = kwargs.get('ybounds' , None ) # the bounds of the y-axis. The midpoint of these bounds determines the origin point of orientation of the plot + zbounds = kwargs.get('zbounds' , None ) # the bounds of the z-axis. The midpoint of these bounds determines the origin point of orientation of the plot + # not adding cbar_tension colorbar yet since the tension magnitudes might change in the animation and the colorbar won't reflect that # can use any other kwargs that go into self.plot() if self.qs==1: raise ValueError("This System is set to be quasi-static. Import MoorDyn data and make qs=0 to use this method") - # update animation function. This gets called every iteration of the animation and redraws the line in its next position - def update_Coords(tStep, tempLineList, tempax, colortension, cmap_tension): # not sure why it needs a 'tempax' input but it works better with it - - for imooring in tempLineList: - imooring.redrawLine(-tStep, colortension=colortension, cmap_tension=cmap_tension) - - return # create the figure and axes to draw the animation - fig, ax = self.plot(bathymetry=bathymetry, opacity=opacity, hidebox=hidebox, rang=rang, colortension=colortension) + fig, ax = self.plot(ax=axis, color=color, draw_body=draw_body, bathymetry=bathymetry, opacity=opacity, hidebox=hidebox, rang=rang, + colortension=colortension, xbounds=xbounds, ybounds=ybounds, zbounds=zbounds) ''' # can do this section instead of self.plot(). They do the same thing fig = plt.figure(figsize=(20/2.54,12/2.54)) @@ -2843,32 +3612,96 @@ def update_Coords(tStep, tempLineList, tempax, colortension, cmap_tension): imooring.drawLine(0, ax) ''' # set figure x/y/z bounds + ''' d = 1600 # can make this an input later ax.set_xlim((-d,d)) ax.set_ylim((-d,d)); ax.set_zlim((-self.depth, 300)) - ax.set_xlabel('x'); ax.set_ylabel('y'); ax.set_zlabel('z'); + # make the axes scaling equal rangex = np.diff(ax.get_xlim3d())[0] rangey = np.diff(ax.get_ylim3d())[0] rangez = np.diff(ax.get_zlim3d())[0] ax.set_box_aspect([rangex, rangey, rangez]) + ''' + ax.set_xlabel('x'); ax.set_ylabel('y'); ax.set_zlabel('z'); + label = ax.text(-100, 100, 0, 'time=0', ha='center', va='center', fontsize=10, color="k") + + # find idyn, the index of the first line in the lineList that contains a series of Tdata + idyn = len(self.lineList)-1 # note, the idyn approach is not robust to different Lines having output, or Rods. Should reconsider. + for line in self.lineList: + if len(line.Tdata) > 0: + idyn = line.number-1 + break - if runtime==-1: - nFrames = len(self.lineList[0].Tdata) - else: - itime = int(np.where(self.lineList[0].Tdata==runtime)[0]) - nFrames = len(self.lineList[0].Tdata[0:itime]) + if runtime==-1: # if the full simulation is desired to be animated + nFrames = len(self.lineList[idyn].Tdata) + else: # if only part of the simulation is to be animated, up to a certain runtime in seconds + itime = int(np.where(self.lineList[idyn].Tdata==runtime)[0]) + nFrames = len(self.lineList[idyn].Tdata[0:itime]) + dt = self.lineList[idyn].Tdata[1]-self.lineList[idyn].Tdata[0] # time step length (s) <<< should get this from main MoorDyn output file <<< # Animation: update the figure with the updated coordinates from update_Coords function # NOTE: the animation needs to be stored in a variable, return out of the method, and referenced when calling self.animatelines() - line_ani = animation.FuncAnimation(fig, update_Coords, np.arange(1, nFrames-1, res), fargs=(self.lineList, ax, colortension, cmap_tension), + line_ani = animation.FuncAnimation(fig, self.updateCoords, np.arange(1, nFrames-1, speed), fargs=(colortension, cmap_tension, label, dt), interval=1, repeat=repeat, repeat_delay=delay, blit=False) # works well when np.arange(...nFrames...) is used. Others iterable ways to do this return line_ani - - + + def unload_md_driver(self, outFileName, outroot = 'driver', MDinputfile = 'test.dat',depth = 600): + + '''Function to output moordyn driver input file + Parameters + ---------- + outFileName: moordyn driver input file name + outroot: root name for output files (ex if outroot = 'driver', the MD output file will be driver.MD.out) + MDinputfile: name of the moordyn input file + depth: water depth + Returns + ------- + None. + ''' + + Echo = False + density = 1025 + gravity = 9.80665 + TMax = 60.0225 + dtC = 0.0125 + numturbines = 0 + inputsmode = 0 + inputsfile ="" + ref = [0,0] + T1 = [0,0,0,0,0,0] + L = [] + + #Input File Header + L.append(" MoorDyn Driver Input File ") + L.append("Another comment line") + L.append("{:5} Echo - echo the input file data (flag)".format(str(Echo).upper())) + L.append("---------------- ENVIRONMENTAL CONDITIONS ------------------") + L.append("{:<1.5f}\t\tgravity - gravity (m/s^2)".format(gravity)) + L.append("{:<4.1f}\t\trhoW - water density (kg/m^3)".format(density)) + L.append("{:<4.1f}\t\tWtrDpth - water depth".format(depth)) + L.append("---------------- MOORDYN ------------------") + L.append("{:}\tMDInputFile - Primary MoorDyn input file name (quoted string)".format(MDinputfile)) + L.append("\"{:}\"\tOutRootName - The name which prefixes all HydroDyn generated files (quoted string)".format(str(outroot))) + L.append("{:<2.4f}\t\tTMax - Number of time steps in the simulations (-)".format(TMax)) + L.append("{:<1.4f}\t\tdtC - TimeInterval for the simulation (sec)".format(dtC)) + L.append("{:<2.0f}\t\tInputsMode - MoorDyn coupled object inputs (0: all inputs are zero for every timestep, 1: time-series inputs) (switch)".format(inputsmode)) + L.append("\"{:}\"\t\tInputsFile - Filename for the MoorDyn inputs file for when InputsMod = 1 (quoted string)".format(inputsfile)) + L.append("{:<2.0f}\t\tNumTurbines - Number of wind turbines (-) [>=1 to use FAST.Farm mode. 0 to use OpenFAST mode.]".format(numturbines)) + L.append("---------------- Initial Positions ------------------") + L.append("ref_X ref_Y surge_init sway_init heave_init roll_init pitch_init yaw_init") + L.append("(m) (m) (m) (m) (m) (m) (m) (m) [followed by NumTurbines rows of data]") + L.append("{:2.8f} {:2.8f} {:2.8f} {:2.8f} {:2.8f} {:2.8f} {:2.8f} {:2.8f} ".format(ref[0],ref[1],T1[0], T1[1], T1[2],T1[3], T1[4], T1[5])) + L.append("END of driver input file") + + with open(outFileName, 'w') as out: + for x in range(len(L)): + out.write(L[x]) + out.write('\n') + diff --git a/MoorPy/pyproject.toml b/MoorPy/pyproject.toml new file mode 100644 index 000000000..70c110503 --- /dev/null +++ b/MoorPy/pyproject.toml @@ -0,0 +1,190 @@ +[build-system] +requires = ["setuptools", "wheel"] +build-backend = "setuptools.build_meta" + +[project] +name = "MoorPy" +version = "1.1.0" +description = "A design-oriented mooring system library for Python" +readme = "README.md" +requires-python = ">=3.8" +license = {text = "BSD-3-Clause"} +keywords = ["wind", "floating", "mooring", "design", "water"] +authors = [ + {name = "National Renewable Energy Laboratory", email = "matthew.hall@nrel.gov" } +] +maintainers = [ + {name = "Matthew Hall", email = "matthew.hall@nrel.gov"}, + {name = "Stein Housner", email = "stein.housner@nrel.gov"}, +] +classifiers = [ # Optional + # How mature is this project? Common values are + # 3 - Alpha + # 4 - Beta + # 5 - Production/Stable + "Development Status :: 4 - Beta", + + # Indicate who your project is intended for + "Intended Audience :: Science/Research", + "Topic :: Scientific/Engineering", + + "License :: OSI Approved :: BSD License", + + # Specify the Python versions you support here. In particular, ensure + # that you indicate you support Python 3. These classifiers are *not* + # checked by "pip install". See instead "python_requires" below. + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Fortran", + + "Operating System :: OS Independent", +] + +# List additional groups of dependencies here (e.g. development +# dependencies). Users will be able to install these using the "extras" +# syntax, for example: +# +# $ pip install sampleproject[dev] +# +# Similar to `dependencies` above, these must be valid existing +# projects. +dependencies = [ + "matplotlib", + "numpy", + "scipy", + "pyyaml", +] + +[project.optional-dependencies] +dev = ["pre-commit"] +docs = [ + "sphinx", + "sphinx-rtd-theme" +] +test = [ + "pytest", + "pytest-cov", + "pytest-xdist", +] + +# List URLs that are relevant to your project +# +# This field corresponds to the "Project-URL" and "Home-Page" metadata fields: +# https://packaging.python.org/specifications/core-metadata/#project-url-multiple-use +# https://packaging.python.org/specifications/core-metadata/#home-page-optional +# +# Examples listed include a pattern for specifying where the package tracks +# issues, where the source is hosted, where to say thanks to the package +# maintainers, and where to support the project financially. The key is +# what's used to render the link text on PyPI. +[project.urls] # Optional +"Homepage" = "https://github.com/NREL/MoorPy" +"Documentation" = "https://moorpy.readthedocs.io" + +# This is configuration specific to the `setuptools` build backend. +# If you are using a different build backend, you will need to change this. +[tool.setuptools] +include-package-data = true + +#[tool.setuptools.packages] +#find = {} + +[tool.setuptools.packages.find] +exclude = ["docs", "examples", "tests"] +namespaces = true + +[tool.setuptools.package-data] +# If there are data files included in your packages that need to be +# installed, specify them here. +"*" = ["*.txt", "*.md", "*.yaml"] + +#[tool.black] +#line-length = 120 +#target-version = ['py311'] +#preview=true +#exclude = ''' +#/( +# \.git +# | \.hg +# | \.mypy_cache +# | \.tox +# | \.venv +# | _build +# | buck-out +# | build +# | dist +#)/ +#''' + +[tool.isort] +# https://github.com/PyCQA/isort +multi_line_output = "3" +include_trailing_comma = true +force_grid_wrap = false +use_parentheses = true +line_length = "120" +sections = ["FUTURE", "STDLIB", "THIRDPARTY", "FIRSTPARTY", "LOCALFOLDER"] +known_first_party = ["wisdem"] +length_sort = "1" +profile = "black" +skip_glob = ['__init__.py'] +atomic = true +#lines_after_imports = 2 +#lines_between_types = 1 +#src_paths=isort,test + +[tool.ruff] +select = ["A", "C", "E", "F", "I"] +ignore = [] + +# Allow autofix for all enabled rules (when `--fix`) is provided. +fixable = ["A", "C", "E", "F", "I"] +unfixable = [] # fix all + +# Exclude a variety of commonly ignored directories. +exclude = [ + ".bzr", + ".direnv", + ".eggs", + ".git", + ".hg", + ".mypy_cache", + ".nox", + ".pants.d", + ".ruff_cache", + ".svn", + ".tox", + ".venv", + "__pypackages__", + "_build", + "buck-out", + "build", + "dist", + "node_modules", + "venv", +] +per-file-ignores = {} # ignore no specific files and checks + +line-length = 88 + +# Allow unused variables when underscore-prefixed. +dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" + +target-version = "py311" + +[tool.ruff.mccabe] +max-complexity = 10 + +#[tool.docformatter] +#blank=true +#close-quotes-on-newline=true +#in-place=true +#make-summary-multi-line=true +#pre-summary-newline=true +#recursive=true +#wrap-descriptions=68 +#wrap-summaries=88 diff --git a/MoorPy/setup.py b/MoorPy/setup.py index 942212bf3..b908cbe55 100644 --- a/MoorPy/setup.py +++ b/MoorPy/setup.py @@ -1,27 +1,3 @@ import setuptools -with open("README.md", "r", encoding="utf-8") as fh: - long_description = fh.read() - -setuptools.setup( - name="MoorPy", - version="0.9.0", - author="National Renewable Energy Laboratory", - author_email="matthew.hall@nrel.gov", - description="A design-oriented mooring system library for Python", - long_description=long_description, - long_description_content_type="text/markdown", - url="https://github.com/NREL/MoorPy", - packages=['moorpy'], - classifiers=[ - "Programming Language :: Python :: 3", - "License :: OSI Approved :: LGPL", - "Operating System :: OS Independent", - ], - python_requires='>=3.6', - install_requires=[ - "numpy", - "matplotlib", - "pyyaml" - ], -) +setuptools.setup() diff --git a/MoorPy/tests/test_catenary.py b/MoorPy/tests/test_catenary.py index c872775fb..5aebe14e1 100644 --- a/MoorPy/tests/test_catenary.py +++ b/MoorPy/tests/test_catenary.py @@ -43,10 +43,22 @@ def test_catenary_symmetricU(): (fAHU, fAVU, fBHU, fBVU, infoU) = catenary(100, 0, 130, 1e12, 100.0, CB=-20, Tol=0.00001, MaxIter=50) assert_allclose([fAHU, fAVU, fBHU, fBVU], [-fBH1, fBV1, fBH1, fBV1], rtol=1e-05, atol=0, verbose=True) + + +def test_sloped_mirror(): + '''Tests two mirror-image sloped seabed scenarios''' + + # seabed slope is 10 deg. dz = (60 m)*tan(alpha) = 10.5796 + hB = 40 - 10.5796 + + (fAH1, fAV1, fBH1, fBV1, info1) = catenary(60, 40, 80, 1e12, 100.0, CB= 0, alpha= 10, Tol=0.00001, MaxIter=50) + (fAH2, fAV2, fBH2, fBV2, info2) = catenary(60, -40, 80, 1e12, 100.0, CB=-hB, alpha=-10, Tol=0.00001, MaxIter=50) + + assert_allclose([fAH1, fAV1, fBH1, fBV1], [-fBH2, fBV2, -fAH2, fAV2], rtol=1e-05, atol=0, verbose=True) + if __name__ == '__main__': for i in range(len(indata)): test_catenary_solutions(i) - - #catenary(0.007335040615956245, 46.969250518704726, 100.0, 257826627.22942558, 512.1255141001664, CB=-532.0307494812953, HF0=2169047.825684437, VF0=1165782.713912318, Tol=2.0000000000000003e-06, MaxIter=50, plots=1) + \ No newline at end of file diff --git a/MoorPy/tests/test_system.py b/MoorPy/tests/test_system.py index 70874e8d1..571a2ea32 100644 --- a/MoorPy/tests/test_system.py +++ b/MoorPy/tests/test_system.py @@ -6,7 +6,8 @@ import numpy as np import moorpy as mp -from moorpy.MoorProps import getLineProps +#from moorpy.MoorProps import getLineProps +from moorpy.helpers import getLineProps import matplotlib.pyplot as plt @@ -20,8 +21,9 @@ def test_tensions_swap(): ms = mp.System(depth=60) - ms.lineTypes['chain'] = getLineProps(120, name='chain') # add a line type - + #ms.lineTypes['chain'] = getLineProps(120, name='chain') # add a line type + ms.setLineType(120, 'chain', name='chain') # add a line type + ms.addPoint(1, [ 0, 0, -60]) ms.addPoint(1, [100, 10, -30]) @@ -41,7 +43,8 @@ def test_stiffnesses_swap(): ms = mp.System(depth=60) - ms.lineTypes['chain'] = getLineProps(120, name='chain') # add a line type + #ms.lineTypes['chain'] = getLineProps(120, name='chain') # add a line type + ms.setLineType(120, 'chain', name='chain') # add a line type ms.addPoint(1, [ 0, 0, -60]) ms.addPoint(1, [100, 10, -30]) @@ -62,7 +65,8 @@ def test_stiffness_body(): ms = mp.System(depth=60) - ms.lineTypes['chain'] = getLineProps(120, name='chain') # add a line type + #ms.lineTypes['chain'] = getLineProps(120, name='chain') # add a line type + ms.setLineType(120, 'chain', name='chain') # add a line type ms.addPoint(1, [ 0, 0, -60]) ms.addPoint(1, [100, 10, -30]) @@ -103,7 +107,8 @@ def test_basic(): ms.depth = depth # add a line type - ms.lineTypes[typeName] = getLineProps(120, name=typeName) + #ms.lineTypes[typeName] = getLineProps(120, name=typeName) + ms.setLineType(120, typeName, name=typeName) # Add a free, body at [0,0,0] to the system (including some properties to make it hydrostatically stiff) ms.addBody(0, np.zeros(6), m=1e6, v=1e3, rM=100, AWP=1e6) @@ -144,7 +149,9 @@ def test_multiseg(): # single line ms1 = mp.System() ms1.depth = 200 - ms1.lineTypes['chain'] = getLineProps(120, name='chain') + #ms1.lineTypes['chain'] = getLineProps(120, name='chain') + ms1.setLineType(120, 'chain', name='chain') + ms1.addPoint(1, [-800, 0 , -200]) # anchor point ms1.addPoint(1, [ 0, 0 , 0]) # fairlead ms1.addLine(860, 'chain', pointA=1, pointB=2) @@ -154,7 +161,8 @@ def test_multiseg(): # two line ms2 = mp.System() ms2.depth = 200 - ms2.lineTypes['chain'] = getLineProps(120, name='chain') + #ms2.lineTypes['chain'] = getLineProps(120, name='chain') + ms2.setLineType(120, 'chain', name='chain') ms2.addPoint(1, [-800, 0 , -200]) # anchor point ms2.addPoint(0, [-205, 0 , -100]) # point along line ms2.addPoint(1, [ 0, 0 , 0]) # fairlead @@ -176,7 +184,8 @@ def test_multiseg_seabed(): # single line ms1 = mp.System() ms1.depth = 200 - ms1.lineTypes['chain'] = getLineProps(120, name='chain') + #ms1.lineTypes['chain'] = getLineProps(120, name='chain') + ms1.setLineType(120, 'chain', name='chain') ms1.addPoint(1, [-800, 0 , -200]) # anchor point ms1.addPoint(1, [ 0, 0 , 0]) # fairlead ms1.addLine(860, 'chain', pointA=1, pointB=2) @@ -186,7 +195,8 @@ def test_multiseg_seabed(): # three line ms2 = mp.System() ms2.depth = 200 - ms2.lineTypes['chain'] = getLineProps(120, name='chain') + #ms2.lineTypes['chain'] = getLineProps(120, name='chain') + ms2.setLineType(120, 'chain', name='chain') ms2.addPoint(1, [-800, 0 , -200]) # anchor point ms2.addPoint(0, [-700, 0 , -200]) # point along line ms2.addPoint(0, [-600, 0 , -200]) # point along line @@ -212,7 +222,8 @@ def test_basicU(): ms1.depth = 100 - ms1.lineTypes['chain'] = getLineProps(120, name='chain') + #ms1.lineTypes['chain'] = getLineProps(120, name='chain') + ms1.setLineType(120, 'chain', name='chain') ms1.addPoint(1, [-200, 0 , -100]) # anchor point ms1.addPoint(0, [-100, 0 , -50], m=0, v=50) # float @@ -231,7 +242,8 @@ def test_basicU(): msU.depth = 100 - msU.lineTypes['chain'] = getLineProps(120, name='chain') + #msU.lineTypes['chain'] = getLineProps(120, name='chain') + msU.setLineType(120, 'chain', name='chain') msU.addPoint(1, [-200, 0 , -100]) # anchor point msU.addPoint(0, [-100, 0 , -50], m=0, v=50) # float @@ -256,6 +268,43 @@ def test_basicU(): np.hstack([msU.pointList[1].r, msU.pointList[2].r]), rtol=0, atol=0.001, verbose=True) + + +def test_bodyStiffness(): + '''Compares the stiffness calculated for a body with numerical and analytical + methods.''' + + ms = mp.System(depth=60) + + ms.setLineType(120, 'chain', name='chain') # add a line type + + # more involved case with a body + ms.addPoint(1, [ 0, 0, -60]) # anchor + ms.addPoint(1, [100, 40, -30], v = 30) # free point between line sections + ms.addPoint(1, [200, 0, 0]) # fairlead + + ms.addPoint(1, [400, 0, -60]) # anchor 2 + ms.addPoint(1, [200, 0, 0]) # fairlead 2 + + # line sloping up from A to B, and another in the opposite order + ms.addLine(120, 'chain', pointA=1, pointB=2) + ms.addLine(110, 'chain', pointA=2, pointB=3) + ms.addLine(220, 'chain', pointA=4, pointB=5) + + # create body and attach lines to it + ms.addBody(-1, [200,0,0,0,0,0], v=20, m=2050, AWP=100, rM=20) + ms.bodyList[0].attachPoint(3, [-5, 2, -10]) + ms.bodyList[0].attachPoint(5, [-5, 0, -10]) + + ms.initialize() + + Kn = ms.bodyList[0].getStiffness(tol=0.00001, dx = 0.001) + Ka = ms.bodyList[0].getStiffnessA(lines_only=True) + + assert_allclose(Ka, Kn, rtol=0.02, atol=100.0, verbose=True) + + + @pytest.mark.parametrize('CB', inCBs) def test_seabed(CB): '''Compares a single catenary mooring line along the seabed with a two-line system @@ -264,7 +313,8 @@ def test_seabed(CB): # single line ms1 = mp.System() ms1.depth = 200 - ms1.lineTypes['chain'] = getLineProps(120, name='chain') + #ms1.lineTypes['chain'] = getLineProps(120, name='chain') + ms1.setLineType(120, 'chain', name='chain') ms1.addPoint(1, [-800, 0 , -200]) # anchor point ms1.addPoint(1, [ 0, 0 , 0]) # fairlead ms1.addLine(860, 'chain', pointA=1, pointB=2, cb=CB) @@ -274,7 +324,8 @@ def test_seabed(CB): # two line ms2 = mp.System() ms2.depth = 200 - ms2.lineTypes['chain'] = getLineProps(120, name='chain') + #ms2.lineTypes['chain'] = getLineProps(120, name='chain') + ms2.setLineType(120, 'chain', name='chain') ms2.addPoint(1, [-800, 0 , -200]) # anchor point ms2.addPoint(0, [-405, 0 , -150]) # midpoint ms2.addPoint(1, [ 0, 0 , 0]) # fairlead diff --git a/RAFT/.github/ISSUE_TEMPLATE/bug_report.md b/RAFT/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 000000000..d005a8811 --- /dev/null +++ b/RAFT/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,30 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +## Description +_Describe the bug here_ + +### Steps to reproduce issue +_Please provide a minimum working example (MWE) if possible_ + +1. … +2. … +3. … + +### Current behavior +… + +### Expected behavior +… + + +### Code versions +_List versions only if relevant_ +- Python +- … \ No newline at end of file diff --git a/RAFT/.github/ISSUE_TEMPLATE/feature_request.md b/RAFT/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 000000000..7cecc72cf --- /dev/null +++ b/RAFT/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,14 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +# Description of feature +Describe the feature here and provide some context. Under what scenario would this be useful? + +# Potential solution +Can you think of ways to implement this? \ No newline at end of file diff --git a/RAFT/.github/PULL_REQUEST_TEMPLATE.md b/RAFT/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..835c623f3 --- /dev/null +++ b/RAFT/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,28 @@ +Delete the text explanations below these headers and replace them with information about your PR. +Please first consult the [developer guide](https://weis.readthedocs.io/en/latest/how_to_contribute_code.html) to make sure your PR follows all code, testing, and documentation conventions. + +## Purpose +Explain the goal of this pull request. If it addresses an existing issue be sure to link to it. Describe the big picture of your changes here, perhaps using a bullet list if multiple changes are done to accomplish a single goal. If it accomplishes multiple goals, it may be best to create separate PR's for each. + +## Type of change +What types of change is it? +_Select the appropriate type(s) that describe this PR_ + +- [ ] Bugfix (non-breaking change which fixes an issue) +- [ ] New feature (non-breaking change which adds functionality) +- [ ] Breaking change (non-backwards-compatible fix or feature) +- [ ] Code style update (formatting, renaming) +- [ ] Refactoring (no functional changes, no API changes) +- [ ] Documentation update +- [ ] Maintenance update +- [ ] Other (please describe) + +## Testing +Explain the steps needed to test the new code to verify that it does indeed address the issue and produce the expected behavior. + +## Checklist +_Put an `x` in the boxes that apply._ + +- [ ] I have run existing tests which pass locally with my changes +- [ ] I have added new tests or examples that prove my fix is effective or that my feature works +- [ ] I have added necessary documentation \ No newline at end of file diff --git a/RAFT/.github/workflows/CI_RAFT.yml b/RAFT/.github/workflows/CI_RAFT.yml new file mode 100644 index 000000000..21682f234 --- /dev/null +++ b/RAFT/.github/workflows/CI_RAFT.yml @@ -0,0 +1,52 @@ +name: CI_RAFT + +# We run CI on push commits and pull requests on all branches +on: [push, pull_request] + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + build_conda: + name: Conda Build (${{ matrix.os }}) - ${{ matrix.python-version }} + runs-on: ${{ matrix.os }} + defaults: + run: + shell: bash -l {0} + + strategy: + fail-fast: false #true + matrix: + os: ["ubuntu-latest", "macOS-latest", "windows-latest"] + python-version: ["3.10", "3.11"] + + steps: + - name: checkout repository + uses: actions/checkout@v3 + + - uses: conda-incubator/setup-miniconda@v2 + # https://github.com/marketplace/actions/setup-miniconda + with: + mamba-version: "*" + miniconda-version: "latest" + #auto-update-conda: true + python-version: ${{ matrix.python-version }} + environment-file: environment.yml + channels: conda-forge + channel-priority: true + activate-environment: test + auto-activate-base: false + + # Install + - name: Conda Install RAFT + run: | + pip install -e . + + - name: Example run + run: | + cd examples + python example_from_yaml.py false + + - name: Test run + run: | + cd tests + pytest . + diff --git a/RAFT/.gitignore b/RAFT/.gitignore index 3010cd119..3e97d2b98 100644 --- a/RAFT/.gitignore +++ b/RAFT/.gitignore @@ -5,7 +5,7 @@ *.egg-info build/ develop-eggs/ -dist/s +dist/ # HAMS-generated data raft/data/cylinder/Output/Hams_format/ @@ -18,4 +18,7 @@ raft/BEM/ raft/HullMesh.pnl raft/platform.gdf tests/BEM/ -tests/platform.gdf \ No newline at end of file +tests/platform.gdf + +# Emacs +*~ diff --git a/RAFT/README.md b/RAFT/README.md index 14f1d1a99..8be7e7f67 100644 --- a/RAFT/README.md +++ b/RAFT/README.md @@ -7,10 +7,9 @@ RAFT v1.0.0 includes the capabilities described above, and further development i ## Getting Started -New users of RAFT as a standalone model are recommended to begin by looking at the input file and script provided in the examples folder, and seeking further information from the [RAFT documentation](https://openraft.readthedocs.io/en/latest/). For use as part of the WEIS toolset, information will be provided once this capability is completed in the [WEIS documentation](https://weis.readthedocs.io/en/latest/). +New users of RAFT as a standalone model are recommended to begin by looking at the input file and script provided in the examples folder, and seeking further information from the [RAFT documentation](https://openraft.readthedocs.io/en/latest/). For use as part of the WEIS toolset, information will be provided once this capability is completed in the [WEIS documentation](https://weis.readthedocs.io/en/latest/). For now, the following will help get started with running RAFT as a standalone model. - -### Prerequisites +RAFT uses a number of prerequisites, or other python package dependencies, to run its calculations. The most notable ones are listed below: - Python 3 - NumPy @@ -19,13 +18,55 @@ New users of RAFT as a standalone model are recommended to begin by looking at t - YAML - MoorPy (available at https://github.com/NREL/MoorPy) - pyHams (available at https://github.com/WISDEM/pyHAMS) -- CCBlade and WISDEM* (available at https://github.com/WISDEM/WISDEM) +- CCBlade or WISDEM* (https://github.com/WISDEM/CCBlade or https://github.com/WISDEM/WISDEM) + +\* CCBlade is a module of WISDEM, but can be used separately. RAFT only requires CCBlade (and some additional related functions) out of the larger WISDEM code. New users can install either CCBlade or WISDEM, but for highest efficiency, we recommend installing CCBlade, without the entire WISDEM installation. + +To install all required python packages to run RAFT, follow the steps below. + +1. Install most of the required python packages to run RAFT from the "requirements" yaml. + + (base) PS ANY_PATH> conda env create -f raft-env.yaml + + This will create a new python virtual environment on a new user's local machine called "raft-env" + +2. Activate the new virtual environment + + (base) PS ANY_PATH> conda activate raft-env + + This will activate the newly created virtual environment, where we will install the remaining dependencies + +3. Install the RAFT package + - Navigate to a directory of your choosing on your local machine and clone this RAFT repository to that new directory + + (raft-env) PS YOUR_PATH> git clone https://github.com/WISDEM/RAFT.git + + - Staying in the same directory, install the RAFT package in it's "editable" mode + + (raft-env) PS YOUR_PATH/RAFT> pip install -e . + +4. Repeat Step 3 two more times, one for CCBlade, and one for MoorPy + + (raft-env) PS YOUR_PATH> git clone https://github.com/WISDEM/CCBlade.git + (raft-env) PS YOUR_PATH/CCBlade> pip install -e . + (raft-env) PS YOUR_PATH/CCBlade> cd .. + (raft-env) PS YOUR_PATH> git clone https://github.com/NREL/MoorPy.git + (raft-env) PS YOUR_PATH/MoorPy> pip install -e . + + ** If you are running into errors with installing CCBlade, make sure there is not a file called "_bem.cp39-win_amd64.pyd" inside of CCBlade/ccblade. Deleting this file will allow the above commands to run. + + +This new raft-env should now be compatible to run RAFT standalone. Dependencies like CCBlade and MoorPy are still under development, which is why for now, it will be easier to install them in their editable forms. + +The other main dependency, PyHAMS, is included within the raft-env.yaml file and is installed in Step 1. + +Another point to note is that ```python setup.py develop``` has become outdated, and ```pip install -e .``` is preferred. + +If you need to remove any virtual environment for any reason, you can run -\* RAFT uses CCBlade and currently requires additional related functions from the larger WISDEM code. We recommend installing WISDEM for the time being. + conda env remove -n "name-of-the-virtual-environment" -### Installation -Download/clone and install this RAFT repository as well as that of [MoorPy](https://github.com/NREL/MoorPy), [pyHAMS](https://github.com/WISDEM/pyHAMS), and [WISDEM](https://github.com/WISDEM/WISDEM). To install RAFT in development mode, go to its directory and run ```python setup.py develop``` or ```pip install -e .``` from the command line. ## Documentation and Issues diff --git a/RAFT/designs/FOCTT_example.yaml b/RAFT/designs/FOCTT_example.yaml new file mode 100644 index 000000000..b310e759d --- /dev/null +++ b/RAFT/designs/FOCTT_example.yaml @@ -0,0 +1,1238 @@ +type: input file for RAFT +name: NREL 500 kW Floating Ocean Current and Tidal Turbine Spar Platform +comments: Preliminary design only used for getting values for natural frequency of platform + + +settings: # global Settings + min_freq : 0.001 # [Hz] lowest frequency to consider, also the frequency bin width + max_freq : 0.40 # [Hz] highest frequency to consider + XiStart : 0 # sets initial amplitude of each DOF for all frequencies + nIter : 4 # sets how many iterations to perform in Model.solveDynamics() + +site: + water_depth : 60 # [m] uniform water depth + rho_water : 1025.0 # [kg/m^3] water density + rho_air : 1.225 # [kg/m^3] air density + mu_air : 1.81e-05 # air dynamic viscosity + shearExp_air: 0.12 # shear exponent + mu_water : 1.00e-03 # [kg/ms] water dynamic viscosity + shearExp_water : 0.12 + +cases: + + keys : [wind_speed, wind_heading, turbulence, turbine_status, turbine_heading, wave_spectrum, wave_period, wave_height, wave_heading, current_speed, current_heading, current_turbulence ] + data : # m/s deg % or e.g. IIB_NTM string deg string (s) (m) (deg) (m/s) (deg) % or e.g. IIB_NTM + - [ 0, 0, 0, operating, 0, JONSWAP, 12, 1, 0, 2, 0, 0 ] + + +turbine: + + mRNA : 17000 # [kg] RNA mass + IxRNA : 0 # [kg-m2] RNA moment of inertia about local x axis (assumed to be identical to rotor axis for now, as approx) [kg-m^2] + IrRNA : 0 # [kg-m2] RNA moment of inertia about local y or z axes [kg-m^2] + xCG_RNA : 0 # [m] x location of RNA center of mass [m] (Actual is ~= -0.27 m) + hHub : -20.0 # [m] hub height above water line [m], Maybe try to put it underwater??? + Fthrust : 1500.0 # [N] temporary thrust force to use + + I_drivetrain: 318628138.0 # full rotor + drivetrain inertia as felt on the high-speed shaft + + nBlades : 3 # number of blades + #Zhub : -20.0 # hub height [m] + Rhub : 1.25 # hub radius [m] + precone : 4.0 # [deg] + shaft_tilt : 6.0 # [deg] + overhang : 2 # [m] + aeroServoMod : 2 # 0 aerodynamics off; 1 aerodynamics on (no control); 2 aerodynamics and control on + + + blade: + precurveTip : -3.9999999999999964 # + presweepTip : 0.0 # + Rtip : 10 # rotor radius + + # r chord theta precurve presweep + geometry: + #- [ 0.69, 2, 15.474, 0.035, 0.000 ] # (these root locations are smaller radius than half the cord length!) + #- [ 1.03, 2.05, 14.692, 0.084, 0.000 ] + #- [ 1.4, 2.07, 13.330, 0.139, 0.000 ] + #- [ 1.7, 2.08, 11.644, 0.192, 0.000 ] + - [ 2.1, 2.1, 9.927, 0.232, 0.000 ] + - [ 2.4, 2.1, 8.438, 0.250, 0.000 ] + - [ 2.8, 2.1, 7.301, 0.250, 0.000 ] + - [ 3.1, 2.08, 6.232, 0.246, 0.000 ] + - [ 3.5, 2.05, 5.230, 0.240, 0.000 ] + - [ 3.8, 2.02, 4.348, 0.233, 0.000 ] + - [ 4.17, 1.9, 3.606, 0.218, 0.000 ] + - [ 4.5, 1.8, 2.978, 0.178, 0.000 ] + - [ 4.8, 1.7, 2.423, 0.100, 0.000 ] + - [ 5.2, 1.6, 1.924, 0.000, 0.000 ] + - [ 5.5, 1.5, 1.467, -0.112, 0.000 ] + - [ 5.9, 1.4, 1.056, -0.244, 0.000 ] + - [ 6.26, 1.3, 0.692, -0.415, 0.000 ] + - [ 6.6, 1.2, 0.355, -0.620, 0.000 ] + - [ 6.9, 1.1, 0.019, -0.846, 0.000 ] + - [ 7.3, 1, -0.358, -1.080, 0.000 ] + - [ 7.6, 0.9, -0.834, -1.330, 0.000 ] + - [ 7.99, 0.85, -1.374, -1.602, 0.000 ] + - [ 8.3, 0.8, -1.848, -1.895, 0.000 ] + - [ 8.7, 0.75, -2.136, -2.202, 0.000 ] + - [ 8.97, 0.7, -2.172, -2.523, 0.000 ] + - [ 9.31, 0.65, -2.108, -2.864, 0.000 ] + - [ 9.6, 0.6, -1.953, -3.224, 0.000 ] + - [ 9.99, 0.55, -1.662, -3.605, 0.000 ] + # station(rel) airfoil name + airfoils: + - [ 0.00000, circular ] + - [ 0.02000, circular ] + - [ 0.15000, SNL-FFA-W3-500 ] + - [ 0.24517, FFA-W3-360 ] + - [ 0.32884, FFA-W3-330blend ] + - [ 0.43918, FFA-W3-301 ] + - [ 0.53767, FFA-W3-270blend ] + - [ 0.63821, FFA-W3-241 ] + - [ 0.77174, FFA-W3-211 ] + - [ 1.00000, FFA-W3-211 ] + + + airfoils: + - name : circular # + relative_thickness : 1.0 # + added_mass_coeff : [0.6, 0.7] # [flapwise, edgewise] + data: # alpha c_l c_d c_m cp_min + - [ -179.9087, 0.00010, 0.35000, -0.00010, 0.00000 ] + - [ 179.9087, 0.00010, 0.35000, -0.00010, 0.00001 ] + - name : SNL-FFA-W3-500 # + relative_thickness : 0.5 # + data: # alpha c_l c_d c_m + - [ -179.9660, 0.00000, 0.08440, 0.00000 ] + - [ -170.0000, 0.44190, 0.08440, 0.31250 ] + - [ -160.0002, 0.88370, 0.12680, 0.28310 ] + - [ -149.9998, 0.96740, 0.29270, 0.26320 ] + - [ -139.9999, 0.78010, 0.49700, 0.20480 ] + - [ -130.0001, 0.62930, 0.71610, 0.19320 ] + - [ -120.0003, 0.47850, 0.92460, 0.20080 ] + - [ -109.9999, 0.31890, 1.09850, 0.21360 ] + - [ -100.0000, 0.15530, 1.21820, 0.22210 ] + - [ -90.0002, 0.00000, 1.27070, 0.21980 ] + - [ -79.9998, -0.15530, 1.21820, 0.19600 ] + - [ -70.0000, -0.31890, 1.09850, 0.16350 ] + - [ -60.0001, -0.47840, 0.92460, 0.12850 ] + - [ -49.9997, -0.62930, 0.71610, 0.09650 ] + - [ -39.9999, -0.78010, 0.49700, 0.07160 ] + - [ -30.0001, -0.96740, 0.29270, 0.05220 ] + - [ -20.0002, -1.02810, 0.14990, -0.00630 ] + - [ -19.7499, -1.02430, 0.14720, -0.00890 ] + - [ -19.2502, -1.00520, 0.14470, -0.00990 ] + - [ -18.9999, -0.99710, 0.14330, -0.01050 ] + - [ -18.7500, -1.00520, 0.14030, -0.01100 ] + - [ -18.5002, -0.99950, 0.13860, -0.01160 ] + - [ -18.2499, -0.99080, 0.13730, -0.01200 ] + - [ -18.0000, -0.98150, 0.13600, -0.01260 ] + - [ -17.4998, -0.97640, 0.13220, -0.01350 ] + - [ -17.2500, -0.97050, 0.13060, -0.01390 ] + - [ -17.0002, -0.96550, 0.12900, -0.01430 ] + - [ -16.7498, -0.96620, 0.12680, -0.01470 ] + - [ -16.5000, -0.95440, 0.12580, -0.01510 ] + - [ -16.2502, -0.94440, 0.12460, -0.01550 ] + - [ -15.9998, -0.94050, 0.12290, -0.01580 ] + - [ -15.7500, -0.94330, 0.12060, -0.01610 ] + - [ -15.5002, -0.93300, 0.11950, -0.01640 ] + - [ -15.2498, -0.92110, 0.11850, -0.01680 ] + - [ -14.7502, -0.91580, 0.11500, -0.01730 ] + - [ -14.4998, -0.90700, 0.11380, -0.01750 ] + - [ -14.2500, -0.89590, 0.11270, -0.01780 ] + - [ -14.0002, -0.89260, 0.11100, -0.01810 ] + - [ -13.7498, -0.88080, 0.11000, -0.01840 ] + - [ -13.5000, -0.87220, 0.10890, -0.01860 ] + - [ -13.2502, -0.86600, 0.10750, -0.01880 ] + - [ -12.9998, -0.86260, 0.10590, -0.01880 ] + - [ -12.7500, -0.84890, 0.10510, -0.01920 ] + - [ -12.5002, -0.83630, 0.10420, -0.01940 ] + - [ -12.2498, -0.83630, 0.10230, -0.01940 ] + - [ -12.0000, -0.82710, 0.10130, -0.01960 ] + - [ -11.7502, -0.81410, 0.10040, -0.01980 ] + - [ -11.4998, -0.80040, 0.09970, -0.02000 ] + - [ -11.0002, -0.78900, 0.09710, -0.01990 ] + - [ -10.7498, -0.78620, 0.09560, -0.01960 ] + - [ -10.5000, -0.77470, 0.09480, -0.01940 ] + - [ -10.2502, -0.77010, 0.09400, -0.01840 ] + - [ -9.9998, -0.76740, 0.09250, -0.01830 ] + - [ -9.7500, -0.75060, 0.09170, -0.01920 ] + - [ -9.5002, -0.72900, 0.09120, -0.02050 ] + - [ -9.2498, -0.70950, 0.09020, -0.02240 ] + - [ -9.0000, -0.68550, 0.08950, -0.02470 ] + - [ -8.7502, -0.65900, 0.08910, -0.02670 ] + - [ -8.4998, -0.63190, 0.08870, -0.02870 ] + - [ -8.2500, -0.60190, 0.08790, -0.03200 ] + - [ -8.0002, -0.57180, 0.08750, -0.03450 ] + - [ -7.7498, -0.54240, 0.08730, -0.03670 ] + - [ -7.5000, -0.50980, 0.08680, -0.03990 ] + - [ -7.2502, -0.47670, 0.08640, -0.04300 ] + - [ -6.9998, -0.44540, 0.08620, -0.04530 ] + - [ -6.7500, -0.41420, 0.08600, -0.04760 ] + - [ -6.5002, -0.37910, 0.08560, -0.05100 ] + - [ -6.2498, -0.34600, 0.08530, -0.05380 ] + - [ -6.0000, -0.31440, 0.08520, -0.05600 ] + - [ -5.7502, -0.28170, 0.08500, -0.05860 ] + - [ -5.4998, -0.24610, 0.08470, -0.06190 ] + - [ -5.2500, -0.21330, 0.08460, -0.06440 ] + - [ -5.0002, -0.18270, 0.08450, -0.06630 ] + - [ -4.7498, -0.14940, 0.08430, -0.06880 ] + - [ -4.5000, -0.11580, 0.08420, -0.07150 ] + - [ -4.2502, -0.08370, 0.08400, -0.07370 ] + - [ -3.9998, -0.05290, 0.08400, -0.07560 ] + - [ -3.7500, -0.02250, 0.08390, -0.07740 ] + - [ -3.5002, 0.00890, 0.08380, -0.07930 ] + - [ -3.2498, 0.03920, 0.08380, -0.08110 ] + - [ -3.0000, 0.06860, 0.08380, -0.08260 ] + - [ -2.7502, 0.09740, 0.08380, -0.08380 ] + - [ -2.4998, 0.12600, 0.08380, -0.08520 ] + - [ -2.2500, 0.15550, 0.08380, -0.08670 ] + - [ -2.0002, 0.18530, 0.08380, -0.08830 ] + - [ -1.7498, 0.21460, 0.08370, -0.08970 ] + - [ -1.5000, 0.24300, 0.08370, -0.09100 ] + - [ -1.2502, 0.27130, 0.08380, -0.09210 ] + - [ -0.9998, 0.30060, 0.08380, -0.09360 ] + - [ -0.7500, 0.32950, 0.08380, -0.09490 ] + - [ -0.5002, 0.35780, 0.08380, -0.09610 ] + - [ -0.2498, 0.38570, 0.08380, -0.09720 ] + - [ 0.0000, 0.41350, 0.08380, -0.09830 ] + - [ 0.2298, 0.44250, 0.08390, -0.09950 ] + - [ 0.4698, 0.47150, 0.08390, -0.10080 ] + - [ 0.7002, 0.50030, 0.08390, -0.10190 ] + - [ 0.9402, 0.52860, 0.08400, -0.10290 ] + - [ 1.1700, 0.55670, 0.08400, -0.10400 ] + - [ 1.3997, 0.58500, 0.08410, -0.10500 ] + - [ 1.6398, 0.61350, 0.08410, -0.10610 ] + - [ 1.8701, 0.64170, 0.08420, -0.10720 ] + - [ 2.1102, 0.66970, 0.08420, -0.10820 ] + - [ 2.3400, 0.69750, 0.08430, -0.10910 ] + - [ 2.5697, 0.72510, 0.08430, -0.11000 ] + - [ 2.8098, 0.75280, 0.08440, -0.11090 ] + - [ 3.0401, 0.78070, 0.08450, -0.11190 ] + - [ 3.2802, 0.80830, 0.08460, -0.11280 ] + - [ 3.5099, 0.83580, 0.08460, -0.11370 ] + - [ 3.7403, 0.86310, 0.08470, -0.11460 ] + - [ 3.9798, 0.89020, 0.08470, -0.11530 ] + - [ 4.2101, 0.91730, 0.08480, -0.11610 ] + - [ 4.4502, 0.94440, 0.08490, -0.11700 ] + - [ 4.6799, 0.97130, 0.08500, -0.11780 ] + - [ 4.9102, 0.99810, 0.08510, -0.11850 ] + - [ 5.1497, 1.02490, 0.08520, -0.11920 ] + - [ 5.3801, 1.05150, 0.08530, -0.11990 ] + - [ 5.6201, 1.07790, 0.08530, -0.12060 ] + - [ 5.8499, 1.10410, 0.08540, -0.12120 ] + - [ 6.0802, 1.13020, 0.08560, -0.12180 ] + - [ 6.3197, 1.15600, 0.08570, -0.12240 ] + - [ 6.5501, 1.18180, 0.08580, -0.12300 ] + - [ 6.7901, 1.20760, 0.08590, -0.12350 ] + - [ 7.0199, 1.23340, 0.08600, -0.12400 ] + - [ 7.2502, 1.25890, 0.08610, -0.12450 ] + - [ 7.4903, 1.28410, 0.08620, -0.12500 ] + - [ 7.7200, 1.30880, 0.08640, -0.12540 ] + - [ 7.9601, 1.33310, 0.08650, -0.12570 ] + - [ 8.1899, 1.35700, 0.08670, -0.12590 ] + - [ 8.4202, 1.38100, 0.08690, -0.12620 ] + - [ 8.6603, 1.40540, 0.08700, -0.12650 ] + - [ 8.8900, 1.42950, 0.08710, -0.12670 ] + - [ 9.1198, 1.45310, 0.08730, -0.12700 ] + - [ 9.8801, 1.51540, 0.08790, -0.12650 ] + - [ 10.6398, 1.57490, 0.08860, -0.12560 ] + - [ 11.4001, 1.61510, 0.08950, -0.12140 ] + - [ 12.1501, 1.64430, 0.09120, -0.11630 ] + - [ 12.9099, 1.68240, 0.09300, -0.11330 ] + - [ 13.6702, 1.71460, 0.09540, -0.11070 ] + - [ 14.4202, 1.73620, 0.09890, -0.10800 ] + - [ 15.1799, 1.76270, 0.10240, -0.10630 ] + - [ 15.9403, 1.77060, 0.10760, -0.10420 ] + - [ 16.6903, 1.76390, 0.11440, -0.10250 ] + - [ 17.4500, 1.76040, 0.12110, -0.10130 ] + - [ 18.2097, 1.72510, 0.13100, -0.10010 ] + - [ 18.9701, 1.70350, 0.13990, -0.09980 ] + - [ 19.7201, 1.67840, 0.14920, -0.10010 ] + - [ 20.4798, 1.65050, 0.15910, -0.10160 ] + - [ 21.2401, 1.62270, 0.16910, -0.10360 ] + - [ 21.9901, 1.60670, 0.17780, -0.10640 ] + - [ 22.7499, 1.59720, 0.18580, -0.10990 ] + - [ 23.5102, 1.58920, 0.19370, -0.11360 ] + - [ 24.2602, 1.58150, 0.20140, -0.11800 ] + - [ 25.0199, 1.55630, 0.21350, -0.12490 ] + - [ 25.7802, 1.52720, 0.22670, -0.13250 ] + - [ 26.5302, 1.49820, 0.23990, -0.14000 ] + - [ 27.2900, 1.46910, 0.25310, -0.14760 ] + - [ 28.0497, 1.44010, 0.26630, -0.15510 ] + - [ 28.8100, 1.41100, 0.27950, -0.16270 ] + - [ 29.5600, 1.38200, 0.29270, -0.17030 ] + - [ 30.3198, 1.36220, 0.30780, -0.17400 ] + - [ 31.0801, 1.34240, 0.32300, -0.17770 ] + - [ 31.8301, 1.32250, 0.33810, -0.18150 ] + - [ 32.5898, 1.30270, 0.35320, -0.18520 ] + - [ 33.3502, 1.28290, 0.36840, -0.18890 ] + - [ 34.1002, 1.26310, 0.38350, -0.19260 ] + - [ 34.8599, 1.24330, 0.39870, -0.19640 ] + - [ 35.6202, 1.22340, 0.41380, -0.20010 ] + - [ 36.3800, 1.20360, 0.42890, -0.20390 ] + - [ 37.1300, 1.18380, 0.44410, -0.20760 ] + - [ 37.8903, 1.16400, 0.45920, -0.21130 ] + - [ 38.6500, 1.14420, 0.47430, -0.21500 ] + - [ 39.4000, 1.12430, 0.48950, -0.21880 ] + - [ 40.1598, 1.10640, 0.50520, -0.22180 ] + - [ 40.9201, 1.09050, 0.52140, -0.22420 ] + - [ 41.6701, 1.07450, 0.53760, -0.22660 ] + - [ 42.4298, 1.05860, 0.55380, -0.22890 ] + - [ 43.1901, 1.04260, 0.57010, -0.23130 ] + - [ 43.9401, 1.02670, 0.58630, -0.23370 ] + - [ 44.6999, 1.01070, 0.60250, -0.23610 ] + - [ 45.4602, 0.99480, 0.61880, -0.23840 ] + - [ 46.2199, 0.97880, 0.63500, -0.24080 ] + - [ 46.9699, 0.96280, 0.65120, -0.24320 ] + - [ 47.7302, 0.94690, 0.66750, -0.24550 ] + - [ 48.4900, 0.93090, 0.68370, -0.24790 ] + - [ 49.2400, 0.91500, 0.69990, -0.25030 ] + - [ 49.9997, 0.89900, 0.71610, -0.25270 ] + - [ 60.0001, 0.68360, 0.92460, -0.28330 ] + - [ 70.0000, 0.45560, 1.09850, -0.31560 ] + - [ 79.9998, 0.22190, 1.21820, -0.34820 ] + - [ 90.0002, 0.00000, 1.27070, -0.37730 ] + - [ 100.0000, -0.15530, 1.21820, -0.38770 ] + - [ 109.9999, -0.31890, 1.09850, -0.38650 ] + - [ 120.0003, -0.47840, 0.92460, -0.38060 ] + - [ 130.0001, -0.62930, 0.71610, -0.38030 ] + - [ 139.9999, -0.78010, 0.49700, -0.40320 ] + - [ 149.9998, -0.96740, 0.29270, -0.48540 ] + - [ 160.0002, -0.88370, 0.12680, -0.53250 ] + - [ 170.0000, -0.44180, 0.08440, -0.39060 ] + - [ 179.9660, 0.00000, 0.08440, 0.00000 ] + - name : FFA-W3-211 # + relative_thickness : 0.211 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.02464, 0.00000 ] + - [ -177.7143, 0.05403, 0.02534, 0.09143 ] + - [ -175.4286, 0.10805, 0.02742, 0.18286 ] + - [ -173.1429, 0.16208, 0.03088, 0.27429 ] + - [ -170.8572, 0.21610, 0.03570, 0.36571 ] + - [ -168.5716, 0.27013, 0.05599, 0.39192 ] + - [ -166.2857, 0.32415, 0.08143, 0.37898 ] + - [ -164.0000, 0.37818, 0.11112, 0.36605 ] + - [ -161.7145, 0.43220, 0.14485, 0.35312 ] + - [ -159.4284, 0.48623, 0.18242, 0.34768 ] + - [ -157.1428, 0.54025, 0.22359, 0.36471 ] + - [ -154.8573, 0.59428, 0.26810, 0.38175 ] + - [ -152.5714, 0.64830, 0.31566, 0.39878 ] + - [ -150.2857, 0.70233, 0.36597, 0.41581 ] + - [ -148.0000, 0.75635, 0.41871, 0.41955 ] + - [ -143.8571, 0.73188, 0.51941, 0.42287 ] + - [ -139.7143, 0.70655, 0.62488, 0.42632 ] + - [ -135.5714, 0.67760, 0.73293, 0.43163 ] + - [ -131.4286, 0.64333, 0.84130, 0.43694 ] + - [ -127.2857, 0.60277, 0.94773, 0.44389 ] + - [ -123.1429, 0.55550, 1.05001, 0.45171 ] + - [ -119.0000, 0.50156, 1.14600, 0.45897 ] + - [ -114.8571, 0.44131, 1.23371, 0.46448 ] + - [ -110.7143, 0.37542, 1.31129, 0.46998 ] + - [ -106.5714, 0.30482, 1.37714, 0.47096 ] + - [ -102.4286, 0.23063, 1.42988, 0.47101 ] + - [ -98.2857, 0.15413, 1.46842, 0.46824 ] + - [ -94.1429, 0.07675, 1.49196, 0.46149 ] + - [ -90.0000, 0.00000, 1.50000, 0.45474 ] + - [ -85.8571, -0.07675, 1.49196, 0.44026 ] + - [ -81.7143, -0.15413, 1.46842, 0.42578 ] + - [ -77.5714, -0.23063, 1.42988, 0.40821 ] + - [ -73.4286, -0.30482, 1.37714, 0.38846 ] + - [ -69.2857, -0.37542, 1.31129, 0.36815 ] + - [ -65.1429, -0.44131, 1.23371, 0.34519 ] + - [ -61.0000, -0.50156, 1.14600, 0.32223 ] + - [ -56.8571, -0.55550, 1.05001, 0.29864 ] + - [ -52.7143, -0.60277, 0.94773, 0.27486 ] + - [ -48.5714, -0.64333, 0.84130, 0.25128 ] + - [ -44.4286, -0.67760, 0.73293, 0.22810 ] + - [ -40.2857, -0.70655, 0.62488, 0.20491 ] + - [ -36.1429, -0.73188, 0.51941, 0.15416 ] + - [ -32.0000, -0.75635, 0.41871, 0.10137 ] + - [ -28.0000, -0.85636, 0.28691, 0.06527 ] + - [ -24.0000, -1.18292, 0.13960, 0.01647 ] + - [ -20.0000, -1.23596, 0.08345, -0.00352 ] + - [ -18.0000, -1.22536, 0.06509, -0.00672 ] + - [ -16.0000, -1.20476, 0.04888, -0.00881 ] + - [ -14.0000, -1.18332, 0.03417, -0.01101 ] + - [ -12.0000, -1.10093, 0.02132, -0.02269 ] + - [ -10.0000, -0.88209, 0.01386, -0.04397 ] + - [ -8.0000, -0.62981, 0.01075, -0.05756 ] + - [ -6.0000, -0.37670, 0.00882, -0.06747 ] + - [ -4.0000, -0.12177, 0.00702, -0.07680 ] + - [ -2.0000, 0.12810, 0.00663, -0.08283 ] + - [ -1.0000, 0.25192, 0.00664, -0.08534 ] + - [ 0.0000, 0.37535, 0.00670, -0.08777 ] + - [ 1.0000, 0.49828, 0.00681, -0.09011 ] + - [ 2.0000, 0.62052, 0.00698, -0.09234 ] + - [ 3.0000, 0.74200, 0.00720, -0.09447 ] + - [ 4.0000, 0.86238, 0.00751, -0.09646 ] + - [ 5.0000, 0.98114, 0.00796, -0.09828 ] + - [ 6.0000, 1.09662, 0.00872, -0.09977 ] + - [ 7.0000, 1.20904, 0.00968, -0.10095 ] + - [ 8.0000, 1.31680, 0.01097, -0.10163 ] + - [ 9.0000, 1.42209, 0.01227, -0.10207 ] + - [ 10.0000, 1.52361, 0.01369, -0.10213 ] + - [ 11.0000, 1.61988, 0.01529, -0.10174 ] + - [ 12.0000, 1.70937, 0.01717, -0.10087 ] + - [ 13.0000, 1.78681, 0.01974, -0.09936 ] + - [ 14.0000, 1.84290, 0.02368, -0.09720 ] + - [ 15.0000, 1.85313, 0.03094, -0.09410 ] + - [ 16.0000, 1.80951, 0.04303, -0.09144 ] + - [ 18.0000, 1.66033, 0.07730, -0.09242 ] + - [ 20.0000, 1.56152, 0.11202, -0.09871 ] + - [ 24.0000, 1.43327, 0.18408, -0.11770 ] + - [ 28.0000, 1.29062, 0.27589, -0.14566 ] + - [ 32.0000, 1.08050, 0.41871, -0.18266 ] + - [ 36.1429, 1.04554, 0.51941, -0.20913 ] + - [ 40.2857, 1.00936, 0.62488, -0.23534 ] + - [ 44.4286, 0.96801, 0.73293, -0.25784 ] + - [ 48.5714, 0.91904, 0.84130, -0.28035 ] + - [ 52.7143, 0.86109, 0.94773, -0.30163 ] + - [ 56.8571, 0.79357, 1.05001, -0.32226 ] + - [ 61.0000, 0.71651, 1.14600, -0.34247 ] + - [ 65.1429, 0.63044, 1.23371, -0.36135 ] + - [ 69.2857, 0.53632, 1.31129, -0.38024 ] + - [ 73.4286, 0.43546, 1.37714, -0.39704 ] + - [ 77.5714, 0.32947, 1.42988, -0.41341 ] + - [ 81.7143, 0.22019, 1.46842, -0.42844 ] + - [ 85.8571, 0.10965, 1.49196, -0.44159 ] + - [ 90.0000, 0.00000, 1.50000, -0.45474 ] + - [ 94.1429, -0.07675, 1.49196, -0.46149 ] + - [ 98.2857, -0.15413, 1.46842, -0.46824 ] + - [ 102.4286, -0.23063, 1.42988, -0.47101 ] + - [ 106.5714, -0.30482, 1.37714, -0.47096 ] + - [ 110.7143, -0.37542, 1.31129, -0.46998 ] + - [ 114.8571, -0.44131, 1.23371, -0.46448 ] + - [ 119.0000, -0.50156, 1.14600, -0.45897 ] + - [ 123.1429, -0.55550, 1.05001, -0.45171 ] + - [ 127.2857, -0.60277, 0.94773, -0.44389 ] + - [ 131.4286, -0.64333, 0.84130, -0.43694 ] + - [ 135.5714, -0.67760, 0.73293, -0.43163 ] + - [ 139.7143, -0.70655, 0.62488, -0.42632 ] + - [ 143.8571, -0.73188, 0.51941, -0.42287 ] + - [ 148.0000, -0.75635, 0.41871, -0.41955 ] + - [ 150.2857, -0.70233, 0.36597, -0.41581 ] + - [ 152.5714, -0.64830, 0.31566, -0.39878 ] + - [ 154.8571, -0.59428, 0.26810, -0.38175 ] + - [ 157.1429, -0.54025, 0.22359, -0.36471 ] + - [ 159.4286, -0.48623, 0.18242, -0.34768 ] + - [ 161.7143, -0.43220, 0.14485, -0.37026 ] + - [ 164.0000, -0.37818, 0.11112, -0.40605 ] + - [ 166.2857, -0.32415, 0.08143, -0.44184 ] + - [ 168.5714, -0.27013, 0.05599, -0.47763 ] + - [ 170.8571, -0.21610, 0.03570, -0.45714 ] + - [ 173.1429, -0.16208, 0.03088, -0.34286 ] + - [ 175.4286, -0.10805, 0.02742, -0.22857 ] + - [ 177.7143, -0.05403, 0.02534, -0.11429 ] + - [ 179.9087, 0.00000, 0.02464, 0.00000 ] + - name : FFA-W3-241 # + relative_thickness : 0.241 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.01178, 0.00000 ] + - [ -177.7143, 0.05818, 0.01248, 0.09143 ] + - [ -175.4286, 0.11636, 0.01460, 0.18286 ] + - [ -173.1429, 0.17453, 0.01811, 0.27429 ] + - [ -170.8572, 0.23271, 0.02300, 0.36571 ] + - [ -168.5716, 0.29089, 0.02922, 0.39568 ] + - [ -166.2857, 0.34907, 0.05382, 0.38876 ] + - [ -164.0000, 0.40725, 0.08379, 0.38184 ] + - [ -161.7145, 0.46542, 0.11786, 0.37492 ] + - [ -159.4284, 0.52360, 0.15581, 0.37408 ] + - [ -157.1428, 0.58178, 0.19740, 0.39148 ] + - [ -154.8573, 0.63996, 0.24237, 0.40888 ] + - [ -152.5714, 0.69814, 0.29043, 0.42628 ] + - [ -150.2857, 0.75631, 0.34128, 0.44368 ] + - [ -148.0000, 0.81449, 0.39460, 0.44537 ] + - [ -143.8571, 0.77925, 0.49645, 0.44436 ] + - [ -139.7143, 0.74511, 0.60319, 0.44360 ] + - [ -135.5714, 0.70881, 0.71263, 0.44609 ] + - [ -131.4286, 0.66835, 0.82249, 0.44858 ] + - [ -127.2857, 0.62253, 0.93051, 0.45370 ] + - [ -123.1429, 0.57080, 1.03447, 0.46020 ] + - [ -119.0000, 0.51307, 1.13222, 0.46633 ] + - [ -114.8571, 0.44965, 1.22176, 0.47130 ] + - [ -110.7143, 0.38115, 1.30123, 0.47627 ] + - [ -106.5714, 0.30846, 1.36903, 0.47705 ] + - [ -102.4286, 0.23266, 1.42376, 0.47695 ] + - [ -98.2857, 0.15503, 1.46433, 0.47409 ] + - [ -94.1429, 0.07698, 1.48990, 0.46732 ] + - [ -90.0000, 0.00000, 1.50000, 0.46055 ] + - [ -85.8571, -0.07698, 1.48990, 0.44509 ] + - [ -81.7143, -0.15503, 1.46433, 0.42964 ] + - [ -77.5714, -0.23266, 1.42376, 0.41125 ] + - [ -73.4286, -0.30846, 1.36903, 0.39081 ] + - [ -69.2857, -0.38115, 1.30123, 0.36988 ] + - [ -65.1429, -0.44965, 1.22176, 0.34663 ] + - [ -61.0000, -0.51307, 1.13222, 0.32339 ] + - [ -56.8571, -0.57080, 1.03447, 0.29984 ] + - [ -52.7143, -0.62253, 0.93051, 0.27618 ] + - [ -48.5714, -0.66835, 0.82249, 0.25280 ] + - [ -44.4286, -0.70881, 0.71263, 0.22992 ] + - [ -40.2857, -0.74511, 0.60319, 0.20705 ] + - [ -36.1429, -0.77925, 0.49645, 0.14561 ] + - [ -32.0000, -0.81449, 0.39460, 0.08131 ] + - [ -28.0000, -1.07781, 0.22252, 0.04592 ] + - [ -24.0000, -1.12692, 0.15159, 0.01901 ] + - [ -20.0000, -1.14480, 0.09699, 0.00063 ] + - [ -18.0000, -1.12797, 0.07744, -0.00342 ] + - [ -16.0000, -1.09392, 0.06122, -0.00587 ] + - [ -14.0000, -1.05961, 0.04667, -0.00652 ] + - [ -12.0000, -1.03121, 0.03302, -0.00755 ] + - [ -10.0000, -0.93706, 0.02027, -0.02243 ] + - [ -8.0000, -0.67380, 0.01168, -0.05583 ] + - [ -6.0000, -0.40391, 0.00918, -0.07159 ] + - [ -4.0000, -0.14226, 0.00839, -0.08123 ] + - [ -2.0000, 0.11580, 0.00810, -0.08892 ] + - [ -1.0000, 0.24382, 0.00808, -0.09235 ] + - [ 0.0000, 0.37113, 0.00813, -0.09556 ] + - [ 1.0000, 0.49766, 0.00824, -0.09857 ] + - [ 2.0000, 0.62334, 0.00842, -0.10139 ] + - [ 3.0000, 0.74798, 0.00867, -0.10403 ] + - [ 4.0000, 0.87137, 0.00901, -0.10645 ] + - [ 5.0000, 0.99320, 0.00945, -0.10863 ] + - [ 6.0000, 1.11325, 0.00998, -0.11057 ] + - [ 7.0000, 1.23037, 0.01070, -0.11214 ] + - [ 8.0000, 1.34496, 0.01153, -0.11337 ] + - [ 9.0000, 1.45407, 0.01269, -0.11396 ] + - [ 10.0000, 1.55911, 0.01396, -0.11403 ] + - [ 11.0000, 1.65779, 0.01545, -0.11336 ] + - [ 12.0000, 1.74834, 0.01724, -0.11187 ] + - [ 13.0000, 1.82666, 0.01961, -0.10935 ] + - [ 14.0000, 1.88831, 0.02293, -0.10606 ] + - [ 15.0000, 1.92579, 0.02795, -0.10238 ] + - [ 16.0000, 1.92722, 0.03609, -0.09887 ] + - [ 18.0000, 1.80055, 0.06534, -0.09497 ] + - [ 20.0000, 1.63088, 0.10459, -0.09996 ] + - [ 24.0000, 1.43345, 0.19148, -0.12589 ] + - [ 28.0000, 1.28805, 0.28629, -0.15453 ] + - [ 32.0000, 1.16356, 0.39460, -0.18396 ] + - [ 36.1429, 1.11321, 0.49645, -0.21099 ] + - [ 40.2857, 1.06444, 0.60319, -0.23768 ] + - [ 44.4286, 1.01259, 0.71263, -0.25992 ] + - [ 48.5714, 0.95478, 0.82249, -0.28216 ] + - [ 52.7143, 0.88932, 0.93051, -0.30323 ] + - [ 56.8571, 0.81542, 1.03447, -0.32368 ] + - [ 61.0000, 0.73296, 1.13222, -0.34380 ] + - [ 65.1429, 0.64236, 1.22176, -0.36292 ] + - [ 69.2857, 0.54450, 1.30123, -0.38204 ] + - [ 73.4286, 0.44065, 1.36903, -0.39944 ] + - [ 77.5714, 0.33237, 1.42376, -0.41648 ] + - [ 81.7143, 0.22148, 1.46433, -0.43231 ] + - [ 85.8571, 0.10997, 1.48990, -0.44643 ] + - [ 90.0000, 0.00000, 1.50000, -0.46055 ] + - [ 94.1429, -0.07698, 1.48990, -0.46732 ] + - [ 98.2857, -0.15503, 1.46433, -0.47409 ] + - [ 102.4286, -0.23266, 1.42376, -0.47695 ] + - [ 106.5714, -0.30846, 1.36903, -0.47705 ] + - [ 110.7143, -0.38115, 1.30123, -0.47627 ] + - [ 114.8571, -0.44965, 1.22176, -0.47130 ] + - [ 119.0000, -0.51307, 1.13222, -0.46633 ] + - [ 123.1429, -0.57080, 1.03447, -0.46020 ] + - [ 127.2857, -0.62253, 0.93051, -0.45370 ] + - [ 131.4286, -0.66835, 0.82249, -0.44858 ] + - [ 135.5714, -0.70881, 0.71263, -0.44609 ] + - [ 139.7143, -0.74511, 0.60319, -0.44360 ] + - [ 143.8571, -0.77925, 0.49645, -0.44436 ] + - [ 148.0000, -0.81449, 0.39460, -0.44537 ] + - [ 150.2857, -0.75631, 0.34128, -0.44368 ] + - [ 152.5714, -0.69814, 0.29043, -0.42628 ] + - [ 154.8571, -0.63996, 0.24237, -0.40888 ] + - [ 157.1429, -0.58178, 0.19740, -0.39148 ] + - [ 159.4286, -0.52360, 0.15581, -0.37408 ] + - [ 161.7143, -0.46542, 0.11786, -0.39207 ] + - [ 164.0000, -0.40725, 0.08379, -0.42184 ] + - [ 166.2857, -0.34907, 0.05382, -0.45162 ] + - [ 168.5714, -0.29089, 0.02922, -0.48139 ] + - [ 170.8571, -0.23271, 0.02300, -0.45714 ] + - [ 173.1429, -0.17453, 0.01811, -0.34286 ] + - [ 175.4286, -0.11636, 0.01460, -0.22857 ] + - [ 177.7143, -0.05818, 0.01248, -0.11429 ] + - [ 179.9087, 0.00000, 0.01178, 0.00000 ] + - name : FFA-W3-270blend # + relative_thickness : 0.27 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.01545, 0.00000 ] + - [ -177.7143, 0.06213, 0.01611, 0.09143 ] + - [ -175.4286, 0.12426, 0.01807, 0.18286 ] + - [ -173.1429, 0.18639, 0.02133, 0.27429 ] + - [ -170.8572, 0.24852, 0.02587, 0.36571 ] + - [ -168.5716, 0.31064, 0.03289, 0.39874 ] + - [ -166.2857, 0.37277, 0.05681, 0.39672 ] + - [ -164.0000, 0.43490, 0.08471, 0.39470 ] + - [ -161.7145, 0.49703, 0.11643, 0.39268 ] + - [ -159.4284, 0.55916, 0.15176, 0.39544 ] + - [ -157.1428, 0.62129, 0.19048, 0.41254 ] + - [ -154.8573, 0.68342, 0.23234, 0.42964 ] + - [ -152.5714, 0.74555, 0.27708, 0.44674 ] + - [ -150.2857, 0.80768, 0.32441, 0.46384 ] + - [ -148.0000, 0.86981, 0.37404, 0.46186 ] + - [ -143.8571, 0.81660, 0.46882, 0.45335 ] + - [ -139.7143, 0.76812, 0.56814, 0.44523 ] + - [ -135.5714, 0.72040, 0.66995, 0.44237 ] + - [ -131.4286, 0.67095, 0.77214, 0.43951 ] + - [ -127.2857, 0.61828, 0.87258, 0.44072 ] + - [ -123.1429, 0.56158, 0.96921, 0.44407 ] + - [ -119.0000, 0.50057, 1.06002, 0.44739 ] + - [ -114.8571, 0.43540, 1.14315, 0.45063 ] + - [ -110.7143, 0.36655, 1.21688, 0.45387 ] + - [ -106.5714, 0.29475, 1.27969, 0.45377 ] + - [ -102.4286, 0.22098, 1.33030, 0.45298 ] + - [ -98.2857, 0.14639, 1.36768, 0.44973 ] + - [ -94.1429, 0.07227, 1.39107, 0.44302 ] + - [ -90.0000, 0.00000, 1.40000, 0.43630 ] + - [ -85.8571, -0.07227, 1.39107, 0.42180 ] + - [ -81.7143, -0.14639, 1.36768, 0.40730 ] + - [ -77.5714, -0.22098, 1.33030, 0.39020 ] + - [ -73.4286, -0.29475, 1.27969, 0.37125 ] + - [ -69.2857, -0.36655, 1.21688, 0.35190 ] + - [ -65.1429, -0.43540, 1.14315, 0.33068 ] + - [ -61.0000, -0.50057, 1.06002, 0.30945 ] + - [ -56.8571, -0.56158, 0.96921, 0.28815 ] + - [ -52.7143, -0.61828, 0.87258, 0.26684 ] + - [ -48.5714, -0.67095, 0.77214, 0.24576 ] + - [ -44.4286, -0.72040, 0.66995, 0.22512 ] + - [ -40.2857, -0.76812, 0.56814, 0.20447 ] + - [ -36.1429, -0.81660, 0.46882, 0.13957 ] + - [ -32.0000, -0.86981, 0.37404, 0.07138 ] + - [ -28.0000, -1.09837, 0.21880, 0.04400 ] + - [ -24.0000, -1.08339, 0.15982, 0.02166 ] + - [ -20.0000, -1.06990, 0.10744, 0.00422 ] + - [ -18.0000, -1.05454, 0.08690, -0.00035 ] + - [ -16.0000, -1.03432, 0.06844, -0.00334 ] + - [ -14.0000, -1.08360, 0.04733, -0.00283 ] + - [ -12.0000, -1.09489, 0.03085, -0.00556 ] + - [ -10.0000, -0.92665, 0.01984, -0.02952 ] + - [ -8.0000, -0.69676, 0.01439, -0.04822 ] + - [ -6.0000, -0.43628, 0.01155, -0.06483 ] + - [ -4.0000, -0.16252, 0.01026, -0.07919 ] + - [ -2.0000, 0.10709, 0.00976, -0.09041 ] + - [ -1.0000, 0.23993, 0.00967, -0.09517 ] + - [ 0.0000, 0.37158, 0.00968, -0.09953 ] + - [ 1.0000, 0.50210, 0.00976, -0.10355 ] + - [ 2.0000, 0.63139, 0.00993, -0.10725 ] + - [ 3.0000, 0.75951, 0.01016, -0.11068 ] + - [ 4.0000, 0.88638, 0.01045, -0.11385 ] + - [ 5.0000, 1.01172, 0.01082, -0.11673 ] + - [ 6.0000, 1.13430, 0.01140, -0.11923 ] + - [ 7.0000, 1.25536, 0.01198, -0.12145 ] + - [ 8.0000, 1.37379, 0.01267, -0.12328 ] + - [ 9.0000, 1.48841, 0.01353, -0.12460 ] + - [ 10.0000, 1.59782, 0.01460, -0.12526 ] + - [ 11.0000, 1.70005, 0.01597, -0.12505 ] + - [ 12.0000, 1.79190, 0.01777, -0.12370 ] + - [ 13.0000, 1.86782, 0.02035, -0.12093 ] + - [ 14.0000, 1.92687, 0.02385, -0.11725 ] + - [ 15.0000, 1.90901, 0.03236, -0.10931 ] + - [ 16.0000, 1.88548, 0.04259, -0.10525 ] + - [ 18.0000, 1.72106, 0.07672, -0.10292 ] + - [ 20.0000, 1.54737, 0.11914, -0.11017 ] + - [ 24.0000, 1.37176, 0.20189, -0.13431 ] + - [ 28.0000, 1.33611, 0.27981, -0.15777 ] + - [ 32.0000, 1.24258, 0.37404, -0.18432 ] + - [ 36.1429, 1.16657, 0.46882, -0.21002 ] + - [ 40.2857, 1.09731, 0.56814, -0.23531 ] + - [ 44.4286, 1.02914, 0.66995, -0.25508 ] + - [ 48.5714, 0.95850, 0.77214, -0.27485 ] + - [ 52.7143, 0.88325, 0.87258, -0.29346 ] + - [ 56.8571, 0.80225, 0.96921, -0.31145 ] + - [ 61.0000, 0.71510, 1.06002, -0.32925 ] + - [ 65.1429, 0.62200, 1.14315, -0.34641 ] + - [ 69.2857, 0.52364, 1.21688, -0.36357 ] + - [ 73.4286, 0.42107, 1.27969, -0.37949 ] + - [ 77.5714, 0.31569, 1.33030, -0.39517 ] + - [ 81.7143, 0.20913, 1.36768, -0.40983 ] + - [ 85.8571, 0.10324, 1.39107, -0.42306 ] + - [ 90.0000, 0.00000, 1.40000, -0.43630 ] + - [ 94.1429, -0.07227, 1.39107, -0.44302 ] + - [ 98.2857, -0.14639, 1.36768, -0.44973 ] + - [ 102.4286, -0.22098, 1.33030, -0.45298 ] + - [ 106.5714, -0.29475, 1.27969, -0.45377 ] + - [ 110.7143, -0.36655, 1.21688, -0.45387 ] + - [ 114.8571, -0.43540, 1.14315, -0.45063 ] + - [ 119.0000, -0.50057, 1.06002, -0.44739 ] + - [ 123.1429, -0.56158, 0.96921, -0.44407 ] + - [ 127.2857, -0.61828, 0.87258, -0.44072 ] + - [ 131.4286, -0.67095, 0.77214, -0.43951 ] + - [ 135.5714, -0.72040, 0.66995, -0.44237 ] + - [ 139.7143, -0.76812, 0.56814, -0.44523 ] + - [ 143.8571, -0.81660, 0.46882, -0.45335 ] + - [ 148.0000, -0.86981, 0.37404, -0.46186 ] + - [ 150.2857, -0.80768, 0.32441, -0.46384 ] + - [ 152.5714, -0.74555, 0.27708, -0.44674 ] + - [ 154.8571, -0.68342, 0.23234, -0.42964 ] + - [ 157.1429, -0.62129, 0.19048, -0.41254 ] + - [ 159.4286, -0.55916, 0.15176, -0.39544 ] + - [ 161.7143, -0.49703, 0.11643, -0.40982 ] + - [ 164.0000, -0.43490, 0.08471, -0.43470 ] + - [ 166.2857, -0.37277, 0.05681, -0.45958 ] + - [ 168.5714, -0.31064, 0.03289, -0.48445 ] + - [ 170.8571, -0.24852, 0.02587, -0.45714 ] + - [ 173.1429, -0.18639, 0.02133, -0.34286 ] + - [ 175.4286, -0.12426, 0.01807, -0.22857 ] + - [ 177.7143, -0.06213, 0.01611, -0.11429 ] + - [ 179.9087, 0.00000, 0.01545, 0.00000 ] + - name : FFA-W3-301 # + relative_thickness : 0.301 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.02454, 0.00000 ] + - [ -177.7143, 0.06508, 0.02514, 0.09143 ] + - [ -175.4286, 0.13016, 0.02694, 0.18286 ] + - [ -173.1429, 0.19525, 0.02993, 0.27429 ] + - [ -170.8572, 0.26033, 0.03408, 0.36571 ] + - [ -168.5716, 0.32541, 0.03938, 0.40085 ] + - [ -166.2857, 0.39049, 0.05910, 0.40220 ] + - [ -164.0000, 0.45557, 0.08495, 0.40356 ] + - [ -161.7145, 0.52066, 0.11433, 0.40492 ] + - [ -159.4284, 0.58574, 0.14704, 0.41010 ] + - [ -157.1428, 0.65082, 0.18290, 0.42678 ] + - [ -154.8573, 0.71590, 0.22166, 0.44345 ] + - [ -152.5714, 0.78098, 0.26309, 0.46013 ] + - [ -150.2857, 0.84607, 0.30692, 0.47680 ] + - [ -148.0000, 0.91115, 0.35287, 0.47162 ] + - [ -143.8571, 0.84257, 0.44061, 0.45656 ] + - [ -139.7143, 0.78187, 0.53255, 0.44202 ] + - [ -135.5714, 0.72448, 0.62677, 0.43452 ] + - [ -131.4286, 0.66755, 0.72131, 0.42701 ] + - [ -127.2857, 0.60928, 0.81421, 0.42483 ] + - [ -123.1429, 0.54868, 0.90355, 0.42544 ] + - [ -119.0000, 0.48530, 0.98748, 0.42634 ] + - [ -114.8571, 0.41915, 1.06425, 0.42813 ] + - [ -110.7143, 0.35056, 1.13227, 0.42992 ] + - [ -106.5714, 0.28017, 1.19015, 0.42916 ] + - [ -102.4286, 0.20881, 1.23669, 0.42788 ] + - [ -98.2857, 0.13754, 1.27093, 0.42444 ] + - [ -94.1429, 0.06751, 1.29218, 0.41794 ] + - [ -90.0000, 0.00000, 1.30000, 0.41144 ] + - [ -85.8571, -0.06751, 1.29218, 0.39804 ] + - [ -81.7143, -0.13754, 1.27093, 0.38464 ] + - [ -77.5714, -0.20881, 1.23669, 0.36892 ] + - [ -73.4286, -0.28017, 1.19015, 0.35157 ] + - [ -69.2857, -0.35056, 1.13227, 0.33391 ] + - [ -65.1429, -0.41915, 1.06425, 0.31474 ] + - [ -61.0000, -0.48530, 0.98748, 0.29557 ] + - [ -56.8571, -0.54868, 0.90355, 0.27653 ] + - [ -52.7143, -0.60928, 0.81421, 0.25754 ] + - [ -48.5714, -0.66755, 0.72131, 0.23873 ] + - [ -44.4286, -0.72448, 0.62677, 0.22027 ] + - [ -40.2857, -0.78187, 0.53255, 0.20181 ] + - [ -36.1429, -0.84257, 0.44061, 0.13644 ] + - [ -32.0000, -0.91115, 0.35287, 0.06760 ] + - [ -28.0000, -1.10349, 0.21721, 0.04231 ] + - [ -24.0000, -1.10737, 0.15629, 0.02026 ] + - [ -20.0000, -1.11815, 0.10335, 0.00407 ] + - [ -18.0000, -1.12332, 0.08180, 0.00017 ] + - [ -16.0000, -1.11865, 0.06331, -0.00167 ] + - [ -14.0000, -1.11620, 0.04718, -0.00120 ] + - [ -12.0000, -1.09588, 0.03280, -0.00463 ] + - [ -10.0000, -0.91767, 0.02351, -0.02494 ] + - [ -8.0000, -0.69311, 0.01793, -0.04304 ] + - [ -6.0000, -0.45396, 0.01431, -0.05868 ] + - [ -4.0000, -0.17779, 0.01242, -0.07601 ] + - [ -2.0000, 0.10480, 0.01160, -0.09121 ] + - [ -1.0000, 0.24383, 0.01143, -0.09763 ] + - [ 0.0000, 0.38111, 0.01138, -0.10341 ] + - [ 1.0000, 0.51660, 0.01143, -0.10861 ] + - [ 2.0000, 0.65044, 0.01156, -0.11333 ] + - [ 3.0000, 0.78267, 0.01177, -0.11762 ] + - [ 4.0000, 0.91326, 0.01204, -0.12154 ] + - [ 5.0000, 1.04207, 0.01239, -0.12510 ] + - [ 6.0000, 1.16873, 0.01283, -0.12828 ] + - [ 7.0000, 1.29296, 0.01338, -0.13104 ] + - [ 8.0000, 1.41390, 0.01406, -0.13332 ] + - [ 9.0000, 1.53088, 0.01488, -0.13503 ] + - [ 10.0000, 1.64208, 0.01592, -0.13599 ] + - [ 11.0000, 1.74568, 0.01726, -0.13605 ] + - [ 12.0000, 1.83887, 0.01908, -0.13514 ] + - [ 13.0000, 1.91764, 0.02169, -0.13322 ] + - [ 14.0000, 1.97413, 0.02572, -0.13020 ] + - [ 15.0000, 1.99916, 0.03222, -0.12641 ] + - [ 16.0000, 1.99377, 0.04157, -0.12265 ] + - [ 18.0000, 1.91720, 0.06731, -0.11675 ] + - [ 20.0000, 1.73683, 0.10526, -0.11652 ] + - [ 24.0000, 1.47321, 0.19229, -0.13790 ] + - [ 28.0000, 1.36017, 0.27449, -0.16242 ] + - [ 32.0000, 1.30164, 0.35287, -0.18463 ] + - [ 36.1429, 1.20367, 0.44061, -0.20894 ] + - [ 40.2857, 1.11695, 0.53255, -0.23276 ] + - [ 44.4286, 1.03498, 0.62677, -0.25011 ] + - [ 48.5714, 0.95364, 0.72131, -0.26746 ] + - [ 52.7143, 0.87040, 0.81421, -0.28365 ] + - [ 56.8571, 0.78383, 0.90355, -0.29923 ] + - [ 61.0000, 0.69329, 0.98748, -0.31472 ] + - [ 65.1429, 0.59878, 1.06425, -0.32988 ] + - [ 69.2857, 0.50080, 1.13227, -0.34505 ] + - [ 73.4286, 0.40024, 1.19015, -0.35942 ] + - [ 77.5714, 0.29831, 1.23669, -0.37363 ] + - [ 81.7143, 0.19648, 1.27093, -0.38702 ] + - [ 85.8571, 0.09644, 1.29218, -0.39923 ] + - [ 90.0000, 0.00000, 1.30000, -0.41144 ] + - [ 94.1429, -0.06751, 1.29218, -0.41794 ] + - [ 98.2857, -0.13754, 1.27093, -0.42444 ] + - [ 102.4286, -0.20881, 1.23669, -0.42788 ] + - [ 106.5714, -0.28017, 1.19015, -0.42916 ] + - [ 110.7143, -0.35056, 1.13227, -0.42992 ] + - [ 114.8571, -0.41915, 1.06425, -0.42813 ] + - [ 119.0000, -0.48530, 0.98748, -0.42634 ] + - [ 123.1429, -0.54868, 0.90355, -0.42544 ] + - [ 127.2857, -0.60928, 0.81421, -0.42483 ] + - [ 131.4286, -0.66755, 0.72131, -0.42701 ] + - [ 135.5714, -0.72448, 0.62677, -0.43452 ] + - [ 139.7143, -0.78187, 0.53255, -0.44202 ] + - [ 143.8571, -0.84257, 0.44061, -0.45656 ] + - [ 148.0000, -0.91115, 0.35287, -0.47162 ] + - [ 150.2857, -0.84607, 0.30692, -0.47680 ] + - [ 152.5714, -0.78098, 0.26309, -0.46013 ] + - [ 154.8571, -0.71590, 0.22166, -0.44345 ] + - [ 157.1429, -0.65082, 0.18290, -0.42678 ] + - [ 159.4286, -0.58574, 0.14704, -0.41010 ] + - [ 161.7143, -0.52066, 0.11433, -0.42206 ] + - [ 164.0000, -0.45557, 0.08495, -0.44356 ] + - [ 166.2857, -0.39049, 0.05910, -0.46506 ] + - [ 168.5714, -0.32541, 0.03938, -0.48656 ] + - [ 170.8571, -0.26033, 0.03408, -0.45714 ] + - [ 173.1429, -0.19525, 0.02993, -0.34286 ] + - [ 175.4286, -0.13016, 0.02694, -0.22857 ] + - [ 177.7143, -0.06508, 0.02514, -0.11429 ] + - [ 179.9087, 0.00000, 0.02454, 0.00000 ] + - name : FFA-W3-330blend # + relative_thickness : 0.33 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.03169, 0.00000 ] + - [ -177.7143, 0.06960, 0.03228, 0.09143 ] + - [ -175.4286, 0.13920, 0.03406, 0.18286 ] + - [ -173.1429, 0.20880, 0.03702, 0.27429 ] + - [ -170.8572, 0.27841, 0.04114, 0.36571 ] + - [ -168.5716, 0.34801, 0.04638, 0.40308 ] + - [ -166.2857, 0.41761, 0.05732, 0.40801 ] + - [ -164.0000, 0.48721, 0.08319, 0.41294 ] + - [ -161.7145, 0.55681, 0.11258, 0.41788 ] + - [ -159.4284, 0.62641, 0.14533, 0.42586 ] + - [ -157.1428, 0.69601, 0.18121, 0.44302 ] + - [ -154.8573, 0.76562, 0.22000, 0.46017 ] + - [ -152.5714, 0.83522, 0.26146, 0.47732 ] + - [ -150.2857, 0.90482, 0.30532, 0.49447 ] + - [ -148.0000, 0.97442, 0.35131, 0.48743 ] + - [ -143.8571, 0.89412, 0.43913, 0.46839 ] + - [ -139.7143, 0.82382, 0.53115, 0.44996 ] + - [ -135.5714, 0.75845, 0.62546, 0.43985 ] + - [ -131.4286, 0.69477, 0.72010, 0.42974 ] + - [ -127.2857, 0.63079, 0.81310, 0.42589 ] + - [ -123.1429, 0.56532, 0.90255, 0.42535 ] + - [ -119.0000, 0.49783, 0.98659, 0.42528 ] + - [ -114.8571, 0.42823, 1.06348, 0.42673 ] + - [ -110.7143, 0.35680, 1.13162, 0.42817 ] + - [ -106.5714, 0.28412, 1.18963, 0.42745 ] + - [ -102.4286, 0.21103, 1.23629, 0.42628 ] + - [ -98.2857, 0.13851, 1.27067, 0.42303 ] + - [ -94.1429, 0.06775, 1.29204, 0.41683 ] + - [ -90.0000, 0.00000, 1.30000, 0.41063 ] + - [ -85.8571, -0.06775, 1.29204, 0.39752 ] + - [ -81.7143, -0.13851, 1.27067, 0.38441 ] + - [ -77.5714, -0.21103, 1.23629, 0.36905 ] + - [ -73.4286, -0.28412, 1.18963, 0.35212 ] + - [ -69.2857, -0.35680, 1.13162, 0.33491 ] + - [ -65.1429, -0.42823, 1.06348, 0.31634 ] + - [ -61.0000, -0.49783, 0.98659, 0.29777 ] + - [ -56.8571, -0.56532, 0.90255, 0.27947 ] + - [ -52.7143, -0.63079, 0.81310, 0.26125 ] + - [ -48.5714, -0.69477, 0.72010, 0.24322 ] + - [ -44.4286, -0.75845, 0.62546, 0.22556 ] + - [ -40.2857, -0.82382, 0.53115, 0.20789 ] + - [ -36.1429, -0.89412, 0.43913, 0.13731 ] + - [ -32.0000, -0.97442, 0.35131, 0.06280 ] + - [ -28.0000, -1.16308, 0.20648, 0.03905 ] + - [ -24.0000, -1.14892, 0.15001, 0.01853 ] + - [ -20.0000, -1.09451, 0.10600, 0.00441 ] + - [ -18.0000, -1.05801, 0.08732, -0.00061 ] + - [ -16.0000, -1.02281, 0.07051, -0.00342 ] + - [ -14.0000, -0.99810, 0.05474, -0.00401 ] + - [ -12.0000, -0.98515, 0.04052, -0.00272 ] + - [ -10.0000, -0.89583, 0.02929, -0.01198 ] + - [ -8.0000, -0.67539, 0.02207, -0.03458 ] + - [ -6.0000, -0.43247, 0.01735, -0.05466 ] + - [ -4.0000, -0.15881, 0.01473, -0.07425 ] + - [ -2.0000, 0.13456, 0.01362, -0.09270 ] + - [ -1.0000, 0.28014, 0.01339, -0.10074 ] + - [ 0.0000, 0.42386, 0.01330, -0.10802 ] + - [ 1.0000, 0.56519, 0.01333, -0.11450 ] + - [ 2.0000, 0.70410, 0.01345, -0.12028 ] + - [ 3.0000, 0.84071, 0.01366, -0.12546 ] + - [ 4.0000, 0.97500, 0.01397, -0.13011 ] + - [ 5.0000, 1.10680, 0.01437, -0.13425 ] + - [ 6.0000, 1.23603, 0.01486, -0.13793 ] + - [ 7.0000, 1.36223, 0.01547, -0.14108 ] + - [ 8.0000, 1.48424, 0.01623, -0.14363 ] + - [ 9.0000, 1.60097, 0.01718, -0.14545 ] + - [ 10.0000, 1.71010, 0.01841, -0.14636 ] + - [ 11.0000, 1.80957, 0.02010, -0.14635 ] + - [ 12.0000, 1.89473, 0.02258, -0.14544 ] + - [ 13.0000, 1.95698, 0.02671, -0.14378 ] + - [ 14.0000, 1.98576, 0.03380, -0.14185 ] + - [ 15.0000, 1.99260, 0.04333, -0.14004 ] + - [ 16.0000, 1.99617, 0.05354, -0.13823 ] + - [ 18.0000, 1.96398, 0.07706, -0.13351 ] + - [ 20.0000, 1.81179, 0.11169, -0.13135 ] + - [ 24.0000, 1.56073, 0.19103, -0.14660 ] + - [ 28.0000, 1.46798, 0.27199, -0.17242 ] + - [ 32.0000, 1.39203, 0.35131, -0.19417 ] + - [ 36.1429, 1.27731, 0.43913, -0.21792 ] + - [ 40.2857, 1.17689, 0.53115, -0.24115 ] + - [ 44.4286, 1.08350, 0.62546, -0.25734 ] + - [ 48.5714, 0.99253, 0.72010, -0.27354 ] + - [ 52.7143, 0.90112, 0.81310, -0.28862 ] + - [ 56.8571, 0.80760, 0.90255, -0.30311 ] + - [ 61.0000, 0.71119, 0.98659, -0.31757 ] + - [ 65.1429, 0.61175, 1.06348, -0.33194 ] + - [ 69.2857, 0.50971, 1.13162, -0.34631 ] + - [ 73.4286, 0.40589, 1.18963, -0.36014 ] + - [ 77.5714, 0.30146, 1.23629, -0.37385 ] + - [ 81.7143, 0.19788, 1.27067, -0.38681 ] + - [ 85.8571, 0.09679, 1.29204, -0.39872 ] + - [ 90.0000, 0.00000, 1.30000, -0.41063 ] + - [ 94.1429, -0.06775, 1.29204, -0.41683 ] + - [ 98.2857, -0.13851, 1.27067, -0.42303 ] + - [ 102.4286, -0.21103, 1.23629, -0.42628 ] + - [ 106.5714, -0.28412, 1.18963, -0.42745 ] + - [ 110.7143, -0.35680, 1.13162, -0.42817 ] + - [ 114.8571, -0.42823, 1.06348, -0.42673 ] + - [ 119.0000, -0.49783, 0.98659, -0.42528 ] + - [ 123.1429, -0.56532, 0.90255, -0.42535 ] + - [ 127.2857, -0.63079, 0.81310, -0.42589 ] + - [ 131.4286, -0.69477, 0.72010, -0.42974 ] + - [ 135.5714, -0.75845, 0.62546, -0.43985 ] + - [ 139.7143, -0.82382, 0.53115, -0.44996 ] + - [ 143.8571, -0.89412, 0.43913, -0.46839 ] + - [ 148.0000, -0.97442, 0.35131, -0.48743 ] + - [ 150.2857, -0.90482, 0.30532, -0.49447 ] + - [ 152.5714, -0.83522, 0.26146, -0.47732 ] + - [ 154.8571, -0.76562, 0.22000, -0.46017 ] + - [ 157.1429, -0.69601, 0.18121, -0.44302 ] + - [ 159.4286, -0.62641, 0.14533, -0.42586 ] + - [ 161.7143, -0.55681, 0.11258, -0.43502 ] + - [ 164.0000, -0.48721, 0.08319, -0.45294 ] + - [ 166.2857, -0.41761, 0.05732, -0.47087 ] + - [ 168.5714, -0.34801, 0.04638, -0.48880 ] + - [ 170.8571, -0.27841, 0.04114, -0.45714 ] + - [ 173.1429, -0.20880, 0.03702, -0.34286 ] + - [ 175.4286, -0.13920, 0.03406, -0.22857 ] + - [ 177.7143, -0.06960, 0.03228, -0.11429 ] + - [ 179.9087, 0.00000, 0.03169, 0.00000 ] + - name : FFA-W3-360 # + relative_thickness : 0.36 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.03715, 0.00000 ] + - [ -177.7143, 0.07178, 0.03774, 0.09143 ] + - [ -175.4286, 0.14356, 0.03951, 0.18286 ] + - [ -173.1429, 0.21534, 0.04245, 0.27429 ] + - [ -170.8572, 0.28713, 0.04653, 0.36571 ] + - [ -168.5716, 0.35891, 0.05174, 0.40313 ] + - [ -166.2857, 0.43069, 0.06068, 0.40814 ] + - [ -164.0000, 0.50247, 0.08651, 0.41315 ] + - [ -161.7145, 0.57425, 0.11586, 0.41816 ] + - [ -159.4284, 0.64603, 0.14856, 0.42627 ] + - [ -157.1428, 0.71781, 0.18439, 0.44370 ] + - [ -154.8573, 0.78960, 0.22313, 0.46114 ] + - [ -152.5714, 0.86138, 0.26453, 0.47857 ] + - [ -150.2857, 0.93316, 0.30832, 0.49600 ] + - [ -148.0000, 1.00494, 0.35424, 0.48830 ] + - [ -143.8571, 0.91898, 0.44192, 0.46784 ] + - [ -139.7143, 0.84406, 0.53379, 0.44803 ] + - [ -135.5714, 0.77483, 0.62793, 0.43697 ] + - [ -131.4286, 0.70790, 0.72238, 0.42591 ] + - [ -127.2857, 0.64116, 0.81520, 0.42150 ] + - [ -123.1429, 0.57335, 0.90444, 0.42058 ] + - [ -119.0000, 0.50388, 0.98826, 0.42024 ] + - [ -114.8571, 0.43261, 1.06493, 0.42168 ] + - [ -110.7143, 0.35981, 1.13285, 0.42312 ] + - [ -106.5714, 0.28603, 1.19061, 0.42258 ] + - [ -102.4286, 0.21209, 1.23704, 0.42163 ] + - [ -98.2857, 0.13899, 1.27116, 0.41864 ] + - [ -94.1429, 0.06787, 1.29229, 0.41277 ] + - [ -90.0000, 0.00000, 1.30000, 0.40690 ] + - [ -85.8571, -0.06787, 1.29229, 0.39426 ] + - [ -81.7143, -0.13899, 1.27116, 0.38162 ] + - [ -77.5714, -0.21209, 1.23704, 0.36676 ] + - [ -73.4286, -0.28603, 1.19061, 0.35033 ] + - [ -69.2857, -0.35981, 1.13285, 0.33362 ] + - [ -65.1429, -0.43261, 1.06493, 0.31561 ] + - [ -61.0000, -0.50388, 0.98826, 0.29759 ] + - [ -56.8571, -0.57335, 0.90444, 0.27989 ] + - [ -52.7143, -0.64116, 0.81520, 0.26230 ] + - [ -48.5714, -0.70790, 0.72238, 0.24491 ] + - [ -44.4286, -0.77483, 0.62793, 0.22794 ] + - [ -40.2857, -0.84406, 0.53379, 0.21097 ] + - [ -36.1429, -0.91898, 0.44192, 0.13525 ] + - [ -32.0000, -1.00494, 0.35424, 0.05517 ] + - [ -28.0000, -1.11306, 0.20494, 0.03211 ] + - [ -24.0000, -1.05425, 0.15434, 0.01268 ] + - [ -20.0000, -0.98247, 0.10967, -0.00282 ] + - [ -18.0000, -0.94173, 0.09249, -0.00741 ] + - [ -16.0000, -0.89333, 0.07597, -0.01107 ] + - [ -14.0000, -0.85472, 0.06054, -0.01250 ] + - [ -12.0000, -0.82348, 0.04641, -0.01177 ] + - [ -10.0000, -0.79541, 0.03441, -0.01082 ] + - [ -8.0000, -0.63650, 0.02548, -0.02769 ] + - [ -6.0000, -0.39095, 0.01994, -0.05107 ] + - [ -4.0000, -0.13071, 0.01653, -0.07148 ] + - [ -2.0000, 0.16173, 0.01507, -0.09179 ] + - [ -1.0000, 0.31121, 0.01477, -0.10119 ] + - [ 0.0000, 0.45956, 0.01465, -0.10988 ] + - [ 1.0000, 0.60566, 0.01466, -0.11776 ] + - [ 2.0000, 0.74868, 0.01481, -0.12477 ] + - [ 3.0000, 0.88862, 0.01507, -0.13098 ] + - [ 4.0000, 1.02544, 0.01544, -0.13648 ] + - [ 5.0000, 1.15878, 0.01593, -0.14130 ] + - [ 6.0000, 1.28822, 0.01654, -0.14540 ] + - [ 7.0000, 1.41282, 0.01731, -0.14875 ] + - [ 8.0000, 1.53090, 0.01831, -0.15118 ] + - [ 9.0000, 1.64065, 0.01963, -0.15262 ] + - [ 10.0000, 1.73926, 0.02150, -0.15310 ] + - [ 11.0000, 1.81971, 0.02445, -0.15254 ] + - [ 12.0000, 1.87065, 0.02966, -0.15121 ] + - [ 13.0000, 1.89221, 0.03770, -0.14969 ] + - [ 14.0000, 1.87910, 0.04824, -0.14562 ] + - [ 15.0000, 1.88111, 0.05838, -0.14358 ] + - [ 16.0000, 1.86359, 0.06992, -0.14095 ] + - [ 18.0000, 1.73324, 0.10166, -0.13711 ] + - [ 20.0000, 1.59357, 0.13916, -0.14082 ] + - [ 24.0000, 1.46708, 0.21002, -0.15693 ] + - [ 28.0000, 1.44834, 0.28200, -0.17979 ] + - [ 32.0000, 1.43563, 0.35424, -0.20147 ] + - [ 36.1429, 1.31283, 0.44192, -0.22409 ] + - [ 40.2857, 1.20580, 0.53379, -0.24619 ] + - [ 44.4286, 1.10690, 0.62793, -0.26133 ] + - [ 48.5714, 1.01129, 0.72238, -0.27648 ] + - [ 52.7143, 0.91594, 0.81520, -0.29062 ] + - [ 56.8571, 0.81907, 0.90444, -0.30424 ] + - [ 61.0000, 0.71982, 0.98826, -0.31787 ] + - [ 65.1429, 0.61801, 1.06493, -0.33154 ] + - [ 69.2857, 0.51401, 1.13285, -0.34522 ] + - [ 73.4286, 0.40862, 1.19061, -0.35846 ] + - [ 77.5714, 0.30299, 1.23704, -0.37161 ] + - [ 81.7143, 0.19855, 1.27116, -0.38405 ] + - [ 85.8571, 0.09695, 1.29229, -0.39547 ] + - [ 90.0000, 0.00000, 1.30000, -0.40690 ] + - [ 94.1429, -0.06787, 1.29229, -0.41277 ] + - [ 98.2857, -0.13899, 1.27116, -0.41864 ] + - [ 102.4286, -0.21209, 1.23704, -0.42163 ] + - [ 106.5714, -0.28603, 1.19061, -0.42258 ] + - [ 110.7143, -0.35981, 1.13285, -0.42312 ] + - [ 114.8571, -0.43261, 1.06493, -0.42168 ] + - [ 119.0000, -0.50388, 0.98826, -0.42024 ] + - [ 123.1429, -0.57335, 0.90444, -0.42058 ] + - [ 127.2857, -0.64116, 0.81520, -0.42150 ] + - [ 131.4286, -0.70790, 0.72238, -0.42591 ] + - [ 135.5714, -0.77483, 0.62793, -0.43697 ] + - [ 139.7143, -0.84406, 0.53379, -0.44803 ] + - [ 143.8571, -0.91898, 0.44192, -0.46784 ] + - [ 148.0000, -1.00494, 0.35424, -0.48830 ] + - [ 150.2857, -0.93316, 0.30832, -0.49600 ] + - [ 152.5714, -0.86138, 0.26453, -0.47857 ] + - [ 154.8571, -0.78960, 0.22313, -0.46114 ] + - [ 157.1429, -0.71781, 0.18439, -0.44370 ] + - [ 159.4286, -0.64603, 0.14856, -0.42627 ] + - [ 161.7143, -0.57425, 0.11586, -0.43530 ] + - [ 164.0000, -0.50247, 0.08651, -0.45315 ] + - [ 166.2857, -0.43069, 0.06068, -0.47100 ] + - [ 168.5714, -0.35891, 0.05174, -0.48884 ] + - [ 170.8571, -0.28713, 0.04653, -0.45714 ] + - [ 173.1429, -0.21534, 0.04245, -0.34286 ] + - [ 175.4286, -0.14356, 0.03951, -0.22857 ] + - [ 177.7143, -0.07178, 0.03774, -0.11429 ] + - [ 179.9087, 0.00000, 0.03715, 0.00000 ] + + + + pitch_control: + GS_Angles: [0.06019804, 0.08713416, 0.10844806, 0.12685912, 0.14339822, 0.1586021 , 0.17279614, 0.18618935, 0.19892772, 0.21111989, 0.22285021, 0.23417256, 0.2451469 , 0.25580691, 0.26619545, 0.27632495, 0.28623134, 0.29593266, 0.30544521, 0.314779 , 0.32395154, 0.33297489, 0.3418577 , 0.35060844, 0.35923641, 0.36774807, 0.37614942, 0.38444655, 0.39264363, 0.40074407] + GS_Kp: [-0.9394215 , -0.80602855, -0.69555026, -0.60254912, -0.52318192, -0.45465531, -0.39489024, -0.34230736, -0.29568537, -0.25406506, -0.2166825 , -0.18292183, -0.15228099, -0.12434663, -0.09877533, -0.0752794 , -0.05361604, -0.0335789 , -0.01499149, 0.00229803, 0.01842102, 0.03349169, 0.0476098 , 0.0608629 , 0.07332812, 0.0850737 , 0.0961602 , 0.10664158, 0.11656607, 0.12597691] + GS_Ki: [-0.07416547, -0.06719673, -0.0614251 , -0.05656651, -0.0524202 , -0.04884022, -0.04571796, -0.04297091, -0.04053528, -0.03836094, -0.03640799, -0.03464426, -0.03304352, -0.03158417, -0.03024826, -0.02902079, -0.02788904, -0.02684226, -0.02587121, -0.02496797, -0.02412567, -0.02333834, -0.02260078, -0.02190841, -0.0212572 , -0.02064359, -0.0200644 , -0.01951683, -0.01899836, -0.01850671] + Fl_Kp: -9.35 + wt_ops: + v: [0, 1, 2, 4] + pitch_op: [-0.25, -0.25, -0.25, 45] + omega_op: [ 1, 3, 6, 6] + gear_ratio: 1 + torque_control: + VS_KP: -38609162.66552 + VS_KI: -4588245.18720 + + + tower: # (could remove some entries that don't apply for the tower) + dlsMax : 5.0 # maximum node splitting section amount; can't be 0 + + name : tower # [-] an identifier (no longer has to be number) + type : 1 # [-] + rA : [ 0, 0, -2.5] # [m] end A coordinates + rB : [ 0, 0, -33.5] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + + # --- outer shell including hydro--- + stations : [ -2.5, -31, -33.5 ] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : [ 1.25, 1.25, .25 ] # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : [ 0.03, 0.03, 0.03 ] # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 1.1 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 1.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + # (neglecting axial coefficients for now) + CdEnd : 1.1 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] material density + + +platform: + + potModMaster : 1 # [int] master switch for potMod variables; 0=keeps all member potMod vars the same, 1=turns all potMod vars to False (no HAMS), 2=turns all potMod vars to True (no strip) + dlsMax : 2.0 # maximum node splitting section amount for platform members; can't be 0 + + members: # list all members here + + - name : upper_column # [-] an identifier (no longer has to be number) + type : 2 # [-] + rA : [ 0, 0, -2.5] # [m] end A coordinates + rB : [ 0, 0, 9] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + # --- outer shell including hydro--- + stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 2.0 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.03 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 1.1 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 1.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 1.1 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + # --- handling of end caps or any internal structures if we need them --- + cap_stations : [ 0 ] # [m] location along member of any inner structures (in same scaling as set by 'stations') + cap_t : [ 0.001 ] # [m] thickness of any internal structures + cap_d_in : [ 0 ] # [m] inner diameter of internal structures (0 for full cap/bulkhead, >0 for a ring shape) + + + - name : mooring_fins # [-] an identifier (no longer has to be number) + type : 2 # [-] + rA : [ 0, 10, -2.15] # [m] end A coordinates + rB : [ 0, -10, -2.15] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + # --- outer shell including hydro--- + stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : .5 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.03 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 1.1 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 1.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 1.1 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + # --- handling of end caps or any internal structures if we need them --- + cap_stations : [ 0, 1 ] # [m] location along member of any inner structures (in same scaling as set by 'stations') + cap_t : [ 0.001, 0.001 ] # [m] thickness of any internal structures + cap_d_in : [ 0, 0 ] # [m] inner diameter of internal structures (0 for full cap/bulkhead, >0 for a ring shape) + + +mooring: + water_depth: 60 # [m] uniform water depth + + points: + - name: back_anchor + type: fixed + location: [-200, 0.0, -60.0] + anchor_type: drag_embedment + + - name: back_anchor_L + type: fixed + location: [-201, -50.0, -60.0] + anchor_type: drag_embedment + + - name: back_anchor_R + type: fixed + location: [-201, 50.0, -60.0] + anchor_type: drag_embedment + + - name: front_anchor + type: fixed + location: [200, 0.0, -60.0] + anchor_type: drag_embedment + + - name: front_anchor_L + type: fixed + location: [200, -50.0, -60.0] + anchor_type: drag_embedment + + - name: front_anchor_R + type: fixed + location: [200, 50.0, -60.0] + anchor_type: drag_embedment + + - name: keel_vessel + type: vessel + location: [0.0, 0.0, -33.5] + + - name: fin_-y_vessel + type: vessel + location: [0.0, -10.0, -2.15] + + - name: fin_+y_vessel + type: vessel + location: [0.0, 10.0, -2.15] + + + lines: + - name: line1 + endA: back_anchor + endB: keel_vessel + type: chain + length: 205 + + - name: line2 + endA: front_anchor + endB: keel_vessel + type: chain + length: 205 + + - name: line3 + endA: back_anchor_L + endB: fin_-y_vessel + type: chain + length: 220 + + - name: line4 + endA: back_anchor_R + endB: fin_+y_vessel + type: chain + length: 220 + + - name: line5 + endA: front_anchor_L + endB: fin_-y_vessel + type: chain + length: 220 + + - name: line6 + endA: front_anchor_R + endB: fin_+y_vessel + type: chain + length: 220 + + + line_types: + - name: chain + diameter: 0.185 + mass_density: 40.0 + stiffness: 3270e6 + breaking_load: 1e8 + cost: 100.0 + transverse_added_mass: 1.0 + tangential_added_mass: 0.0 + transverse_drag: 1.6 + tangential_drag: 0.1 + + anchor_types: + - name: drag_embedment + mass: 1e3 + cost: 1e4 + max_vertical_load: 0.0 + max_lateral_load: 1e5 + \ No newline at end of file diff --git a/RAFT/designs/RM1_Floating.yaml b/RAFT/designs/RM1_Floating.yaml new file mode 100644 index 000000000..123025dd3 --- /dev/null +++ b/RAFT/designs/RM1_Floating.yaml @@ -0,0 +1,1152 @@ +type: input file for RAFT +name: RM1 Floating Model from OpenFAST/r-test/glue-codes/openfast/MHK_RM1_Floating (as of 6/8/2023) +comments: + + +settings: # global Settings + min_freq : 0.001 # [Hz] lowest frequency to consider, also the frequency bin width + max_freq : 0.40 # [Hz] highest frequency to consider + XiStart : 0 # sets initial amplitude of each DOF for all frequencies + nIter : 4 # sets how many iterations to perform in Model.solveDynamics() + +site: + water_depth : 50 # [m] uniform water depth + rho_water : 1025.0 # [kg/m^3] water density + rho_air : 1.225 # [kg/m^3] air density + mu_air : 1.81e-05 # [kg/ms] air dynamic viscosity + shearExp_air : 0.12 # [-] shear exponent of air + mu_water : 1.07e-03 # [kg/ms] water dynamic viscosity + shearExp_water : 0.1429 # [-] shear exponent of water + +cases: + + keys : [wind_speed, wind_heading, turbulence, turbine_status, turbine_heading, wave_spectrum, wave_period, wave_height, wave_heading, current_speed, current_heading, current_turbulence ] + data : # m/s deg % or e.g. IIB_NTM string deg string (s) (m) (deg) (m/s) (deg) % or e.g. IIB_NTM + - [ 0.0, 0, 0, parked, 0, JONSWAP, 8.0, 2.0, 0, 1.9, 0, 0 ] + + +turbine: + + nrotors : 1 # [-] number of turbines in the FOWT + rotorCoords : [[0, 0]] # [m, m] x-y coordinates of rotor in space + speed_gain : 1.1 # [-] multiplier on inflow velocity due to flow confinement + + mRNA : 52755.716 # [kg] RNA mass + IxRNA : 232552.25 # [kg-m2] RNA moment of inertia about local x axis (assumed to be identical to rotor axis for now, as approx) [kg-m^2] + IrRNA : 244643.0 # [kg-m2] RNA moment of inertia about local y or z axes [kg-m^2] + xCG_RNA : 0.412 # [m] x location of RNA center of mass [m from centerline, positive downwind] + hHub : -25.2 # [m] hub height above water line [m], Maybe try to put it underwater??? + Fthrust : 0.0 # [N] temporary thrust force to use + + I_drivetrain: 0.0 # full rotor + drivetrain inertia as felt on the high-speed shaft + + nBlades : 2 # [-] number of blades + Zhub : -25.2 # [m] hub height [m] + Rhub : 1.0 # [m] hub radius [m] + precone : 0.0 # [deg] + shaft_tilt : 0.0 # [deg] + overhang : 4.91 # [m] + aeroMod : 0 # [-] 0 aerodynamics off; 1 aerodynamics on + + + blade: + precurveTip : 0.0 # + presweepTip : 0.0 # + Rtip : 10.0 # rotor radius + + # r chord theta precurve presweep + geometry: + - [ 1.000, 0.800, 12.86, 0.00, 0.00 ] + - [ 1.150, 0.800, 12.86, 0.00, 0.00 ] + - [ 1.450, 0.894, 12.86, 0.00, 0.00 ] + - [ 1.750, 1.118, 12.86, 0.00, 0.00 ] + - [ 2.050, 1.386, 12.86, 0.00, 0.00 ] + - [ 2.350, 1.610, 12.86, 0.00, 0.00 ] + - [ 2.650, 1.704, 12.86, 0.00, 0.00 ] + - [ 2.950, 1.662, 11.54, 0.00, 0.00 ] + - [ 3.250, 1.619, 10.44, 0.00, 0.00 ] + - [ 3.550, 1.577, 9.50 , 0.00, 0.00 ] + - [ 3.850, 1.534, 8.71 , 0.00, 0.00 ] + - [ 4.150, 1.492, 8.02 , 0.00, 0.00 ] + - [ 4.450, 1.450, 7.43 , 0.00, 0.00 ] + - [ 4.750, 1.407, 6.91 , 0.00, 0.00 ] + - [ 5.050, 1.365, 6.45 , 0.00, 0.00 ] + - [ 5.350, 1.322, 6.04 , 0.00, 0.00 ] + - [ 5.650, 1.279, 5.68 , 0.00, 0.00 ] + - [ 5.950, 1.235, 5.35 , 0.00, 0.00 ] + - [ 6.250, 1.192, 5.05 , 0.00, 0.00 ] + - [ 6.550, 1.148, 4.77 , 0.00, 0.00 ] + - [ 6.850, 1.103, 4.51 , 0.00, 0.00 ] + - [ 7.150, 1.058, 4.26 , 0.00, 0.00 ] + - [ 7.450, 1.012, 4.03 , 0.00, 0.00 ] + - [ 7.750, 0.966, 3.80 , 0.00, 0.00 ] + - [ 8.050, 0.920, 3.57 , 0.00, 0.00 ] + - [ 8.350, 0.872, 3.35 , 0.00, 0.00 ] + - [ 8.650, 0.824, 3.13 , 0.00, 0.00 ] + - [ 8.950, 0.776, 2.90 , 0.00, 0.00 ] + - [ 9.250, 0.726, 2.67 , 0.00, 0.00 ] + - [ 9.550, 0.676, 2.43 , 0.00, 0.00 ] + - [ 9.850, 0.626, 2.18 , 0.00, 0.00 ] + - [ 10.00, 0.626, 2.18 , 0.00, 0.00 ] + + # station(rel) airfoil name + airfoils: + - [0.0 , S1 ] + - [0.01666667, S1 ] + - [0.05 , S2 ] + - [0.08333333, S3 ] + - [0.11666667, S4 ] + - [0.15 , S5 ] + - [0.18333333, S6 ] + - [0.21666667, S7 ] + - [0.25 , S8 ] + - [0.28333333, S9 ] + - [0.31666667, S9 ] + - [0.35 , S9 ] + - [0.38333333, S9 ] + - [0.41666667, S9 ] + - [0.45 , S9 ] + - [0.48333333, S9 ] + - [0.51666667, S9 ] + - [0.55 , S9 ] + - [0.58333333, S9 ] + - [0.61666667, S9 ] + - [0.65 , S9 ] + - [0.68333333, S9 ] + - [0.71666667, S9 ] + - [0.75 , S9 ] + - [0.78333333, S9 ] + - [0.81666667, S9 ] + - [0.85 , S9 ] + - [0.88333333, S9 ] + - [0.91666667, S9 ] + - [0.95 , S9 ] + - [0.98333333, S9 ] + - [1.0 , S9 ] + + + airfoils: + - name : S1 # NACA6_1000 + relative_thickness : 0.9956 # + added_mass_coeff : [0.7, 0.7] # [flapwise, edgewise] + data: # alpha c_l c_d c_m cp_min + - [ -180.00, 0.0, 0.7, 0.0, -3.0 ] + - [ 0.00, 0.0, 0.7, 0.0, -3.0 ] + - [ 180.00, 0.0, 0.7, 0.0, -3.0 ] + - name : S2 # NACA6_0864 + relative_thickness : 0.8572 # + added_mass_coeff : [0.7, 0.7] # [flapwise, edgewise] + data: # alpha c_l c_d c_m cp_min + - [ -180.000, 0.0000, 0.5765, 0.0, -2.6421] + - [ -170.000, 0.0727, 0.5765, 0.0, -2.6421] + - [ -160.000, 0.1455, 0.5865, 0.0, -2.6421] + - [ -150.000, 0.1715, 0.6174, 0.0, -2.6421] + - [ -140.000, 0.1402, 0.6554, 0.0, -2.6421] + - [ -130.000, 0.1144, 0.6961, 0.0, -2.6421] + - [ -120.000, 0.0878, 0.7348, 0.0, -2.6421] + - [ -110.000, 0.0589, 0.7670, 0.0, -2.6421] + - [ -100.000, 0.0289, 0.7890, 0.0, -2.6421] + - [ -90.000, 0.0000, 0.7984, 0.0, -2.6421] + - [ -80.000, -0.0289, 0.7890, 0.0, -2.6421] + - [ -70.000, -0.0589, 0.7670, 0.0, -2.6421] + - [ -60.000, -0.0878, 0.7348, 0.0, -2.6421] + - [ -50.000, -0.1144, 0.6961, 0.0, -2.6421] + - [ -40.000, -0.1402, 0.6554, 0.0, -2.6421] + - [ -30.000, -0.1715, 0.6174, 0.0, -2.6421] + - [ -20.000, -0.1503, 0.5939, 0.0, -2.6421] + - [ -10.000, -0.1223, 0.5772, 0.0, -2.9191] + - [ -9.000, -0.1172, 0.5767, 0.0, -2.8738] + - [ -8.000, -0.1072, 0.5765, 0.0, -2.8237] + - [ -5.000, -0.0498, 0.5762, 0.0, -2.6788] + - [ -4.000, -0.0287, 0.5761, 0.0, -2.6447] + - [ -3.000, -0.0071, 0.5760, 0.0, -2.6217] + - [ -2.000, 0.0146, 0.5759, 0.0, -2.6265] + - [ -1.000, 0.0366, 0.5758, 0.0, -2.6418] + - [ 0.000, 0.0588, 0.5758, 0.0, -2.6582] + - [ 1.000, 0.0806, 0.5758, 0.0, -2.6747] + - [ 2.000, 0.1019, 0.5758, 0.0, -2.6912] + - [ 3.000, 0.1229, 0.5759, 0.0, -2.7082] + - [ 4.000, 0.1424, 0.5761, 0.0, -2.7238] + - [ 6.000, 0.1765, 0.5764, 0.0, -2.7594] + - [ 7.000, 0.1903, 0.5765, 0.0, -2.7828] + - [ 8.000, 0.2007, 0.5767, 0.0, -2.8120] + - [ 9.000, 0.2064, 0.5772, 0.0, -2.8389] + - [ 11.000, 0.2172, 0.5785, 0.0, -2.8998] + - [ 12.000, 0.2241, 0.5793, 0.0, -2.9500] + - [ 13.000, 0.2312, 0.5802, 0.0, -3.0035] + - [ 15.000, 0.2438, 0.5823, 0.0, -3.1186] + - [ 16.000, 0.2491, 0.5836, 0.0, -3.1799] + - [ 17.000, 0.2546, 0.5849, 0.0, -3.2469] + - [ 18.000, 0.2582, 0.5865, 0.0, -3.3095] + - [ 19.000, 0.2624, 0.5882, 0.0, -3.3777] + - [ 20.000, 0.2652, 0.5901, 0.0, -3.4441] + - [ 22.000, 0.2683, 0.5945, 0.0, -3.5738] + - [ 25.000, 0.2704, 0.6015, 0.0, -3.7758] + - [ 26.000, 0.2702, 0.6039, 0.0, -3.8370] + - [ 30.000, 0.2450, 0.6174, 0.0, -3.5690] + - [ 40.000, 0.2003, 0.6554, 0.0, -2.6421] + - [ 50.000, 0.1634, 0.6961, 0.0, -2.6421] + - [ 60.000, 0.1254, 0.7348, 0.0, -2.6421] + - [ 70.000, 0.0842, 0.7670, 0.0, -2.6421] + - [ 80.000, 0.0413, 0.7890, 0.0, -2.6421] + - [ 90.000, 0.0000, 0.7984, 0.0, -2.6421] + - [ 100.000, -0.0289, 0.7890, 0.0, -2.6421] + - [ 110.000, -0.0589, 0.7670, 0.0, -2.6421] + - [ 120.000, -0.0878, 0.7348, 0.0, -2.6421] + - [ 130.000, -0.1144, 0.6961, 0.0, -2.6421] + - [ 140.000, -0.1402, 0.6554, 0.0, -2.6421] + - [ 150.000, -0.1715, 0.6174, 0.0, -2.6421] + - [ 160.000, -0.1455, 0.5865, 0.0, -2.6421] + - [ 170.000, -0.0727, 0.5765, 0.0, -2.6421] + - [ 180.000, 0.0000, 0.5765, 0.0, -2.6421] + - name : S3 # NACA6_0629 + relative_thickness : 0.6118 # + added_mass_coeff : [0.7, 0.7] # [flapwise, edgewise] + data: # alpha c_l c_d c_m cp_min + - [ -180.000, 0.0000, 0.3632, 0.0, -2.0237 ] + - [ -170.000, 0.1984, 0.3632, 0.0, -2.0237 ] + - [ -160.000, 0.3969, 0.3903, 0.0, -2.0237 ] + - [ -150.000, 0.4679, 0.4746, 0.0, -2.0237 ] + - [ -140.000, 0.3825, 0.5784, 0.0, -2.0237 ] + - [ -130.000, 0.3121, 0.6895, 0.0, -2.0237 ] + - [ -120.000, 0.2394, 0.7950, 0.0, -2.0237 ] + - [ -110.000, 0.1608, 0.8828, 0.0, -2.0237 ] + - [ -100.000, 0.0788, 0.9428, 0.0, -2.0237 ] + - [ -90.000, 0.0000, 0.9685, 0.0, -2.0237 ] + - [ -80.000, -0.0788, 0.9428, 0.0, -2.0237 ] + - [ -70.000, -0.1608, 0.8828, 0.0, -2.0237 ] + - [ -60.000, -0.2394, 0.7950, 0.0, -2.0237 ] + - [ -50.000, -0.3121, 0.6895, 0.0, -2.0237 ] + - [ -40.000, -0.3825, 0.5784, 0.0, -2.0237 ] + - [ -30.000, -0.4679, 0.4746, 0.0, -2.0237 ] + - [ -20.000, -0.4101, 0.4105, 0.0, -2.0237 ] + - [ -10.000, -0.3337, 0.3649, 0.0, -2.7794 ] + - [ -9.000, -0.3198, 0.3637, 0.0, -2.6556 ] + - [ -8.000, -0.2924, 0.3632, 0.0, -2.5191 ] + - [ -5.000, -0.1360, 0.3621, 0.0, -2.1238 ] + - [ -4.000, -0.0783, 0.3619, 0.0, -2.0308 ] + - [ -3.000, -0.0193, 0.3617, 0.0, -1.9679 ] + - [ -2.000, 0.0398, 0.3614, 0.0, -1.9812 ] + - [ -1.000, 0.0999, 0.3612, 0.0, -2.0228 ] + - [ 0.000, 0.1605, 0.3612, 0.0, -2.0675 ] + - [ 1.000, 0.2199, 0.3612, 0.0, -2.1125 ] + - [ 2.000, 0.2781, 0.3613, 0.0, -2.1575 ] + - [ 3.000, 0.3353, 0.3615, 0.0, -2.2039 ] + - [ 4.000, 0.3885, 0.3619, 0.0, -2.2464 ] + - [ 6.000, 0.4815, 0.3629, 0.0, -2.3438 ] + - [ 7.000, 0.5192, 0.3632, 0.0, -2.4075 ] + - [ 8.000, 0.5476, 0.3638, 0.0, -2.4872 ] + - [ 9.000, 0.5629, 0.3650, 0.0, -2.5606 ] + - [ 11.000, 0.5926, 0.3687, 0.0, -2.7266 ] + - [ 12.000, 0.6113, 0.3708, 0.0, -2.8637 ] + - [ 13.000, 0.6308, 0.3731, 0.0, -3.0095 ] + - [ 15.000, 0.6651, 0.3789, 0.0, -3.3236 ] + - [ 16.000, 0.6796, 0.3824, 0.0, -3.4907 ] + - [ 17.000, 0.6944, 0.3861, 0.0, -3.6734 ] + - [ 18.000, 0.7045, 0.3905, 0.0, -3.8443 ] + - [ 19.000, 0.7158, 0.3950, 0.0, -4.0304 ] + - [ 20.000, 0.7234, 0.4003, 0.0, -4.2115 ] + - [ 22.000, 0.7319, 0.4121, 0.0, -4.5653 ] + - [ 25.000, 0.7378, 0.4313, 0.0, -5.1162 ] + - [ 26.000, 0.7370, 0.4379, 0.0, -5.2833 ] + - [ 30.000, 0.6684, 0.4746, 0.0, -4.5522 ] + - [ 40.000, 0.5465, 0.5784, 0.0, -2.0237 ] + - [ 50.000, 0.4458, 0.6895, 0.0, -2.0237 ] + - [ 60.000, 0.3420, 0.7950, 0.0, -2.0237 ] + - [ 70.000, 0.2297, 0.8828, 0.0, -2.0237 ] + - [ 80.000, 0.1126, 0.9428, 0.0, -2.0237 ] + - [ 90.000, 0.0000, 0.9685, 0.0, -2.0237 ] + - [ 100.000, -0.0788, 0.9428, 0.0, -2.0237 ] + - [ 110.000, -0.1608, 0.8828, 0.0, -2.0237 ] + - [ 120.000, -0.2394, 0.7950, 0.0, -2.0237 ] + - [ 130.000, -0.3121, 0.6895, 0.0, -2.0237 ] + - [ 140.000, -0.3825, 0.5784, 0.0, -2.0237 ] + - [ 150.000, -0.4679, 0.4746, 0.0, -2.0237 ] + - [ 160.000, -0.3969, 0.3903, 0.0, -2.0237 ] + - [ 170.000, -0.1984, 0.3632, 0.0, -2.0237 ] + - [ 180.000, 0.0000, 0.3632, 0.0, -2.0237 ] + - name : S4 # NACA6_0444 + relative_thickness : 0.4145 # + added_mass_coeff : [0.7, 0.7] # [flapwise, edgewise] + data: # alpha c_l c_d c_m cp_min + - [ -180.000, 0.0000, 0.1952, 0.0, -1.5368 ] + - [ -170.000, 0.2974, 0.1952, 0.0, -1.5368 ] + - [ -160.000, 0.5948, 0.2359, 0.0, -1.5368 ] + - [ -150.000, 0.7012, 0.3622, 0.0, -1.5368 ] + - [ -140.000, 0.5733, 0.5177, 0.0, -1.5368 ] + - [ -130.000, 0.4677, 0.6842, 0.0, -1.5368 ] + - [ -120.000, 0.3588, 0.8424, 0.0, -1.5368 ] + - [ -110.000, 0.2409, 0.9739, 0.0, -1.5368 ] + - [ -100.000, 0.1181, 1.0639, 0.0, -1.5368 ] + - [ -90.000, 0.0000, 1.1024, 0.0, -1.5368 ] + - [ -80.000,-0.1181, 1.0639, 0.0, -1.5368 ] + - [ -70.000,-0.2409, 0.9739, 0.0, -1.5368 ] + - [ -60.000,-0.3588, 0.8424, 0.0, -1.5368 ] + - [ -50.000,-0.4677, 0.6842, 0.0, -1.5368 ] + - [ -40.000,-0.5733, 0.5177, 0.0, -1.5368 ] + - [ -30.000,-0.7012, 0.3622, 0.0, -1.5368 ] + - [ -20.000,-0.6145, 0.2662, 0.0, -1.5368 ] + - [ -10.000,-0.5000, 0.1978, 0.0, -2.6694 ] + - [ -9.000,-0.4793, 0.1959, 0.0, -2.4839 ] + - [ -8.000,-0.4382, 0.1952, 0.0, -2.2793 ] + - [ -5.000,-0.2037, 0.1937, 0.0, -1.6869 ] + - [ -4.000,-0.1174, 0.1933, 0.0, -1.5475 ] + - [ -3.000,-0.0290, 0.1930, 0.0, -1.4533 ] + - [ -2.000, 0.0596, 0.1926, 0.0, -1.4732 ] + - [ -1.000, 0.1497, 0.1923, 0.0, -1.5355 ] + - [ 0.000, 0.2405, 0.1922, 0.0, -1.6025 ] + - [ 1.000, 0.3296, 0.1922, 0.0, -1.6699 ] + - [ 2.000, 0.4167, 0.1924, 0.0, -1.7374 ] + - [ 3.000, 0.5025, 0.1927, 0.0, -1.8069 ] + - [ 4.000, 0.5822, 0.1933, 0.0, -1.8707 ] + - [ 6.000, 0.7216, 0.1948, 0.0, -2.0165 ] + - [ 7.000, 0.7781, 0.1953, 0.0, -2.1120 ] + - [ 8.000, 0.8206, 0.1961, 0.0, -2.2315 ] + - [ 9.000, 0.8437, 0.1979, 0.0, -2.3414 ] + - [ 11.000, 0.8881, 0.2035, 0.0, -2.5902 ] + - [ 12.000, 0.9161, 0.2066, 0.0, -2.7957 ] + - [ 13.000, 0.9453, 0.2101, 0.0, -3.0142 ] + - [ 15.000, 0.9967, 0.2188, 0.0, -3.4850 ] + - [ 16.000, 1.0185, 0.2240, 0.0, -3.7355 ] + - [ 17.000, 1.0407, 0.2296, 0.0, -4.0092 ] + - [ 18.000, 1.0557, 0.2362, 0.0, -4.2653 ] + - [ 19.000, 1.0727, 0.2430, 0.0, -4.5442 ] + - [ 20.000, 1.0841, 0.2508, 0.0, -4.8156 ] + - [ 22.000, 1.0969, 0.2686, 0.0, -5.3459 ] + - [ 25.000, 1.1056, 0.2973, 0.0, -6.1715 ] + - [ 26.000, 1.1045, 0.3072, 0.0, -6.4219 ] + - [ 30.000, 1.0018, 0.3622, 0.0, -5.3262 ] + - [ 40.000, 0.8190, 0.5177, 0.0, -1.5368 ] + - [ 50.000, 0.6682, 0.6842, 0.0, -1.5368 ] + - [ 60.000, 0.5125, 0.8424, 0.0, -1.5368 ] + - [ 70.000, 0.3442, 0.9739, 0.0, -1.5368 ] + - [ 80.000, 0.1688, 1.0639, 0.0, -1.5368 ] + - [ 90.000, 0.0000, 1.1024, 0.0, -1.5368 ] + - [ 100.000,-0.1181, 1.0639, 0.0, -1.5368 ] + - [ 110.000,-0.2409, 0.9739, 0.0, -1.5368 ] + - [ 120.000,-0.3588, 0.8424, 0.0, -1.5368 ] + - [ 130.000,-0.4677, 0.6842, 0.0, -1.5368 ] + - [ 140.000,-0.5733, 0.5177, 0.0, -1.5368 ] + - [ 150.000,-0.7012, 0.3622, 0.0, -1.5368 ] + - [ 160.000,-0.5948, 0.2359, 0.0, -1.5368 ] + - [ 170.000,-0.2974, 0.1952, 0.0, -1.5368 ] + - [ 180.000, 0.0000, 0.1952, 0.0, -1.5368 ] + - name : S5 # NACA6_0329 + relative_thickness : 0.2873 # + added_mass_coeff : [0.7, 0.7] # [flapwise, edgewise] + data: # alpha c_l c_d c_m cp_min + - [ -180.000, 0.0000, 0.0908, 0.0, -1.2342 ] + - [ -170.000, 0.3589, 0.0908, 0.0, -1.2342 ] + - [ -160.000, 0.7178, 0.1399, 0.0, -1.2342 ] + - [ -150.000, 0.8463, 0.2923, 0.0, -1.2342 ] + - [ -140.000, 0.6918, 0.4800, 0.0, -1.2342 ] + - [ -130.000, 0.5644, 0.6809, 0.0, -1.2342 ] + - [ -120.000, 0.4330, 0.8718, 0.0, -1.2342 ] + - [ -110.000, 0.2907, 1.0306, 0.0, -1.2342 ] + - [ -100.000, 0.1426, 1.1392, 0.0, -1.2342 ] + - [ -90.000, 0.0000, 1.1856, 0.0, -1.2342 ] + - [ -80.000,-0.1426, 1.1392, 0.0, -1.2342 ] + - [ -70.000,-0.2907, 1.0306, 0.0, -1.2342 ] + - [ -60.000,-0.4330, 0.8718, 0.0, -1.2342 ] + - [ -50.000,-0.5644, 0.6809, 0.0, -1.2342 ] + - [ -40.000,-0.6918, 0.4800, 0.0, -1.2342 ] + - [ -30.000,-0.8463, 0.2923, 0.0, -1.2342 ] + - [ -20.000,-0.7416, 0.1764, 0.0, -1.2342 ] + - [ -10.000,-0.6035, 0.0940, 0.0, -2.6010 ] + - [ -9.000,-0.5784, 0.0917, 0.0, -2.3771 ] + - [ -8.000,-0.5289, 0.0908, 0.0, -2.1303 ] + - [ -5.000,-0.2459, 0.0889, 0.0, -1.4153 ] + - [ -4.000,-0.1417, 0.0885, 0.0, -1.2471 ] + - [ -3.000,-0.0350, 0.0882, 0.0, -1.1334 ] + - [ -2.000, 0.0720, 0.0876, 0.0, -1.1574 ] + - [ -1.000, 0.1806, 0.0873, 0.0, -1.2325 ] + - [ 0.000, 0.2903, 0.0872, 0.0, -1.3135 ] + - [ 1.000, 0.3977, 0.0872, 0.0, -1.3948 ] + - [ 2.000, 0.5029, 0.0874, 0.0, -1.4763 ] + - [ 3.000, 0.6065, 0.0878, 0.0, -1.5602 ] + - [ 4.000, 0.7026, 0.0885, 0.0, -1.6371 ] + - [ 6.000, 0.8709, 0.0903, 0.0, -1.8131 ] + - [ 7.000, 0.9390, 0.0909, 0.0, -1.9283 ] + - [ 8.000, 0.9903, 0.0919, 0.0, -2.0725 ] + - [ 9.000, 1.0182, 0.0941, 0.0, -2.2052 ] + - [ 11.000, 1.0718, 0.1008, 0.0, -2.5055 ] + - [ 12.000, 1.1056, 0.1046, 0.0, -2.7534 ] + - [ 13.000, 1.1409, 0.1088, 0.0, -3.0171 ] + - [ 15.000, 1.2029, 0.1193, 0.0, -3.5854 ] + - [ 16.000, 1.2292, 0.1256, 0.0, -3.8876 ] + - [ 17.000, 1.2559, 0.1323, 0.0, -4.2180 ] + - [ 18.000, 1.2741, 0.1402, 0.0, -4.5271 ] + - [ 19.000, 1.2946, 0.1485, 0.0, -4.8636 ] + - [ 20.000, 1.3084, 0.1579, 0.0, -5.1912 ] + - [ 22.000, 1.3238, 0.1794, 0.0, -5.8311 ] + - [ 25.000, 1.3343, 0.2140, 0.0, -6.8274 ] + - [ 26.000, 1.3330, 0.2260, 0.0, -7.1297 ] + - [ 30.000, 1.2089, 0.2923, 0.0, -5.8073 ] + - [ 40.000, 0.9884, 0.4800, 0.0, -1.2342 ] + - [ 50.000, 0.8063, 0.6809, 0.0, -1.2342 ] + - [ 60.000, 0.6186, 0.8718, 0.0, -1.2342 ] + - [ 70.000, 0.4154, 1.0306, 0.0, -1.2342 ] + - [ 80.000, 0.2037, 1.1392, 0.0, -1.2342 ] + - [ 90.000, 0.0000, 1.1856, 0.0, -1.2342 ] + - [ 100.000,-0.1426, 1.1392, 0.0, -1.2342 ] + - [ 110.000,-0.2907, 1.0306, 0.0, -1.2342 ] + - [ 120.000,-0.4330, 0.8718, 0.0, -1.2342 ] + - [ 130.000,-0.5644, 0.6809, 0.0, -1.2342 ] + - [ 140.000,-0.6918, 0.4800, 0.0, -1.2342 ] + - [ 150.000,-0.8463, 0.2923, 0.0, -1.2342 ] + - [ 160.000,-0.7178, 0.1399, 0.0, -1.2342 ] + - [ 170.000,-0.3589, 0.0908, 0.0, -1.2342 ] + - [ 180.000, 0.0000, 0.0908, 0.0, -1.2342 ] + - name : S6 # NACA6_0276 + relative_thickness : 0.2287 # + added_mass_coeff : [0.7, 0.7] # [flapwise, edgewise] + data: # alpha c_l c_d c_m cp_min + - [ -180.000, 0.0000, 0.0427, 0.0, -1.0947 ] + - [ -170.000, 0.3872, 0.0427, 0.0, -1.0947 ] + - [ -160.000, 0.7745, 0.0957, 0.0, -1.0947 ] + - [ -150.000, 0.9131, 0.2601, 0.0, -1.0947 ] + - [ -140.000, 0.7465, 0.4626, 0.0, -1.0947 ] + - [ -130.000, 0.6090, 0.6794, 0.0, -1.0947 ] + - [ -120.000, 0.4672, 0.8854, 0.0, -1.0947 ] + - [ -110.000, 0.3137, 1.0567, 0.0, -1.0947 ] + - [ -100.000, 0.1539, 1.1738, 0.0, -1.0947 ] + - [ -90.000, 0.0000, 1.2239, 0.0, -1.0947 ] + - [ -80.000,-0.1539, 1.1738, 0.0, -1.0947 ] + - [ -70.000,-0.3137, 1.0567, 0.0, -1.0947 ] + - [ -60.000,-0.4672, 0.8854, 0.0, -1.0947 ] + - [ -50.000,-0.6090, 0.6794, 0.0, -1.0947 ] + - [ -40.000,-0.7465, 0.4626, 0.0, -1.0947 ] + - [ -30.000,-0.9131, 0.2601, 0.0, -1.0947 ] + - [ -20.000,-0.8002, 0.1351, 0.0, -1.0947 ] + - [ -10.000,-0.6511, 0.0461, 0.0, -2.5695 ] + - [ -9.000,-0.6241, 0.0436, 0.0, -2.3279 ] + - [ -8.000,-0.5706, 0.0427, 0.0, -2.0616 ] + - [ -5.000,-0.2653, 0.0407, 0.0, -1.2901 ] + - [ -4.000,-0.1529, 0.0402, 0.0, -1.1086 ] + - [ -3.000,-0.0377, 0.0398, 0.0, -0.9859 ] + - [ -2.000, 0.0776, 0.0393, 0.0, -1.0119 ] + - [ -1.000, 0.1949, 0.0389, 0.0, -1.0929 ] + - [ 0.000, 0.3132, 0.0388, 0.0, -1.1803 ] + - [ 1.000, 0.4292, 0.0388, 0.0, -1.2680 ] + - [ 2.000, 0.5426, 0.0391, 0.0, -1.3559 ] + - [ 3.000, 0.6544, 0.0394, 0.0, -1.4464 ] + - [ 4.000, 0.7581, 0.0402, 0.0, -1.5294 ] + - [ 6.000, 0.9397, 0.0421, 0.0, -1.7194 ] + - [ 7.000, 1.0132, 0.0428, 0.0, -1.8437 ] + - [ 8.000, 1.0686, 0.0438, 0.0, -1.9993 ] + - [ 9.000, 1.0986, 0.0462, 0.0, -2.1424 ] + - [ 11.000, 1.1565, 0.0534, 0.0, -2.4664 ] + - [ 12.000, 1.1929, 0.0575, 0.0, -2.7339 ] + - [ 13.000, 1.2310, 0.0621, 0.0, -3.0185 ] + - [ 15.000, 1.2979, 0.0735, 0.0, -3.6316 ] + - [ 16.000, 1.3263, 0.0802, 0.0, -3.9577 ] + - [ 17.000, 1.3551, 0.0875, 0.0, -4.3142 ] + - [ 18.000, 1.3747, 0.0960, 0.0, -4.6477 ] + - [ 19.000, 1.3968, 0.1049, 0.0, -5.0108 ] + - [ 20.000, 1.4117, 0.1151, 0.0, -5.3642 ] + - [ 22.000, 1.4284, 0.1382, 0.0, -6.0547 ] + - [ 25.000, 1.4397, 0.1756, 0.0, -7.1298 ] + - [ 26.000, 1.4383, 0.1885, 0.0, -7.4558 ] + - [ 30.000, 1.3044, 0.2601, 0.0, -6.0291 ] + - [ 40.000, 1.0665, 0.4626, 0.0, -1.0947 ] + - [ 50.000, 0.8700, 0.6794, 0.0, -1.0947 ] + - [ 60.000, 0.6674, 0.8854, 0.0, -1.0947 ] + - [ 70.000, 0.4482, 1.0567, 0.0, -1.0947 ] + - [ 80.000, 0.2198, 1.1738, 0.0, -1.0947 ] + - [ 90.000, 0.0000, 1.2239, 0.0, -1.0947 ] + - [ 100.000,-0.1539, 1.1738, 0.0, -1.0947 ] + - [ 110.000,-0.3137, 1.0567, 0.0, -1.0947 ] + - [ 120.000,-0.4672, 0.8854, 0.0, -1.0947 ] + - [ 130.000,-0.6090, 0.6794, 0.0, -1.0947 ] + - [ 140.000,-0.7465, 0.4626, 0.0, -1.0947 ] + - [ 150.000,-0.9131, 0.2601, 0.0, -1.0947 ] + - [ 160.000,-0.7745, 0.0957, 0.0, -1.0947 ] + - [ 170.000,-0.3872, 0.0427, 0.0, -1.0947 ] + - [ 180.000, 0.0000, 0.0427, 0.0, -1.0947 ] + - name : S7 # NACA6_0259 + relative_thickness : 0.2099 # + added_mass_coeff : [0.7, 0.7] # [flapwise, edgewise] + data: # alpha c_l c_d c_m cp_min + - [ -180.000, 0.0000, 0.0273, 0.0, -1.0500 ] + - [ -170.000, 0.3963, 0.0273, 0.0, -1.0500 ] + - [ -160.000, 0.7927, 0.0815, 0.0, -1.0500 ] + - [ -150.000, 0.9345, 0.2497, 0.0, -1.0500 ] + - [ -140.000, 0.7640, 0.4570, 0.0, -1.0500 ] + - [ -130.000, 0.6233, 0.6789, 0.0, -1.0500 ] + - [ -120.000, 0.4781, 0.8897, 0.0, -1.0500 ] + - [ -110.000, 0.3211, 1.0650, 0.0, -1.0500 ] + - [ -100.000, 0.1575, 1.1850, 0.0, -1.0500 ] + - [ -90.000, 0.0000, 1.2363, 0.0, -1.0500 ] + - [ -80.000,-0.1575, 1.1850, 0.0, -1.0500 ] + - [ -70.000,-0.3211, 1.0650, 0.0, -1.0500 ] + - [ -60.000,-0.4781, 0.8897, 0.0, -1.0500 ] + - [ -50.000,-0.6233, 0.6789, 0.0, -1.0500 ] + - [ -40.000,-0.7640, 0.4570, 0.0, -1.0500 ] + - [ -30.000,-0.9345, 0.2497, 0.0, -1.0500 ] + - [ -20.000,-0.8190, 0.1218, 0.0, -1.0500 ] + - [ -10.000,-0.6664, 0.0308, 0.0, -2.5594 ] + - [ -9.000,-0.6387, 0.0282, 0.0, -2.3121 ] + - [ -8.000,-0.5840, 0.0273, 0.0, -2.0395 ] + - [ -5.000,-0.2715, 0.0252, 0.0, -1.2500 ] + - [ -4.000,-0.1565, 0.0247, 0.0, -1.0642 ] + - [ -3.000,-0.0386, 0.0243, 0.0, -0.9387 ] + - [ -2.000, 0.0795, 0.0237, 0.0, -0.9652 ] + - [ -1.000, 0.1995, 0.0234, 0.0, -1.0481 ] + - [ 0.000, 0.3206, 0.0233, 0.0, -1.1376 ] + - [ 1.000, 0.4392, 0.0233, 0.0, -1.2274 ] + - [ 2.000, 0.5554, 0.0235, 0.0, -1.3173 ] + - [ 3.000, 0.6697, 0.0239, 0.0, -1.4100 ] + - [ 4.000, 0.7759, 0.0247, 0.0, -1.4949 ] + - [ 6.000, 0.9617, 0.0267, 0.0, -1.6893 ] + - [ 7.000, 1.0370, 0.0273, 0.0, -1.8165 ] + - [ 8.000, 1.0937, 0.0284, 0.0, -1.9758 ] + - [ 9.000, 1.1244, 0.0309, 0.0, -2.1223 ] + - [ 11.000, 1.1836, 0.0383, 0.0, -2.4539 ] + - [ 12.000, 1.2209, 0.0425, 0.0, -2.7277 ] + - [ 13.000, 1.2599, 0.0471, 0.0, -3.0189 ] + - [ 15.000, 1.3283, 0.0587, 0.0, -3.6464 ] + - [ 16.000, 1.3574, 0.0657, 0.0, -3.9802 ] + - [ 17.000, 1.3869, 0.0731, 0.0, -4.3450 ] + - [ 18.000, 1.4070, 0.0819, 0.0, -4.6864 ] + - [ 19.000, 1.4296, 0.0909, 0.0, -5.0580 ] + - [ 20.000, 1.4449, 0.1014, 0.0, -5.4198 ] + - [ 22.000, 1.4619, 0.1250, 0.0, -6.1264 ] + - [ 25.000, 1.4735, 0.1633, 0.0, -7.2267 ] + - [ 26.000, 1.4721, 0.1765, 0.0, -7.5605 ] + - [ 30.000, 1.3351, 0.2497, 0.0, -6.1002 ] + - [ 40.000, 1.0915, 0.4570, 0.0, -1.0500 ] + - [ 50.000, 0.8905, 0.6789, 0.0, -1.0500 ] + - [ 60.000, 0.6831, 0.8897, 0.0, -1.0500 ] + - [ 70.000, 0.4587, 1.0650, 0.0, -1.0500 ] + - [ 80.000, 0.2249, 1.1850, 0.0, -1.0500 ] + - [ 90.000, 0.0000, 1.2363, 0.0, -1.0500 ] + - [ 100.000,-0.1575, 1.1850, 0.0, -1.0500 ] + - [ 110.000,-0.3211, 1.0650, 0.0, -1.0500 ] + - [ 120.000,-0.4781, 0.8897, 0.0, -1.0500 ] + - [ 130.000,-0.6233, 0.6789, 0.0, -1.0500 ] + - [ 140.000,-0.7640, 0.4570, 0.0, -1.0500 ] + - [ 150.000,-0.9345, 0.2497, 0.0, -1.0500 ] + - [ 160.000,-0.7927, 0.0815, 0.0, -1.0500 ] + - [ 170.000,-0.3963, 0.0273, 0.0, -1.0500 ] + - [ 180.000, 0.0000, 0.0273, 0.0, -1.0500 ] + - name : S8 # NACA6_0247 + relative_thickness : 0.1966 # + added_mass_coeff : [0.7, 0.7] # [flapwise, edgewise] + data: # alpha c_l c_d c_m cp_min + - [ -180.000, 0.0000, 0.0164, 0.0, -1.0184 ] + - [ -170.000, 0.4028, 0.0164, 0.0, -1.0184 ] + - [ -160.000, 0.8055, 0.0714, 0.0, -1.0184 ] + - [ -150.000, 0.9497, 0.2425, 0.0, -1.0184 ] + - [ -140.000, 0.7764, 0.4531, 0.0, -1.0184 ] + - [ -130.000, 0.6334, 0.6786, 0.0, -1.0184 ] + - [ -120.000, 0.4859, 0.8928, 0.0, -1.0184 ] + - [ -110.000, 0.3263, 1.0710, 0.0, -1.0184 ] + - [ -100.000, 0.1600, 1.1928, 0.0, -1.0184 ] + - [ -90.000, 0.0000, 1.2449, 0.0, -1.0184 ] + - [ -80.000,-0.1600, 1.1928, 0.0, -1.0184 ] + - [ -70.000,-0.3263, 1.0710, 0.0, -1.0184 ] + - [ -60.000,-0.4859, 0.8928, 0.0, -1.0184 ] + - [ -50.000,-0.6334, 0.6786, 0.0, -1.0184 ] + - [ -40.000,-0.7764, 0.4531, 0.0, -1.0184 ] + - [ -30.000,-0.9497, 0.2425, 0.0, -1.0184 ] + - [ -20.000,-0.8323, 0.1125, 0.0, -1.0184 ] + - [ -10.000,-0.6772, 0.0199, 0.0, -2.5523 ] + - [ -9.000,-0.6491, 0.0173, 0.0, -2.3010 ] + - [ -8.000,-0.5935, 0.0164, 0.0, -2.0240 ] + - [ -5.000,-0.2759, 0.0143, 0.0, -1.2216 ] + - [ -4.000,-0.1590, 0.0138, 0.0, -1.0329 ] + - [ -3.000,-0.0392, 0.0134, 0.0, -0.9053 ] + - [ -2.000, 0.0807, 0.0128, 0.0, -0.9322 ] + - [ -1.000, 0.2027, 0.0124, 0.0, -1.0165 ] + - [ 0.000, 0.3258, 0.0123, 0.0, -1.1074 ] + - [ 1.000, 0.4464, 0.0123, 0.0, -1.1986 ] + - [ 2.000, 0.5644, 0.0126, 0.0, -1.2901 ] + - [ 3.000, 0.6806, 0.0130, 0.0, -1.3842 ] + - [ 4.000, 0.7885, 0.0138, 0.0, -1.4705 ] + - [ 6.000, 0.9773, 0.0158, 0.0, -1.6681 ] + - [ 7.000, 1.0538, 0.0165, 0.0, -1.7974 ] + - [ 8.000, 1.1114, 0.0175, 0.0, -1.9592 ] + - [ 9.000, 1.1426, 0.0200, 0.0, -2.1081 ] + - [ 11.000, 1.2028, 0.0276, 0.0, -2.4451 ] + - [ 12.000, 1.2407, 0.0318, 0.0, -2.7233 ] + - [ 13.000, 1.2803, 0.0366, 0.0, -3.0192 ] + - [ 15.000, 1.3499, 0.0484, 0.0, -3.6569 ] + - [ 16.000, 1.3794, 0.0554, 0.0, -3.9960 ] + - [ 17.000, 1.4094, 0.0629, 0.0, -4.3668 ] + - [ 18.000, 1.4298, 0.0718, 0.0, -4.7137 ] + - [ 19.000, 1.4528, 0.0811, 0.0, -5.0914 ] + - [ 20.000, 1.4683, 0.0917, 0.0, -5.4589 ] + - [ 22.000, 1.4856, 0.1157, 0.0, -6.1771 ] + - [ 25.000, 1.4974, 0.1546, 0.0, -7.2952 ] + - [ 26.000, 1.4959, 0.1680, 0.0, -7.6343 ] + - [ 30.000, 1.3567, 0.2425, 0.0, -6.1504 ] + - [ 40.000, 1.1092, 0.4531, 0.0, -1.0184 ] + - [ 50.000, 0.9049, 0.6786, 0.0, -1.0184 ] + - [ 60.000, 0.6941, 0.8928, 0.0, -1.0184 ] + - [ 70.000, 0.4662, 1.0710, 0.0, -1.0184 ] + - [ 80.000, 0.2286, 1.1928, 0.0, -1.0184 ] + - [ 90.000, 0.0000, 1.2449, 0.0, -1.0184 ] + - [ 100.000,-0.1600, 1.1928, 0.0, -1.0184 ] + - [ 110.000,-0.3263, 1.0710, 0.0, -1.0184 ] + - [ 120.000,-0.4859, 0.8928, 0.0, -1.0184 ] + - [ 130.000,-0.6334, 0.6786, 0.0, -1.0184 ] + - [ 140.000,-0.7764, 0.4531, 0.0, -1.0184 ] + - [ 150.000,-0.9497, 0.2425, 0.0, -1.0184 ] + - [ 160.000,-0.8055, 0.0714, 0.0, -1.0184 ] + - [ 170.000,-0.4028, 0.0164, 0.0, -1.0184 ] + - [ 180.000, 0.0000, 0.0164, 0.0, -1.0184 ] + - name : S9 # NACA6_0240 + relative_thickness : 0.1870 # + added_mass_coeff : [0.7, 0.7] # [flapwise, edgewise] + data: # alpha c_l c_d c_m cp_min + - [ -180, 0.0000, 0.0100, 0.0, -1 ] + - [ -170, 0.4065, 0.0100, 0.0, -1 ] + - [ -160, 0.8130, 0.0656, 0.0, -1 ] + - [ -150, 0.9585, 0.2382, 0.0, -1 ] + - [ -140, 0.7836, 0.4508, 0.0, -1 ] + - [ -130, 0.6393, 0.6784, 0.0, -1 ] + - [ -120, 0.4904, 0.8946, 0.0, -1 ] + - [ -110, 0.3293, 1.0744, 0.0, -1 ] + - [ -100, 0.1615, 1.1974, 0.0, -1 ] + - [ -90, 0.0000, 1.2500, 0.0, -1 ] + - [ -80, -0.1615, 1.1974, 0.0, -1 ] + - [ -70, -0.3293, 1.0744, 0.0, -1 ] + - [ -60, -0.4904, 0.8946, 0.0, -1 ] + - [ -50, -0.6393, 0.6784, 0.0, -1 ] + - [ -40, -0.7836, 0.4508, 0.0, -1 ] + - [ -30, -0.9585, 0.2382, 0.0, -1 ] + - [ -20, -0.8400, 0.1070, 0.0, -1 ] + - [ -10, -0.6835, 0.0136, 0.0, -2.5481 ] + - [ -9, -0.6551, 0.0110, 0.0, -2.2945 ] + - [ -8, -0.5990, 0.0100, 0.0, -2.0149 ] + - [ -5, -0.2785, 0.0079, 0.0, -1.2051 ] + - [ -4, -0.1605, 0.0074, 0.0, -1.0146 ] + - [ -3, -0.0396, 0.0070, 0.0, -0.8858 ] + - [ -2, 0.0815, 0.0064, 0.0, -0.9130 ] + - [ -1, 0.2046, 0.0060, 0.0, -0.9981 ] + - [ 0, 0.3288, 0.0059, 0.0, -1.0898 ] + - [ 1, 0.4505, 0.0059, 0.0, -1.1819 ] + - [ 2, 0.5696, 0.0062, 0.0, -1.2742 ] + - [ 3, 0.6869, 0.0066, 0.0, -1.3692 ] + - [ 4, 0.7958, 0.0074, 0.0, -1.4563 ] + - [ 6, 0.9864, 0.0094, 0.0, -1.6557 ] + - [ 7, 1.0636, 0.0101, 0.0, -1.7862 ] + - [ 8, 1.1217, 0.0112, 0.0, -1.9495 ] + - [ 9, 1.1532, 0.0137, 0.0, -2.0998 ] + - [ 11, 1.2140, 0.0213, 0.0, -2.4399 ] + - [ 12, 1.2522, 0.0256, 0.0, -2.7207 ] + - [ 13, 1.2922, 0.0304, 0.0, -3.0194 ] + - [ 15, 1.3624, 0.0423, 0.0, -3.6630 ] + - [ 16, 1.3922, 0.0494, 0.0, -4.0053 ] + - [ 17, 1.4225, 0.0570, 0.0, -4.3795 ] + - [ 18, 1.4431, 0.0660, 0.0, -4.7296 ] + - [ 19, 1.4663, 0.0753, 0.0, -5.1108 ] + - [ 20, 1.4819, 0.0860, 0.0, -5.4818 ] + - [ 22, 1.4994, 0.1103, 0.0, -6.2066 ] + - [ 25, 1.5113, 0.1495, 0.0, -7.3351 ] + - [ 26, 1.5098, 0.1631, 0.0, -7.6774 ] + - [ 30, 1.3693, 0.2382, 0.0, -6.1797 ] + - [ 40, 1.1195, 0.4508, 0.0, -1 ] + - [ 50, 0.9133, 0.6784, 0.0, -1 ] + - [ 60, 0.7006, 0.8946, 0.0, -1 ] + - [ 70, 0.4705, 1.0744, 0.0, -1 ] + - [ 80, 0.2307, 1.1974, 0.0, -1 ] + - [ 90, 0.0000, 1.2500, 0.0, -1 ] + - [ 100, -0.1615, 1.1974, 0.0, -1 ] + - [ 110, -0.3293, 1.0744, 0.0, -1 ] + - [ 120, -0.4904, 0.8946, 0.0, -1 ] + - [ 130, -0.6393, 0.6784, 0.0, -1 ] + - [ 140, -0.7836, 0.4508, 0.0, -1 ] + - [ 150, -0.9585, 0.2382, 0.0, -1 ] + - [ 160, -0.8130, 0.0656, 0.0, -1 ] + - [ 170, -0.4065, 0.0100, 0.0, -1 ] + - [ 180, 0.0000, 0.0100, 0.0, -1 ] + + + + + pitch_control: + GS_Angles: [0.06019804, 0.08713416, 0.10844806, 0.12685912, 0.14339822, 0.1586021 , 0.17279614, 0.18618935, 0.19892772, 0.21111989, 0.22285021, 0.23417256, 0.2451469 , 0.25580691, 0.26619545, 0.27632495, 0.28623134, 0.29593266, 0.30544521, 0.314779 , 0.32395154, 0.33297489, 0.3418577 , 0.35060844, 0.35923641, 0.36774807, 0.37614942, 0.38444655, 0.39264363, 0.40074407] + GS_Kp: [-0.9394215 , -0.80602855, -0.69555026, -0.60254912, -0.52318192, -0.45465531, -0.39489024, -0.34230736, -0.29568537, -0.25406506, -0.2166825 , -0.18292183, -0.15228099, -0.12434663, -0.09877533, -0.0752794 , -0.05361604, -0.0335789 , -0.01499149, 0.00229803, 0.01842102, 0.03349169, 0.0476098 , 0.0608629 , 0.07332812, 0.0850737 , 0.0961602 , 0.10664158, 0.11656607, 0.12597691] + GS_Ki: [-0.07416547, -0.06719673, -0.0614251 , -0.05656651, -0.0524202 , -0.04884022, -0.04571796, -0.04297091, -0.04053528, -0.03836094, -0.03640799, -0.03464426, -0.03304352, -0.03158417, -0.03024826, -0.02902079, -0.02788904, -0.02684226, -0.02587121, -0.02496797, -0.02412567, -0.02333834, -0.02260078, -0.02190841, -0.0212572 , -0.02064359, -0.0200644 , -0.01951683, -0.01899836, -0.01850671] + Fl_Kp: -9.35 + wt_ops: # operating points: wind speed [m/s], blade pitch [deg], rotor speed [rpm] + v: [0.50, 0.60, 0.70, 0.80, 0.90, 1.00, 1.10, 1.20, 1.30, 1.40, 1.50, 1.60, 1.70, 1.80, 1.90, 2.00, 2.10, 2.20, 2.30, 2.40, 2.50, 2.60, 2.70, 2.80, 2.90, 3.00] + pitch_op: [0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.70, 4.30, 6.00, 7.40, 8.60, 9.70, 10.80, 11.70, 12.70, 13.50, 14.40] + omega_op: [3.34, 4.01, 4.68, 5.35, 6.02, 6.68, 7.35, 8.02, 8.69, 9.36, 10.03, 10.70, 11.36, 11.50, 11.50, 11.50, 11.50, 11.50, 11.50, 11.50, 11.50, 11.50, 11.50, 11.50, 11.50, 11.50] + gear_ratio: 1 + torque_control: + VS_KP: -38609162.66552 + VS_KI: -4588245.18720 + + + tower: + dlsMax : 2.0 # maximum node splitting section amount; can't be 0 + + name : tower # [-] an identifier (no longer has to be number) + type : 1 # [-] + rA : [ 0, 0, -24.0] # [m] end A coordinates + rB : [ 0, 0, -9.0] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + stations : [ 0, 1 ] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 0.3253 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.16265 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 0.2 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 0.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] material density + + +platform: + + potModMaster : 1 # [int] master switch for potMod variables; 0=keeps all member potMod vars the same, 1=turns all potMod vars to False (no HAMS), 2=turns all potMod vars to True (no strip) + dlsMax : 2.0 # maximum node splitting section amount for platform members; can't be 0 + + members: # list all members here + + - name : column-E # [-] an identifier (no longer has to be number) + type : 2 # [-] + rA : [ 28.0, 0.0, -10.0] # [m] end A coordinates + rB : [ 28.0, 0.0, 6.0] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 8.0 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.02 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 1.2 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 1.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + + - name : column-W # [-] an identifier (no longer has to be number) + type : 2 # [-] + rA : [ -28.0, 0.0, -10.0] # [m] end A coordinates + rB : [ -28.0, 0.0, 6.0] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 8.0 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.02 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 1.2 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 1.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + + - name : column-S # [-] an identifier (no longer has to be number) + type : 2 # [-] + rA : [ 0.0, -12.0, -10.0] # [m] end A coordinates + rB : [ 0.0, -12.0, 6.0] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 8.0 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.02 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 1.2 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 1.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + + - name : column-N # [-] an identifier (no longer has to be number) + type : 2 # [-] + rA : [ 0.0, 12.0, -10.0] # [m] end A coordinates + rB : [ 0.0, 12.0, 6.0] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 8.0 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.02 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 1.2 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 1.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + + - name : upper_brace-NE # [-] an identifier (no longer has to be number) + type : 2 # [-] + rA : [ 3.67658, 10.4243, 4.5] # [m] end A coordinates + rB : [ 24.3234, 1.57568, 4.5] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 2.0 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.02 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 1.2 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 1.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + + - name : upper_brace-SE # [-] an identifier (no longer has to be number) + type : 2 # [-] + rA : [ 3.67658, -10.4243, 4.5] # [m] end A coordinates + rB : [ 24.3234, -1.57568, 4.5] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 2.0 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.02 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 1.2 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 1.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + + - name : upper_brace-SW # [-] an identifier (no longer has to be number) + type : 2 # [-] + rA : [ -3.67658, -10.4243, 4.5] # [m] end A coordinates + rB : [ -24.3234, -1.57568, 4.5] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 2.0 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.02 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 1.2 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 1.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + + - name : upper_brace-NW # [-] an identifier (no longer has to be number) + type : 2 # [-] + rA : [ -3.67658, 10.4243, 4.5] # [m] end A coordinates + rB : [ -24.3234, 1.57568, 4.5] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 2.0 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.02 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 1.2 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 1.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + + - name : lower_brace-NE # [-] an identifier (no longer has to be number) + type : 2 # [-] + rA : [ 3.67658, 10.4243, -8.5] # [m] end A coordinates + rB : [ 24.3234, 1.57568, -8.5] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 2.0 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.081 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 1.2 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 1.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + + - name : lower_brace-SE # [-] an identifier (no longer has to be number) + type : 2 # [-] + rA : [ 3.67658, -10.4243, -8.5] # [m] end A coordinates + rB : [ 24.3234, -1.57568, -8.5] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 2.0 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.081 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 1.2 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 1.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + + - name : lower_brace-SW # [-] an identifier (no longer has to be number) + type : 2 # [-] + rA : [ -3.67658, -10.4243, -8.5] # [m] end A coordinates + rB : [ -24.3234, -1.57568, -8.5] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 2.0 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.081 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 1.2 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 1.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + + - name : lower_brace-NW # [-] an identifier (no longer has to be number) + type : 2 # [-] + rA : [ -3.67658, 10.4243, -8.5] # [m] end A coordinates + rB : [ -24.3234, 1.57568, -8.5] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 2.0 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.081 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 1.2 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 1.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + + + + + - name : upper_tower_brace # [-] an identifier (no longer has to be number) + type : 2 # [-] + rA : [ 0.0, -8.0, 4.5] # [m] end A coordinates + rB : [ 0.0, 8.0, 4.5] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 2.0 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.02 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 1.2 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 1.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + + - name : lower_tower_brace # [-] an identifier (no longer has to be number) + type : 2 # [-] + rA : [ 0.0, -8.0, -8.5] # [m] end A coordinates + rB : [ 0.0, 8.0, -8.5] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 2.0 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.02 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 1.2 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 1.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + + - name : diag_tower_brace-S # [-] an identifier (no longer has to be number) + type : 2 # [-] + rA : [ 0.0, -8.0, -8.5] # [m] end A coordinates + rB : [ 0.0, 0.0, 4.5] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 2.0 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.02 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 1.2 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 1.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + + - name : diag_tower_brace-N # [-] an identifier (no longer has to be number) + type : 2 # [-] + rA : [ 0.0, 8.0, -8.5] # [m] end A coordinates + rB : [ 0.0, 0.0, 4.5] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 2.0 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.02 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 1.2 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 1.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + + - name : heave_plate-E # [-] an identifier (no longer has to be number) + type : 2 # [-] + rA : [ 28.0, 0.0, -10.5] # [m] end A coordinates + rB : [ 28.0, 0.0, -10.0] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 12.0 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.3925 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 1.2 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 1.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 1.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 1.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + + - name : heave_plate-W # [-] an identifier (no longer has to be number) + type : 2 # [-] + rA : [ -28.0, 0.0, -10.5] # [m] end A coordinates + rB : [ -28.0, 0.0, -10.0] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 12.0 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.3925 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 1.2 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 1.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 1.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 1.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + + - name : heave_plate-S # [-] an identifier (no longer has to be number) + type : 2 # [-] + rA : [ 0.0, -12.0, -10.5] # [m] end A coordinates + rB : [ 0.0, -12.0, -10.0] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 12.0 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.3925 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 1.2 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 1.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 1.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 1.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + + - name : heave_plate-N # [-] an identifier (no longer has to be number) + type : 2 # [-] + rA : [ 0.0, 12.0, -10.5] # [m] end A coordinates + rB : [ 0.0, 12.0, -10.0] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 12.0 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.3925 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 1.2 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 1.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 1.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 1.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + + + + +mooring: + water_depth: 50 # [m] uniform water depth + + points: + - name: sw_anchor + type: fixed + location: [-152.0, -50.0, -50.0] + anchor_type: drag_embedment + + - name: w_anchor + type: fixed + location: [-152.0, 0.0, -50.0] + anchor_type: drag_embedment + + - name: nw_anchor + type: fixed + location: [-152.0, 50.0, -50.0] + anchor_type: drag_embedment + + - name: se_anchor + type: fixed + location: [152.0, -50.0, -50.0] + anchor_type: drag_embedment + + - name: e_anchor + type: fixed + location: [152.0, 0.0, -50.0] + anchor_type: drag_embedment + + - name: ne_anchor + type: fixed + location: [152.0, 50.0, -50.0] + anchor_type: drag_embedment + + - name: sw_fairlead + type: vessel + location: [-34.0, 0.0, -10.0] + + - name: w_fairlead + type: vessel + location: [-34.0, 0.0, -10.0] + + - name: nw_fairlead + type: vessel + location: [-34.0, 0.0, -10.0] + + - name: se_fairlead + type: vessel + location: [34.0, 0.0, -10.0] + + - name: e_fairlead + type: vessel + location: [34.0, 0.0, -10.0] + + - name: ne_fairlead + type: vessel + location: [34.0, 0.0, -10.0] + + + lines: + - name: sw_line + endA: sw_anchor + endB: sw_fairlead + type: main + length: 160 + + - name: w_line + endA: w_anchor + endB: w_fairlead + type: main + length: 152 + + - name: nw_line + endA: nw_anchor + endB: nw_fairlead + type: main + length: 160 + + - name: se_line + endA: se_anchor + endB: se_fairlead + type: main + length: 160 + + - name: e_line + endA: e_anchor + endB: e_fairlead + type: main + length: 152 + + - name: ne_line + endA: ne_anchor + endB: ne_fairlead + type: main + length: 160 + + + + + line_types: + - name: main + diameter: 0.324 + mass_density: 644.8 + stiffness: 85.4e8 + breaking_load: 1e8 + cost: 100.0 + transverse_added_mass: 0.5 + tangential_added_mass: 1.0 + transverse_drag: 1.15 + tangential_drag: 2.4 + + anchor_types: + - name: drag_embedment + mass: 1e3 + cost: 1e4 + max_vertical_load: 0.0 + max_lateral_load: 1e5 + \ No newline at end of file diff --git a/RAFT/designs/Vertical_cylinder.yaml b/RAFT/designs/Vertical_cylinder.yaml new file mode 100644 index 000000000..c584b85af --- /dev/null +++ b/RAFT/designs/Vertical_cylinder.yaml @@ -0,0 +1,120 @@ +type: input file for RAFT +name: IEA 15 MW with VolturnUS-S steel semi +comments: This is a quick example that includes potential flow BEM hydrodynamics with PyHAMS and different wave headings. + + +settings: # global Settings + min_freq : 0.001 # [Hz] lowest frequency to consider, also the frequency bin width + max_freq : 0.20 # [Hz] highest frequency to consider + XiStart : 0 # sets initial amplitude of each DOF for all frequencies + nIter : 4 # sets how many iterations to perform in Model.solveDynamics() + +site: + water_depth : 200 # [m] uniform water depth + rho_water : 1025.0 # [kg/m^3] water density + rho_air : 0 # [kg/m^3] air density + mu_air : 0 # air dynamic viscosity + shearExp : 0 # shear exponent + +cases: + keys : [wind_speed, wind_heading, turbulence, turbine_status, turbine_heading, wave_spectrum, wave_period, wave_height, wave_heading, current_speed, current_heading, current_turbulence ] + data : # m/s deg % or e.g. IIB_NTM string deg string (s) (m) (deg) (m/s) (deg) % or e.g. IIB_NTM + - [ 0, 0, 0, parked, 0, still, 12, 1, 0, 0, 0, 0 ] + + +platform: + potModMaster : 1 # [int] master switch for potMod variables; 0=keeps all member potMod vars the same, 1=turns all potMod vars to False (no HAMS), 2=turns all potMod vars to True (no strip) + dlsMax : 5.0 # maximum node splitting section amount for platform members; can't be 0 + + members: # list all members here + + - name : vertical_cylinder # [-] an identifier (no longer has to be number) + type : 2 # [-] + rA : [0,0,-1] # [m] end A coordinates + rB : [0,0,1] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : False # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + # --- outer shell including hydro--- + stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 1.0 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.01 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 1.0 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 1.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : [0.0,0.0] # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + + +mooring: + water_depth: 2 # [m] uniform water depth + + points: + - name: fairlead1 + type: vessel + location: [-0.5, 0.0, 0.0] + + - name: fairlead2 + type: vessel + location: [0.25, 0.433, 0.0] + + - name: fairlead3 + type: vessel + location: [0.25, -0.433, 0.0] + + - name: anchor1 + type: fixed + location: [-1.5, 0.0, -2.0] + anchor_type: example + + - name: anchor2 + type: fixed + location: [0.75, 1.3, -2.0] + anchor_type: example + + - name: anchor3 + type: fixed + location: [0.75, -1.3, -2.0] + anchor_type: example + + + lines: + - name: west + endA: anchor1 + endB: fairlead1 + type: main + length: 1.0 + + - name: northeast + endA: anchor2 + endB: fairlead2 + type: main + length: 1.0 + + - name: southeast + endA: anchor3 + endB: fairlead3 + type: main + length: 1.0 + + + + line_types: + - name: main + diameter: 0.1 + mass_density: 0.1 + stiffness: 1000 + breaking_load: 0.1 + cost: 0.1 + transverse_added_mass: 0.1 + tangential_added_mass: 0.1 + transverse_drag: 0.1 + tangential_drag: 0.1 + + anchor_types: + - name: example + mass: 10 + cost: 10 + max_vertical_load: 10 + max_lateral_load: 10 + + \ No newline at end of file diff --git a/RAFT/designs/VolturnUS-S.yaml b/RAFT/designs/VolturnUS-S.yaml index dc1da8b73..39f117bad 100644 --- a/RAFT/designs/VolturnUS-S.yaml +++ b/RAFT/designs/VolturnUS-S.yaml @@ -1118,7 +1118,7 @@ platform: gamma : 0.0 # [deg] twist angle about the member's z-axis potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory # --- outer shell including hydro--- - stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + stations : [0, 35] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB d : 12.5 # [m] diameters if circular or side lengths if rectangular (can be pairs) t : 0.05 # [m] wall thicknesses (scalar or list of same length as stations) Cd : 0.8 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) @@ -1144,7 +1144,7 @@ platform: gamma : 0.0 # [deg] twist angle about the member's z-axis potMod : False # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory # --- outer shell including hydro--- - stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + stations : [0, 40.5] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB d : [12.5, 7.0] # [m] diameters if circular or side lengths if rectangular (can be pairs) t : 0.05 # [m] wall thicknesses (scalar or list of same length as stations) Cd : 0.8 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) @@ -1152,7 +1152,7 @@ platform: CdEnd : 0.6 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) CaEnd : 0.6 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) rho_shell : 7850 # [kg/m3] - l_fill : 43.0 # [m] + l_fill : 40.5 # [m] rho_fill : 1025.0 # [kg/m3] diff --git a/RAFT/designs/VolturnUS-S_farm.yaml b/RAFT/designs/VolturnUS-S_farm.yaml new file mode 100644 index 000000000..e2c84b103 --- /dev/null +++ b/RAFT/designs/VolturnUS-S_farm.yaml @@ -0,0 +1,1273 @@ +type: input file for RAFT +name: IEA 15 MW with VolturnUS-S steel semi - a farm of four +comments: updated to use tuned hydro coefficients from Torque 2022 paper and peak-thrust-clipping control + +settings: # global Settings + min_freq : 0.001 # [Hz] lowest frequency to consider, also the frequency bin width + max_freq : 0.1 # [Hz] highest frequency to consider + XiStart : 0 # sets initial amplitude of each DOF for all frequencies + nIter : 10 # sets how many iterations to perform in Model.solveDynamics() + +site: + water_depth : 200 # [m] uniform water depth + rho_water : 1025.0 # [kg/m^3] water density + rho_air : 1.225 # [kg/m^3] air density + mu_air : 1.81e-05 # air dynamic viscosity + shearExp : 0.12 # shear exponent + +cases: # new + keys : [wind_speed, wind_heading, turbulence, turbine_status, yaw_misalign, wave_spectrum, wave_period, wave_height, wave_heading ] + data : # m/s deg % or e.g. 2B_NTM string deg string (s) (m) (deg) + #- [ 12, 0, 0.01, parked , 0, JONSWAP, 12, 6, 0 ] + - [ 10.5, 0, 0.01, operating, 0, JONSWAP, 12, 6, 0 ] + + +array: # new + keys : [turbineID, platformID, mooringID, x_location, y_location, heading_adjust] + data : # ID# ID# ID# [m] [m] [deg] + #- [ 1, 1, 1, 0, 0, 0 ] # single + #- [ 1, 1, 1, 800, 800, 0 ] # 4 square array, individual moorings + #- [ 1, 1, 1, -800, 800, 0 ] + #- [ 1, 1, 1, -800, -800, 0 ] + #- [ 1, 1, 1, 800, -800, 180 ] + #- [ 1, 1, 1, 800, -800, 180 ] + - [ 1, 1, 0, 0, 0, 180 ] # 2 array, shared moorings + - [ 1, 1, 0, 1600, 0, 0 ] + + + + # note: 0 could indicate not included at the fowt level for this fowt + # 1-n could indicate multiple options (or all use the same mooring design if only one option) + + + + +array_mooring: # option for array-level mooring system + file: SharedMooring2.dat # MoorDyn shared mooring input file (same as would be used in FAST.Farm) + + +turbine: + + mRNA : 991000 # [kg] RNA mass + IxRNA : 0 # [kg-m2] RNA moment of inertia about local x axis (assumed to be identical to rotor axis for now, as approx) [kg-m^2] + IrRNA : 0 # [kg-m2] RNA moment of inertia about local y or z axes [kg-m^2] + xCG_RNA : 0 # [m] x location of RNA center of mass [m] (Actual is ~= -0.27 m) + hHub : 150.0 # [m] hub height above water line [m] + Fthrust : 1500.0E3 # [N] temporary thrust force to use + + I_drivetrain: 318628138.0 # full rotor + drivetrain inertia as felt on the high-speed shaft + + nBlades : 3 # number of blades + Zhub : 150.0 # hub height [m] + Rhub : 3.97 # hub radius [m] + precone : 4.0 # [deg] + shaft_tilt : 6.0 # [deg] + overhang : 12.0313 # [m] + aeroServoMod : 2 # 0 aerodynamics off; 1 aerodynamics on (no control); 2 aerodynamics and control on + + blade: + precurveTip : -3.9999999999999964 # + presweepTip : 0.0 # + Rtip : 120.96999999936446 # rotor radius + + # r chord theta precurve presweep + geometry: + - [ 8.004, 5.228, 15.474, 0.035, 0.000 ] + - [ 12.039, 5.321, 14.692, 0.084, 0.000 ] + - [ 16.073, 5.458, 13.330, 0.139, 0.000 ] + - [ 20.108, 5.602, 11.644, 0.192, 0.000 ] + - [ 24.142, 5.718, 9.927, 0.232, 0.000 ] + - [ 28.177, 5.767, 8.438, 0.250, 0.000 ] + - [ 32.211, 5.713, 7.301, 0.250, 0.000 ] + - [ 36.246, 5.536, 6.232, 0.246, 0.000 ] + - [ 40.280, 5.291, 5.230, 0.240, 0.000 ] + - [ 44.315, 5.035, 4.348, 0.233, 0.000 ] + - [ 48.349, 4.815, 3.606, 0.218, 0.000 ] + - [ 52.384, 4.623, 2.978, 0.178, 0.000 ] + - [ 56.418, 4.432, 2.423, 0.100, 0.000 ] + - [ 60.453, 4.245, 1.924, 0.000, 0.000 ] + - [ 64.487, 4.065, 1.467, -0.112, 0.000 ] + - [ 68.522, 3.896, 1.056, -0.244, 0.000 ] + - [ 72.556, 3.735, 0.692, -0.415, 0.000 ] + - [ 76.591, 3.579, 0.355, -0.620, 0.000 ] + - [ 80.625, 3.425, 0.019, -0.846, 0.000 ] + - [ 84.660, 3.268, -0.358, -1.080, 0.000 ] + - [ 88.694, 3.112, -0.834, -1.330, 0.000 ] + - [ 92.729, 2.957, -1.374, -1.602, 0.000 ] + - [ 96.763, 2.800, -1.848, -1.895, 0.000 ] + - [ 100.798, 2.637, -2.136, -2.202, 0.000 ] + - [ 104.832, 2.464, -2.172, -2.523, 0.000 ] + - [ 108.867, 2.283, -2.108, -2.864, 0.000 ] + - [ 112.901, 2.096, -1.953, -3.224, 0.000 ] + - [ 116.936, 1.902, -1.662, -3.605, 0.000 ] + # station(rel) airfoil name + airfoils: + - [ 0.00000, circular ] + - [ 0.02000, circular ] + - [ 0.15000, SNL-FFA-W3-500 ] + - [ 0.24517, FFA-W3-360 ] + - [ 0.32884, FFA-W3-330blend ] + - [ 0.43918, FFA-W3-301 ] + - [ 0.53767, FFA-W3-270blend ] + - [ 0.63821, FFA-W3-241 ] + - [ 0.77174, FFA-W3-211 ] + - [ 1.00000, FFA-W3-211 ] + + + airfoils: + - name : circular # + relative_thickness : 1.0 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00010, 0.35000, -0.00010 ] + - [ 179.9087, 0.00010, 0.35000, -0.00010 ] + - name : SNL-FFA-W3-500 # + relative_thickness : 0.5 # + data: # alpha c_l c_d c_m + - [ -179.9660, 0.00000, 0.08440, 0.00000 ] + - [ -170.0000, 0.44190, 0.08440, 0.31250 ] + - [ -160.0002, 0.88370, 0.12680, 0.28310 ] + - [ -149.9998, 0.96740, 0.29270, 0.26320 ] + - [ -139.9999, 0.78010, 0.49700, 0.20480 ] + - [ -130.0001, 0.62930, 0.71610, 0.19320 ] + - [ -120.0003, 0.47850, 0.92460, 0.20080 ] + - [ -109.9999, 0.31890, 1.09850, 0.21360 ] + - [ -100.0000, 0.15530, 1.21820, 0.22210 ] + - [ -90.0002, 0.00000, 1.27070, 0.21980 ] + - [ -79.9998, -0.15530, 1.21820, 0.19600 ] + - [ -70.0000, -0.31890, 1.09850, 0.16350 ] + - [ -60.0001, -0.47840, 0.92460, 0.12850 ] + - [ -49.9997, -0.62930, 0.71610, 0.09650 ] + - [ -39.9999, -0.78010, 0.49700, 0.07160 ] + - [ -30.0001, -0.96740, 0.29270, 0.05220 ] + - [ -20.0002, -1.02810, 0.14990, -0.00630 ] + - [ -19.7499, -1.02430, 0.14720, -0.00890 ] + - [ -19.2502, -1.00520, 0.14470, -0.00990 ] + - [ -18.9999, -0.99710, 0.14330, -0.01050 ] + - [ -18.7500, -1.00520, 0.14030, -0.01100 ] + - [ -18.5002, -0.99950, 0.13860, -0.01160 ] + - [ -18.2499, -0.99080, 0.13730, -0.01200 ] + - [ -18.0000, -0.98150, 0.13600, -0.01260 ] + - [ -17.4998, -0.97640, 0.13220, -0.01350 ] + - [ -17.2500, -0.97050, 0.13060, -0.01390 ] + - [ -17.0002, -0.96550, 0.12900, -0.01430 ] + - [ -16.7498, -0.96620, 0.12680, -0.01470 ] + - [ -16.5000, -0.95440, 0.12580, -0.01510 ] + - [ -16.2502, -0.94440, 0.12460, -0.01550 ] + - [ -15.9998, -0.94050, 0.12290, -0.01580 ] + - [ -15.7500, -0.94330, 0.12060, -0.01610 ] + - [ -15.5002, -0.93300, 0.11950, -0.01640 ] + - [ -15.2498, -0.92110, 0.11850, -0.01680 ] + - [ -14.7502, -0.91580, 0.11500, -0.01730 ] + - [ -14.4998, -0.90700, 0.11380, -0.01750 ] + - [ -14.2500, -0.89590, 0.11270, -0.01780 ] + - [ -14.0002, -0.89260, 0.11100, -0.01810 ] + - [ -13.7498, -0.88080, 0.11000, -0.01840 ] + - [ -13.5000, -0.87220, 0.10890, -0.01860 ] + - [ -13.2502, -0.86600, 0.10750, -0.01880 ] + - [ -12.9998, -0.86260, 0.10590, -0.01880 ] + - [ -12.7500, -0.84890, 0.10510, -0.01920 ] + - [ -12.5002, -0.83630, 0.10420, -0.01940 ] + - [ -12.2498, -0.83630, 0.10230, -0.01940 ] + - [ -12.0000, -0.82710, 0.10130, -0.01960 ] + - [ -11.7502, -0.81410, 0.10040, -0.01980 ] + - [ -11.4998, -0.80040, 0.09970, -0.02000 ] + - [ -11.0002, -0.78900, 0.09710, -0.01990 ] + - [ -10.7498, -0.78620, 0.09560, -0.01960 ] + - [ -10.5000, -0.77470, 0.09480, -0.01940 ] + - [ -10.2502, -0.77010, 0.09400, -0.01840 ] + - [ -9.9998, -0.76740, 0.09250, -0.01830 ] + - [ -9.7500, -0.75060, 0.09170, -0.01920 ] + - [ -9.5002, -0.72900, 0.09120, -0.02050 ] + - [ -9.2498, -0.70950, 0.09020, -0.02240 ] + - [ -9.0000, -0.68550, 0.08950, -0.02470 ] + - [ -8.7502, -0.65900, 0.08910, -0.02670 ] + - [ -8.4998, -0.63190, 0.08870, -0.02870 ] + - [ -8.2500, -0.60190, 0.08790, -0.03200 ] + - [ -8.0002, -0.57180, 0.08750, -0.03450 ] + - [ -7.7498, -0.54240, 0.08730, -0.03670 ] + - [ -7.5000, -0.50980, 0.08680, -0.03990 ] + - [ -7.2502, -0.47670, 0.08640, -0.04300 ] + - [ -6.9998, -0.44540, 0.08620, -0.04530 ] + - [ -6.7500, -0.41420, 0.08600, -0.04760 ] + - [ -6.5002, -0.37910, 0.08560, -0.05100 ] + - [ -6.2498, -0.34600, 0.08530, -0.05380 ] + - [ -6.0000, -0.31440, 0.08520, -0.05600 ] + - [ -5.7502, -0.28170, 0.08500, -0.05860 ] + - [ -5.4998, -0.24610, 0.08470, -0.06190 ] + - [ -5.2500, -0.21330, 0.08460, -0.06440 ] + - [ -5.0002, -0.18270, 0.08450, -0.06630 ] + - [ -4.7498, -0.14940, 0.08430, -0.06880 ] + - [ -4.5000, -0.11580, 0.08420, -0.07150 ] + - [ -4.2502, -0.08370, 0.08400, -0.07370 ] + - [ -3.9998, -0.05290, 0.08400, -0.07560 ] + - [ -3.7500, -0.02250, 0.08390, -0.07740 ] + - [ -3.5002, 0.00890, 0.08380, -0.07930 ] + - [ -3.2498, 0.03920, 0.08380, -0.08110 ] + - [ -3.0000, 0.06860, 0.08380, -0.08260 ] + - [ -2.7502, 0.09740, 0.08380, -0.08380 ] + - [ -2.4998, 0.12600, 0.08380, -0.08520 ] + - [ -2.2500, 0.15550, 0.08380, -0.08670 ] + - [ -2.0002, 0.18530, 0.08380, -0.08830 ] + - [ -1.7498, 0.21460, 0.08370, -0.08970 ] + - [ -1.5000, 0.24300, 0.08370, -0.09100 ] + - [ -1.2502, 0.27130, 0.08380, -0.09210 ] + - [ -0.9998, 0.30060, 0.08380, -0.09360 ] + - [ -0.7500, 0.32950, 0.08380, -0.09490 ] + - [ -0.5002, 0.35780, 0.08380, -0.09610 ] + - [ -0.2498, 0.38570, 0.08380, -0.09720 ] + - [ 0.0000, 0.41350, 0.08380, -0.09830 ] + - [ 0.2298, 0.44250, 0.08390, -0.09950 ] + - [ 0.4698, 0.47150, 0.08390, -0.10080 ] + - [ 0.7002, 0.50030, 0.08390, -0.10190 ] + - [ 0.9402, 0.52860, 0.08400, -0.10290 ] + - [ 1.1700, 0.55670, 0.08400, -0.10400 ] + - [ 1.3997, 0.58500, 0.08410, -0.10500 ] + - [ 1.6398, 0.61350, 0.08410, -0.10610 ] + - [ 1.8701, 0.64170, 0.08420, -0.10720 ] + - [ 2.1102, 0.66970, 0.08420, -0.10820 ] + - [ 2.3400, 0.69750, 0.08430, -0.10910 ] + - [ 2.5697, 0.72510, 0.08430, -0.11000 ] + - [ 2.8098, 0.75280, 0.08440, -0.11090 ] + - [ 3.0401, 0.78070, 0.08450, -0.11190 ] + - [ 3.2802, 0.80830, 0.08460, -0.11280 ] + - [ 3.5099, 0.83580, 0.08460, -0.11370 ] + - [ 3.7403, 0.86310, 0.08470, -0.11460 ] + - [ 3.9798, 0.89020, 0.08470, -0.11530 ] + - [ 4.2101, 0.91730, 0.08480, -0.11610 ] + - [ 4.4502, 0.94440, 0.08490, -0.11700 ] + - [ 4.6799, 0.97130, 0.08500, -0.11780 ] + - [ 4.9102, 0.99810, 0.08510, -0.11850 ] + - [ 5.1497, 1.02490, 0.08520, -0.11920 ] + - [ 5.3801, 1.05150, 0.08530, -0.11990 ] + - [ 5.6201, 1.07790, 0.08530, -0.12060 ] + - [ 5.8499, 1.10410, 0.08540, -0.12120 ] + - [ 6.0802, 1.13020, 0.08560, -0.12180 ] + - [ 6.3197, 1.15600, 0.08570, -0.12240 ] + - [ 6.5501, 1.18180, 0.08580, -0.12300 ] + - [ 6.7901, 1.20760, 0.08590, -0.12350 ] + - [ 7.0199, 1.23340, 0.08600, -0.12400 ] + - [ 7.2502, 1.25890, 0.08610, -0.12450 ] + - [ 7.4903, 1.28410, 0.08620, -0.12500 ] + - [ 7.7200, 1.30880, 0.08640, -0.12540 ] + - [ 7.9601, 1.33310, 0.08650, -0.12570 ] + - [ 8.1899, 1.35700, 0.08670, -0.12590 ] + - [ 8.4202, 1.38100, 0.08690, -0.12620 ] + - [ 8.6603, 1.40540, 0.08700, -0.12650 ] + - [ 8.8900, 1.42950, 0.08710, -0.12670 ] + - [ 9.1198, 1.45310, 0.08730, -0.12700 ] + - [ 9.8801, 1.51540, 0.08790, -0.12650 ] + - [ 10.6398, 1.57490, 0.08860, -0.12560 ] + - [ 11.4001, 1.61510, 0.08950, -0.12140 ] + - [ 12.1501, 1.64430, 0.09120, -0.11630 ] + - [ 12.9099, 1.68240, 0.09300, -0.11330 ] + - [ 13.6702, 1.71460, 0.09540, -0.11070 ] + - [ 14.4202, 1.73620, 0.09890, -0.10800 ] + - [ 15.1799, 1.76270, 0.10240, -0.10630 ] + - [ 15.9403, 1.77060, 0.10760, -0.10420 ] + - [ 16.6903, 1.76390, 0.11440, -0.10250 ] + - [ 17.4500, 1.76040, 0.12110, -0.10130 ] + - [ 18.2097, 1.72510, 0.13100, -0.10010 ] + - [ 18.9701, 1.70350, 0.13990, -0.09980 ] + - [ 19.7201, 1.67840, 0.14920, -0.10010 ] + - [ 20.4798, 1.65050, 0.15910, -0.10160 ] + - [ 21.2401, 1.62270, 0.16910, -0.10360 ] + - [ 21.9901, 1.60670, 0.17780, -0.10640 ] + - [ 22.7499, 1.59720, 0.18580, -0.10990 ] + - [ 23.5102, 1.58920, 0.19370, -0.11360 ] + - [ 24.2602, 1.58150, 0.20140, -0.11800 ] + - [ 25.0199, 1.55630, 0.21350, -0.12490 ] + - [ 25.7802, 1.52720, 0.22670, -0.13250 ] + - [ 26.5302, 1.49820, 0.23990, -0.14000 ] + - [ 27.2900, 1.46910, 0.25310, -0.14760 ] + - [ 28.0497, 1.44010, 0.26630, -0.15510 ] + - [ 28.8100, 1.41100, 0.27950, -0.16270 ] + - [ 29.5600, 1.38200, 0.29270, -0.17030 ] + - [ 30.3198, 1.36220, 0.30780, -0.17400 ] + - [ 31.0801, 1.34240, 0.32300, -0.17770 ] + - [ 31.8301, 1.32250, 0.33810, -0.18150 ] + - [ 32.5898, 1.30270, 0.35320, -0.18520 ] + - [ 33.3502, 1.28290, 0.36840, -0.18890 ] + - [ 34.1002, 1.26310, 0.38350, -0.19260 ] + - [ 34.8599, 1.24330, 0.39870, -0.19640 ] + - [ 35.6202, 1.22340, 0.41380, -0.20010 ] + - [ 36.3800, 1.20360, 0.42890, -0.20390 ] + - [ 37.1300, 1.18380, 0.44410, -0.20760 ] + - [ 37.8903, 1.16400, 0.45920, -0.21130 ] + - [ 38.6500, 1.14420, 0.47430, -0.21500 ] + - [ 39.4000, 1.12430, 0.48950, -0.21880 ] + - [ 40.1598, 1.10640, 0.50520, -0.22180 ] + - [ 40.9201, 1.09050, 0.52140, -0.22420 ] + - [ 41.6701, 1.07450, 0.53760, -0.22660 ] + - [ 42.4298, 1.05860, 0.55380, -0.22890 ] + - [ 43.1901, 1.04260, 0.57010, -0.23130 ] + - [ 43.9401, 1.02670, 0.58630, -0.23370 ] + - [ 44.6999, 1.01070, 0.60250, -0.23610 ] + - [ 45.4602, 0.99480, 0.61880, -0.23840 ] + - [ 46.2199, 0.97880, 0.63500, -0.24080 ] + - [ 46.9699, 0.96280, 0.65120, -0.24320 ] + - [ 47.7302, 0.94690, 0.66750, -0.24550 ] + - [ 48.4900, 0.93090, 0.68370, -0.24790 ] + - [ 49.2400, 0.91500, 0.69990, -0.25030 ] + - [ 49.9997, 0.89900, 0.71610, -0.25270 ] + - [ 60.0001, 0.68360, 0.92460, -0.28330 ] + - [ 70.0000, 0.45560, 1.09850, -0.31560 ] + - [ 79.9998, 0.22190, 1.21820, -0.34820 ] + - [ 90.0002, 0.00000, 1.27070, -0.37730 ] + - [ 100.0000, -0.15530, 1.21820, -0.38770 ] + - [ 109.9999, -0.31890, 1.09850, -0.38650 ] + - [ 120.0003, -0.47840, 0.92460, -0.38060 ] + - [ 130.0001, -0.62930, 0.71610, -0.38030 ] + - [ 139.9999, -0.78010, 0.49700, -0.40320 ] + - [ 149.9998, -0.96740, 0.29270, -0.48540 ] + - [ 160.0002, -0.88370, 0.12680, -0.53250 ] + - [ 170.0000, -0.44180, 0.08440, -0.39060 ] + - [ 179.9660, 0.00000, 0.08440, 0.00000 ] + - name : FFA-W3-211 # + relative_thickness : 0.211 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.02464, 0.00000 ] + - [ -177.7143, 0.05403, 0.02534, 0.09143 ] + - [ -175.4286, 0.10805, 0.02742, 0.18286 ] + - [ -173.1429, 0.16208, 0.03088, 0.27429 ] + - [ -170.8572, 0.21610, 0.03570, 0.36571 ] + - [ -168.5716, 0.27013, 0.05599, 0.39192 ] + - [ -166.2857, 0.32415, 0.08143, 0.37898 ] + - [ -164.0000, 0.37818, 0.11112, 0.36605 ] + - [ -161.7145, 0.43220, 0.14485, 0.35312 ] + - [ -159.4284, 0.48623, 0.18242, 0.34768 ] + - [ -157.1428, 0.54025, 0.22359, 0.36471 ] + - [ -154.8573, 0.59428, 0.26810, 0.38175 ] + - [ -152.5714, 0.64830, 0.31566, 0.39878 ] + - [ -150.2857, 0.70233, 0.36597, 0.41581 ] + - [ -148.0000, 0.75635, 0.41871, 0.41955 ] + - [ -143.8571, 0.73188, 0.51941, 0.42287 ] + - [ -139.7143, 0.70655, 0.62488, 0.42632 ] + - [ -135.5714, 0.67760, 0.73293, 0.43163 ] + - [ -131.4286, 0.64333, 0.84130, 0.43694 ] + - [ -127.2857, 0.60277, 0.94773, 0.44389 ] + - [ -123.1429, 0.55550, 1.05001, 0.45171 ] + - [ -119.0000, 0.50156, 1.14600, 0.45897 ] + - [ -114.8571, 0.44131, 1.23371, 0.46448 ] + - [ -110.7143, 0.37542, 1.31129, 0.46998 ] + - [ -106.5714, 0.30482, 1.37714, 0.47096 ] + - [ -102.4286, 0.23063, 1.42988, 0.47101 ] + - [ -98.2857, 0.15413, 1.46842, 0.46824 ] + - [ -94.1429, 0.07675, 1.49196, 0.46149 ] + - [ -90.0000, 0.00000, 1.50000, 0.45474 ] + - [ -85.8571, -0.07675, 1.49196, 0.44026 ] + - [ -81.7143, -0.15413, 1.46842, 0.42578 ] + - [ -77.5714, -0.23063, 1.42988, 0.40821 ] + - [ -73.4286, -0.30482, 1.37714, 0.38846 ] + - [ -69.2857, -0.37542, 1.31129, 0.36815 ] + - [ -65.1429, -0.44131, 1.23371, 0.34519 ] + - [ -61.0000, -0.50156, 1.14600, 0.32223 ] + - [ -56.8571, -0.55550, 1.05001, 0.29864 ] + - [ -52.7143, -0.60277, 0.94773, 0.27486 ] + - [ -48.5714, -0.64333, 0.84130, 0.25128 ] + - [ -44.4286, -0.67760, 0.73293, 0.22810 ] + - [ -40.2857, -0.70655, 0.62488, 0.20491 ] + - [ -36.1429, -0.73188, 0.51941, 0.15416 ] + - [ -32.0000, -0.75635, 0.41871, 0.10137 ] + - [ -28.0000, -0.85636, 0.28691, 0.06527 ] + - [ -24.0000, -1.18292, 0.13960, 0.01647 ] + - [ -20.0000, -1.23596, 0.08345, -0.00352 ] + - [ -18.0000, -1.22536, 0.06509, -0.00672 ] + - [ -16.0000, -1.20476, 0.04888, -0.00881 ] + - [ -14.0000, -1.18332, 0.03417, -0.01101 ] + - [ -12.0000, -1.10093, 0.02132, -0.02269 ] + - [ -10.0000, -0.88209, 0.01386, -0.04397 ] + - [ -8.0000, -0.62981, 0.01075, -0.05756 ] + - [ -6.0000, -0.37670, 0.00882, -0.06747 ] + - [ -4.0000, -0.12177, 0.00702, -0.07680 ] + - [ -2.0000, 0.12810, 0.00663, -0.08283 ] + - [ -1.0000, 0.25192, 0.00664, -0.08534 ] + - [ 0.0000, 0.37535, 0.00670, -0.08777 ] + - [ 1.0000, 0.49828, 0.00681, -0.09011 ] + - [ 2.0000, 0.62052, 0.00698, -0.09234 ] + - [ 3.0000, 0.74200, 0.00720, -0.09447 ] + - [ 4.0000, 0.86238, 0.00751, -0.09646 ] + - [ 5.0000, 0.98114, 0.00796, -0.09828 ] + - [ 6.0000, 1.09662, 0.00872, -0.09977 ] + - [ 7.0000, 1.20904, 0.00968, -0.10095 ] + - [ 8.0000, 1.31680, 0.01097, -0.10163 ] + - [ 9.0000, 1.42209, 0.01227, -0.10207 ] + - [ 10.0000, 1.52361, 0.01369, -0.10213 ] + - [ 11.0000, 1.61988, 0.01529, -0.10174 ] + - [ 12.0000, 1.70937, 0.01717, -0.10087 ] + - [ 13.0000, 1.78681, 0.01974, -0.09936 ] + - [ 14.0000, 1.84290, 0.02368, -0.09720 ] + - [ 15.0000, 1.85313, 0.03094, -0.09410 ] + - [ 16.0000, 1.80951, 0.04303, -0.09144 ] + - [ 18.0000, 1.66033, 0.07730, -0.09242 ] + - [ 20.0000, 1.56152, 0.11202, -0.09871 ] + - [ 24.0000, 1.43327, 0.18408, -0.11770 ] + - [ 28.0000, 1.29062, 0.27589, -0.14566 ] + - [ 32.0000, 1.08050, 0.41871, -0.18266 ] + - [ 36.1429, 1.04554, 0.51941, -0.20913 ] + - [ 40.2857, 1.00936, 0.62488, -0.23534 ] + - [ 44.4286, 0.96801, 0.73293, -0.25784 ] + - [ 48.5714, 0.91904, 0.84130, -0.28035 ] + - [ 52.7143, 0.86109, 0.94773, -0.30163 ] + - [ 56.8571, 0.79357, 1.05001, -0.32226 ] + - [ 61.0000, 0.71651, 1.14600, -0.34247 ] + - [ 65.1429, 0.63044, 1.23371, -0.36135 ] + - [ 69.2857, 0.53632, 1.31129, -0.38024 ] + - [ 73.4286, 0.43546, 1.37714, -0.39704 ] + - [ 77.5714, 0.32947, 1.42988, -0.41341 ] + - [ 81.7143, 0.22019, 1.46842, -0.42844 ] + - [ 85.8571, 0.10965, 1.49196, -0.44159 ] + - [ 90.0000, 0.00000, 1.50000, -0.45474 ] + - [ 94.1429, -0.07675, 1.49196, -0.46149 ] + - [ 98.2857, -0.15413, 1.46842, -0.46824 ] + - [ 102.4286, -0.23063, 1.42988, -0.47101 ] + - [ 106.5714, -0.30482, 1.37714, -0.47096 ] + - [ 110.7143, -0.37542, 1.31129, -0.46998 ] + - [ 114.8571, -0.44131, 1.23371, -0.46448 ] + - [ 119.0000, -0.50156, 1.14600, -0.45897 ] + - [ 123.1429, -0.55550, 1.05001, -0.45171 ] + - [ 127.2857, -0.60277, 0.94773, -0.44389 ] + - [ 131.4286, -0.64333, 0.84130, -0.43694 ] + - [ 135.5714, -0.67760, 0.73293, -0.43163 ] + - [ 139.7143, -0.70655, 0.62488, -0.42632 ] + - [ 143.8571, -0.73188, 0.51941, -0.42287 ] + - [ 148.0000, -0.75635, 0.41871, -0.41955 ] + - [ 150.2857, -0.70233, 0.36597, -0.41581 ] + - [ 152.5714, -0.64830, 0.31566, -0.39878 ] + - [ 154.8571, -0.59428, 0.26810, -0.38175 ] + - [ 157.1429, -0.54025, 0.22359, -0.36471 ] + - [ 159.4286, -0.48623, 0.18242, -0.34768 ] + - [ 161.7143, -0.43220, 0.14485, -0.37026 ] + - [ 164.0000, -0.37818, 0.11112, -0.40605 ] + - [ 166.2857, -0.32415, 0.08143, -0.44184 ] + - [ 168.5714, -0.27013, 0.05599, -0.47763 ] + - [ 170.8571, -0.21610, 0.03570, -0.45714 ] + - [ 173.1429, -0.16208, 0.03088, -0.34286 ] + - [ 175.4286, -0.10805, 0.02742, -0.22857 ] + - [ 177.7143, -0.05403, 0.02534, -0.11429 ] + - [ 179.9087, 0.00000, 0.02464, 0.00000 ] + - name : FFA-W3-241 # + relative_thickness : 0.241 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.01178, 0.00000 ] + - [ -177.7143, 0.05818, 0.01248, 0.09143 ] + - [ -175.4286, 0.11636, 0.01460, 0.18286 ] + - [ -173.1429, 0.17453, 0.01811, 0.27429 ] + - [ -170.8572, 0.23271, 0.02300, 0.36571 ] + - [ -168.5716, 0.29089, 0.02922, 0.39568 ] + - [ -166.2857, 0.34907, 0.05382, 0.38876 ] + - [ -164.0000, 0.40725, 0.08379, 0.38184 ] + - [ -161.7145, 0.46542, 0.11786, 0.37492 ] + - [ -159.4284, 0.52360, 0.15581, 0.37408 ] + - [ -157.1428, 0.58178, 0.19740, 0.39148 ] + - [ -154.8573, 0.63996, 0.24237, 0.40888 ] + - [ -152.5714, 0.69814, 0.29043, 0.42628 ] + - [ -150.2857, 0.75631, 0.34128, 0.44368 ] + - [ -148.0000, 0.81449, 0.39460, 0.44537 ] + - [ -143.8571, 0.77925, 0.49645, 0.44436 ] + - [ -139.7143, 0.74511, 0.60319, 0.44360 ] + - [ -135.5714, 0.70881, 0.71263, 0.44609 ] + - [ -131.4286, 0.66835, 0.82249, 0.44858 ] + - [ -127.2857, 0.62253, 0.93051, 0.45370 ] + - [ -123.1429, 0.57080, 1.03447, 0.46020 ] + - [ -119.0000, 0.51307, 1.13222, 0.46633 ] + - [ -114.8571, 0.44965, 1.22176, 0.47130 ] + - [ -110.7143, 0.38115, 1.30123, 0.47627 ] + - [ -106.5714, 0.30846, 1.36903, 0.47705 ] + - [ -102.4286, 0.23266, 1.42376, 0.47695 ] + - [ -98.2857, 0.15503, 1.46433, 0.47409 ] + - [ -94.1429, 0.07698, 1.48990, 0.46732 ] + - [ -90.0000, 0.00000, 1.50000, 0.46055 ] + - [ -85.8571, -0.07698, 1.48990, 0.44509 ] + - [ -81.7143, -0.15503, 1.46433, 0.42964 ] + - [ -77.5714, -0.23266, 1.42376, 0.41125 ] + - [ -73.4286, -0.30846, 1.36903, 0.39081 ] + - [ -69.2857, -0.38115, 1.30123, 0.36988 ] + - [ -65.1429, -0.44965, 1.22176, 0.34663 ] + - [ -61.0000, -0.51307, 1.13222, 0.32339 ] + - [ -56.8571, -0.57080, 1.03447, 0.29984 ] + - [ -52.7143, -0.62253, 0.93051, 0.27618 ] + - [ -48.5714, -0.66835, 0.82249, 0.25280 ] + - [ -44.4286, -0.70881, 0.71263, 0.22992 ] + - [ -40.2857, -0.74511, 0.60319, 0.20705 ] + - [ -36.1429, -0.77925, 0.49645, 0.14561 ] + - [ -32.0000, -0.81449, 0.39460, 0.08131 ] + - [ -28.0000, -1.07781, 0.22252, 0.04592 ] + - [ -24.0000, -1.12692, 0.15159, 0.01901 ] + - [ -20.0000, -1.14480, 0.09699, 0.00063 ] + - [ -18.0000, -1.12797, 0.07744, -0.00342 ] + - [ -16.0000, -1.09392, 0.06122, -0.00587 ] + - [ -14.0000, -1.05961, 0.04667, -0.00652 ] + - [ -12.0000, -1.03121, 0.03302, -0.00755 ] + - [ -10.0000, -0.93706, 0.02027, -0.02243 ] + - [ -8.0000, -0.67380, 0.01168, -0.05583 ] + - [ -6.0000, -0.40391, 0.00918, -0.07159 ] + - [ -4.0000, -0.14226, 0.00839, -0.08123 ] + - [ -2.0000, 0.11580, 0.00810, -0.08892 ] + - [ -1.0000, 0.24382, 0.00808, -0.09235 ] + - [ 0.0000, 0.37113, 0.00813, -0.09556 ] + - [ 1.0000, 0.49766, 0.00824, -0.09857 ] + - [ 2.0000, 0.62334, 0.00842, -0.10139 ] + - [ 3.0000, 0.74798, 0.00867, -0.10403 ] + - [ 4.0000, 0.87137, 0.00901, -0.10645 ] + - [ 5.0000, 0.99320, 0.00945, -0.10863 ] + - [ 6.0000, 1.11325, 0.00998, -0.11057 ] + - [ 7.0000, 1.23037, 0.01070, -0.11214 ] + - [ 8.0000, 1.34496, 0.01153, -0.11337 ] + - [ 9.0000, 1.45407, 0.01269, -0.11396 ] + - [ 10.0000, 1.55911, 0.01396, -0.11403 ] + - [ 11.0000, 1.65779, 0.01545, -0.11336 ] + - [ 12.0000, 1.74834, 0.01724, -0.11187 ] + - [ 13.0000, 1.82666, 0.01961, -0.10935 ] + - [ 14.0000, 1.88831, 0.02293, -0.10606 ] + - [ 15.0000, 1.92579, 0.02795, -0.10238 ] + - [ 16.0000, 1.92722, 0.03609, -0.09887 ] + - [ 18.0000, 1.80055, 0.06534, -0.09497 ] + - [ 20.0000, 1.63088, 0.10459, -0.09996 ] + - [ 24.0000, 1.43345, 0.19148, -0.12589 ] + - [ 28.0000, 1.28805, 0.28629, -0.15453 ] + - [ 32.0000, 1.16356, 0.39460, -0.18396 ] + - [ 36.1429, 1.11321, 0.49645, -0.21099 ] + - [ 40.2857, 1.06444, 0.60319, -0.23768 ] + - [ 44.4286, 1.01259, 0.71263, -0.25992 ] + - [ 48.5714, 0.95478, 0.82249, -0.28216 ] + - [ 52.7143, 0.88932, 0.93051, -0.30323 ] + - [ 56.8571, 0.81542, 1.03447, -0.32368 ] + - [ 61.0000, 0.73296, 1.13222, -0.34380 ] + - [ 65.1429, 0.64236, 1.22176, -0.36292 ] + - [ 69.2857, 0.54450, 1.30123, -0.38204 ] + - [ 73.4286, 0.44065, 1.36903, -0.39944 ] + - [ 77.5714, 0.33237, 1.42376, -0.41648 ] + - [ 81.7143, 0.22148, 1.46433, -0.43231 ] + - [ 85.8571, 0.10997, 1.48990, -0.44643 ] + - [ 90.0000, 0.00000, 1.50000, -0.46055 ] + - [ 94.1429, -0.07698, 1.48990, -0.46732 ] + - [ 98.2857, -0.15503, 1.46433, -0.47409 ] + - [ 102.4286, -0.23266, 1.42376, -0.47695 ] + - [ 106.5714, -0.30846, 1.36903, -0.47705 ] + - [ 110.7143, -0.38115, 1.30123, -0.47627 ] + - [ 114.8571, -0.44965, 1.22176, -0.47130 ] + - [ 119.0000, -0.51307, 1.13222, -0.46633 ] + - [ 123.1429, -0.57080, 1.03447, -0.46020 ] + - [ 127.2857, -0.62253, 0.93051, -0.45370 ] + - [ 131.4286, -0.66835, 0.82249, -0.44858 ] + - [ 135.5714, -0.70881, 0.71263, -0.44609 ] + - [ 139.7143, -0.74511, 0.60319, -0.44360 ] + - [ 143.8571, -0.77925, 0.49645, -0.44436 ] + - [ 148.0000, -0.81449, 0.39460, -0.44537 ] + - [ 150.2857, -0.75631, 0.34128, -0.44368 ] + - [ 152.5714, -0.69814, 0.29043, -0.42628 ] + - [ 154.8571, -0.63996, 0.24237, -0.40888 ] + - [ 157.1429, -0.58178, 0.19740, -0.39148 ] + - [ 159.4286, -0.52360, 0.15581, -0.37408 ] + - [ 161.7143, -0.46542, 0.11786, -0.39207 ] + - [ 164.0000, -0.40725, 0.08379, -0.42184 ] + - [ 166.2857, -0.34907, 0.05382, -0.45162 ] + - [ 168.5714, -0.29089, 0.02922, -0.48139 ] + - [ 170.8571, -0.23271, 0.02300, -0.45714 ] + - [ 173.1429, -0.17453, 0.01811, -0.34286 ] + - [ 175.4286, -0.11636, 0.01460, -0.22857 ] + - [ 177.7143, -0.05818, 0.01248, -0.11429 ] + - [ 179.9087, 0.00000, 0.01178, 0.00000 ] + - name : FFA-W3-270blend # + relative_thickness : 0.27 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.01545, 0.00000 ] + - [ -177.7143, 0.06213, 0.01611, 0.09143 ] + - [ -175.4286, 0.12426, 0.01807, 0.18286 ] + - [ -173.1429, 0.18639, 0.02133, 0.27429 ] + - [ -170.8572, 0.24852, 0.02587, 0.36571 ] + - [ -168.5716, 0.31064, 0.03289, 0.39874 ] + - [ -166.2857, 0.37277, 0.05681, 0.39672 ] + - [ -164.0000, 0.43490, 0.08471, 0.39470 ] + - [ -161.7145, 0.49703, 0.11643, 0.39268 ] + - [ -159.4284, 0.55916, 0.15176, 0.39544 ] + - [ -157.1428, 0.62129, 0.19048, 0.41254 ] + - [ -154.8573, 0.68342, 0.23234, 0.42964 ] + - [ -152.5714, 0.74555, 0.27708, 0.44674 ] + - [ -150.2857, 0.80768, 0.32441, 0.46384 ] + - [ -148.0000, 0.86981, 0.37404, 0.46186 ] + - [ -143.8571, 0.81660, 0.46882, 0.45335 ] + - [ -139.7143, 0.76812, 0.56814, 0.44523 ] + - [ -135.5714, 0.72040, 0.66995, 0.44237 ] + - [ -131.4286, 0.67095, 0.77214, 0.43951 ] + - [ -127.2857, 0.61828, 0.87258, 0.44072 ] + - [ -123.1429, 0.56158, 0.96921, 0.44407 ] + - [ -119.0000, 0.50057, 1.06002, 0.44739 ] + - [ -114.8571, 0.43540, 1.14315, 0.45063 ] + - [ -110.7143, 0.36655, 1.21688, 0.45387 ] + - [ -106.5714, 0.29475, 1.27969, 0.45377 ] + - [ -102.4286, 0.22098, 1.33030, 0.45298 ] + - [ -98.2857, 0.14639, 1.36768, 0.44973 ] + - [ -94.1429, 0.07227, 1.39107, 0.44302 ] + - [ -90.0000, 0.00000, 1.40000, 0.43630 ] + - [ -85.8571, -0.07227, 1.39107, 0.42180 ] + - [ -81.7143, -0.14639, 1.36768, 0.40730 ] + - [ -77.5714, -0.22098, 1.33030, 0.39020 ] + - [ -73.4286, -0.29475, 1.27969, 0.37125 ] + - [ -69.2857, -0.36655, 1.21688, 0.35190 ] + - [ -65.1429, -0.43540, 1.14315, 0.33068 ] + - [ -61.0000, -0.50057, 1.06002, 0.30945 ] + - [ -56.8571, -0.56158, 0.96921, 0.28815 ] + - [ -52.7143, -0.61828, 0.87258, 0.26684 ] + - [ -48.5714, -0.67095, 0.77214, 0.24576 ] + - [ -44.4286, -0.72040, 0.66995, 0.22512 ] + - [ -40.2857, -0.76812, 0.56814, 0.20447 ] + - [ -36.1429, -0.81660, 0.46882, 0.13957 ] + - [ -32.0000, -0.86981, 0.37404, 0.07138 ] + - [ -28.0000, -1.09837, 0.21880, 0.04400 ] + - [ -24.0000, -1.08339, 0.15982, 0.02166 ] + - [ -20.0000, -1.06990, 0.10744, 0.00422 ] + - [ -18.0000, -1.05454, 0.08690, -0.00035 ] + - [ -16.0000, -1.03432, 0.06844, -0.00334 ] + - [ -14.0000, -1.08360, 0.04733, -0.00283 ] + - [ -12.0000, -1.09489, 0.03085, -0.00556 ] + - [ -10.0000, -0.92665, 0.01984, -0.02952 ] + - [ -8.0000, -0.69676, 0.01439, -0.04822 ] + - [ -6.0000, -0.43628, 0.01155, -0.06483 ] + - [ -4.0000, -0.16252, 0.01026, -0.07919 ] + - [ -2.0000, 0.10709, 0.00976, -0.09041 ] + - [ -1.0000, 0.23993, 0.00967, -0.09517 ] + - [ 0.0000, 0.37158, 0.00968, -0.09953 ] + - [ 1.0000, 0.50210, 0.00976, -0.10355 ] + - [ 2.0000, 0.63139, 0.00993, -0.10725 ] + - [ 3.0000, 0.75951, 0.01016, -0.11068 ] + - [ 4.0000, 0.88638, 0.01045, -0.11385 ] + - [ 5.0000, 1.01172, 0.01082, -0.11673 ] + - [ 6.0000, 1.13430, 0.01140, -0.11923 ] + - [ 7.0000, 1.25536, 0.01198, -0.12145 ] + - [ 8.0000, 1.37379, 0.01267, -0.12328 ] + - [ 9.0000, 1.48841, 0.01353, -0.12460 ] + - [ 10.0000, 1.59782, 0.01460, -0.12526 ] + - [ 11.0000, 1.70005, 0.01597, -0.12505 ] + - [ 12.0000, 1.79190, 0.01777, -0.12370 ] + - [ 13.0000, 1.86782, 0.02035, -0.12093 ] + - [ 14.0000, 1.92687, 0.02385, -0.11725 ] + - [ 15.0000, 1.90901, 0.03236, -0.10931 ] + - [ 16.0000, 1.88548, 0.04259, -0.10525 ] + - [ 18.0000, 1.72106, 0.07672, -0.10292 ] + - [ 20.0000, 1.54737, 0.11914, -0.11017 ] + - [ 24.0000, 1.37176, 0.20189, -0.13431 ] + - [ 28.0000, 1.33611, 0.27981, -0.15777 ] + - [ 32.0000, 1.24258, 0.37404, -0.18432 ] + - [ 36.1429, 1.16657, 0.46882, -0.21002 ] + - [ 40.2857, 1.09731, 0.56814, -0.23531 ] + - [ 44.4286, 1.02914, 0.66995, -0.25508 ] + - [ 48.5714, 0.95850, 0.77214, -0.27485 ] + - [ 52.7143, 0.88325, 0.87258, -0.29346 ] + - [ 56.8571, 0.80225, 0.96921, -0.31145 ] + - [ 61.0000, 0.71510, 1.06002, -0.32925 ] + - [ 65.1429, 0.62200, 1.14315, -0.34641 ] + - [ 69.2857, 0.52364, 1.21688, -0.36357 ] + - [ 73.4286, 0.42107, 1.27969, -0.37949 ] + - [ 77.5714, 0.31569, 1.33030, -0.39517 ] + - [ 81.7143, 0.20913, 1.36768, -0.40983 ] + - [ 85.8571, 0.10324, 1.39107, -0.42306 ] + - [ 90.0000, 0.00000, 1.40000, -0.43630 ] + - [ 94.1429, -0.07227, 1.39107, -0.44302 ] + - [ 98.2857, -0.14639, 1.36768, -0.44973 ] + - [ 102.4286, -0.22098, 1.33030, -0.45298 ] + - [ 106.5714, -0.29475, 1.27969, -0.45377 ] + - [ 110.7143, -0.36655, 1.21688, -0.45387 ] + - [ 114.8571, -0.43540, 1.14315, -0.45063 ] + - [ 119.0000, -0.50057, 1.06002, -0.44739 ] + - [ 123.1429, -0.56158, 0.96921, -0.44407 ] + - [ 127.2857, -0.61828, 0.87258, -0.44072 ] + - [ 131.4286, -0.67095, 0.77214, -0.43951 ] + - [ 135.5714, -0.72040, 0.66995, -0.44237 ] + - [ 139.7143, -0.76812, 0.56814, -0.44523 ] + - [ 143.8571, -0.81660, 0.46882, -0.45335 ] + - [ 148.0000, -0.86981, 0.37404, -0.46186 ] + - [ 150.2857, -0.80768, 0.32441, -0.46384 ] + - [ 152.5714, -0.74555, 0.27708, -0.44674 ] + - [ 154.8571, -0.68342, 0.23234, -0.42964 ] + - [ 157.1429, -0.62129, 0.19048, -0.41254 ] + - [ 159.4286, -0.55916, 0.15176, -0.39544 ] + - [ 161.7143, -0.49703, 0.11643, -0.40982 ] + - [ 164.0000, -0.43490, 0.08471, -0.43470 ] + - [ 166.2857, -0.37277, 0.05681, -0.45958 ] + - [ 168.5714, -0.31064, 0.03289, -0.48445 ] + - [ 170.8571, -0.24852, 0.02587, -0.45714 ] + - [ 173.1429, -0.18639, 0.02133, -0.34286 ] + - [ 175.4286, -0.12426, 0.01807, -0.22857 ] + - [ 177.7143, -0.06213, 0.01611, -0.11429 ] + - [ 179.9087, 0.00000, 0.01545, 0.00000 ] + - name : FFA-W3-301 # + relative_thickness : 0.301 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.02454, 0.00000 ] + - [ -177.7143, 0.06508, 0.02514, 0.09143 ] + - [ -175.4286, 0.13016, 0.02694, 0.18286 ] + - [ -173.1429, 0.19525, 0.02993, 0.27429 ] + - [ -170.8572, 0.26033, 0.03408, 0.36571 ] + - [ -168.5716, 0.32541, 0.03938, 0.40085 ] + - [ -166.2857, 0.39049, 0.05910, 0.40220 ] + - [ -164.0000, 0.45557, 0.08495, 0.40356 ] + - [ -161.7145, 0.52066, 0.11433, 0.40492 ] + - [ -159.4284, 0.58574, 0.14704, 0.41010 ] + - [ -157.1428, 0.65082, 0.18290, 0.42678 ] + - [ -154.8573, 0.71590, 0.22166, 0.44345 ] + - [ -152.5714, 0.78098, 0.26309, 0.46013 ] + - [ -150.2857, 0.84607, 0.30692, 0.47680 ] + - [ -148.0000, 0.91115, 0.35287, 0.47162 ] + - [ -143.8571, 0.84257, 0.44061, 0.45656 ] + - [ -139.7143, 0.78187, 0.53255, 0.44202 ] + - [ -135.5714, 0.72448, 0.62677, 0.43452 ] + - [ -131.4286, 0.66755, 0.72131, 0.42701 ] + - [ -127.2857, 0.60928, 0.81421, 0.42483 ] + - [ -123.1429, 0.54868, 0.90355, 0.42544 ] + - [ -119.0000, 0.48530, 0.98748, 0.42634 ] + - [ -114.8571, 0.41915, 1.06425, 0.42813 ] + - [ -110.7143, 0.35056, 1.13227, 0.42992 ] + - [ -106.5714, 0.28017, 1.19015, 0.42916 ] + - [ -102.4286, 0.20881, 1.23669, 0.42788 ] + - [ -98.2857, 0.13754, 1.27093, 0.42444 ] + - [ -94.1429, 0.06751, 1.29218, 0.41794 ] + - [ -90.0000, 0.00000, 1.30000, 0.41144 ] + - [ -85.8571, -0.06751, 1.29218, 0.39804 ] + - [ -81.7143, -0.13754, 1.27093, 0.38464 ] + - [ -77.5714, -0.20881, 1.23669, 0.36892 ] + - [ -73.4286, -0.28017, 1.19015, 0.35157 ] + - [ -69.2857, -0.35056, 1.13227, 0.33391 ] + - [ -65.1429, -0.41915, 1.06425, 0.31474 ] + - [ -61.0000, -0.48530, 0.98748, 0.29557 ] + - [ -56.8571, -0.54868, 0.90355, 0.27653 ] + - [ -52.7143, -0.60928, 0.81421, 0.25754 ] + - [ -48.5714, -0.66755, 0.72131, 0.23873 ] + - [ -44.4286, -0.72448, 0.62677, 0.22027 ] + - [ -40.2857, -0.78187, 0.53255, 0.20181 ] + - [ -36.1429, -0.84257, 0.44061, 0.13644 ] + - [ -32.0000, -0.91115, 0.35287, 0.06760 ] + - [ -28.0000, -1.10349, 0.21721, 0.04231 ] + - [ -24.0000, -1.10737, 0.15629, 0.02026 ] + - [ -20.0000, -1.11815, 0.10335, 0.00407 ] + - [ -18.0000, -1.12332, 0.08180, 0.00017 ] + - [ -16.0000, -1.11865, 0.06331, -0.00167 ] + - [ -14.0000, -1.11620, 0.04718, -0.00120 ] + - [ -12.0000, -1.09588, 0.03280, -0.00463 ] + - [ -10.0000, -0.91767, 0.02351, -0.02494 ] + - [ -8.0000, -0.69311, 0.01793, -0.04304 ] + - [ -6.0000, -0.45396, 0.01431, -0.05868 ] + - [ -4.0000, -0.17779, 0.01242, -0.07601 ] + - [ -2.0000, 0.10480, 0.01160, -0.09121 ] + - [ -1.0000, 0.24383, 0.01143, -0.09763 ] + - [ 0.0000, 0.38111, 0.01138, -0.10341 ] + - [ 1.0000, 0.51660, 0.01143, -0.10861 ] + - [ 2.0000, 0.65044, 0.01156, -0.11333 ] + - [ 3.0000, 0.78267, 0.01177, -0.11762 ] + - [ 4.0000, 0.91326, 0.01204, -0.12154 ] + - [ 5.0000, 1.04207, 0.01239, -0.12510 ] + - [ 6.0000, 1.16873, 0.01283, -0.12828 ] + - [ 7.0000, 1.29296, 0.01338, -0.13104 ] + - [ 8.0000, 1.41390, 0.01406, -0.13332 ] + - [ 9.0000, 1.53088, 0.01488, -0.13503 ] + - [ 10.0000, 1.64208, 0.01592, -0.13599 ] + - [ 11.0000, 1.74568, 0.01726, -0.13605 ] + - [ 12.0000, 1.83887, 0.01908, -0.13514 ] + - [ 13.0000, 1.91764, 0.02169, -0.13322 ] + - [ 14.0000, 1.97413, 0.02572, -0.13020 ] + - [ 15.0000, 1.99916, 0.03222, -0.12641 ] + - [ 16.0000, 1.99377, 0.04157, -0.12265 ] + - [ 18.0000, 1.91720, 0.06731, -0.11675 ] + - [ 20.0000, 1.73683, 0.10526, -0.11652 ] + - [ 24.0000, 1.47321, 0.19229, -0.13790 ] + - [ 28.0000, 1.36017, 0.27449, -0.16242 ] + - [ 32.0000, 1.30164, 0.35287, -0.18463 ] + - [ 36.1429, 1.20367, 0.44061, -0.20894 ] + - [ 40.2857, 1.11695, 0.53255, -0.23276 ] + - [ 44.4286, 1.03498, 0.62677, -0.25011 ] + - [ 48.5714, 0.95364, 0.72131, -0.26746 ] + - [ 52.7143, 0.87040, 0.81421, -0.28365 ] + - [ 56.8571, 0.78383, 0.90355, -0.29923 ] + - [ 61.0000, 0.69329, 0.98748, -0.31472 ] + - [ 65.1429, 0.59878, 1.06425, -0.32988 ] + - [ 69.2857, 0.50080, 1.13227, -0.34505 ] + - [ 73.4286, 0.40024, 1.19015, -0.35942 ] + - [ 77.5714, 0.29831, 1.23669, -0.37363 ] + - [ 81.7143, 0.19648, 1.27093, -0.38702 ] + - [ 85.8571, 0.09644, 1.29218, -0.39923 ] + - [ 90.0000, 0.00000, 1.30000, -0.41144 ] + - [ 94.1429, -0.06751, 1.29218, -0.41794 ] + - [ 98.2857, -0.13754, 1.27093, -0.42444 ] + - [ 102.4286, -0.20881, 1.23669, -0.42788 ] + - [ 106.5714, -0.28017, 1.19015, -0.42916 ] + - [ 110.7143, -0.35056, 1.13227, -0.42992 ] + - [ 114.8571, -0.41915, 1.06425, -0.42813 ] + - [ 119.0000, -0.48530, 0.98748, -0.42634 ] + - [ 123.1429, -0.54868, 0.90355, -0.42544 ] + - [ 127.2857, -0.60928, 0.81421, -0.42483 ] + - [ 131.4286, -0.66755, 0.72131, -0.42701 ] + - [ 135.5714, -0.72448, 0.62677, -0.43452 ] + - [ 139.7143, -0.78187, 0.53255, -0.44202 ] + - [ 143.8571, -0.84257, 0.44061, -0.45656 ] + - [ 148.0000, -0.91115, 0.35287, -0.47162 ] + - [ 150.2857, -0.84607, 0.30692, -0.47680 ] + - [ 152.5714, -0.78098, 0.26309, -0.46013 ] + - [ 154.8571, -0.71590, 0.22166, -0.44345 ] + - [ 157.1429, -0.65082, 0.18290, -0.42678 ] + - [ 159.4286, -0.58574, 0.14704, -0.41010 ] + - [ 161.7143, -0.52066, 0.11433, -0.42206 ] + - [ 164.0000, -0.45557, 0.08495, -0.44356 ] + - [ 166.2857, -0.39049, 0.05910, -0.46506 ] + - [ 168.5714, -0.32541, 0.03938, -0.48656 ] + - [ 170.8571, -0.26033, 0.03408, -0.45714 ] + - [ 173.1429, -0.19525, 0.02993, -0.34286 ] + - [ 175.4286, -0.13016, 0.02694, -0.22857 ] + - [ 177.7143, -0.06508, 0.02514, -0.11429 ] + - [ 179.9087, 0.00000, 0.02454, 0.00000 ] + - name : FFA-W3-330blend # + relative_thickness : 0.33 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.03169, 0.00000 ] + - [ -177.7143, 0.06960, 0.03228, 0.09143 ] + - [ -175.4286, 0.13920, 0.03406, 0.18286 ] + - [ -173.1429, 0.20880, 0.03702, 0.27429 ] + - [ -170.8572, 0.27841, 0.04114, 0.36571 ] + - [ -168.5716, 0.34801, 0.04638, 0.40308 ] + - [ -166.2857, 0.41761, 0.05732, 0.40801 ] + - [ -164.0000, 0.48721, 0.08319, 0.41294 ] + - [ -161.7145, 0.55681, 0.11258, 0.41788 ] + - [ -159.4284, 0.62641, 0.14533, 0.42586 ] + - [ -157.1428, 0.69601, 0.18121, 0.44302 ] + - [ -154.8573, 0.76562, 0.22000, 0.46017 ] + - [ -152.5714, 0.83522, 0.26146, 0.47732 ] + - [ -150.2857, 0.90482, 0.30532, 0.49447 ] + - [ -148.0000, 0.97442, 0.35131, 0.48743 ] + - [ -143.8571, 0.89412, 0.43913, 0.46839 ] + - [ -139.7143, 0.82382, 0.53115, 0.44996 ] + - [ -135.5714, 0.75845, 0.62546, 0.43985 ] + - [ -131.4286, 0.69477, 0.72010, 0.42974 ] + - [ -127.2857, 0.63079, 0.81310, 0.42589 ] + - [ -123.1429, 0.56532, 0.90255, 0.42535 ] + - [ -119.0000, 0.49783, 0.98659, 0.42528 ] + - [ -114.8571, 0.42823, 1.06348, 0.42673 ] + - [ -110.7143, 0.35680, 1.13162, 0.42817 ] + - [ -106.5714, 0.28412, 1.18963, 0.42745 ] + - [ -102.4286, 0.21103, 1.23629, 0.42628 ] + - [ -98.2857, 0.13851, 1.27067, 0.42303 ] + - [ -94.1429, 0.06775, 1.29204, 0.41683 ] + - [ -90.0000, 0.00000, 1.30000, 0.41063 ] + - [ -85.8571, -0.06775, 1.29204, 0.39752 ] + - [ -81.7143, -0.13851, 1.27067, 0.38441 ] + - [ -77.5714, -0.21103, 1.23629, 0.36905 ] + - [ -73.4286, -0.28412, 1.18963, 0.35212 ] + - [ -69.2857, -0.35680, 1.13162, 0.33491 ] + - [ -65.1429, -0.42823, 1.06348, 0.31634 ] + - [ -61.0000, -0.49783, 0.98659, 0.29777 ] + - [ -56.8571, -0.56532, 0.90255, 0.27947 ] + - [ -52.7143, -0.63079, 0.81310, 0.26125 ] + - [ -48.5714, -0.69477, 0.72010, 0.24322 ] + - [ -44.4286, -0.75845, 0.62546, 0.22556 ] + - [ -40.2857, -0.82382, 0.53115, 0.20789 ] + - [ -36.1429, -0.89412, 0.43913, 0.13731 ] + - [ -32.0000, -0.97442, 0.35131, 0.06280 ] + - [ -28.0000, -1.16308, 0.20648, 0.03905 ] + - [ -24.0000, -1.14892, 0.15001, 0.01853 ] + - [ -20.0000, -1.09451, 0.10600, 0.00441 ] + - [ -18.0000, -1.05801, 0.08732, -0.00061 ] + - [ -16.0000, -1.02281, 0.07051, -0.00342 ] + - [ -14.0000, -0.99810, 0.05474, -0.00401 ] + - [ -12.0000, -0.98515, 0.04052, -0.00272 ] + - [ -10.0000, -0.89583, 0.02929, -0.01198 ] + - [ -8.0000, -0.67539, 0.02207, -0.03458 ] + - [ -6.0000, -0.43247, 0.01735, -0.05466 ] + - [ -4.0000, -0.15881, 0.01473, -0.07425 ] + - [ -2.0000, 0.13456, 0.01362, -0.09270 ] + - [ -1.0000, 0.28014, 0.01339, -0.10074 ] + - [ 0.0000, 0.42386, 0.01330, -0.10802 ] + - [ 1.0000, 0.56519, 0.01333, -0.11450 ] + - [ 2.0000, 0.70410, 0.01345, -0.12028 ] + - [ 3.0000, 0.84071, 0.01366, -0.12546 ] + - [ 4.0000, 0.97500, 0.01397, -0.13011 ] + - [ 5.0000, 1.10680, 0.01437, -0.13425 ] + - [ 6.0000, 1.23603, 0.01486, -0.13793 ] + - [ 7.0000, 1.36223, 0.01547, -0.14108 ] + - [ 8.0000, 1.48424, 0.01623, -0.14363 ] + - [ 9.0000, 1.60097, 0.01718, -0.14545 ] + - [ 10.0000, 1.71010, 0.01841, -0.14636 ] + - [ 11.0000, 1.80957, 0.02010, -0.14635 ] + - [ 12.0000, 1.89473, 0.02258, -0.14544 ] + - [ 13.0000, 1.95698, 0.02671, -0.14378 ] + - [ 14.0000, 1.98576, 0.03380, -0.14185 ] + - [ 15.0000, 1.99260, 0.04333, -0.14004 ] + - [ 16.0000, 1.99617, 0.05354, -0.13823 ] + - [ 18.0000, 1.96398, 0.07706, -0.13351 ] + - [ 20.0000, 1.81179, 0.11169, -0.13135 ] + - [ 24.0000, 1.56073, 0.19103, -0.14660 ] + - [ 28.0000, 1.46798, 0.27199, -0.17242 ] + - [ 32.0000, 1.39203, 0.35131, -0.19417 ] + - [ 36.1429, 1.27731, 0.43913, -0.21792 ] + - [ 40.2857, 1.17689, 0.53115, -0.24115 ] + - [ 44.4286, 1.08350, 0.62546, -0.25734 ] + - [ 48.5714, 0.99253, 0.72010, -0.27354 ] + - [ 52.7143, 0.90112, 0.81310, -0.28862 ] + - [ 56.8571, 0.80760, 0.90255, -0.30311 ] + - [ 61.0000, 0.71119, 0.98659, -0.31757 ] + - [ 65.1429, 0.61175, 1.06348, -0.33194 ] + - [ 69.2857, 0.50971, 1.13162, -0.34631 ] + - [ 73.4286, 0.40589, 1.18963, -0.36014 ] + - [ 77.5714, 0.30146, 1.23629, -0.37385 ] + - [ 81.7143, 0.19788, 1.27067, -0.38681 ] + - [ 85.8571, 0.09679, 1.29204, -0.39872 ] + - [ 90.0000, 0.00000, 1.30000, -0.41063 ] + - [ 94.1429, -0.06775, 1.29204, -0.41683 ] + - [ 98.2857, -0.13851, 1.27067, -0.42303 ] + - [ 102.4286, -0.21103, 1.23629, -0.42628 ] + - [ 106.5714, -0.28412, 1.18963, -0.42745 ] + - [ 110.7143, -0.35680, 1.13162, -0.42817 ] + - [ 114.8571, -0.42823, 1.06348, -0.42673 ] + - [ 119.0000, -0.49783, 0.98659, -0.42528 ] + - [ 123.1429, -0.56532, 0.90255, -0.42535 ] + - [ 127.2857, -0.63079, 0.81310, -0.42589 ] + - [ 131.4286, -0.69477, 0.72010, -0.42974 ] + - [ 135.5714, -0.75845, 0.62546, -0.43985 ] + - [ 139.7143, -0.82382, 0.53115, -0.44996 ] + - [ 143.8571, -0.89412, 0.43913, -0.46839 ] + - [ 148.0000, -0.97442, 0.35131, -0.48743 ] + - [ 150.2857, -0.90482, 0.30532, -0.49447 ] + - [ 152.5714, -0.83522, 0.26146, -0.47732 ] + - [ 154.8571, -0.76562, 0.22000, -0.46017 ] + - [ 157.1429, -0.69601, 0.18121, -0.44302 ] + - [ 159.4286, -0.62641, 0.14533, -0.42586 ] + - [ 161.7143, -0.55681, 0.11258, -0.43502 ] + - [ 164.0000, -0.48721, 0.08319, -0.45294 ] + - [ 166.2857, -0.41761, 0.05732, -0.47087 ] + - [ 168.5714, -0.34801, 0.04638, -0.48880 ] + - [ 170.8571, -0.27841, 0.04114, -0.45714 ] + - [ 173.1429, -0.20880, 0.03702, -0.34286 ] + - [ 175.4286, -0.13920, 0.03406, -0.22857 ] + - [ 177.7143, -0.06960, 0.03228, -0.11429 ] + - [ 179.9087, 0.00000, 0.03169, 0.00000 ] + - name : FFA-W3-360 # + relative_thickness : 0.36 # + data: # alpha c_l c_d c_m + - [ -179.9087, 0.00000, 0.03715, 0.00000 ] + - [ -177.7143, 0.07178, 0.03774, 0.09143 ] + - [ -175.4286, 0.14356, 0.03951, 0.18286 ] + - [ -173.1429, 0.21534, 0.04245, 0.27429 ] + - [ -170.8572, 0.28713, 0.04653, 0.36571 ] + - [ -168.5716, 0.35891, 0.05174, 0.40313 ] + - [ -166.2857, 0.43069, 0.06068, 0.40814 ] + - [ -164.0000, 0.50247, 0.08651, 0.41315 ] + - [ -161.7145, 0.57425, 0.11586, 0.41816 ] + - [ -159.4284, 0.64603, 0.14856, 0.42627 ] + - [ -157.1428, 0.71781, 0.18439, 0.44370 ] + - [ -154.8573, 0.78960, 0.22313, 0.46114 ] + - [ -152.5714, 0.86138, 0.26453, 0.47857 ] + - [ -150.2857, 0.93316, 0.30832, 0.49600 ] + - [ -148.0000, 1.00494, 0.35424, 0.48830 ] + - [ -143.8571, 0.91898, 0.44192, 0.46784 ] + - [ -139.7143, 0.84406, 0.53379, 0.44803 ] + - [ -135.5714, 0.77483, 0.62793, 0.43697 ] + - [ -131.4286, 0.70790, 0.72238, 0.42591 ] + - [ -127.2857, 0.64116, 0.81520, 0.42150 ] + - [ -123.1429, 0.57335, 0.90444, 0.42058 ] + - [ -119.0000, 0.50388, 0.98826, 0.42024 ] + - [ -114.8571, 0.43261, 1.06493, 0.42168 ] + - [ -110.7143, 0.35981, 1.13285, 0.42312 ] + - [ -106.5714, 0.28603, 1.19061, 0.42258 ] + - [ -102.4286, 0.21209, 1.23704, 0.42163 ] + - [ -98.2857, 0.13899, 1.27116, 0.41864 ] + - [ -94.1429, 0.06787, 1.29229, 0.41277 ] + - [ -90.0000, 0.00000, 1.30000, 0.40690 ] + - [ -85.8571, -0.06787, 1.29229, 0.39426 ] + - [ -81.7143, -0.13899, 1.27116, 0.38162 ] + - [ -77.5714, -0.21209, 1.23704, 0.36676 ] + - [ -73.4286, -0.28603, 1.19061, 0.35033 ] + - [ -69.2857, -0.35981, 1.13285, 0.33362 ] + - [ -65.1429, -0.43261, 1.06493, 0.31561 ] + - [ -61.0000, -0.50388, 0.98826, 0.29759 ] + - [ -56.8571, -0.57335, 0.90444, 0.27989 ] + - [ -52.7143, -0.64116, 0.81520, 0.26230 ] + - [ -48.5714, -0.70790, 0.72238, 0.24491 ] + - [ -44.4286, -0.77483, 0.62793, 0.22794 ] + - [ -40.2857, -0.84406, 0.53379, 0.21097 ] + - [ -36.1429, -0.91898, 0.44192, 0.13525 ] + - [ -32.0000, -1.00494, 0.35424, 0.05517 ] + - [ -28.0000, -1.11306, 0.20494, 0.03211 ] + - [ -24.0000, -1.05425, 0.15434, 0.01268 ] + - [ -20.0000, -0.98247, 0.10967, -0.00282 ] + - [ -18.0000, -0.94173, 0.09249, -0.00741 ] + - [ -16.0000, -0.89333, 0.07597, -0.01107 ] + - [ -14.0000, -0.85472, 0.06054, -0.01250 ] + - [ -12.0000, -0.82348, 0.04641, -0.01177 ] + - [ -10.0000, -0.79541, 0.03441, -0.01082 ] + - [ -8.0000, -0.63650, 0.02548, -0.02769 ] + - [ -6.0000, -0.39095, 0.01994, -0.05107 ] + - [ -4.0000, -0.13071, 0.01653, -0.07148 ] + - [ -2.0000, 0.16173, 0.01507, -0.09179 ] + - [ -1.0000, 0.31121, 0.01477, -0.10119 ] + - [ 0.0000, 0.45956, 0.01465, -0.10988 ] + - [ 1.0000, 0.60566, 0.01466, -0.11776 ] + - [ 2.0000, 0.74868, 0.01481, -0.12477 ] + - [ 3.0000, 0.88862, 0.01507, -0.13098 ] + - [ 4.0000, 1.02544, 0.01544, -0.13648 ] + - [ 5.0000, 1.15878, 0.01593, -0.14130 ] + - [ 6.0000, 1.28822, 0.01654, -0.14540 ] + - [ 7.0000, 1.41282, 0.01731, -0.14875 ] + - [ 8.0000, 1.53090, 0.01831, -0.15118 ] + - [ 9.0000, 1.64065, 0.01963, -0.15262 ] + - [ 10.0000, 1.73926, 0.02150, -0.15310 ] + - [ 11.0000, 1.81971, 0.02445, -0.15254 ] + - [ 12.0000, 1.87065, 0.02966, -0.15121 ] + - [ 13.0000, 1.89221, 0.03770, -0.14969 ] + - [ 14.0000, 1.87910, 0.04824, -0.14562 ] + - [ 15.0000, 1.88111, 0.05838, -0.14358 ] + - [ 16.0000, 1.86359, 0.06992, -0.14095 ] + - [ 18.0000, 1.73324, 0.10166, -0.13711 ] + - [ 20.0000, 1.59357, 0.13916, -0.14082 ] + - [ 24.0000, 1.46708, 0.21002, -0.15693 ] + - [ 28.0000, 1.44834, 0.28200, -0.17979 ] + - [ 32.0000, 1.43563, 0.35424, -0.20147 ] + - [ 36.1429, 1.31283, 0.44192, -0.22409 ] + - [ 40.2857, 1.20580, 0.53379, -0.24619 ] + - [ 44.4286, 1.10690, 0.62793, -0.26133 ] + - [ 48.5714, 1.01129, 0.72238, -0.27648 ] + - [ 52.7143, 0.91594, 0.81520, -0.29062 ] + - [ 56.8571, 0.81907, 0.90444, -0.30424 ] + - [ 61.0000, 0.71982, 0.98826, -0.31787 ] + - [ 65.1429, 0.61801, 1.06493, -0.33154 ] + - [ 69.2857, 0.51401, 1.13285, -0.34522 ] + - [ 73.4286, 0.40862, 1.19061, -0.35846 ] + - [ 77.5714, 0.30299, 1.23704, -0.37161 ] + - [ 81.7143, 0.19855, 1.27116, -0.38405 ] + - [ 85.8571, 0.09695, 1.29229, -0.39547 ] + - [ 90.0000, 0.00000, 1.30000, -0.40690 ] + - [ 94.1429, -0.06787, 1.29229, -0.41277 ] + - [ 98.2857, -0.13899, 1.27116, -0.41864 ] + - [ 102.4286, -0.21209, 1.23704, -0.42163 ] + - [ 106.5714, -0.28603, 1.19061, -0.42258 ] + - [ 110.7143, -0.35981, 1.13285, -0.42312 ] + - [ 114.8571, -0.43261, 1.06493, -0.42168 ] + - [ 119.0000, -0.50388, 0.98826, -0.42024 ] + - [ 123.1429, -0.57335, 0.90444, -0.42058 ] + - [ 127.2857, -0.64116, 0.81520, -0.42150 ] + - [ 131.4286, -0.70790, 0.72238, -0.42591 ] + - [ 135.5714, -0.77483, 0.62793, -0.43697 ] + - [ 139.7143, -0.84406, 0.53379, -0.44803 ] + - [ 143.8571, -0.91898, 0.44192, -0.46784 ] + - [ 148.0000, -1.00494, 0.35424, -0.48830 ] + - [ 150.2857, -0.93316, 0.30832, -0.49600 ] + - [ 152.5714, -0.86138, 0.26453, -0.47857 ] + - [ 154.8571, -0.78960, 0.22313, -0.46114 ] + - [ 157.1429, -0.71781, 0.18439, -0.44370 ] + - [ 159.4286, -0.64603, 0.14856, -0.42627 ] + - [ 161.7143, -0.57425, 0.11586, -0.43530 ] + - [ 164.0000, -0.50247, 0.08651, -0.45315 ] + - [ 166.2857, -0.43069, 0.06068, -0.47100 ] + - [ 168.5714, -0.35891, 0.05174, -0.48884 ] + - [ 170.8571, -0.28713, 0.04653, -0.45714 ] + - [ 173.1429, -0.21534, 0.04245, -0.34286 ] + - [ 175.4286, -0.14356, 0.03951, -0.22857 ] + - [ 177.7143, -0.07178, 0.03774, -0.11429 ] + - [ 179.9087, 0.00000, 0.03715, 0.00000 ] + + + + pitch_control: + GS_Angles: [0.06019804, 0.08713416, 0.10844806, 0.12685912, 0.14339822, 0.1586021 , 0.17279614, 0.18618935, 0.19892772, 0.21111989, 0.22285021, 0.23417256, 0.2451469 , 0.25580691, 0.26619545, 0.27632495, 0.28623134, 0.29593266, 0.30544521, 0.314779 , 0.32395154, 0.33297489, 0.3418577 , 0.35060844, 0.35923641, 0.36774807, 0.37614942, 0.38444655, 0.39264363, 0.40074407] + GS_Kp: [-0.9394215 , -0.80602855, -0.69555026, -0.60254912, -0.52318192, -0.45465531, -0.39489024, -0.34230736, -0.29568537, -0.25406506, -0.2166825 , -0.18292183, -0.15228099, -0.12434663, -0.09877533, -0.0752794 , -0.05361604, -0.0335789 , -0.01499149, 0.00229803, 0.01842102, 0.03349169, 0.0476098 , 0.0608629 , 0.07332812, 0.0850737 , 0.0961602 , 0.10664158, 0.11656607, 0.12597691] + GS_Ki: [-0.07416547, -0.06719673, -0.0614251 , -0.05656651, -0.0524202 , -0.04884022, -0.04571796, -0.04297091, -0.04053528, -0.03836094, -0.03640799, -0.03464426, -0.03304352, -0.03158417, -0.03024826, -0.02902079, -0.02788904, -0.02684226, -0.02587121, -0.02496797, -0.02412567, -0.02333834, -0.02260078, -0.02190841, -0.0212572 , -0.02064359, -0.0200644 , -0.01951683, -0.01899836, -0.01850671] + Fl_Kp: -9.35 + wt_ops: # operating points: wind speed [m/s], blade pitch [deg], rotor speed [rpm] + v: [3.0, 3.266896551724138, 3.533793103448276, 3.800689655172414, 4.067586206896552, 4.334482758620689, 4.601379310344828, 4.868275862068966, 5.135172413793104, 5.402068965517241, 5.6689655172413795, 5.935862068965518, 6.2027586206896554, 6.469655172413793, 6.736551724137931, 7.00344827586207, 7.270344827586207, 7.537241379310345, 7.804137931034483, 8.071034482758622, 8.337931034482759, 8.604827586206897, 8.871724137931036, 9.138620689655173, 9.405517241379311, 9.672413793103448, 9.939310344827586, 10.206206896551725, 10.473103448275863, 10.74, 11.231724137931035, 11.723448275862069, 12.215172413793104, 12.706896551724139, 13.198620689655172, 13.690344827586207, 14.182068965517242, 14.673793103448276, 15.16551724137931, 15.657241379310346, 16.14896551724138, 16.640689655172416, 17.13241379310345, 17.624137931034483, 18.11586206896552, 18.607586206896553, 19.099310344827586, 19.591034482758623, 20.082758620689653, 20.57448275862069, 21.066206896551726, 21.557931034482756, 22.049655172413793, 22.54137931034483, 23.03310344827586, 23.524827586206897, 24.016551724137933, 24.508275862068963, 25.0] + #pitch_op: [-0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, 3.57152, 5.12896, 6.36736, 7.43866, 8.40197, 9.28843, 10.1161, 10.8974, 11.641, 12.3529, 13.038, 13.6997, 14.3409, 14.9642, 15.5713, 16.1639, 16.7435, 17.3109, 17.8673, 18.4136, 18.9506, 19.4788, 19.9989, 20.5112, 21.0164, 21.5147, 22.0067, 22.4925, 22.9724] # original + pitch_op: [3.44, 3.44, 3.44, 3.44, 3.44, 3.44, 3.19, 2.94, 2.65, 2.32, 1.97, 1.59, 1.19, 0.79, 0.38, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.46, 1.27, 1.99, 2.61, 3.05, 3.69, 5.13, 6.37, 7.44, 8.40, 9.29, 10.12, 10.90, 11.64, 12.35, 13.04, 13.70, 14.34, 14.96, 15.57, 16.16, 16.74, 17.31, 17.87, 18.41, 18.95, 19.48, 20.00, 20.51, 21.02, 21.51, 22.01, 22.49, 22.97] # updated with min pitch to achieve peak thrust shaving + omega_op: [2.1486, 2.3397, 2.5309, 2.722, 2.9132, 3.1043, 3.2955, 3.4866, 3.6778, 3.8689, 4.0601, 4.2512, 4.4424, 4.6335, 4.8247, 5.0159, 5.207, 5.3982, 5.5893, 5.7805, 5.9716, 6.1628, 6.3539, 6.5451, 6.7362, 6.9274, 7.1185, 7.3097, 7.5008, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56] + gear_ratio: 1 + torque_control: + VS_KP: -38609162.66552 + VS_KI: -4588245.18720 + + + tower: # (could remove some entries that don't apply for the tower) + dlsMax : 5.0 # maximum node splitting section amount; can't be 0 + + name : tower # [-] an identifier (no longer has to be number) + type : 1 # [-] + rA : [ 0, 0, 15] # [m] end A coordinates + rB : [ 0, 0, 144.582] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + + # --- outer shell including hydro--- + stations : [ 15, 28, 28.001, 41, 41.001, 54, 54.001, 67, 67.001, 80, 80.001, 93, 93.001, 106, 106.001, 119, 119.001, 132, 132.001, 144.582 ] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : [ 10, 9.964, 9.964, 9.967, 9.967, 9.927, 9.927, 9.528, 9.528, 9.149, 9.149, 8.945, 8.945, 8.735, 8.735, 8.405, 8.405, 7.321, 7.321, 6.5 ] # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : [ 0.082954, 0.082954, 0.083073, 0.083073, 0.082799, 0.082799, 0.0299, 0.0299, 0.027842, 0.027842, 0.025567, 0.025567, 0.022854, 0.022854, 0.02025, 0.02025, 0.018339, 0.018339, 0.021211, 0.021211 ] # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 0.0 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 0.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + # (neglecting axial coefficients for now) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] material density + + + + + + + +platform: + + potModMaster : 1 # [int] master switch for potMod variables; 0=keeps all member potMod vars the same, 1=turns all potMod vars to False (no HAMS), 2=turns all potMod vars to True (no strip) + dlsMax : 5.0 # maximum node splitting section amount for platform members; can't be 0 + + members: # list all members here + + - name : center_column # [-] an identifier (no longer has to be number) + type : 2 # [-] + rA : [ 0, 0, -20] # [m] end A coordinates + rB : [ 0, 0, 15] # [m] and B coordinates + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + # --- outer shell including hydro--- + stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 10.0 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.05 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 0.6 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 0.93 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.6 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 1.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + # --- handling of end caps or any internal structures if we need them --- + cap_stations : [ 0 ] # [m] location along member of any inner structures (in same scaling as set by 'stations') + cap_t : [ 0.001 ] # [m] thickness of any internal structures + cap_d_in : [ 0 ] # [m] inner diameter of internal structures (0 for full cap/bulkhead, >0 for a ring shape) + + + - name : outer_column # [-] an identifier (no longer has to be number) + type : 2 # [-] + rA : [51.75, 0, -20] # [m] end A coordinates + rB : [51.75, 0, 15] # [m] and B coordinates + heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + # --- outer shell including hydro--- + stations : [0, 35] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 12.5 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.05 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 0.6 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 0.93 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 1.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.7 # value of 3.0 gives more heave response # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + # --- ballast --- + l_fill : 1.4 # [m] + rho_fill : 5000 # [kg/m3] + # --- handling of end caps or any internal structures if we need them --- + cap_stations : [ 0 ] # [m] location along member of any inner structures (in same scaling as set by 'stations') + cap_t : [ 0.001 ] # [m] thickness of any internal structures + cap_d_in : [ 0 ] # [m] inner diameter of internal structures (0 for full cap/bulkhead, >0 for a ring shape) + + + - name : pontoon # [-] an identifier (no longer has to be number) + type : 2 # [-] + rA : [ 5 , 0, -16.5] # [m] end A coordinates + rB : [ 45.5, 0, -16.5] # [m] and B coordinates + heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) + shape : rect # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : False # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + # --- outer shell including hydro--- + stations : [0, 40.5] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : [12.4, 7.0] # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.05 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : [1.5, 2.2 ] # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : [2.2, 0.2 ] # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + l_fill : 40.5 # [m] + rho_fill : 1025.0 # [kg/m3] + + + - name : upper_support # [-] an identifier (no longer has to be number) + type : 2 # [-] + rA : [ 5 , 0, 14.545] # [m] end A coordinates + rB : [ 45.5, 0, 14.545] # [m] and B coordinates + heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) + shape : circ # [-] circular or rectangular + gamma : 0.0 # [deg] twist angle about the member's z-axis + potMod : False # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory + # --- outer shell including hydro--- + stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + d : 0.91 # [m] diameters if circular or side lengths if rectangular (can be pairs) + t : 0.01 # [m] wall thicknesses (scalar or list of same length as stations) + Cd : 0.0 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) + Ca : 0.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) + CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) + CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) + rho_shell : 7850 # [kg/m3] + + + +mooring: + water_depth: 200 # [m] uniform water depth + + points: + - name: line1_anchor + type: fixed + location: [-837, 0.0, -200.0] + anchor_type: drag_embedment + + - name: line2_anchor + type: fixed + location: [418, 725, -200.0] + anchor_type: drag_embedment + + - name: line3_anchor + type: fixed + location: [418, -725, -200.0] + anchor_type: drag_embedment + + - name: line1_vessel + type: vessel + location: [-58, 0.0, -14.0] + + - name: line2_vessel + type: vessel + location: [29, 50, -14.0] + + - name: line3_vessel + type: vessel + location: [29, -50, -14.0] + + lines: + - name: line1 + endA: line1_anchor + endB: line1_vessel + type: chain + length: 850 + + - name: line2 + endA: line2_anchor + endB: line2_vessel + type: chain + length: 850 + + - name: line3 + endA: line3_anchor + endB: line3_vessel + type: chain + length: 850 + + line_types: + - name: chain + diameter: 0.185 + mass_density: 685.0 + stiffness: 3270e6 + breaking_load: 1e8 + cost: 100.0 + transverse_added_mass: 1.0 + tangential_added_mass: 0.0 + transverse_drag: 1.6 + tangential_drag: 0.1 + + anchor_types: + - name: drag_embedment + mass: 1e3 + cost: 1e4 + max_vertical_load: 0.0 + max_lateral_load: 1e5 + \ No newline at end of file diff --git a/RAFT/designs/test.yaml b/RAFT/designs/test.yaml deleted file mode 100644 index b7b1b50ec..000000000 --- a/RAFT/designs/test.yaml +++ /dev/null @@ -1,1308 +0,0 @@ -type: input file for RAFT -name: test yaml for MHK turbines for CT-Opt - - -settings: # global Settings - min_freq : 0.005 # [Hz] lowest frequency to consider, also the frequency bin width - max_freq : 0.40 # [Hz] highest frequency to consider - XiStart : 0 # sets initial amplitude of each DOF for all frequencies - nIter : 10 # sets how many iterations to perform in Model.solveDynamics() - -site: - water_depth : 200 # [m] uniform water depth - rho_water : 1025.0 # [kg/m^3] water density - rho_air : 1.225 # [kg/m^3] air density - mu_air : 1.81e-05 # air dynamic viscosity - shearExp : 0.12 # shear exponent - -cases: - - keys : [wind_speed, wind_heading, turbulence, turbine_status, yaw_misalign, wave_spectrum, wave_period, wave_height, wave_heading ] - data : # m/s deg % or e.g. 2B_NTM string deg string (s) (m) (deg) - - [ 12, 0, 0.01, operating, 0, JONSWAP, 13.1, 8.5, 0 ] - - -turbine : - - nrotors : 1 # [-] number of turbines in the FOWT - rotorCoords : [[0,0]] # x-y coordinates of rotor in space - - mRNA : 991000 # [kg] RNA mass - IxRNA : 0 # [kg-m2] RNA moment of inertia about local x axis (assumed to be identical to rotor axis for now, as approx) [kg-m^2] - IrRNA : 0 # [kg-m2] RNA moment of inertia about local y or z axes [kg-m^2] - xCG_RNA : 0 # [m] x location of RNA center of mass [m] (Actual is ~= -0.27 m) - hHub : 150.0 # [m] hub height above water line [m] - Fthrust : 1500.0E3 # [N] temporary thrust force to use - - I_drivetrain: 318628138.0 # full rotor + drivetrain inertia as felt on the high-speed shaft - - nBlades : 3 # number of blades - Zhub : 150.0 # hub height [m] - Rhub : 3.97 # hub radius [m] - precone : 4.0 # [rad] - shaft_tilt : 6.0 # [rad] - overhang : 12.0313 # [m] - aeroServoMod : 1 # 0 aerodynamics off; 1 aerodynamics on (no control); 2 aerodynamics and control on - - blade: - - precurveTip : -3.9999999999999964 # - presweepTip : 0.0 # - Rtip : 120.96999999936446 # rotor radius - - geometry: # r chord theta precurve presweep - # (m) (m) (deg) (m) (m) - - [ 8.004, 5.228, 15.474, 0.035, 0.000 ] - - [ 12.039, 5.321, 14.692, 0.084, 0.000 ] - - [ 16.073, 5.458, 13.330, 0.139, 0.000 ] - - [ 20.108, 5.602, 11.644, 0.192, 0.000 ] - - [ 24.142, 5.718, 9.927, 0.232, 0.000 ] - - [ 28.177, 5.767, 8.438, 0.250, 0.000 ] - - [ 32.211, 5.713, 7.301, 0.250, 0.000 ] - - [ 36.246, 5.536, 6.232, 0.246, 0.000 ] - - [ 40.280, 5.291, 5.230, 0.240, 0.000 ] - - [ 44.315, 5.035, 4.348, 0.233, 0.000 ] - - [ 48.349, 4.815, 3.606, 0.218, 0.000 ] - - [ 52.384, 4.623, 2.978, 0.178, 0.000 ] - - [ 56.418, 4.432, 2.423, 0.100, 0.000 ] - - [ 60.453, 4.245, 1.924, 0.000, 0.000 ] - - [ 64.487, 4.065, 1.467, -0.112, 0.000 ] - - [ 68.522, 3.896, 1.056, -0.244, 0.000 ] - - [ 72.556, 3.735, 0.692, -0.415, 0.000 ] - - [ 76.591, 3.579, 0.355, -0.620, 0.000 ] - - [ 80.625, 3.425, 0.019, -0.846, 0.000 ] - - [ 84.660, 3.268, -0.358, -1.080, 0.000 ] - - [ 88.694, 3.112, -0.834, -1.330, 0.000 ] - - [ 92.729, 2.957, -1.374, -1.602, 0.000 ] - - [ 96.763, 2.800, -1.848, -1.895, 0.000 ] - - [ 100.798, 2.637, -2.136, -2.202, 0.000 ] - - [ 104.832, 2.464, -2.172, -2.523, 0.000 ] - - [ 108.867, 2.283, -2.108, -2.864, 0.000 ] - - [ 112.901, 2.096, -1.953, -3.224, 0.000 ] - - [ 116.936, 1.902, -1.662, -3.605, 0.000 ] - - airfoils: # location name - # (0-1) (string) name must match name in airfoils list - - [ 0.00000, circular ] - - [ 0.02000, circular ] - - [ 0.15000, SNL-FFA-W3-500 ] - - [ 0.24517, FFA-W3-360 ] - - [ 0.32884, FFA-W3-330blend ] - - [ 0.43918, FFA-W3-301 ] - - [ 0.53767, FFA-W3-270blend ] - - [ 0.63821, FFA-W3-241 ] - - [ 0.77174, FFA-W3-211 ] - - [ 1.00000, FFA-W3-211 ] - - - precurveTip : -3.9999999999999964 # - presweepTip : 0.0 # - Rtip : 120.96999999936446 # rotor radius - - geometry: # r chord theta precurve presweep - # (m) (m) (deg) (m) (m) - - [ 8.004, 5.228, 15.474, 0.035, 0.000 ] - - [ 12.039, 5.321, 14.692, 0.084, 0.000 ] - - [ 16.073, 5.458, 13.330, 0.139, 0.000 ] - - [ 20.108, 5.602, 11.644, 0.192, 0.000 ] - - [ 24.142, 5.718, 9.927, 0.232, 0.000 ] - - [ 28.177, 5.767, 8.438, 0.250, 0.000 ] - - [ 32.211, 5.713, 7.301, 0.250, 0.000 ] - - [ 36.246, 5.536, 6.232, 0.246, 0.000 ] - - [ 40.280, 5.291, 5.230, 0.240, 0.000 ] - - [ 44.315, 5.035, 4.348, 0.233, 0.000 ] - - [ 48.349, 4.815, 3.606, 0.218, 0.000 ] - - [ 52.384, 4.623, 2.978, 0.178, 0.000 ] - - [ 56.418, 4.432, 2.423, 0.100, 0.000 ] - - [ 60.453, 4.245, 1.924, 0.000, 0.000 ] - - [ 64.487, 4.065, 1.467, -0.112, 0.000 ] - - [ 68.522, 3.896, 1.056, -0.244, 0.000 ] - - [ 72.556, 3.735, 0.692, -0.415, 0.000 ] - - [ 76.591, 3.579, 0.355, -0.620, 0.000 ] - - [ 80.625, 3.425, 0.019, -0.846, 0.000 ] - - [ 84.660, 3.268, -0.358, -1.080, 0.000 ] - - [ 88.694, 3.112, -0.834, -1.330, 0.000 ] - - [ 92.729, 2.957, -1.374, -1.602, 0.000 ] - - [ 96.763, 2.800, -1.848, -1.895, 0.000 ] - - [ 100.798, 2.637, -2.136, -2.202, 0.000 ] - - [ 104.832, 2.464, -2.172, -2.523, 0.000 ] - - [ 108.867, 2.283, -2.108, -2.864, 0.000 ] - - [ 112.901, 2.096, -1.953, -3.224, 0.000 ] - - [ 116.936, 1.902, -1.662, -3.605, 0.000 ] - - airfoils: # location name - # (0-1) (string) name must match name in airfoils list - - [ 0.00000, circular ] - - [ 0.02000, circular ] - - [ 0.15000, SNL-FFA-W3-500 ] - - [ 0.24517, FFA-W3-360 ] - - [ 0.32884, FFA-W3-330blend ] - - [ 0.43918, FFA-W3-301 ] - - [ 0.53767, FFA-W3-270blend ] - - [ 0.63821, FFA-W3-241 ] - - [ 0.77174, FFA-W3-211 ] - - [ 1.00000, FFA-W3-211 ] - - airfoils: - - name : circular # - relative_thickness : 1.0 # - data: # alpha c_l c_d c_m - # (deg) (-) (-) (-) - - [ -179.91, 0.00010, 0.35000, -0.00010 ] - - [ 179.91, 0.00010, 0.35000, -0.00010 ] - - name : SNL-FFA-W3-500 # - relative_thickness : 0.5 # - data: # alpha c_l c_d c_m - # (deg) (-) (-) (-) - - [ -179.97, 0.00000, 0.08440, 0.00000 ] - - [ -170.00, 0.44190, 0.08440, 0.31250 ] - - [ -160.00, 0.88370, 0.12680, 0.28310 ] - - [ -150.00, 0.96740, 0.29270, 0.26320 ] - - [ -140.00, 0.78010, 0.49700, 0.20480 ] - - [ -130.00, 0.62930, 0.71610, 0.19320 ] - - [ -120.00, 0.47850, 0.92460, 0.20080 ] - - [ -110.00, 0.31890, 1.09850, 0.21360 ] - - [ -100.00, 0.15530, 1.21820, 0.22210 ] - - [ -90.00, 0.00000, 1.27070, 0.21980 ] - - [ -80.00, -0.15530, 1.21820, 0.19600 ] - - [ -70.00, -0.31890, 1.09850, 0.16350 ] - - [ -60.00, -0.47840, 0.92460, 0.12850 ] - - [ -50.00, -0.62930, 0.71610, 0.09650 ] - - [ -40.00, -0.78010, 0.49700, 0.07160 ] - - [ -30.00, -0.96740, 0.29270, 0.05220 ] - - [ -20.00, -1.02810, 0.14990, -0.00630 ] - - [ -19.75, -1.02430, 0.14720, -0.00890 ] - - [ -19.25, -1.00520, 0.14470, -0.00990 ] - - [ -19.00, -0.99710, 0.14330, -0.01050 ] - - [ -18.75, -1.00520, 0.14030, -0.01100 ] - - [ -18.50, -0.99950, 0.13860, -0.01160 ] - - [ -18.25, -0.99080, 0.13730, -0.01200 ] - - [ -18.00, -0.98150, 0.13600, -0.01260 ] - - [ -17.50, -0.97640, 0.13220, -0.01350 ] - - [ -17.25, -0.97050, 0.13060, -0.01390 ] - - [ -17.00, -0.96550, 0.12900, -0.01430 ] - - [ -16.75, -0.96620, 0.12680, -0.01470 ] - - [ -16.50, -0.95440, 0.12580, -0.01510 ] - - [ -16.25, -0.94440, 0.12460, -0.01550 ] - - [ -16.00, -0.94050, 0.12290, -0.01580 ] - - [ -15.75, -0.94330, 0.12060, -0.01610 ] - - [ -15.50, -0.93300, 0.11950, -0.01640 ] - - [ -15.25, -0.92110, 0.11850, -0.01680 ] - - [ -14.75, -0.91580, 0.11500, -0.01730 ] - - [ -14.50, -0.90700, 0.11380, -0.01750 ] - - [ -14.25, -0.89590, 0.11270, -0.01780 ] - - [ -14.00, -0.89260, 0.11100, -0.01810 ] - - [ -13.75, -0.88080, 0.11000, -0.01840 ] - - [ -13.50, -0.87220, 0.10890, -0.01860 ] - - [ -13.25, -0.86600, 0.10750, -0.01880 ] - - [ -13.00, -0.86260, 0.10590, -0.01880 ] - - [ -12.75, -0.84890, 0.10510, -0.01920 ] - - [ -12.50, -0.83630, 0.10420, -0.01940 ] - - [ -12.25, -0.83630, 0.10230, -0.01940 ] - - [ -12.00, -0.82710, 0.10130, -0.01960 ] - - [ -11.75, -0.81410, 0.10040, -0.01980 ] - - [ -11.50, -0.80040, 0.09970, -0.02000 ] - - [ -11.00, -0.78900, 0.09710, -0.01990 ] - - [ -10.75, -0.78620, 0.09560, -0.01960 ] - - [ -10.50, -0.77470, 0.09480, -0.01940 ] - - [ -10.25, -0.77010, 0.09400, -0.01840 ] - - [ -10.00, -0.76740, 0.09250, -0.01830 ] - - [ -9.75, -0.75060, 0.09170, -0.01920 ] - - [ -9.50, -0.72900, 0.09120, -0.02050 ] - - [ -9.25, -0.70950, 0.09020, -0.02240 ] - - [ -9.00, -0.68550, 0.08950, -0.02470 ] - - [ -8.75, -0.65900, 0.08910, -0.02670 ] - - [ -8.50, -0.63190, 0.08870, -0.02870 ] - - [ -8.25, -0.60190, 0.08790, -0.03200 ] - - [ -8.00, -0.57180, 0.08750, -0.03450 ] - - [ -7.75, -0.54240, 0.08730, -0.03670 ] - - [ -7.50, -0.50980, 0.08680, -0.03990 ] - - [ -7.25, -0.47670, 0.08640, -0.04300 ] - - [ -7.00, -0.44540, 0.08620, -0.04530 ] - - [ -6.75, -0.41420, 0.08600, -0.04760 ] - - [ -6.50, -0.37910, 0.08560, -0.05100 ] - - [ -6.25, -0.34600, 0.08530, -0.05380 ] - - [ -6.00, -0.31440, 0.08520, -0.05600 ] - - [ -5.75, -0.28170, 0.08500, -0.05860 ] - - [ -5.50, -0.24610, 0.08470, -0.06190 ] - - [ -5.25, -0.21330, 0.08460, -0.06440 ] - - [ -5.00, -0.18270, 0.08450, -0.06630 ] - - [ -4.75, -0.14940, 0.08430, -0.06880 ] - - [ -4.50, -0.11580, 0.08420, -0.07150 ] - - [ -4.25, -0.08370, 0.08400, -0.07370 ] - - [ -4.00, -0.05290, 0.08400, -0.07560 ] - - [ -3.75, -0.02250, 0.08390, -0.07740 ] - - [ -3.50, 0.00890, 0.08380, -0.07930 ] - - [ -3.25, 0.03920, 0.08380, -0.08110 ] - - [ -3.00, 0.06860, 0.08380, -0.08260 ] - - [ -2.75, 0.09740, 0.08380, -0.08380 ] - - [ -2.50, 0.12600, 0.08380, -0.08520 ] - - [ -2.25, 0.15550, 0.08380, -0.08670 ] - - [ -2.00, 0.18530, 0.08380, -0.08830 ] - - [ -1.75, 0.21460, 0.08370, -0.08970 ] - - [ -1.50, 0.24300, 0.08370, -0.09100 ] - - [ -1.25, 0.27130, 0.08380, -0.09210 ] - - [ -1.00, 0.30060, 0.08380, -0.09360 ] - - [ -0.75, 0.32950, 0.08380, -0.09490 ] - - [ -0.50, 0.35780, 0.08380, -0.09610 ] - - [ -0.25, 0.38570, 0.08380, -0.09720 ] - - [ 0.00, 0.41350, 0.08380, -0.09830 ] - - [ 0.23, 0.44250, 0.08390, -0.09950 ] - - [ 0.47, 0.47150, 0.08390, -0.10080 ] - - [ 0.70, 0.50030, 0.08390, -0.10190 ] - - [ 0.94, 0.52860, 0.08400, -0.10290 ] - - [ 1.17, 0.55670, 0.08400, -0.10400 ] - - [ 1.40, 0.58500, 0.08410, -0.10500 ] - - [ 1.64, 0.61350, 0.08410, -0.10610 ] - - [ 1.87, 0.64170, 0.08420, -0.10720 ] - - [ 2.11, 0.66970, 0.08420, -0.10820 ] - - [ 2.34, 0.69750, 0.08430, -0.10910 ] - - [ 2.57, 0.72510, 0.08430, -0.11000 ] - - [ 2.81, 0.75280, 0.08440, -0.11090 ] - - [ 3.04, 0.78070, 0.08450, -0.11190 ] - - [ 3.28, 0.80830, 0.08460, -0.11280 ] - - [ 3.51, 0.83580, 0.08460, -0.11370 ] - - [ 3.74, 0.86310, 0.08470, -0.11460 ] - - [ 3.98, 0.89020, 0.08470, -0.11530 ] - - [ 4.21, 0.91730, 0.08480, -0.11610 ] - - [ 4.45, 0.94440, 0.08490, -0.11700 ] - - [ 4.68, 0.97130, 0.08500, -0.11780 ] - - [ 4.91, 0.99810, 0.08510, -0.11850 ] - - [ 5.15, 1.02490, 0.08520, -0.11920 ] - - [ 5.38, 1.05150, 0.08530, -0.11990 ] - - [ 5.62, 1.07790, 0.08530, -0.12060 ] - - [ 5.85, 1.10410, 0.08540, -0.12120 ] - - [ 6.08, 1.13020, 0.08560, -0.12180 ] - - [ 6.32, 1.15600, 0.08570, -0.12240 ] - - [ 6.55, 1.18180, 0.08580, -0.12300 ] - - [ 6.79, 1.20760, 0.08590, -0.12350 ] - - [ 7.02, 1.23340, 0.08600, -0.12400 ] - - [ 7.25, 1.25890, 0.08610, -0.12450 ] - - [ 7.49, 1.28410, 0.08620, -0.12500 ] - - [ 7.72, 1.30880, 0.08640, -0.12540 ] - - [ 7.96, 1.33310, 0.08650, -0.12570 ] - - [ 8.19, 1.35700, 0.08670, -0.12590 ] - - [ 8.42, 1.38100, 0.08690, -0.12620 ] - - [ 8.66, 1.40540, 0.08700, -0.12650 ] - - [ 8.89, 1.42950, 0.08710, -0.12670 ] - - [ 9.12, 1.45310, 0.08730, -0.12700 ] - - [ 9.88, 1.51540, 0.08790, -0.12650 ] - - [ 10.64, 1.57490, 0.08860, -0.12560 ] - - [ 11.40, 1.61510, 0.08950, -0.12140 ] - - [ 12.15, 1.64430, 0.09120, -0.11630 ] - - [ 12.91, 1.68240, 0.09300, -0.11330 ] - - [ 13.67, 1.71460, 0.09540, -0.11070 ] - - [ 14.42, 1.73620, 0.09890, -0.10800 ] - - [ 15.18, 1.76270, 0.10240, -0.10630 ] - - [ 15.94, 1.77060, 0.10760, -0.10420 ] - - [ 16.69, 1.76390, 0.11440, -0.10250 ] - - [ 17.45, 1.76040, 0.12110, -0.10130 ] - - [ 18.21, 1.72510, 0.13100, -0.10010 ] - - [ 18.97, 1.70350, 0.13990, -0.09980 ] - - [ 19.72, 1.67840, 0.14920, -0.10010 ] - - [ 20.48, 1.65050, 0.15910, -0.10160 ] - - [ 21.24, 1.62270, 0.16910, -0.10360 ] - - [ 21.99, 1.60670, 0.17780, -0.10640 ] - - [ 22.75, 1.59720, 0.18580, -0.10990 ] - - [ 23.51, 1.58920, 0.19370, -0.11360 ] - - [ 24.26, 1.58150, 0.20140, -0.11800 ] - - [ 25.02, 1.55630, 0.21350, -0.12490 ] - - [ 25.78, 1.52720, 0.22670, -0.13250 ] - - [ 26.53, 1.49820, 0.23990, -0.14000 ] - - [ 27.29, 1.46910, 0.25310, -0.14760 ] - - [ 28.05, 1.44010, 0.26630, -0.15510 ] - - [ 28.81, 1.41100, 0.27950, -0.16270 ] - - [ 29.56, 1.38200, 0.29270, -0.17030 ] - - [ 30.32, 1.36220, 0.30780, -0.17400 ] - - [ 31.08, 1.34240, 0.32300, -0.17770 ] - - [ 31.83, 1.32250, 0.33810, -0.18150 ] - - [ 32.59, 1.30270, 0.35320, -0.18520 ] - - [ 33.35, 1.28290, 0.36840, -0.18890 ] - - [ 34.10, 1.26310, 0.38350, -0.19260 ] - - [ 34.86, 1.24330, 0.39870, -0.19640 ] - - [ 35.62, 1.22340, 0.41380, -0.20010 ] - - [ 36.38, 1.20360, 0.42890, -0.20390 ] - - [ 37.13, 1.18380, 0.44410, -0.20760 ] - - [ 37.89, 1.16400, 0.45920, -0.21130 ] - - [ 38.65, 1.14420, 0.47430, -0.21500 ] - - [ 39.40, 1.12430, 0.48950, -0.21880 ] - - [ 40.16, 1.10640, 0.50520, -0.22180 ] - - [ 40.92, 1.09050, 0.52140, -0.22420 ] - - [ 41.67, 1.07450, 0.53760, -0.22660 ] - - [ 42.43, 1.05860, 0.55380, -0.22890 ] - - [ 43.19, 1.04260, 0.57010, -0.23130 ] - - [ 43.94, 1.02670, 0.58630, -0.23370 ] - - [ 44.70, 1.01070, 0.60250, -0.23610 ] - - [ 45.46, 0.99480, 0.61880, -0.23840 ] - - [ 46.22, 0.97880, 0.63500, -0.24080 ] - - [ 46.97, 0.96280, 0.65120, -0.24320 ] - - [ 47.73, 0.94690, 0.66750, -0.24550 ] - - [ 48.49, 0.93090, 0.68370, -0.24790 ] - - [ 49.24, 0.91500, 0.69990, -0.25030 ] - - [ 50.00, 0.89900, 0.71610, -0.25270 ] - - [ 60.00, 0.68360, 0.92460, -0.28330 ] - - [ 70.00, 0.45560, 1.09850, -0.31560 ] - - [ 80.00, 0.22190, 1.21820, -0.34820 ] - - [ 90.00, 0.00000, 1.27070, -0.37730 ] - - [ 100.00, -0.15530, 1.21820, -0.38770 ] - - [ 110.00, -0.31890, 1.09850, -0.38650 ] - - [ 120.00, -0.47840, 0.92460, -0.38060 ] - - [ 130.00, -0.62930, 0.71610, -0.38030 ] - - [ 140.00, -0.78010, 0.49700, -0.40320 ] - - [ 150.00, -0.96740, 0.29270, -0.48540 ] - - [ 160.00, -0.88370, 0.12680, -0.53250 ] - - [ 170.00, -0.44180, 0.08440, -0.39060 ] - - [ 179.97, 0.00000, 0.08440, 0.00000 ] - - name : FFA-W3-211 # - relative_thickness : 0.211 # - data: # alpha c_l c_d c_m - # (deg) (-) (-) (-) - - [ -179.91, 0.00000, 0.02464, 0.00000 ] - - [ -177.71, 0.05403, 0.02534, 0.09143 ] - - [ -175.43, 0.10805, 0.02742, 0.18286 ] - - [ -173.14, 0.16208, 0.03088, 0.27429 ] - - [ -170.86, 0.21610, 0.03570, 0.36571 ] - - [ -168.57, 0.27013, 0.05599, 0.39192 ] - - [ -166.29, 0.32415, 0.08143, 0.37898 ] - - [ -164.00, 0.37818, 0.11112, 0.36605 ] - - [ -161.71, 0.43220, 0.14485, 0.35312 ] - - [ -159.43, 0.48623, 0.18242, 0.34768 ] - - [ -157.14, 0.54025, 0.22359, 0.36471 ] - - [ -154.86, 0.59428, 0.26810, 0.38175 ] - - [ -152.57, 0.64830, 0.31566, 0.39878 ] - - [ -150.29, 0.70233, 0.36597, 0.41581 ] - - [ -148.00, 0.75635, 0.41871, 0.41955 ] - - [ -143.86, 0.73188, 0.51941, 0.42287 ] - - [ -139.71, 0.70655, 0.62488, 0.42632 ] - - [ -135.57, 0.67760, 0.73293, 0.43163 ] - - [ -131.43, 0.64333, 0.84130, 0.43694 ] - - [ -127.29, 0.60277, 0.94773, 0.44389 ] - - [ -123.14, 0.55550, 1.05001, 0.45171 ] - - [ -119.00, 0.50156, 1.14600, 0.45897 ] - - [ -114.86, 0.44131, 1.23371, 0.46448 ] - - [ -110.71, 0.37542, 1.31129, 0.46998 ] - - [ -106.57, 0.30482, 1.37714, 0.47096 ] - - [ -102.43, 0.23063, 1.42988, 0.47101 ] - - [ -98.29, 0.15413, 1.46842, 0.46824 ] - - [ -94.14, 0.07675, 1.49196, 0.46149 ] - - [ -90.00, 0.00000, 1.50000, 0.45474 ] - - [ -85.86, -0.07675, 1.49196, 0.44026 ] - - [ -81.71, -0.15413, 1.46842, 0.42578 ] - - [ -77.57, -0.23063, 1.42988, 0.40821 ] - - [ -73.43, -0.30482, 1.37714, 0.38846 ] - - [ -69.29, -0.37542, 1.31129, 0.36815 ] - - [ -65.14, -0.44131, 1.23371, 0.34519 ] - - [ -61.00, -0.50156, 1.14600, 0.32223 ] - - [ -56.86, -0.55550, 1.05001, 0.29864 ] - - [ -52.71, -0.60277, 0.94773, 0.27486 ] - - [ -48.57, -0.64333, 0.84130, 0.25128 ] - - [ -44.43, -0.67760, 0.73293, 0.22810 ] - - [ -40.29, -0.70655, 0.62488, 0.20491 ] - - [ -36.14, -0.73188, 0.51941, 0.15416 ] - - [ -32.00, -0.75635, 0.41871, 0.10137 ] - - [ -28.00, -0.85636, 0.28691, 0.06527 ] - - [ -24.00, -1.18292, 0.13960, 0.01647 ] - - [ -20.00, -1.23596, 0.08345, -0.00352 ] - - [ -18.00, -1.22536, 0.06509, -0.00672 ] - - [ -16.00, -1.20476, 0.04888, -0.00881 ] - - [ -14.00, -1.18332, 0.03417, -0.01101 ] - - [ -12.00, -1.10093, 0.02132, -0.02269 ] - - [ -10.00, -0.88209, 0.01386, -0.04397 ] - - [ -8.00, -0.62981, 0.01075, -0.05756 ] - - [ -6.00, -0.37670, 0.00882, -0.06747 ] - - [ -4.00, -0.12177, 0.00702, -0.07680 ] - - [ -2.00, 0.12810, 0.00663, -0.08283 ] - - [ -1.00, 0.25192, 0.00664, -0.08534 ] - - [ 0.00, 0.37535, 0.00670, -0.08777 ] - - [ 1.00, 0.49828, 0.00681, -0.09011 ] - - [ 2.00, 0.62052, 0.00698, -0.09234 ] - - [ 3.00, 0.74200, 0.00720, -0.09447 ] - - [ 4.00, 0.86238, 0.00751, -0.09646 ] - - [ 5.00, 0.98114, 0.00796, -0.09828 ] - - [ 6.00, 1.09662, 0.00872, -0.09977 ] - - [ 7.00, 1.20904, 0.00968, -0.10095 ] - - [ 8.00, 1.31680, 0.01097, -0.10163 ] - - [ 9.00, 1.42209, 0.01227, -0.10207 ] - - [ 10.00, 1.52361, 0.01369, -0.10213 ] - - [ 11.00, 1.61988, 0.01529, -0.10174 ] - - [ 12.00, 1.70937, 0.01717, -0.10087 ] - - [ 13.00, 1.78681, 0.01974, -0.09936 ] - - [ 14.00, 1.84290, 0.02368, -0.09720 ] - - [ 15.00, 1.85313, 0.03094, -0.09410 ] - - [ 16.00, 1.80951, 0.04303, -0.09144 ] - - [ 18.00, 1.66033, 0.07730, -0.09242 ] - - [ 20.00, 1.56152, 0.11202, -0.09871 ] - - [ 24.00, 1.43327, 0.18408, -0.11770 ] - - [ 28.00, 1.29062, 0.27589, -0.14566 ] - - [ 32.00, 1.08050, 0.41871, -0.18266 ] - - [ 36.14, 1.04554, 0.51941, -0.20913 ] - - [ 40.29, 1.00936, 0.62488, -0.23534 ] - - [ 44.43, 0.96801, 0.73293, -0.25784 ] - - [ 48.57, 0.91904, 0.84130, -0.28035 ] - - [ 52.71, 0.86109, 0.94773, -0.30163 ] - - [ 56.86, 0.79357, 1.05001, -0.32226 ] - - [ 61.00, 0.71651, 1.14600, -0.34247 ] - - [ 65.14, 0.63044, 1.23371, -0.36135 ] - - [ 69.29, 0.53632, 1.31129, -0.38024 ] - - [ 73.43, 0.43546, 1.37714, -0.39704 ] - - [ 77.57, 0.32947, 1.42988, -0.41341 ] - - [ 81.71, 0.22019, 1.46842, -0.42844 ] - - [ 85.86, 0.10965, 1.49196, -0.44159 ] - - [ 90.00, 0.00000, 1.50000, -0.45474 ] - - [ 94.14, -0.07675, 1.49196, -0.46149 ] - - [ 98.29, -0.15413, 1.46842, -0.46824 ] - - [ 102.43, -0.23063, 1.42988, -0.47101 ] - - [ 106.57, -0.30482, 1.37714, -0.47096 ] - - [ 110.71, -0.37542, 1.31129, -0.46998 ] - - [ 114.86, -0.44131, 1.23371, -0.46448 ] - - [ 119.00, -0.50156, 1.14600, -0.45897 ] - - [ 123.14, -0.55550, 1.05001, -0.45171 ] - - [ 127.29, -0.60277, 0.94773, -0.44389 ] - - [ 131.43, -0.64333, 0.84130, -0.43694 ] - - [ 135.57, -0.67760, 0.73293, -0.43163 ] - - [ 139.71, -0.70655, 0.62488, -0.42632 ] - - [ 143.86, -0.73188, 0.51941, -0.42287 ] - - [ 148.00, -0.75635, 0.41871, -0.41955 ] - - [ 150.29, -0.70233, 0.36597, -0.41581 ] - - [ 152.57, -0.64830, 0.31566, -0.39878 ] - - [ 154.86, -0.59428, 0.26810, -0.38175 ] - - [ 157.14, -0.54025, 0.22359, -0.36471 ] - - [ 159.43, -0.48623, 0.18242, -0.34768 ] - - [ 161.71, -0.43220, 0.14485, -0.37026 ] - - [ 164.00, -0.37818, 0.11112, -0.40605 ] - - [ 166.29, -0.32415, 0.08143, -0.44184 ] - - [ 168.57, -0.27013, 0.05599, -0.47763 ] - - [ 170.86, -0.21610, 0.03570, -0.45714 ] - - [ 173.14, -0.16208, 0.03088, -0.34286 ] - - [ 175.43, -0.10805, 0.02742, -0.22857 ] - - [ 177.71, -0.05403, 0.02534, -0.11429 ] - - [ 179.91, 0.00000, 0.02464, 0.00000 ] - - name : FFA-W3-241 # - relative_thickness : 0.241 # - data: # alpha c_l c_d c_m - # (deg) (-) (-) (-) - - [ -179.91, 0.00000, 0.01178, 0.00000 ] - - [ -177.71, 0.05818, 0.01248, 0.09143 ] - - [ -175.43, 0.11636, 0.01460, 0.18286 ] - - [ -173.14, 0.17453, 0.01811, 0.27429 ] - - [ -170.86, 0.23271, 0.02300, 0.36571 ] - - [ -168.57, 0.29089, 0.02922, 0.39568 ] - - [ -166.29, 0.34907, 0.05382, 0.38876 ] - - [ -164.00, 0.40725, 0.08379, 0.38184 ] - - [ -161.71, 0.46542, 0.11786, 0.37492 ] - - [ -159.43, 0.52360, 0.15581, 0.37408 ] - - [ -157.14, 0.58178, 0.19740, 0.39148 ] - - [ -154.86, 0.63996, 0.24237, 0.40888 ] - - [ -152.57, 0.69814, 0.29043, 0.42628 ] - - [ -150.29, 0.75631, 0.34128, 0.44368 ] - - [ -148.00, 0.81449, 0.39460, 0.44537 ] - - [ -143.86, 0.77925, 0.49645, 0.44436 ] - - [ -139.71, 0.74511, 0.60319, 0.44360 ] - - [ -135.57, 0.70881, 0.71263, 0.44609 ] - - [ -131.43, 0.66835, 0.82249, 0.44858 ] - - [ -127.29, 0.62253, 0.93051, 0.45370 ] - - [ -123.14, 0.57080, 1.03447, 0.46020 ] - - [ -119.00, 0.51307, 1.13222, 0.46633 ] - - [ -114.86, 0.44965, 1.22176, 0.47130 ] - - [ -110.71, 0.38115, 1.30123, 0.47627 ] - - [ -106.57, 0.30846, 1.36903, 0.47705 ] - - [ -102.43, 0.23266, 1.42376, 0.47695 ] - - [ -98.29, 0.15503, 1.46433, 0.47409 ] - - [ -94.14, 0.07698, 1.48990, 0.46732 ] - - [ -90.00, 0.00000, 1.50000, 0.46055 ] - - [ -85.86, -0.07698, 1.48990, 0.44509 ] - - [ -81.71, -0.15503, 1.46433, 0.42964 ] - - [ -77.57, -0.23266, 1.42376, 0.41125 ] - - [ -73.43, -0.30846, 1.36903, 0.39081 ] - - [ -69.29, -0.38115, 1.30123, 0.36988 ] - - [ -65.14, -0.44965, 1.22176, 0.34663 ] - - [ -61.00, -0.51307, 1.13222, 0.32339 ] - - [ -56.86, -0.57080, 1.03447, 0.29984 ] - - [ -52.71, -0.62253, 0.93051, 0.27618 ] - - [ -48.57, -0.66835, 0.82249, 0.25280 ] - - [ -44.43, -0.70881, 0.71263, 0.22992 ] - - [ -40.29, -0.74511, 0.60319, 0.20705 ] - - [ -36.14, -0.77925, 0.49645, 0.14561 ] - - [ -32.00, -0.81449, 0.39460, 0.08131 ] - - [ -28.00, -1.07781, 0.22252, 0.04592 ] - - [ -24.00, -1.12692, 0.15159, 0.01901 ] - - [ -20.00, -1.14480, 0.09699, 0.00063 ] - - [ -18.00, -1.12797, 0.07744, -0.00342 ] - - [ -16.00, -1.09392, 0.06122, -0.00587 ] - - [ -14.00, -1.05961, 0.04667, -0.00652 ] - - [ -12.00, -1.03121, 0.03302, -0.00755 ] - - [ -10.00, -0.93706, 0.02027, -0.02243 ] - - [ -8.00, -0.67380, 0.01168, -0.05583 ] - - [ -6.00, -0.40391, 0.00918, -0.07159 ] - - [ -4.00, -0.14226, 0.00839, -0.08123 ] - - [ -2.00, 0.11580, 0.00810, -0.08892 ] - - [ -1.00, 0.24382, 0.00808, -0.09235 ] - - [ 0.00, 0.37113, 0.00813, -0.09556 ] - - [ 1.00, 0.49766, 0.00824, -0.09857 ] - - [ 2.00, 0.62334, 0.00842, -0.10139 ] - - [ 3.00, 0.74798, 0.00867, -0.10403 ] - - [ 4.00, 0.87137, 0.00901, -0.10645 ] - - [ 5.00, 0.99320, 0.00945, -0.10863 ] - - [ 6.00, 1.11325, 0.00998, -0.11057 ] - - [ 7.00, 1.23037, 0.01070, -0.11214 ] - - [ 8.00, 1.34496, 0.01153, -0.11337 ] - - [ 9.00, 1.45407, 0.01269, -0.11396 ] - - [ 10.00, 1.55911, 0.01396, -0.11403 ] - - [ 11.00, 1.65779, 0.01545, -0.11336 ] - - [ 12.00, 1.74834, 0.01724, -0.11187 ] - - [ 13.00, 1.82666, 0.01961, -0.10935 ] - - [ 14.00, 1.88831, 0.02293, -0.10606 ] - - [ 15.00, 1.92579, 0.02795, -0.10238 ] - - [ 16.00, 1.92722, 0.03609, -0.09887 ] - - [ 18.00, 1.80055, 0.06534, -0.09497 ] - - [ 20.00, 1.63088, 0.10459, -0.09996 ] - - [ 24.00, 1.43345, 0.19148, -0.12589 ] - - [ 28.00, 1.28805, 0.28629, -0.15453 ] - - [ 32.00, 1.16356, 0.39460, -0.18396 ] - - [ 36.14, 1.11321, 0.49645, -0.21099 ] - - [ 40.29, 1.06444, 0.60319, -0.23768 ] - - [ 44.43, 1.01259, 0.71263, -0.25992 ] - - [ 48.57, 0.95478, 0.82249, -0.28216 ] - - [ 52.71, 0.88932, 0.93051, -0.30323 ] - - [ 56.86, 0.81542, 1.03447, -0.32368 ] - - [ 61.00, 0.73296, 1.13222, -0.34380 ] - - [ 65.14, 0.64236, 1.22176, -0.36292 ] - - [ 69.29, 0.54450, 1.30123, -0.38204 ] - - [ 73.43, 0.44065, 1.36903, -0.39944 ] - - [ 77.57, 0.33237, 1.42376, -0.41648 ] - - [ 81.71, 0.22148, 1.46433, -0.43231 ] - - [ 85.86, 0.10997, 1.48990, -0.44643 ] - - [ 90.00, 0.00000, 1.50000, -0.46055 ] - - [ 94.14, -0.07698, 1.48990, -0.46732 ] - - [ 98.29, -0.15503, 1.46433, -0.47409 ] - - [ 102.43, -0.23266, 1.42376, -0.47695 ] - - [ 106.57, -0.30846, 1.36903, -0.47705 ] - - [ 110.71, -0.38115, 1.30123, -0.47627 ] - - [ 114.86, -0.44965, 1.22176, -0.47130 ] - - [ 119.00, -0.51307, 1.13222, -0.46633 ] - - [ 123.14, -0.57080, 1.03447, -0.46020 ] - - [ 127.29, -0.62253, 0.93051, -0.45370 ] - - [ 131.43, -0.66835, 0.82249, -0.44858 ] - - [ 135.57, -0.70881, 0.71263, -0.44609 ] - - [ 139.71, -0.74511, 0.60319, -0.44360 ] - - [ 143.86, -0.77925, 0.49645, -0.44436 ] - - [ 148.00, -0.81449, 0.39460, -0.44537 ] - - [ 150.29, -0.75631, 0.34128, -0.44368 ] - - [ 152.57, -0.69814, 0.29043, -0.42628 ] - - [ 154.86, -0.63996, 0.24237, -0.40888 ] - - [ 157.14, -0.58178, 0.19740, -0.39148 ] - - [ 159.43, -0.52360, 0.15581, -0.37408 ] - - [ 161.71, -0.46542, 0.11786, -0.39207 ] - - [ 164.00, -0.40725, 0.08379, -0.42184 ] - - [ 166.29, -0.34907, 0.05382, -0.45162 ] - - [ 168.57, -0.29089, 0.02922, -0.48139 ] - - [ 170.86, -0.23271, 0.02300, -0.45714 ] - - [ 173.14, -0.17453, 0.01811, -0.34286 ] - - [ 175.43, -0.11636, 0.01460, -0.22857 ] - - [ 177.71, -0.05818, 0.01248, -0.11429 ] - - [ 179.91, 0.00000, 0.01178, 0.00000 ] - - name : FFA-W3-270blend # - relative_thickness : 0.27 # - data: # alpha c_l c_d c_m - # (deg) (-) (-) (-) - - [ -179.91, 0.00000, 0.01545, 0.00000 ] - - [ -177.71, 0.06213, 0.01611, 0.09143 ] - - [ -175.43, 0.12426, 0.01807, 0.18286 ] - - [ -173.14, 0.18639, 0.02133, 0.27429 ] - - [ -170.86, 0.24852, 0.02587, 0.36571 ] - - [ -168.57, 0.31064, 0.03289, 0.39874 ] - - [ -166.29, 0.37277, 0.05681, 0.39672 ] - - [ -164.00, 0.43490, 0.08471, 0.39470 ] - - [ -161.71, 0.49703, 0.11643, 0.39268 ] - - [ -159.43, 0.55916, 0.15176, 0.39544 ] - - [ -157.14, 0.62129, 0.19048, 0.41254 ] - - [ -154.86, 0.68342, 0.23234, 0.42964 ] - - [ -152.57, 0.74555, 0.27708, 0.44674 ] - - [ -150.29, 0.80768, 0.32441, 0.46384 ] - - [ -148.00, 0.86981, 0.37404, 0.46186 ] - - [ -143.86, 0.81660, 0.46882, 0.45335 ] - - [ -139.71, 0.76812, 0.56814, 0.44523 ] - - [ -135.57, 0.72040, 0.66995, 0.44237 ] - - [ -131.43, 0.67095, 0.77214, 0.43951 ] - - [ -127.29, 0.61828, 0.87258, 0.44072 ] - - [ -123.14, 0.56158, 0.96921, 0.44407 ] - - [ -119.00, 0.50057, 1.06002, 0.44739 ] - - [ -114.86, 0.43540, 1.14315, 0.45063 ] - - [ -110.71, 0.36655, 1.21688, 0.45387 ] - - [ -106.57, 0.29475, 1.27969, 0.45377 ] - - [ -102.43, 0.22098, 1.33030, 0.45298 ] - - [ -98.29, 0.14639, 1.36768, 0.44973 ] - - [ -94.14, 0.07227, 1.39107, 0.44302 ] - - [ -90.00, 0.00000, 1.40000, 0.43630 ] - - [ -85.86, -0.07227, 1.39107, 0.42180 ] - - [ -81.71, -0.14639, 1.36768, 0.40730 ] - - [ -77.57, -0.22098, 1.33030, 0.39020 ] - - [ -73.43, -0.29475, 1.27969, 0.37125 ] - - [ -69.29, -0.36655, 1.21688, 0.35190 ] - - [ -65.14, -0.43540, 1.14315, 0.33068 ] - - [ -61.00, -0.50057, 1.06002, 0.30945 ] - - [ -56.86, -0.56158, 0.96921, 0.28815 ] - - [ -52.71, -0.61828, 0.87258, 0.26684 ] - - [ -48.57, -0.67095, 0.77214, 0.24576 ] - - [ -44.43, -0.72040, 0.66995, 0.22512 ] - - [ -40.29, -0.76812, 0.56814, 0.20447 ] - - [ -36.14, -0.81660, 0.46882, 0.13957 ] - - [ -32.00, -0.86981, 0.37404, 0.07138 ] - - [ -28.00, -1.09837, 0.21880, 0.04400 ] - - [ -24.00, -1.08339, 0.15982, 0.02166 ] - - [ -20.00, -1.06990, 0.10744, 0.00422 ] - - [ -18.00, -1.05454, 0.08690, -0.00035 ] - - [ -16.00, -1.03432, 0.06844, -0.00334 ] - - [ -14.00, -1.08360, 0.04733, -0.00283 ] - - [ -12.00, -1.09489, 0.03085, -0.00556 ] - - [ -10.00, -0.92665, 0.01984, -0.02952 ] - - [ -8.00, -0.69676, 0.01439, -0.04822 ] - - [ -6.00, -0.43628, 0.01155, -0.06483 ] - - [ -4.00, -0.16252, 0.01026, -0.07919 ] - - [ -2.00, 0.10709, 0.00976, -0.09041 ] - - [ -1.00, 0.23993, 0.00967, -0.09517 ] - - [ 0.00, 0.37158, 0.00968, -0.09953 ] - - [ 1.00, 0.50210, 0.00976, -0.10355 ] - - [ 2.00, 0.63139, 0.00993, -0.10725 ] - - [ 3.00, 0.75951, 0.01016, -0.11068 ] - - [ 4.00, 0.88638, 0.01045, -0.11385 ] - - [ 5.00, 1.01172, 0.01082, -0.11673 ] - - [ 6.00, 1.13430, 0.01140, -0.11923 ] - - [ 7.00, 1.25536, 0.01198, -0.12145 ] - - [ 8.00, 1.37379, 0.01267, -0.12328 ] - - [ 9.00, 1.48841, 0.01353, -0.12460 ] - - [ 10.00, 1.59782, 0.01460, -0.12526 ] - - [ 11.00, 1.70005, 0.01597, -0.12505 ] - - [ 12.00, 1.79190, 0.01777, -0.12370 ] - - [ 13.00, 1.86782, 0.02035, -0.12093 ] - - [ 14.00, 1.92687, 0.02385, -0.11725 ] - - [ 15.00, 1.90901, 0.03236, -0.10931 ] - - [ 16.00, 1.88548, 0.04259, -0.10525 ] - - [ 18.00, 1.72106, 0.07672, -0.10292 ] - - [ 20.00, 1.54737, 0.11914, -0.11017 ] - - [ 24.00, 1.37176, 0.20189, -0.13431 ] - - [ 28.00, 1.33611, 0.27981, -0.15777 ] - - [ 32.00, 1.24258, 0.37404, -0.18432 ] - - [ 36.14, 1.16657, 0.46882, -0.21002 ] - - [ 40.29, 1.09731, 0.56814, -0.23531 ] - - [ 44.43, 1.02914, 0.66995, -0.25508 ] - - [ 48.57, 0.95850, 0.77214, -0.27485 ] - - [ 52.71, 0.88325, 0.87258, -0.29346 ] - - [ 56.86, 0.80225, 0.96921, -0.31145 ] - - [ 61.00, 0.71510, 1.06002, -0.32925 ] - - [ 65.14, 0.62200, 1.14315, -0.34641 ] - - [ 69.29, 0.52364, 1.21688, -0.36357 ] - - [ 73.43, 0.42107, 1.27969, -0.37949 ] - - [ 77.57, 0.31569, 1.33030, -0.39517 ] - - [ 81.71, 0.20913, 1.36768, -0.40983 ] - - [ 85.86, 0.10324, 1.39107, -0.42306 ] - - [ 90.00, 0.00000, 1.40000, -0.43630 ] - - [ 94.14, -0.07227, 1.39107, -0.44302 ] - - [ 98.29, -0.14639, 1.36768, -0.44973 ] - - [ 102.43, -0.22098, 1.33030, -0.45298 ] - - [ 106.57, -0.29475, 1.27969, -0.45377 ] - - [ 110.71, -0.36655, 1.21688, -0.45387 ] - - [ 114.86, -0.43540, 1.14315, -0.45063 ] - - [ 119.00, -0.50057, 1.06002, -0.44739 ] - - [ 123.14, -0.56158, 0.96921, -0.44407 ] - - [ 127.29, -0.61828, 0.87258, -0.44072 ] - - [ 131.43, -0.67095, 0.77214, -0.43951 ] - - [ 135.57, -0.72040, 0.66995, -0.44237 ] - - [ 139.71, -0.76812, 0.56814, -0.44523 ] - - [ 143.86, -0.81660, 0.46882, -0.45335 ] - - [ 148.00, -0.86981, 0.37404, -0.46186 ] - - [ 150.29, -0.80768, 0.32441, -0.46384 ] - - [ 152.57, -0.74555, 0.27708, -0.44674 ] - - [ 154.86, -0.68342, 0.23234, -0.42964 ] - - [ 157.14, -0.62129, 0.19048, -0.41254 ] - - [ 159.43, -0.55916, 0.15176, -0.39544 ] - - [ 161.71, -0.49703, 0.11643, -0.40982 ] - - [ 164.00, -0.43490, 0.08471, -0.43470 ] - - [ 166.29, -0.37277, 0.05681, -0.45958 ] - - [ 168.57, -0.31064, 0.03289, -0.48445 ] - - [ 170.86, -0.24852, 0.02587, -0.45714 ] - - [ 173.14, -0.18639, 0.02133, -0.34286 ] - - [ 175.43, -0.12426, 0.01807, -0.22857 ] - - [ 177.71, -0.06213, 0.01611, -0.11429 ] - - [ 179.91, 0.00000, 0.01545, 0.00000 ] - - name : FFA-W3-301 # - relative_thickness : 0.301 # - data: # alpha c_l c_d c_m - # (deg) (-) (-) (-) - - [ -179.91, 0.00000, 0.02454, 0.00000 ] - - [ -177.71, 0.06508, 0.02514, 0.09143 ] - - [ -175.43, 0.13016, 0.02694, 0.18286 ] - - [ -173.14, 0.19525, 0.02993, 0.27429 ] - - [ -170.86, 0.26033, 0.03408, 0.36571 ] - - [ -168.57, 0.32541, 0.03938, 0.40085 ] - - [ -166.29, 0.39049, 0.05910, 0.40220 ] - - [ -164.00, 0.45557, 0.08495, 0.40356 ] - - [ -161.71, 0.52066, 0.11433, 0.40492 ] - - [ -159.43, 0.58574, 0.14704, 0.41010 ] - - [ -157.14, 0.65082, 0.18290, 0.42678 ] - - [ -154.86, 0.71590, 0.22166, 0.44345 ] - - [ -152.57, 0.78098, 0.26309, 0.46013 ] - - [ -150.29, 0.84607, 0.30692, 0.47680 ] - - [ -148.00, 0.91115, 0.35287, 0.47162 ] - - [ -143.86, 0.84257, 0.44061, 0.45656 ] - - [ -139.71, 0.78187, 0.53255, 0.44202 ] - - [ -135.57, 0.72448, 0.62677, 0.43452 ] - - [ -131.43, 0.66755, 0.72131, 0.42701 ] - - [ -127.29, 0.60928, 0.81421, 0.42483 ] - - [ -123.14, 0.54868, 0.90355, 0.42544 ] - - [ -119.00, 0.48530, 0.98748, 0.42634 ] - - [ -114.86, 0.41915, 1.06425, 0.42813 ] - - [ -110.71, 0.35056, 1.13227, 0.42992 ] - - [ -106.57, 0.28017, 1.19015, 0.42916 ] - - [ -102.43, 0.20881, 1.23669, 0.42788 ] - - [ -98.29, 0.13754, 1.27093, 0.42444 ] - - [ -94.14, 0.06751, 1.29218, 0.41794 ] - - [ -90.00, 0.00000, 1.30000, 0.41144 ] - - [ -85.86, -0.06751, 1.29218, 0.39804 ] - - [ -81.71, -0.13754, 1.27093, 0.38464 ] - - [ -77.57, -0.20881, 1.23669, 0.36892 ] - - [ -73.43, -0.28017, 1.19015, 0.35157 ] - - [ -69.29, -0.35056, 1.13227, 0.33391 ] - - [ -65.14, -0.41915, 1.06425, 0.31474 ] - - [ -61.00, -0.48530, 0.98748, 0.29557 ] - - [ -56.86, -0.54868, 0.90355, 0.27653 ] - - [ -52.71, -0.60928, 0.81421, 0.25754 ] - - [ -48.57, -0.66755, 0.72131, 0.23873 ] - - [ -44.43, -0.72448, 0.62677, 0.22027 ] - - [ -40.29, -0.78187, 0.53255, 0.20181 ] - - [ -36.14, -0.84257, 0.44061, 0.13644 ] - - [ -32.00, -0.91115, 0.35287, 0.06760 ] - - [ -28.00, -1.10349, 0.21721, 0.04231 ] - - [ -24.00, -1.10737, 0.15629, 0.02026 ] - - [ -20.00, -1.11815, 0.10335, 0.00407 ] - - [ -18.00, -1.12332, 0.08180, 0.00017 ] - - [ -16.00, -1.11865, 0.06331, -0.00167 ] - - [ -14.00, -1.11620, 0.04718, -0.00120 ] - - [ -12.00, -1.09588, 0.03280, -0.00463 ] - - [ -10.00, -0.91767, 0.02351, -0.02494 ] - - [ -8.00, -0.69311, 0.01793, -0.04304 ] - - [ -6.00, -0.45396, 0.01431, -0.05868 ] - - [ -4.00, -0.17779, 0.01242, -0.07601 ] - - [ -2.00, 0.10480, 0.01160, -0.09121 ] - - [ -1.00, 0.24383, 0.01143, -0.09763 ] - - [ 0.00, 0.38111, 0.01138, -0.10341 ] - - [ 1.00, 0.51660, 0.01143, -0.10861 ] - - [ 2.00, 0.65044, 0.01156, -0.11333 ] - - [ 3.00, 0.78267, 0.01177, -0.11762 ] - - [ 4.00, 0.91326, 0.01204, -0.12154 ] - - [ 5.00, 1.04207, 0.01239, -0.12510 ] - - [ 6.00, 1.16873, 0.01283, -0.12828 ] - - [ 7.00, 1.29296, 0.01338, -0.13104 ] - - [ 8.00, 1.41390, 0.01406, -0.13332 ] - - [ 9.00, 1.53088, 0.01488, -0.13503 ] - - [ 10.00, 1.64208, 0.01592, -0.13599 ] - - [ 11.00, 1.74568, 0.01726, -0.13605 ] - - [ 12.00, 1.83887, 0.01908, -0.13514 ] - - [ 13.00, 1.91764, 0.02169, -0.13322 ] - - [ 14.00, 1.97413, 0.02572, -0.13020 ] - - [ 15.00, 1.99916, 0.03222, -0.12641 ] - - [ 16.00, 1.99377, 0.04157, -0.12265 ] - - [ 18.00, 1.91720, 0.06731, -0.11675 ] - - [ 20.00, 1.73683, 0.10526, -0.11652 ] - - [ 24.00, 1.47321, 0.19229, -0.13790 ] - - [ 28.00, 1.36017, 0.27449, -0.16242 ] - - [ 32.00, 1.30164, 0.35287, -0.18463 ] - - [ 36.14, 1.20367, 0.44061, -0.20894 ] - - [ 40.29, 1.11695, 0.53255, -0.23276 ] - - [ 44.43, 1.03498, 0.62677, -0.25011 ] - - [ 48.57, 0.95364, 0.72131, -0.26746 ] - - [ 52.71, 0.87040, 0.81421, -0.28365 ] - - [ 56.86, 0.78383, 0.90355, -0.29923 ] - - [ 61.00, 0.69329, 0.98748, -0.31472 ] - - [ 65.14, 0.59878, 1.06425, -0.32988 ] - - [ 69.29, 0.50080, 1.13227, -0.34505 ] - - [ 73.43, 0.40024, 1.19015, -0.35942 ] - - [ 77.57, 0.29831, 1.23669, -0.37363 ] - - [ 81.71, 0.19648, 1.27093, -0.38702 ] - - [ 85.86, 0.09644, 1.29218, -0.39923 ] - - [ 90.00, 0.00000, 1.30000, -0.41144 ] - - [ 94.14, -0.06751, 1.29218, -0.41794 ] - - [ 98.29, -0.13754, 1.27093, -0.42444 ] - - [ 102.43, -0.20881, 1.23669, -0.42788 ] - - [ 106.57, -0.28017, 1.19015, -0.42916 ] - - [ 110.71, -0.35056, 1.13227, -0.42992 ] - - [ 114.86, -0.41915, 1.06425, -0.42813 ] - - [ 119.00, -0.48530, 0.98748, -0.42634 ] - - [ 123.14, -0.54868, 0.90355, -0.42544 ] - - [ 127.29, -0.60928, 0.81421, -0.42483 ] - - [ 131.43, -0.66755, 0.72131, -0.42701 ] - - [ 135.57, -0.72448, 0.62677, -0.43452 ] - - [ 139.71, -0.78187, 0.53255, -0.44202 ] - - [ 143.86, -0.84257, 0.44061, -0.45656 ] - - [ 148.00, -0.91115, 0.35287, -0.47162 ] - - [ 150.29, -0.84607, 0.30692, -0.47680 ] - - [ 152.57, -0.78098, 0.26309, -0.46013 ] - - [ 154.86, -0.71590, 0.22166, -0.44345 ] - - [ 157.14, -0.65082, 0.18290, -0.42678 ] - - [ 159.43, -0.58574, 0.14704, -0.41010 ] - - [ 161.71, -0.52066, 0.11433, -0.42206 ] - - [ 164.00, -0.45557, 0.08495, -0.44356 ] - - [ 166.29, -0.39049, 0.05910, -0.46506 ] - - [ 168.57, -0.32541, 0.03938, -0.48656 ] - - [ 170.86, -0.26033, 0.03408, -0.45714 ] - - [ 173.14, -0.19525, 0.02993, -0.34286 ] - - [ 175.43, -0.13016, 0.02694, -0.22857 ] - - [ 177.71, -0.06508, 0.02514, -0.11429 ] - - [ 179.91, 0.00000, 0.02454, 0.00000 ] - - name : FFA-W3-330blend # - relative_thickness : 0.33 # - data: # alpha c_l c_d c_m - # (deg) (-) (-) (-) - - [ -179.91, 0.00000, 0.03169, 0.00000 ] - - [ -177.71, 0.06960, 0.03228, 0.09143 ] - - [ -175.43, 0.13920, 0.03406, 0.18286 ] - - [ -173.14, 0.20880, 0.03702, 0.27429 ] - - [ -170.86, 0.27841, 0.04114, 0.36571 ] - - [ -168.57, 0.34801, 0.04638, 0.40308 ] - - [ -166.29, 0.41761, 0.05732, 0.40801 ] - - [ -164.00, 0.48721, 0.08319, 0.41294 ] - - [ -161.71, 0.55681, 0.11258, 0.41788 ] - - [ -159.43, 0.62641, 0.14533, 0.42586 ] - - [ -157.14, 0.69601, 0.18121, 0.44302 ] - - [ -154.86, 0.76562, 0.22000, 0.46017 ] - - [ -152.57, 0.83522, 0.26146, 0.47732 ] - - [ -150.29, 0.90482, 0.30532, 0.49447 ] - - [ -148.00, 0.97442, 0.35131, 0.48743 ] - - [ -143.86, 0.89412, 0.43913, 0.46839 ] - - [ -139.71, 0.82382, 0.53115, 0.44996 ] - - [ -135.57, 0.75845, 0.62546, 0.43985 ] - - [ -131.43, 0.69477, 0.72010, 0.42974 ] - - [ -127.29, 0.63079, 0.81310, 0.42589 ] - - [ -123.14, 0.56532, 0.90255, 0.42535 ] - - [ -119.00, 0.49783, 0.98659, 0.42528 ] - - [ -114.86, 0.42823, 1.06348, 0.42673 ] - - [ -110.71, 0.35680, 1.13162, 0.42817 ] - - [ -106.57, 0.28412, 1.18963, 0.42745 ] - - [ -102.43, 0.21103, 1.23629, 0.42628 ] - - [ -98.29, 0.13851, 1.27067, 0.42303 ] - - [ -94.14, 0.06775, 1.29204, 0.41683 ] - - [ -90.00, 0.00000, 1.30000, 0.41063 ] - - [ -85.86, -0.06775, 1.29204, 0.39752 ] - - [ -81.71, -0.13851, 1.27067, 0.38441 ] - - [ -77.57, -0.21103, 1.23629, 0.36905 ] - - [ -73.43, -0.28412, 1.18963, 0.35212 ] - - [ -69.29, -0.35680, 1.13162, 0.33491 ] - - [ -65.14, -0.42823, 1.06348, 0.31634 ] - - [ -61.00, -0.49783, 0.98659, 0.29777 ] - - [ -56.86, -0.56532, 0.90255, 0.27947 ] - - [ -52.71, -0.63079, 0.81310, 0.26125 ] - - [ -48.57, -0.69477, 0.72010, 0.24322 ] - - [ -44.43, -0.75845, 0.62546, 0.22556 ] - - [ -40.29, -0.82382, 0.53115, 0.20789 ] - - [ -36.14, -0.89412, 0.43913, 0.13731 ] - - [ -32.00, -0.97442, 0.35131, 0.06280 ] - - [ -28.00, -1.16308, 0.20648, 0.03905 ] - - [ -24.00, -1.14892, 0.15001, 0.01853 ] - - [ -20.00, -1.09451, 0.10600, 0.00441 ] - - [ -18.00, -1.05801, 0.08732, -0.00061 ] - - [ -16.00, -1.02281, 0.07051, -0.00342 ] - - [ -14.00, -0.99810, 0.05474, -0.00401 ] - - [ -12.00, -0.98515, 0.04052, -0.00272 ] - - [ -10.00, -0.89583, 0.02929, -0.01198 ] - - [ -8.00, -0.67539, 0.02207, -0.03458 ] - - [ -6.00, -0.43247, 0.01735, -0.05466 ] - - [ -4.00, -0.15881, 0.01473, -0.07425 ] - - [ -2.00, 0.13456, 0.01362, -0.09270 ] - - [ -1.00, 0.28014, 0.01339, -0.10074 ] - - [ 0.00, 0.42386, 0.01330, -0.10802 ] - - [ 1.00, 0.56519, 0.01333, -0.11450 ] - - [ 2.00, 0.70410, 0.01345, -0.12028 ] - - [ 3.00, 0.84071, 0.01366, -0.12546 ] - - [ 4.00, 0.97500, 0.01397, -0.13011 ] - - [ 5.00, 1.10680, 0.01437, -0.13425 ] - - [ 6.00, 1.23603, 0.01486, -0.13793 ] - - [ 7.00, 1.36223, 0.01547, -0.14108 ] - - [ 8.00, 1.48424, 0.01623, -0.14363 ] - - [ 9.00, 1.60097, 0.01718, -0.14545 ] - - [ 10.00, 1.71010, 0.01841, -0.14636 ] - - [ 11.00, 1.80957, 0.02010, -0.14635 ] - - [ 12.00, 1.89473, 0.02258, -0.14544 ] - - [ 13.00, 1.95698, 0.02671, -0.14378 ] - - [ 14.00, 1.98576, 0.03380, -0.14185 ] - - [ 15.00, 1.99260, 0.04333, -0.14004 ] - - [ 16.00, 1.99617, 0.05354, -0.13823 ] - - [ 18.00, 1.96398, 0.07706, -0.13351 ] - - [ 20.00, 1.81179, 0.11169, -0.13135 ] - - [ 24.00, 1.56073, 0.19103, -0.14660 ] - - [ 28.00, 1.46798, 0.27199, -0.17242 ] - - [ 32.00, 1.39203, 0.35131, -0.19417 ] - - [ 36.14, 1.27731, 0.43913, -0.21792 ] - - [ 40.29, 1.17689, 0.53115, -0.24115 ] - - [ 44.43, 1.08350, 0.62546, -0.25734 ] - - [ 48.57, 0.99253, 0.72010, -0.27354 ] - - [ 52.71, 0.90112, 0.81310, -0.28862 ] - - [ 56.86, 0.80760, 0.90255, -0.30311 ] - - [ 61.00, 0.71119, 0.98659, -0.31757 ] - - [ 65.14, 0.61175, 1.06348, -0.33194 ] - - [ 69.29, 0.50971, 1.13162, -0.34631 ] - - [ 73.43, 0.40589, 1.18963, -0.36014 ] - - [ 77.57, 0.30146, 1.23629, -0.37385 ] - - [ 81.71, 0.19788, 1.27067, -0.38681 ] - - [ 85.86, 0.09679, 1.29204, -0.39872 ] - - [ 90.00, 0.00000, 1.30000, -0.41063 ] - - [ 94.14, -0.06775, 1.29204, -0.41683 ] - - [ 98.29, -0.13851, 1.27067, -0.42303 ] - - [ 102.43, -0.21103, 1.23629, -0.42628 ] - - [ 106.57, -0.28412, 1.18963, -0.42745 ] - - [ 110.71, -0.35680, 1.13162, -0.42817 ] - - [ 114.86, -0.42823, 1.06348, -0.42673 ] - - [ 119.00, -0.49783, 0.98659, -0.42528 ] - - [ 123.14, -0.56532, 0.90255, -0.42535 ] - - [ 127.29, -0.63079, 0.81310, -0.42589 ] - - [ 131.43, -0.69477, 0.72010, -0.42974 ] - - [ 135.57, -0.75845, 0.62546, -0.43985 ] - - [ 139.71, -0.82382, 0.53115, -0.44996 ] - - [ 143.86, -0.89412, 0.43913, -0.46839 ] - - [ 148.00, -0.97442, 0.35131, -0.48743 ] - - [ 150.29, -0.90482, 0.30532, -0.49447 ] - - [ 152.57, -0.83522, 0.26146, -0.47732 ] - - [ 154.86, -0.76562, 0.22000, -0.46017 ] - - [ 157.14, -0.69601, 0.18121, -0.44302 ] - - [ 159.43, -0.62641, 0.14533, -0.42586 ] - - [ 161.71, -0.55681, 0.11258, -0.43502 ] - - [ 164.00, -0.48721, 0.08319, -0.45294 ] - - [ 166.29, -0.41761, 0.05732, -0.47087 ] - - [ 168.57, -0.34801, 0.04638, -0.48880 ] - - [ 170.86, -0.27841, 0.04114, -0.45714 ] - - [ 173.14, -0.20880, 0.03702, -0.34286 ] - - [ 175.43, -0.13920, 0.03406, -0.22857 ] - - [ 177.71, -0.06960, 0.03228, -0.11429 ] - - [ 179.91, 0.00000, 0.03169, 0.00000 ] - - name : FFA-W3-360 # - relative_thickness : 0.36 # - data: # alpha c_l c_d c_m - # (deg) (-) (-) (-) - - [ -179.91, 0.00000, 0.03715, 0.00000 ] - - [ -177.71, 0.07178, 0.03774, 0.09143 ] - - [ -175.43, 0.14356, 0.03951, 0.18286 ] - - [ -173.14, 0.21534, 0.04245, 0.27429 ] - - [ -170.86, 0.28713, 0.04653, 0.36571 ] - - [ -168.57, 0.35891, 0.05174, 0.40313 ] - - [ -166.29, 0.43069, 0.06068, 0.40814 ] - - [ -164.00, 0.50247, 0.08651, 0.41315 ] - - [ -161.71, 0.57425, 0.11586, 0.41816 ] - - [ -159.43, 0.64603, 0.14856, 0.42627 ] - - [ -157.14, 0.71781, 0.18439, 0.44370 ] - - [ -154.86, 0.78960, 0.22313, 0.46114 ] - - [ -152.57, 0.86138, 0.26453, 0.47857 ] - - [ -150.29, 0.93316, 0.30832, 0.49600 ] - - [ -148.00, 1.00494, 0.35424, 0.48830 ] - - [ -143.86, 0.91898, 0.44192, 0.46784 ] - - [ -139.71, 0.84406, 0.53379, 0.44803 ] - - [ -135.57, 0.77483, 0.62793, 0.43697 ] - - [ -131.43, 0.70790, 0.72238, 0.42591 ] - - [ -127.29, 0.64116, 0.81520, 0.42150 ] - - [ -123.14, 0.57335, 0.90444, 0.42058 ] - - [ -119.00, 0.50388, 0.98826, 0.42024 ] - - [ -114.86, 0.43261, 1.06493, 0.42168 ] - - [ -110.71, 0.35981, 1.13285, 0.42312 ] - - [ -106.57, 0.28603, 1.19061, 0.42258 ] - - [ -102.43, 0.21209, 1.23704, 0.42163 ] - - [ -98.29, 0.13899, 1.27116, 0.41864 ] - - [ -94.14, 0.06787, 1.29229, 0.41277 ] - - [ -90.00, 0.00000, 1.30000, 0.40690 ] - - [ -85.86, -0.06787, 1.29229, 0.39426 ] - - [ -81.71, -0.13899, 1.27116, 0.38162 ] - - [ -77.57, -0.21209, 1.23704, 0.36676 ] - - [ -73.43, -0.28603, 1.19061, 0.35033 ] - - [ -69.29, -0.35981, 1.13285, 0.33362 ] - - [ -65.14, -0.43261, 1.06493, 0.31561 ] - - [ -61.00, -0.50388, 0.98826, 0.29759 ] - - [ -56.86, -0.57335, 0.90444, 0.27989 ] - - [ -52.71, -0.64116, 0.81520, 0.26230 ] - - [ -48.57, -0.70790, 0.72238, 0.24491 ] - - [ -44.43, -0.77483, 0.62793, 0.22794 ] - - [ -40.29, -0.84406, 0.53379, 0.21097 ] - - [ -36.14, -0.91898, 0.44192, 0.13525 ] - - [ -32.00, -1.00494, 0.35424, 0.05517 ] - - [ -28.00, -1.11306, 0.20494, 0.03211 ] - - [ -24.00, -1.05425, 0.15434, 0.01268 ] - - [ -20.00, -0.98247, 0.10967, -0.00282 ] - - [ -18.00, -0.94173, 0.09249, -0.00741 ] - - [ -16.00, -0.89333, 0.07597, -0.01107 ] - - [ -14.00, -0.85472, 0.06054, -0.01250 ] - - [ -12.00, -0.82348, 0.04641, -0.01177 ] - - [ -10.00, -0.79541, 0.03441, -0.01082 ] - - [ -8.00, -0.63650, 0.02548, -0.02769 ] - - [ -6.00, -0.39095, 0.01994, -0.05107 ] - - [ -4.00, -0.13071, 0.01653, -0.07148 ] - - [ -2.00, 0.16173, 0.01507, -0.09179 ] - - [ -1.00, 0.31121, 0.01477, -0.10119 ] - - [ 0.00, 0.45956, 0.01465, -0.10988 ] - - [ 1.00, 0.60566, 0.01466, -0.11776 ] - - [ 2.00, 0.74868, 0.01481, -0.12477 ] - - [ 3.00, 0.88862, 0.01507, -0.13098 ] - - [ 4.00, 1.02544, 0.01544, -0.13648 ] - - [ 5.00, 1.15878, 0.01593, -0.14130 ] - - [ 6.00, 1.28822, 0.01654, -0.14540 ] - - [ 7.00, 1.41282, 0.01731, -0.14875 ] - - [ 8.00, 1.53090, 0.01831, -0.15118 ] - - [ 9.00, 1.64065, 0.01963, -0.15262 ] - - [ 10.00, 1.73926, 0.02150, -0.15310 ] - - [ 11.00, 1.81971, 0.02445, -0.15254 ] - - [ 12.00, 1.87065, 0.02966, -0.15121 ] - - [ 13.00, 1.89221, 0.03770, -0.14969 ] - - [ 14.00, 1.87910, 0.04824, -0.14562 ] - - [ 15.00, 1.88111, 0.05838, -0.14358 ] - - [ 16.00, 1.86359, 0.06992, -0.14095 ] - - [ 18.00, 1.73324, 0.10166, -0.13711 ] - - [ 20.00, 1.59357, 0.13916, -0.14082 ] - - [ 24.00, 1.46708, 0.21002, -0.15693 ] - - [ 28.00, 1.44834, 0.28200, -0.17979 ] - - [ 32.00, 1.43563, 0.35424, -0.20147 ] - - [ 36.14, 1.31283, 0.44192, -0.22409 ] - - [ 40.29, 1.20580, 0.53379, -0.24619 ] - - [ 44.43, 1.10690, 0.62793, -0.26133 ] - - [ 48.57, 1.01129, 0.72238, -0.27648 ] - - [ 52.71, 0.91594, 0.81520, -0.29062 ] - - [ 56.86, 0.81907, 0.90444, -0.30424 ] - - [ 61.00, 0.71982, 0.98826, -0.31787 ] - - [ 65.14, 0.61801, 1.06493, -0.33154 ] - - [ 69.29, 0.51401, 1.13285, -0.34522 ] - - [ 73.43, 0.40862, 1.19061, -0.35846 ] - - [ 77.57, 0.30299, 1.23704, -0.37161 ] - - [ 81.71, 0.19855, 1.27116, -0.38405 ] - - [ 85.86, 0.09695, 1.29229, -0.39547 ] - - [ 90.00, 0.00000, 1.30000, -0.40690 ] - - [ 94.14, -0.06787, 1.29229, -0.41277 ] - - [ 98.29, -0.13899, 1.27116, -0.41864 ] - - [ 102.43, -0.21209, 1.23704, -0.42163 ] - - [ 106.57, -0.28603, 1.19061, -0.42258 ] - - [ 110.71, -0.35981, 1.13285, -0.42312 ] - - [ 114.86, -0.43261, 1.06493, -0.42168 ] - - [ 119.00, -0.50388, 0.98826, -0.42024 ] - - [ 123.14, -0.57335, 0.90444, -0.42058 ] - - [ 127.29, -0.64116, 0.81520, -0.42150 ] - - [ 131.43, -0.70790, 0.72238, -0.42591 ] - - [ 135.57, -0.77483, 0.62793, -0.43697 ] - - [ 139.71, -0.84406, 0.53379, -0.44803 ] - - [ 143.86, -0.91898, 0.44192, -0.46784 ] - - [ 148.00, -1.00494, 0.35424, -0.48830 ] - - [ 150.29, -0.93316, 0.30832, -0.49600 ] - - [ 152.57, -0.86138, 0.26453, -0.47857 ] - - [ 154.86, -0.78960, 0.22313, -0.46114 ] - - [ 157.14, -0.71781, 0.18439, -0.44370 ] - - [ 159.43, -0.64603, 0.14856, -0.42627 ] - - [ 161.71, -0.57425, 0.11586, -0.43530 ] - - [ 164.00, -0.50247, 0.08651, -0.45315 ] - - [ 166.29, -0.43069, 0.06068, -0.47100 ] - - [ 168.57, -0.35891, 0.05174, -0.48884 ] - - [ 170.86, -0.28713, 0.04653, -0.45714 ] - - [ 173.14, -0.21534, 0.04245, -0.34286 ] - - [ 175.43, -0.14356, 0.03951, -0.22857 ] - - [ 177.71, -0.07178, 0.03774, -0.11429 ] - - [ 179.91, 0.00000, 0.03715, 0.00000 ] - - - pitch_control: - GS_Angles: [0.06019804, 0.08713416, 0.10844806, 0.12685912, 0.14339822, 0.1586021 , 0.17279614, 0.18618935, 0.19892772, 0.21111989, 0.22285021, 0.23417256, 0.2451469 , 0.25580691, 0.26619545, 0.27632495, 0.28623134, 0.29593266, 0.30544521, 0.314779 , 0.32395154, 0.33297489, 0.3418577 , 0.35060844, 0.35923641, 0.36774807, 0.37614942, 0.38444655, 0.39264363, 0.40074407] - GS_Kp: [-0.9394215 , -0.80602855, -0.69555026, -0.60254912, -0.52318192, -0.45465531, -0.39489024, -0.34230736, -0.29568537, -0.25406506, -0.2166825 , -0.18292183, -0.15228099, -0.12434663, -0.09877533, -0.0752794 , -0.05361604, -0.0335789 , -0.01499149, 0.00229803, 0.01842102, 0.03349169, 0.0476098 , 0.0608629 , 0.07332812, 0.0850737 , 0.0961602 , 0.10664158, 0.11656607, 0.12597691] - GS_Ki: [-0.07416547, -0.06719673, -0.0614251 , -0.05656651, -0.0524202 , -0.04884022, -0.04571796, -0.04297091, -0.04053528, -0.03836094, -0.03640799, -0.03464426, -0.03304352, -0.03158417, -0.03024826, -0.02902079, -0.02788904, -0.02684226, -0.02587121, -0.02496797, -0.02412567, -0.02333834, -0.02260078, -0.02190841, -0.0212572 , -0.02064359, -0.0200644 , -0.01951683, -0.01899836, -0.01850671] - Fl_Kp: -9.35 - wt_ops: # operating points: wind speed [m/s], blade pitch [deg], rotor speed [rpm] - v: [3.0, 3.266896551724138, 3.533793103448276, 3.800689655172414, 4.067586206896552, 4.334482758620689, 4.601379310344828, 4.868275862068966, 5.135172413793104, 5.402068965517241, 5.6689655172413795, 5.935862068965518, 6.2027586206896554, 6.469655172413793, 6.736551724137931, 7.00344827586207, 7.270344827586207, 7.537241379310345, 7.804137931034483, 8.071034482758622, 8.337931034482759, 8.604827586206897, 8.871724137931036, 9.138620689655173, 9.405517241379311, 9.672413793103448, 9.939310344827586, 10.206206896551725, 10.473103448275863, 10.74, 11.231724137931035, 11.723448275862069, 12.215172413793104, 12.706896551724139, 13.198620689655172, 13.690344827586207, 14.182068965517242, 14.673793103448276, 15.16551724137931, 15.657241379310346, 16.14896551724138, 16.640689655172416, 17.13241379310345, 17.624137931034483, 18.11586206896552, 18.607586206896553, 19.099310344827586, 19.591034482758623, 20.082758620689653, 20.57448275862069, 21.066206896551726, 21.557931034482756, 22.049655172413793, 22.54137931034483, 23.03310344827586, 23.524827586206897, 24.016551724137933, 24.508275862068963, 25.0] - pitch_op: [-0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, 3.57152, 5.12896, 6.36736, 7.43866, 8.40197, 9.28843, 10.1161, 10.8974, 11.641, 12.3529, 13.038, 13.6997, 14.3409, 14.9642, 15.5713, 16.1639, 16.7435, 17.3109, 17.8673, 18.4136, 18.9506, 19.4788, 19.9989, 20.5112, 21.0164, 21.5147, 22.0067, 22.4925, 22.9724] - omega_op: [2.1486, 2.3397, 2.5309, 2.722, 2.9132, 3.1043, 3.2955, 3.4866, 3.6778, 3.8689, 4.0601, 4.2512, 4.4424, 4.6335, 4.8247, 5.0159, 5.207, 5.3982, 5.5893, 5.7805, 5.9716, 6.1628, 6.3539, 6.5451, 6.7362, 6.9274, 7.1185, 7.3097, 7.5008, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56] - gear_ratio: 1 - torque_control: - VS_KP: -38609162.66552 - VS_KI: -4588245.18720 - - - tower: # (could remove some entries that don't apply for the tower) - - - name: main - type: 1 # 1 to signify that this member is a tower (2 for if it's part of the platform/substructure) - - dlsMax : 5.0 # maximum node splitting section amount; can't be 0 - - name : tower # [-] an identifier (no longer has to be number) - type : 1 # [-] - rA : [ 0, 0, 15] # [m] end A coordinates - rB : [ 0, 0, 144.582] # [m] and B coordinates - shape : circ # [-] circular or rectangular - gamma : 0.0 # [deg] twist angle about the member's z-axis - - # --- outer shell including hydro--- - stations : [ 15, 28, 28.001, 41, 41.001, 54, 54.001, 67, 67.001, 80, 80.001, 93, 93.001, 106, 106.001, 119, 119.001, 132, 132.001, 144.582 ] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB - d : [ 10, 9.964, 9.964, 9.967, 9.967, 9.927, 9.927, 9.528, 9.528, 9.149, 9.149, 8.945, 8.945, 8.735, 8.735, 8.405, 8.405, 7.321, 7.321, 6.5 ] # [m] diameters if circular or side lengths if rectangular (can be pairs) - t : [ 0.082954, 0.082954, 0.083073, 0.083073, 0.082799, 0.082799, 0.0299, 0.0299, 0.027842, 0.027842, 0.025567, 0.025567, 0.022854, 0.022854, 0.02025, 0.02025, 0.018339, 0.018339, 0.021211, 0.021211 ] # [m] wall thicknesses (scalar or list of same length as stations) - Cd : 0.0 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) - Ca : 0.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) - # (neglecting axial coefficients for now) - CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) - CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) - rho_shell : 7850 # [kg/m3] material density - - - - - - - -platform: - - potModMaster : 1 # [int] master switch for potMod variables; 0=keeps all member potMod vars the same, 1=turns all potMod vars to False (no HAMS), 2=turns all potMod vars to True (no strip) - dlsMax : 5.0 # maximum node splitting section amount for platform members; can't be 0 - - members: # list all members here - - - name : center_column # [-] an identifier (no longer has to be number) - type : 2 # [-] - rA : [ 0, 0, -20] # [m] end A coordinates - rB : [ 0, 0, 15] # [m] and B coordinates - shape : circ # [-] circular or rectangular - gamma : 0.0 # [deg] twist angle about the member's z-axis - potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory - # --- outer shell including hydro--- - stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB - d : 10.0 # [m] diameters if circular or side lengths if rectangular (can be pairs) - t : 0.05 # [m] wall thicknesses (scalar or list of same length as stations) - Cd : 0.8 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) - Ca : 1.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) - CdEnd : 0.6 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) - CaEnd : 0.6 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) - rho_shell : 7850 # [kg/m3] - # --- handling of end caps or any internal structures if we need them --- - cap_stations : [ 0 ] # [m] location along member of any inner structures (in same scaling as set by 'stations') - cap_t : [ 0.001 ] # [m] thickness of any internal structures - cap_d_in : [ 0 ] # [m] inner diameter of internal structures (0 for full cap/bulkhead, >0 for a ring shape) - - - - name : outer_column # [-] an identifier (no longer has to be number) - type : 2 # [-] - rA : [51.75, 0, -20] # [m] end A coordinates - rB : [51.75, 0, 15] # [m] and B coordinates - heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) - shape : circ # [-] circular or rectangular - gamma : 0.0 # [deg] twist angle about the member's z-axis - potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory - # --- outer shell including hydro--- - stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB - d : 12.5 # [m] diameters if circular or side lengths if rectangular (can be pairs) - t : 0.05 # [m] wall thicknesses (scalar or list of same length as stations) - Cd : 0.8 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) - Ca : 1.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) - CdEnd : 0.6 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) - CaEnd : 0.6 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) - rho_shell : 7850 # [kg/m3] - # --- ballast --- - l_fill : 1.4 # [m] - rho_fill : 5000 # [kg/m3] - # --- handling of end caps or any internal structures if we need them --- - cap_stations : [ 0 ] # [m] location along member of any inner structures (in same scaling as set by 'stations') - cap_t : [ 0.001 ] # [m] thickness of any internal structures - cap_d_in : [ 0 ] # [m] inner diameter of internal structures (0 for full cap/bulkhead, >0 for a ring shape) - - - - name : pontoon # [-] an identifier (no longer has to be number) - type : 2 # [-] - rA : [ 5 , 0, -16.5] # [m] end A coordinates - rB : [ 45.5, 0, -16.5] # [m] and B coordinates - heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) - shape : rect # [-] circular or rectangular - gamma : 0.0 # [deg] twist angle about the member's z-axis - potMod : False # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory - # --- outer shell including hydro--- - stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB - d : [12.5, 7.0] # [m] diameters if circular or side lengths if rectangular (can be pairs) - t : 0.05 # [m] wall thicknesses (scalar or list of same length as stations) - Cd : 0.8 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) - Ca : 1.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) - CdEnd : 0.6 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) - CaEnd : 0.6 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) - rho_shell : 7850 # [kg/m3] - l_fill : 43.0 # [m] - rho_fill : 1025.0 # [kg/m3] - - - - name : upper_support # [-] an identifier (no longer has to be number) - type : 2 # [-] - rA : [ 5 , 0, 14.545] # [m] end A coordinates - rB : [ 45.5, 0, 14.545] # [m] and B coordinates - heading : [ 60, 180, 300] # [deg] heading rotation of column about z axis (for repeated members) - shape : circ # [-] circular or rectangular - gamma : 0.0 # [deg] twist angle about the member's z-axis - potMod : False # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory - # --- outer shell including hydro--- - stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB - d : 0.91 # [m] diameters if circular or side lengths if rectangular (can be pairs) - t : 0.01 # [m] wall thicknesses (scalar or list of same length as stations) - Cd : 0.8 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) - Ca : 1.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) - CdEnd : 0.6 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) - CaEnd : 0.6 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) - rho_shell : 7850 # [kg/m3] - - -mooring: - water_depth: 200 # [m] uniform water depth - - points: - - name: line1_anchor - type: fixed - location: [-837, 0.0, -200.0] - anchor_type: drag_embedment - - - name: line2_anchor - type: fixed - location: [418, 725, -200.0] - anchor_type: drag_embedment - - - name: line3_anchor - type: fixed - location: [418, -725, -200.0] - anchor_type: drag_embedment - - - name: line1_vessel - type: vessel - location: [-58, 0.0, -14.0] - - - name: line2_vessel - type: vessel - location: [29, 50, -14.0] - - - name: line3_vessel - type: vessel - location: [29, -50, -14.0] - - lines: - - name: line1 - endA: line1_anchor - endB: line1_vessel - type: chain - length: 850 - - - name: line2 - endA: line2_anchor - endB: line2_vessel - type: chain - length: 850 - - - name: line3 - endA: line3_anchor - endB: line3_vessel - type: chain - length: 850 - - line_types: - - name: chain - diameter: 0.185 - mass_density: 685.0 - stiffness: 3270e6 - breaking_load: 1e8 - cost: 100.0 - transverse_added_mass: 1.0 - tangential_added_mass: 0.0 - transverse_drag: 1.6 - tangential_drag: 0.1 - - anchor_types: - - name: drag_embedment - mass: 1e3 - cost: 1e4 - max_vertical_load: 0.0 - max_lateral_load: 1e5 \ No newline at end of file diff --git a/RAFT/designs/test2.yaml b/RAFT/designs/test2.yaml deleted file mode 100644 index 274a0fa84..000000000 --- a/RAFT/designs/test2.yaml +++ /dev/null @@ -1,1273 +0,0 @@ -type: input file for RAFT -name: test yaml for MHK turbines for CT-Opt - - -settings: # global Settings - min_freq : 0.001 # [Hz] lowest frequency to consider, also the frequency bin width - max_freq : 0.40 # [Hz] highest frequency to consider - XiStart : 0 # sets initial amplitude of each DOF for all frequencies - nIter : 10 # sets how many iterations to perform in Model.solveDynamics() - -site: - water_depth : 400 # [m] uniform water depth - rho_water : 1025.0 # [kg/m^3] water density - rho_air : 1.225 # [kg/m^3] air density - mu_air : 1.81e-05 # air dynamic viscosity - shearExp : 0.12 # shear exponent - -cases: - - keys : [wind_speed, wind_heading, turbulence, turbine_status, yaw_misalign, wave_spectrum, wave_period, wave_height, wave_heading ] - data : # m/s deg % or e.g. 2B_NTM string deg string (s) (m) (deg) - - [ 12, 0, 0.01, operating, 0, JONSWAP, 13.1, 8.5, 0 ] - - -turbine : - - nrotors : 2 # [-] number of turbines in the FOWT - rotorCoords : [[0,150],[0,-150]] # x-y coordinates of rotor in space - - mRNA : 991000 # [kg] RNA mass - IxRNA : 0 # [kg-m2] RNA moment of inertia about local x axis (assumed to be identical to rotor axis for now, as approx) [kg-m^2] - IrRNA : 0 # [kg-m2] RNA moment of inertia about local y or z axes [kg-m^2] - xCG_RNA : 0 # [m] x location of RNA center of mass [m] (Actual is ~= -0.27 m) - hHub : 150.0 # [m] hub height above water line [m] - Fthrust : 1500.0E3 # [N] temporary thrust force to use - - I_drivetrain: 318628138.0 # full rotor + drivetrain inertia as felt on the high-speed shaft - - nBlades : 3 # number of blades - Zhub : -150.0 # hub height [m] - Rhub : 3.97 # hub radius [m] - precone : 4.0 # [rad] - shaft_tilt : 0.0 # [rad] - overhang : 12.0313 # [m] - aeroServoMod : 1 # 0 aerodynamics off; 1 aerodynamics on (no control); 2 aerodynamics and control on - - blade: - precurveTip : -3.9999999999999964 # - presweepTip : 0.0 # - Rtip : 120.96999999936446 # rotor radius - - geometry: # r chord theta precurve presweep - # (m) (m) (deg) (m) (m) - - [ 8.004, 5.228, 15.474, 0.035, 0.000 ] - - [ 12.039, 5.321, 14.692, 0.084, 0.000 ] - - [ 16.073, 5.458, 13.330, 0.139, 0.000 ] - - [ 20.108, 5.602, 11.644, 0.192, 0.000 ] - - [ 24.142, 5.718, 9.927, 0.232, 0.000 ] - - [ 28.177, 5.767, 8.438, 0.250, 0.000 ] - - [ 32.211, 5.713, 7.301, 0.250, 0.000 ] - - [ 36.246, 5.536, 6.232, 0.246, 0.000 ] - - [ 40.280, 5.291, 5.230, 0.240, 0.000 ] - - [ 44.315, 5.035, 4.348, 0.233, 0.000 ] - - [ 48.349, 4.815, 3.606, 0.218, 0.000 ] - - [ 52.384, 4.623, 2.978, 0.178, 0.000 ] - - [ 56.418, 4.432, 2.423, 0.100, 0.000 ] - - [ 60.453, 4.245, 1.924, 0.000, 0.000 ] - - [ 64.487, 4.065, 1.467, -0.112, 0.000 ] - - [ 68.522, 3.896, 1.056, -0.244, 0.000 ] - - [ 72.556, 3.735, 0.692, -0.415, 0.000 ] - - [ 76.591, 3.579, 0.355, -0.620, 0.000 ] - - [ 80.625, 3.425, 0.019, -0.846, 0.000 ] - - [ 84.660, 3.268, -0.358, -1.080, 0.000 ] - - [ 88.694, 3.112, -0.834, -1.330, 0.000 ] - - [ 92.729, 2.957, -1.374, -1.602, 0.000 ] - - [ 96.763, 2.800, -1.848, -1.895, 0.000 ] - - [ 100.798, 2.637, -2.136, -2.202, 0.000 ] - - [ 104.832, 2.464, -2.172, -2.523, 0.000 ] - - [ 108.867, 2.283, -2.108, -2.864, 0.000 ] - - [ 112.901, 2.096, -1.953, -3.224, 0.000 ] - - [ 116.936, 1.902, -1.662, -3.605, 0.000 ] - - airfoils: # location name - # (0-1) (string) name must match name in airfoils list - - [ 0.00000, circular ] - - [ 0.02000, circular ] - - [ 0.15000, SNL-FFA-W3-500 ] - - [ 0.24517, FFA-W3-360 ] - - [ 0.32884, FFA-W3-330blend ] - - [ 0.43918, FFA-W3-301 ] - - [ 0.53767, FFA-W3-270blend ] - - [ 0.63821, FFA-W3-241 ] - - [ 0.77174, FFA-W3-211 ] - - [ 1.00000, FFA-W3-211 ] - - airfoils: - - name : circular # - relative_thickness : 1.0 # - data: # alpha c_l c_d c_m - # (deg) (-) (-) (-) - - [ -179.91, 0.00010, 0.35000, -0.00010 ] - - [ 179.91, 0.00010, 0.35000, -0.00010 ] - - name : SNL-FFA-W3-500 # - relative_thickness : 0.5 # - data: # alpha c_l c_d c_m - # (deg) (-) (-) (-) - - [ -179.97, 0.00000, 0.08440, 0.00000 ] - - [ -170.00, 0.44190, 0.08440, 0.31250 ] - - [ -160.00, 0.88370, 0.12680, 0.28310 ] - - [ -150.00, 0.96740, 0.29270, 0.26320 ] - - [ -140.00, 0.78010, 0.49700, 0.20480 ] - - [ -130.00, 0.62930, 0.71610, 0.19320 ] - - [ -120.00, 0.47850, 0.92460, 0.20080 ] - - [ -110.00, 0.31890, 1.09850, 0.21360 ] - - [ -100.00, 0.15530, 1.21820, 0.22210 ] - - [ -90.00, 0.00000, 1.27070, 0.21980 ] - - [ -80.00, -0.15530, 1.21820, 0.19600 ] - - [ -70.00, -0.31890, 1.09850, 0.16350 ] - - [ -60.00, -0.47840, 0.92460, 0.12850 ] - - [ -50.00, -0.62930, 0.71610, 0.09650 ] - - [ -40.00, -0.78010, 0.49700, 0.07160 ] - - [ -30.00, -0.96740, 0.29270, 0.05220 ] - - [ -20.00, -1.02810, 0.14990, -0.00630 ] - - [ -19.75, -1.02430, 0.14720, -0.00890 ] - - [ -19.25, -1.00520, 0.14470, -0.00990 ] - - [ -19.00, -0.99710, 0.14330, -0.01050 ] - - [ -18.75, -1.00520, 0.14030, -0.01100 ] - - [ -18.50, -0.99950, 0.13860, -0.01160 ] - - [ -18.25, -0.99080, 0.13730, -0.01200 ] - - [ -18.00, -0.98150, 0.13600, -0.01260 ] - - [ -17.50, -0.97640, 0.13220, -0.01350 ] - - [ -17.25, -0.97050, 0.13060, -0.01390 ] - - [ -17.00, -0.96550, 0.12900, -0.01430 ] - - [ -16.75, -0.96620, 0.12680, -0.01470 ] - - [ -16.50, -0.95440, 0.12580, -0.01510 ] - - [ -16.25, -0.94440, 0.12460, -0.01550 ] - - [ -16.00, -0.94050, 0.12290, -0.01580 ] - - [ -15.75, -0.94330, 0.12060, -0.01610 ] - - [ -15.50, -0.93300, 0.11950, -0.01640 ] - - [ -15.25, -0.92110, 0.11850, -0.01680 ] - - [ -14.75, -0.91580, 0.11500, -0.01730 ] - - [ -14.50, -0.90700, 0.11380, -0.01750 ] - - [ -14.25, -0.89590, 0.11270, -0.01780 ] - - [ -14.00, -0.89260, 0.11100, -0.01810 ] - - [ -13.75, -0.88080, 0.11000, -0.01840 ] - - [ -13.50, -0.87220, 0.10890, -0.01860 ] - - [ -13.25, -0.86600, 0.10750, -0.01880 ] - - [ -13.00, -0.86260, 0.10590, -0.01880 ] - - [ -12.75, -0.84890, 0.10510, -0.01920 ] - - [ -12.50, -0.83630, 0.10420, -0.01940 ] - - [ -12.25, -0.83630, 0.10230, -0.01940 ] - - [ -12.00, -0.82710, 0.10130, -0.01960 ] - - [ -11.75, -0.81410, 0.10040, -0.01980 ] - - [ -11.50, -0.80040, 0.09970, -0.02000 ] - - [ -11.00, -0.78900, 0.09710, -0.01990 ] - - [ -10.75, -0.78620, 0.09560, -0.01960 ] - - [ -10.50, -0.77470, 0.09480, -0.01940 ] - - [ -10.25, -0.77010, 0.09400, -0.01840 ] - - [ -10.00, -0.76740, 0.09250, -0.01830 ] - - [ -9.75, -0.75060, 0.09170, -0.01920 ] - - [ -9.50, -0.72900, 0.09120, -0.02050 ] - - [ -9.25, -0.70950, 0.09020, -0.02240 ] - - [ -9.00, -0.68550, 0.08950, -0.02470 ] - - [ -8.75, -0.65900, 0.08910, -0.02670 ] - - [ -8.50, -0.63190, 0.08870, -0.02870 ] - - [ -8.25, -0.60190, 0.08790, -0.03200 ] - - [ -8.00, -0.57180, 0.08750, -0.03450 ] - - [ -7.75, -0.54240, 0.08730, -0.03670 ] - - [ -7.50, -0.50980, 0.08680, -0.03990 ] - - [ -7.25, -0.47670, 0.08640, -0.04300 ] - - [ -7.00, -0.44540, 0.08620, -0.04530 ] - - [ -6.75, -0.41420, 0.08600, -0.04760 ] - - [ -6.50, -0.37910, 0.08560, -0.05100 ] - - [ -6.25, -0.34600, 0.08530, -0.05380 ] - - [ -6.00, -0.31440, 0.08520, -0.05600 ] - - [ -5.75, -0.28170, 0.08500, -0.05860 ] - - [ -5.50, -0.24610, 0.08470, -0.06190 ] - - [ -5.25, -0.21330, 0.08460, -0.06440 ] - - [ -5.00, -0.18270, 0.08450, -0.06630 ] - - [ -4.75, -0.14940, 0.08430, -0.06880 ] - - [ -4.50, -0.11580, 0.08420, -0.07150 ] - - [ -4.25, -0.08370, 0.08400, -0.07370 ] - - [ -4.00, -0.05290, 0.08400, -0.07560 ] - - [ -3.75, -0.02250, 0.08390, -0.07740 ] - - [ -3.50, 0.00890, 0.08380, -0.07930 ] - - [ -3.25, 0.03920, 0.08380, -0.08110 ] - - [ -3.00, 0.06860, 0.08380, -0.08260 ] - - [ -2.75, 0.09740, 0.08380, -0.08380 ] - - [ -2.50, 0.12600, 0.08380, -0.08520 ] - - [ -2.25, 0.15550, 0.08380, -0.08670 ] - - [ -2.00, 0.18530, 0.08380, -0.08830 ] - - [ -1.75, 0.21460, 0.08370, -0.08970 ] - - [ -1.50, 0.24300, 0.08370, -0.09100 ] - - [ -1.25, 0.27130, 0.08380, -0.09210 ] - - [ -1.00, 0.30060, 0.08380, -0.09360 ] - - [ -0.75, 0.32950, 0.08380, -0.09490 ] - - [ -0.50, 0.35780, 0.08380, -0.09610 ] - - [ -0.25, 0.38570, 0.08380, -0.09720 ] - - [ 0.00, 0.41350, 0.08380, -0.09830 ] - - [ 0.23, 0.44250, 0.08390, -0.09950 ] - - [ 0.47, 0.47150, 0.08390, -0.10080 ] - - [ 0.70, 0.50030, 0.08390, -0.10190 ] - - [ 0.94, 0.52860, 0.08400, -0.10290 ] - - [ 1.17, 0.55670, 0.08400, -0.10400 ] - - [ 1.40, 0.58500, 0.08410, -0.10500 ] - - [ 1.64, 0.61350, 0.08410, -0.10610 ] - - [ 1.87, 0.64170, 0.08420, -0.10720 ] - - [ 2.11, 0.66970, 0.08420, -0.10820 ] - - [ 2.34, 0.69750, 0.08430, -0.10910 ] - - [ 2.57, 0.72510, 0.08430, -0.11000 ] - - [ 2.81, 0.75280, 0.08440, -0.11090 ] - - [ 3.04, 0.78070, 0.08450, -0.11190 ] - - [ 3.28, 0.80830, 0.08460, -0.11280 ] - - [ 3.51, 0.83580, 0.08460, -0.11370 ] - - [ 3.74, 0.86310, 0.08470, -0.11460 ] - - [ 3.98, 0.89020, 0.08470, -0.11530 ] - - [ 4.21, 0.91730, 0.08480, -0.11610 ] - - [ 4.45, 0.94440, 0.08490, -0.11700 ] - - [ 4.68, 0.97130, 0.08500, -0.11780 ] - - [ 4.91, 0.99810, 0.08510, -0.11850 ] - - [ 5.15, 1.02490, 0.08520, -0.11920 ] - - [ 5.38, 1.05150, 0.08530, -0.11990 ] - - [ 5.62, 1.07790, 0.08530, -0.12060 ] - - [ 5.85, 1.10410, 0.08540, -0.12120 ] - - [ 6.08, 1.13020, 0.08560, -0.12180 ] - - [ 6.32, 1.15600, 0.08570, -0.12240 ] - - [ 6.55, 1.18180, 0.08580, -0.12300 ] - - [ 6.79, 1.20760, 0.08590, -0.12350 ] - - [ 7.02, 1.23340, 0.08600, -0.12400 ] - - [ 7.25, 1.25890, 0.08610, -0.12450 ] - - [ 7.49, 1.28410, 0.08620, -0.12500 ] - - [ 7.72, 1.30880, 0.08640, -0.12540 ] - - [ 7.96, 1.33310, 0.08650, -0.12570 ] - - [ 8.19, 1.35700, 0.08670, -0.12590 ] - - [ 8.42, 1.38100, 0.08690, -0.12620 ] - - [ 8.66, 1.40540, 0.08700, -0.12650 ] - - [ 8.89, 1.42950, 0.08710, -0.12670 ] - - [ 9.12, 1.45310, 0.08730, -0.12700 ] - - [ 9.88, 1.51540, 0.08790, -0.12650 ] - - [ 10.64, 1.57490, 0.08860, -0.12560 ] - - [ 11.40, 1.61510, 0.08950, -0.12140 ] - - [ 12.15, 1.64430, 0.09120, -0.11630 ] - - [ 12.91, 1.68240, 0.09300, -0.11330 ] - - [ 13.67, 1.71460, 0.09540, -0.11070 ] - - [ 14.42, 1.73620, 0.09890, -0.10800 ] - - [ 15.18, 1.76270, 0.10240, -0.10630 ] - - [ 15.94, 1.77060, 0.10760, -0.10420 ] - - [ 16.69, 1.76390, 0.11440, -0.10250 ] - - [ 17.45, 1.76040, 0.12110, -0.10130 ] - - [ 18.21, 1.72510, 0.13100, -0.10010 ] - - [ 18.97, 1.70350, 0.13990, -0.09980 ] - - [ 19.72, 1.67840, 0.14920, -0.10010 ] - - [ 20.48, 1.65050, 0.15910, -0.10160 ] - - [ 21.24, 1.62270, 0.16910, -0.10360 ] - - [ 21.99, 1.60670, 0.17780, -0.10640 ] - - [ 22.75, 1.59720, 0.18580, -0.10990 ] - - [ 23.51, 1.58920, 0.19370, -0.11360 ] - - [ 24.26, 1.58150, 0.20140, -0.11800 ] - - [ 25.02, 1.55630, 0.21350, -0.12490 ] - - [ 25.78, 1.52720, 0.22670, -0.13250 ] - - [ 26.53, 1.49820, 0.23990, -0.14000 ] - - [ 27.29, 1.46910, 0.25310, -0.14760 ] - - [ 28.05, 1.44010, 0.26630, -0.15510 ] - - [ 28.81, 1.41100, 0.27950, -0.16270 ] - - [ 29.56, 1.38200, 0.29270, -0.17030 ] - - [ 30.32, 1.36220, 0.30780, -0.17400 ] - - [ 31.08, 1.34240, 0.32300, -0.17770 ] - - [ 31.83, 1.32250, 0.33810, -0.18150 ] - - [ 32.59, 1.30270, 0.35320, -0.18520 ] - - [ 33.35, 1.28290, 0.36840, -0.18890 ] - - [ 34.10, 1.26310, 0.38350, -0.19260 ] - - [ 34.86, 1.24330, 0.39870, -0.19640 ] - - [ 35.62, 1.22340, 0.41380, -0.20010 ] - - [ 36.38, 1.20360, 0.42890, -0.20390 ] - - [ 37.13, 1.18380, 0.44410, -0.20760 ] - - [ 37.89, 1.16400, 0.45920, -0.21130 ] - - [ 38.65, 1.14420, 0.47430, -0.21500 ] - - [ 39.40, 1.12430, 0.48950, -0.21880 ] - - [ 40.16, 1.10640, 0.50520, -0.22180 ] - - [ 40.92, 1.09050, 0.52140, -0.22420 ] - - [ 41.67, 1.07450, 0.53760, -0.22660 ] - - [ 42.43, 1.05860, 0.55380, -0.22890 ] - - [ 43.19, 1.04260, 0.57010, -0.23130 ] - - [ 43.94, 1.02670, 0.58630, -0.23370 ] - - [ 44.70, 1.01070, 0.60250, -0.23610 ] - - [ 45.46, 0.99480, 0.61880, -0.23840 ] - - [ 46.22, 0.97880, 0.63500, -0.24080 ] - - [ 46.97, 0.96280, 0.65120, -0.24320 ] - - [ 47.73, 0.94690, 0.66750, -0.24550 ] - - [ 48.49, 0.93090, 0.68370, -0.24790 ] - - [ 49.24, 0.91500, 0.69990, -0.25030 ] - - [ 50.00, 0.89900, 0.71610, -0.25270 ] - - [ 60.00, 0.68360, 0.92460, -0.28330 ] - - [ 70.00, 0.45560, 1.09850, -0.31560 ] - - [ 80.00, 0.22190, 1.21820, -0.34820 ] - - [ 90.00, 0.00000, 1.27070, -0.37730 ] - - [ 100.00, -0.15530, 1.21820, -0.38770 ] - - [ 110.00, -0.31890, 1.09850, -0.38650 ] - - [ 120.00, -0.47840, 0.92460, -0.38060 ] - - [ 130.00, -0.62930, 0.71610, -0.38030 ] - - [ 140.00, -0.78010, 0.49700, -0.40320 ] - - [ 150.00, -0.96740, 0.29270, -0.48540 ] - - [ 160.00, -0.88370, 0.12680, -0.53250 ] - - [ 170.00, -0.44180, 0.08440, -0.39060 ] - - [ 179.97, 0.00000, 0.08440, 0.00000 ] - - name : FFA-W3-211 # - relative_thickness : 0.211 # - data: # alpha c_l c_d c_m - # (deg) (-) (-) (-) - - [ -179.91, 0.00000, 0.02464, 0.00000 ] - - [ -177.71, 0.05403, 0.02534, 0.09143 ] - - [ -175.43, 0.10805, 0.02742, 0.18286 ] - - [ -173.14, 0.16208, 0.03088, 0.27429 ] - - [ -170.86, 0.21610, 0.03570, 0.36571 ] - - [ -168.57, 0.27013, 0.05599, 0.39192 ] - - [ -166.29, 0.32415, 0.08143, 0.37898 ] - - [ -164.00, 0.37818, 0.11112, 0.36605 ] - - [ -161.71, 0.43220, 0.14485, 0.35312 ] - - [ -159.43, 0.48623, 0.18242, 0.34768 ] - - [ -157.14, 0.54025, 0.22359, 0.36471 ] - - [ -154.86, 0.59428, 0.26810, 0.38175 ] - - [ -152.57, 0.64830, 0.31566, 0.39878 ] - - [ -150.29, 0.70233, 0.36597, 0.41581 ] - - [ -148.00, 0.75635, 0.41871, 0.41955 ] - - [ -143.86, 0.73188, 0.51941, 0.42287 ] - - [ -139.71, 0.70655, 0.62488, 0.42632 ] - - [ -135.57, 0.67760, 0.73293, 0.43163 ] - - [ -131.43, 0.64333, 0.84130, 0.43694 ] - - [ -127.29, 0.60277, 0.94773, 0.44389 ] - - [ -123.14, 0.55550, 1.05001, 0.45171 ] - - [ -119.00, 0.50156, 1.14600, 0.45897 ] - - [ -114.86, 0.44131, 1.23371, 0.46448 ] - - [ -110.71, 0.37542, 1.31129, 0.46998 ] - - [ -106.57, 0.30482, 1.37714, 0.47096 ] - - [ -102.43, 0.23063, 1.42988, 0.47101 ] - - [ -98.29, 0.15413, 1.46842, 0.46824 ] - - [ -94.14, 0.07675, 1.49196, 0.46149 ] - - [ -90.00, 0.00000, 1.50000, 0.45474 ] - - [ -85.86, -0.07675, 1.49196, 0.44026 ] - - [ -81.71, -0.15413, 1.46842, 0.42578 ] - - [ -77.57, -0.23063, 1.42988, 0.40821 ] - - [ -73.43, -0.30482, 1.37714, 0.38846 ] - - [ -69.29, -0.37542, 1.31129, 0.36815 ] - - [ -65.14, -0.44131, 1.23371, 0.34519 ] - - [ -61.00, -0.50156, 1.14600, 0.32223 ] - - [ -56.86, -0.55550, 1.05001, 0.29864 ] - - [ -52.71, -0.60277, 0.94773, 0.27486 ] - - [ -48.57, -0.64333, 0.84130, 0.25128 ] - - [ -44.43, -0.67760, 0.73293, 0.22810 ] - - [ -40.29, -0.70655, 0.62488, 0.20491 ] - - [ -36.14, -0.73188, 0.51941, 0.15416 ] - - [ -32.00, -0.75635, 0.41871, 0.10137 ] - - [ -28.00, -0.85636, 0.28691, 0.06527 ] - - [ -24.00, -1.18292, 0.13960, 0.01647 ] - - [ -20.00, -1.23596, 0.08345, -0.00352 ] - - [ -18.00, -1.22536, 0.06509, -0.00672 ] - - [ -16.00, -1.20476, 0.04888, -0.00881 ] - - [ -14.00, -1.18332, 0.03417, -0.01101 ] - - [ -12.00, -1.10093, 0.02132, -0.02269 ] - - [ -10.00, -0.88209, 0.01386, -0.04397 ] - - [ -8.00, -0.62981, 0.01075, -0.05756 ] - - [ -6.00, -0.37670, 0.00882, -0.06747 ] - - [ -4.00, -0.12177, 0.00702, -0.07680 ] - - [ -2.00, 0.12810, 0.00663, -0.08283 ] - - [ -1.00, 0.25192, 0.00664, -0.08534 ] - - [ 0.00, 0.37535, 0.00670, -0.08777 ] - - [ 1.00, 0.49828, 0.00681, -0.09011 ] - - [ 2.00, 0.62052, 0.00698, -0.09234 ] - - [ 3.00, 0.74200, 0.00720, -0.09447 ] - - [ 4.00, 0.86238, 0.00751, -0.09646 ] - - [ 5.00, 0.98114, 0.00796, -0.09828 ] - - [ 6.00, 1.09662, 0.00872, -0.09977 ] - - [ 7.00, 1.20904, 0.00968, -0.10095 ] - - [ 8.00, 1.31680, 0.01097, -0.10163 ] - - [ 9.00, 1.42209, 0.01227, -0.10207 ] - - [ 10.00, 1.52361, 0.01369, -0.10213 ] - - [ 11.00, 1.61988, 0.01529, -0.10174 ] - - [ 12.00, 1.70937, 0.01717, -0.10087 ] - - [ 13.00, 1.78681, 0.01974, -0.09936 ] - - [ 14.00, 1.84290, 0.02368, -0.09720 ] - - [ 15.00, 1.85313, 0.03094, -0.09410 ] - - [ 16.00, 1.80951, 0.04303, -0.09144 ] - - [ 18.00, 1.66033, 0.07730, -0.09242 ] - - [ 20.00, 1.56152, 0.11202, -0.09871 ] - - [ 24.00, 1.43327, 0.18408, -0.11770 ] - - [ 28.00, 1.29062, 0.27589, -0.14566 ] - - [ 32.00, 1.08050, 0.41871, -0.18266 ] - - [ 36.14, 1.04554, 0.51941, -0.20913 ] - - [ 40.29, 1.00936, 0.62488, -0.23534 ] - - [ 44.43, 0.96801, 0.73293, -0.25784 ] - - [ 48.57, 0.91904, 0.84130, -0.28035 ] - - [ 52.71, 0.86109, 0.94773, -0.30163 ] - - [ 56.86, 0.79357, 1.05001, -0.32226 ] - - [ 61.00, 0.71651, 1.14600, -0.34247 ] - - [ 65.14, 0.63044, 1.23371, -0.36135 ] - - [ 69.29, 0.53632, 1.31129, -0.38024 ] - - [ 73.43, 0.43546, 1.37714, -0.39704 ] - - [ 77.57, 0.32947, 1.42988, -0.41341 ] - - [ 81.71, 0.22019, 1.46842, -0.42844 ] - - [ 85.86, 0.10965, 1.49196, -0.44159 ] - - [ 90.00, 0.00000, 1.50000, -0.45474 ] - - [ 94.14, -0.07675, 1.49196, -0.46149 ] - - [ 98.29, -0.15413, 1.46842, -0.46824 ] - - [ 102.43, -0.23063, 1.42988, -0.47101 ] - - [ 106.57, -0.30482, 1.37714, -0.47096 ] - - [ 110.71, -0.37542, 1.31129, -0.46998 ] - - [ 114.86, -0.44131, 1.23371, -0.46448 ] - - [ 119.00, -0.50156, 1.14600, -0.45897 ] - - [ 123.14, -0.55550, 1.05001, -0.45171 ] - - [ 127.29, -0.60277, 0.94773, -0.44389 ] - - [ 131.43, -0.64333, 0.84130, -0.43694 ] - - [ 135.57, -0.67760, 0.73293, -0.43163 ] - - [ 139.71, -0.70655, 0.62488, -0.42632 ] - - [ 143.86, -0.73188, 0.51941, -0.42287 ] - - [ 148.00, -0.75635, 0.41871, -0.41955 ] - - [ 150.29, -0.70233, 0.36597, -0.41581 ] - - [ 152.57, -0.64830, 0.31566, -0.39878 ] - - [ 154.86, -0.59428, 0.26810, -0.38175 ] - - [ 157.14, -0.54025, 0.22359, -0.36471 ] - - [ 159.43, -0.48623, 0.18242, -0.34768 ] - - [ 161.71, -0.43220, 0.14485, -0.37026 ] - - [ 164.00, -0.37818, 0.11112, -0.40605 ] - - [ 166.29, -0.32415, 0.08143, -0.44184 ] - - [ 168.57, -0.27013, 0.05599, -0.47763 ] - - [ 170.86, -0.21610, 0.03570, -0.45714 ] - - [ 173.14, -0.16208, 0.03088, -0.34286 ] - - [ 175.43, -0.10805, 0.02742, -0.22857 ] - - [ 177.71, -0.05403, 0.02534, -0.11429 ] - - [ 179.91, 0.00000, 0.02464, 0.00000 ] - - name : FFA-W3-241 # - relative_thickness : 0.241 # - data: # alpha c_l c_d c_m - # (deg) (-) (-) (-) - - [ -179.91, 0.00000, 0.01178, 0.00000 ] - - [ -177.71, 0.05818, 0.01248, 0.09143 ] - - [ -175.43, 0.11636, 0.01460, 0.18286 ] - - [ -173.14, 0.17453, 0.01811, 0.27429 ] - - [ -170.86, 0.23271, 0.02300, 0.36571 ] - - [ -168.57, 0.29089, 0.02922, 0.39568 ] - - [ -166.29, 0.34907, 0.05382, 0.38876 ] - - [ -164.00, 0.40725, 0.08379, 0.38184 ] - - [ -161.71, 0.46542, 0.11786, 0.37492 ] - - [ -159.43, 0.52360, 0.15581, 0.37408 ] - - [ -157.14, 0.58178, 0.19740, 0.39148 ] - - [ -154.86, 0.63996, 0.24237, 0.40888 ] - - [ -152.57, 0.69814, 0.29043, 0.42628 ] - - [ -150.29, 0.75631, 0.34128, 0.44368 ] - - [ -148.00, 0.81449, 0.39460, 0.44537 ] - - [ -143.86, 0.77925, 0.49645, 0.44436 ] - - [ -139.71, 0.74511, 0.60319, 0.44360 ] - - [ -135.57, 0.70881, 0.71263, 0.44609 ] - - [ -131.43, 0.66835, 0.82249, 0.44858 ] - - [ -127.29, 0.62253, 0.93051, 0.45370 ] - - [ -123.14, 0.57080, 1.03447, 0.46020 ] - - [ -119.00, 0.51307, 1.13222, 0.46633 ] - - [ -114.86, 0.44965, 1.22176, 0.47130 ] - - [ -110.71, 0.38115, 1.30123, 0.47627 ] - - [ -106.57, 0.30846, 1.36903, 0.47705 ] - - [ -102.43, 0.23266, 1.42376, 0.47695 ] - - [ -98.29, 0.15503, 1.46433, 0.47409 ] - - [ -94.14, 0.07698, 1.48990, 0.46732 ] - - [ -90.00, 0.00000, 1.50000, 0.46055 ] - - [ -85.86, -0.07698, 1.48990, 0.44509 ] - - [ -81.71, -0.15503, 1.46433, 0.42964 ] - - [ -77.57, -0.23266, 1.42376, 0.41125 ] - - [ -73.43, -0.30846, 1.36903, 0.39081 ] - - [ -69.29, -0.38115, 1.30123, 0.36988 ] - - [ -65.14, -0.44965, 1.22176, 0.34663 ] - - [ -61.00, -0.51307, 1.13222, 0.32339 ] - - [ -56.86, -0.57080, 1.03447, 0.29984 ] - - [ -52.71, -0.62253, 0.93051, 0.27618 ] - - [ -48.57, -0.66835, 0.82249, 0.25280 ] - - [ -44.43, -0.70881, 0.71263, 0.22992 ] - - [ -40.29, -0.74511, 0.60319, 0.20705 ] - - [ -36.14, -0.77925, 0.49645, 0.14561 ] - - [ -32.00, -0.81449, 0.39460, 0.08131 ] - - [ -28.00, -1.07781, 0.22252, 0.04592 ] - - [ -24.00, -1.12692, 0.15159, 0.01901 ] - - [ -20.00, -1.14480, 0.09699, 0.00063 ] - - [ -18.00, -1.12797, 0.07744, -0.00342 ] - - [ -16.00, -1.09392, 0.06122, -0.00587 ] - - [ -14.00, -1.05961, 0.04667, -0.00652 ] - - [ -12.00, -1.03121, 0.03302, -0.00755 ] - - [ -10.00, -0.93706, 0.02027, -0.02243 ] - - [ -8.00, -0.67380, 0.01168, -0.05583 ] - - [ -6.00, -0.40391, 0.00918, -0.07159 ] - - [ -4.00, -0.14226, 0.00839, -0.08123 ] - - [ -2.00, 0.11580, 0.00810, -0.08892 ] - - [ -1.00, 0.24382, 0.00808, -0.09235 ] - - [ 0.00, 0.37113, 0.00813, -0.09556 ] - - [ 1.00, 0.49766, 0.00824, -0.09857 ] - - [ 2.00, 0.62334, 0.00842, -0.10139 ] - - [ 3.00, 0.74798, 0.00867, -0.10403 ] - - [ 4.00, 0.87137, 0.00901, -0.10645 ] - - [ 5.00, 0.99320, 0.00945, -0.10863 ] - - [ 6.00, 1.11325, 0.00998, -0.11057 ] - - [ 7.00, 1.23037, 0.01070, -0.11214 ] - - [ 8.00, 1.34496, 0.01153, -0.11337 ] - - [ 9.00, 1.45407, 0.01269, -0.11396 ] - - [ 10.00, 1.55911, 0.01396, -0.11403 ] - - [ 11.00, 1.65779, 0.01545, -0.11336 ] - - [ 12.00, 1.74834, 0.01724, -0.11187 ] - - [ 13.00, 1.82666, 0.01961, -0.10935 ] - - [ 14.00, 1.88831, 0.02293, -0.10606 ] - - [ 15.00, 1.92579, 0.02795, -0.10238 ] - - [ 16.00, 1.92722, 0.03609, -0.09887 ] - - [ 18.00, 1.80055, 0.06534, -0.09497 ] - - [ 20.00, 1.63088, 0.10459, -0.09996 ] - - [ 24.00, 1.43345, 0.19148, -0.12589 ] - - [ 28.00, 1.28805, 0.28629, -0.15453 ] - - [ 32.00, 1.16356, 0.39460, -0.18396 ] - - [ 36.14, 1.11321, 0.49645, -0.21099 ] - - [ 40.29, 1.06444, 0.60319, -0.23768 ] - - [ 44.43, 1.01259, 0.71263, -0.25992 ] - - [ 48.57, 0.95478, 0.82249, -0.28216 ] - - [ 52.71, 0.88932, 0.93051, -0.30323 ] - - [ 56.86, 0.81542, 1.03447, -0.32368 ] - - [ 61.00, 0.73296, 1.13222, -0.34380 ] - - [ 65.14, 0.64236, 1.22176, -0.36292 ] - - [ 69.29, 0.54450, 1.30123, -0.38204 ] - - [ 73.43, 0.44065, 1.36903, -0.39944 ] - - [ 77.57, 0.33237, 1.42376, -0.41648 ] - - [ 81.71, 0.22148, 1.46433, -0.43231 ] - - [ 85.86, 0.10997, 1.48990, -0.44643 ] - - [ 90.00, 0.00000, 1.50000, -0.46055 ] - - [ 94.14, -0.07698, 1.48990, -0.46732 ] - - [ 98.29, -0.15503, 1.46433, -0.47409 ] - - [ 102.43, -0.23266, 1.42376, -0.47695 ] - - [ 106.57, -0.30846, 1.36903, -0.47705 ] - - [ 110.71, -0.38115, 1.30123, -0.47627 ] - - [ 114.86, -0.44965, 1.22176, -0.47130 ] - - [ 119.00, -0.51307, 1.13222, -0.46633 ] - - [ 123.14, -0.57080, 1.03447, -0.46020 ] - - [ 127.29, -0.62253, 0.93051, -0.45370 ] - - [ 131.43, -0.66835, 0.82249, -0.44858 ] - - [ 135.57, -0.70881, 0.71263, -0.44609 ] - - [ 139.71, -0.74511, 0.60319, -0.44360 ] - - [ 143.86, -0.77925, 0.49645, -0.44436 ] - - [ 148.00, -0.81449, 0.39460, -0.44537 ] - - [ 150.29, -0.75631, 0.34128, -0.44368 ] - - [ 152.57, -0.69814, 0.29043, -0.42628 ] - - [ 154.86, -0.63996, 0.24237, -0.40888 ] - - [ 157.14, -0.58178, 0.19740, -0.39148 ] - - [ 159.43, -0.52360, 0.15581, -0.37408 ] - - [ 161.71, -0.46542, 0.11786, -0.39207 ] - - [ 164.00, -0.40725, 0.08379, -0.42184 ] - - [ 166.29, -0.34907, 0.05382, -0.45162 ] - - [ 168.57, -0.29089, 0.02922, -0.48139 ] - - [ 170.86, -0.23271, 0.02300, -0.45714 ] - - [ 173.14, -0.17453, 0.01811, -0.34286 ] - - [ 175.43, -0.11636, 0.01460, -0.22857 ] - - [ 177.71, -0.05818, 0.01248, -0.11429 ] - - [ 179.91, 0.00000, 0.01178, 0.00000 ] - - name : FFA-W3-270blend # - relative_thickness : 0.27 # - data: # alpha c_l c_d c_m - # (deg) (-) (-) (-) - - [ -179.91, 0.00000, 0.01545, 0.00000 ] - - [ -177.71, 0.06213, 0.01611, 0.09143 ] - - [ -175.43, 0.12426, 0.01807, 0.18286 ] - - [ -173.14, 0.18639, 0.02133, 0.27429 ] - - [ -170.86, 0.24852, 0.02587, 0.36571 ] - - [ -168.57, 0.31064, 0.03289, 0.39874 ] - - [ -166.29, 0.37277, 0.05681, 0.39672 ] - - [ -164.00, 0.43490, 0.08471, 0.39470 ] - - [ -161.71, 0.49703, 0.11643, 0.39268 ] - - [ -159.43, 0.55916, 0.15176, 0.39544 ] - - [ -157.14, 0.62129, 0.19048, 0.41254 ] - - [ -154.86, 0.68342, 0.23234, 0.42964 ] - - [ -152.57, 0.74555, 0.27708, 0.44674 ] - - [ -150.29, 0.80768, 0.32441, 0.46384 ] - - [ -148.00, 0.86981, 0.37404, 0.46186 ] - - [ -143.86, 0.81660, 0.46882, 0.45335 ] - - [ -139.71, 0.76812, 0.56814, 0.44523 ] - - [ -135.57, 0.72040, 0.66995, 0.44237 ] - - [ -131.43, 0.67095, 0.77214, 0.43951 ] - - [ -127.29, 0.61828, 0.87258, 0.44072 ] - - [ -123.14, 0.56158, 0.96921, 0.44407 ] - - [ -119.00, 0.50057, 1.06002, 0.44739 ] - - [ -114.86, 0.43540, 1.14315, 0.45063 ] - - [ -110.71, 0.36655, 1.21688, 0.45387 ] - - [ -106.57, 0.29475, 1.27969, 0.45377 ] - - [ -102.43, 0.22098, 1.33030, 0.45298 ] - - [ -98.29, 0.14639, 1.36768, 0.44973 ] - - [ -94.14, 0.07227, 1.39107, 0.44302 ] - - [ -90.00, 0.00000, 1.40000, 0.43630 ] - - [ -85.86, -0.07227, 1.39107, 0.42180 ] - - [ -81.71, -0.14639, 1.36768, 0.40730 ] - - [ -77.57, -0.22098, 1.33030, 0.39020 ] - - [ -73.43, -0.29475, 1.27969, 0.37125 ] - - [ -69.29, -0.36655, 1.21688, 0.35190 ] - - [ -65.14, -0.43540, 1.14315, 0.33068 ] - - [ -61.00, -0.50057, 1.06002, 0.30945 ] - - [ -56.86, -0.56158, 0.96921, 0.28815 ] - - [ -52.71, -0.61828, 0.87258, 0.26684 ] - - [ -48.57, -0.67095, 0.77214, 0.24576 ] - - [ -44.43, -0.72040, 0.66995, 0.22512 ] - - [ -40.29, -0.76812, 0.56814, 0.20447 ] - - [ -36.14, -0.81660, 0.46882, 0.13957 ] - - [ -32.00, -0.86981, 0.37404, 0.07138 ] - - [ -28.00, -1.09837, 0.21880, 0.04400 ] - - [ -24.00, -1.08339, 0.15982, 0.02166 ] - - [ -20.00, -1.06990, 0.10744, 0.00422 ] - - [ -18.00, -1.05454, 0.08690, -0.00035 ] - - [ -16.00, -1.03432, 0.06844, -0.00334 ] - - [ -14.00, -1.08360, 0.04733, -0.00283 ] - - [ -12.00, -1.09489, 0.03085, -0.00556 ] - - [ -10.00, -0.92665, 0.01984, -0.02952 ] - - [ -8.00, -0.69676, 0.01439, -0.04822 ] - - [ -6.00, -0.43628, 0.01155, -0.06483 ] - - [ -4.00, -0.16252, 0.01026, -0.07919 ] - - [ -2.00, 0.10709, 0.00976, -0.09041 ] - - [ -1.00, 0.23993, 0.00967, -0.09517 ] - - [ 0.00, 0.37158, 0.00968, -0.09953 ] - - [ 1.00, 0.50210, 0.00976, -0.10355 ] - - [ 2.00, 0.63139, 0.00993, -0.10725 ] - - [ 3.00, 0.75951, 0.01016, -0.11068 ] - - [ 4.00, 0.88638, 0.01045, -0.11385 ] - - [ 5.00, 1.01172, 0.01082, -0.11673 ] - - [ 6.00, 1.13430, 0.01140, -0.11923 ] - - [ 7.00, 1.25536, 0.01198, -0.12145 ] - - [ 8.00, 1.37379, 0.01267, -0.12328 ] - - [ 9.00, 1.48841, 0.01353, -0.12460 ] - - [ 10.00, 1.59782, 0.01460, -0.12526 ] - - [ 11.00, 1.70005, 0.01597, -0.12505 ] - - [ 12.00, 1.79190, 0.01777, -0.12370 ] - - [ 13.00, 1.86782, 0.02035, -0.12093 ] - - [ 14.00, 1.92687, 0.02385, -0.11725 ] - - [ 15.00, 1.90901, 0.03236, -0.10931 ] - - [ 16.00, 1.88548, 0.04259, -0.10525 ] - - [ 18.00, 1.72106, 0.07672, -0.10292 ] - - [ 20.00, 1.54737, 0.11914, -0.11017 ] - - [ 24.00, 1.37176, 0.20189, -0.13431 ] - - [ 28.00, 1.33611, 0.27981, -0.15777 ] - - [ 32.00, 1.24258, 0.37404, -0.18432 ] - - [ 36.14, 1.16657, 0.46882, -0.21002 ] - - [ 40.29, 1.09731, 0.56814, -0.23531 ] - - [ 44.43, 1.02914, 0.66995, -0.25508 ] - - [ 48.57, 0.95850, 0.77214, -0.27485 ] - - [ 52.71, 0.88325, 0.87258, -0.29346 ] - - [ 56.86, 0.80225, 0.96921, -0.31145 ] - - [ 61.00, 0.71510, 1.06002, -0.32925 ] - - [ 65.14, 0.62200, 1.14315, -0.34641 ] - - [ 69.29, 0.52364, 1.21688, -0.36357 ] - - [ 73.43, 0.42107, 1.27969, -0.37949 ] - - [ 77.57, 0.31569, 1.33030, -0.39517 ] - - [ 81.71, 0.20913, 1.36768, -0.40983 ] - - [ 85.86, 0.10324, 1.39107, -0.42306 ] - - [ 90.00, 0.00000, 1.40000, -0.43630 ] - - [ 94.14, -0.07227, 1.39107, -0.44302 ] - - [ 98.29, -0.14639, 1.36768, -0.44973 ] - - [ 102.43, -0.22098, 1.33030, -0.45298 ] - - [ 106.57, -0.29475, 1.27969, -0.45377 ] - - [ 110.71, -0.36655, 1.21688, -0.45387 ] - - [ 114.86, -0.43540, 1.14315, -0.45063 ] - - [ 119.00, -0.50057, 1.06002, -0.44739 ] - - [ 123.14, -0.56158, 0.96921, -0.44407 ] - - [ 127.29, -0.61828, 0.87258, -0.44072 ] - - [ 131.43, -0.67095, 0.77214, -0.43951 ] - - [ 135.57, -0.72040, 0.66995, -0.44237 ] - - [ 139.71, -0.76812, 0.56814, -0.44523 ] - - [ 143.86, -0.81660, 0.46882, -0.45335 ] - - [ 148.00, -0.86981, 0.37404, -0.46186 ] - - [ 150.29, -0.80768, 0.32441, -0.46384 ] - - [ 152.57, -0.74555, 0.27708, -0.44674 ] - - [ 154.86, -0.68342, 0.23234, -0.42964 ] - - [ 157.14, -0.62129, 0.19048, -0.41254 ] - - [ 159.43, -0.55916, 0.15176, -0.39544 ] - - [ 161.71, -0.49703, 0.11643, -0.40982 ] - - [ 164.00, -0.43490, 0.08471, -0.43470 ] - - [ 166.29, -0.37277, 0.05681, -0.45958 ] - - [ 168.57, -0.31064, 0.03289, -0.48445 ] - - [ 170.86, -0.24852, 0.02587, -0.45714 ] - - [ 173.14, -0.18639, 0.02133, -0.34286 ] - - [ 175.43, -0.12426, 0.01807, -0.22857 ] - - [ 177.71, -0.06213, 0.01611, -0.11429 ] - - [ 179.91, 0.00000, 0.01545, 0.00000 ] - - name : FFA-W3-301 # - relative_thickness : 0.301 # - data: # alpha c_l c_d c_m - # (deg) (-) (-) (-) - - [ -179.91, 0.00000, 0.02454, 0.00000 ] - - [ -177.71, 0.06508, 0.02514, 0.09143 ] - - [ -175.43, 0.13016, 0.02694, 0.18286 ] - - [ -173.14, 0.19525, 0.02993, 0.27429 ] - - [ -170.86, 0.26033, 0.03408, 0.36571 ] - - [ -168.57, 0.32541, 0.03938, 0.40085 ] - - [ -166.29, 0.39049, 0.05910, 0.40220 ] - - [ -164.00, 0.45557, 0.08495, 0.40356 ] - - [ -161.71, 0.52066, 0.11433, 0.40492 ] - - [ -159.43, 0.58574, 0.14704, 0.41010 ] - - [ -157.14, 0.65082, 0.18290, 0.42678 ] - - [ -154.86, 0.71590, 0.22166, 0.44345 ] - - [ -152.57, 0.78098, 0.26309, 0.46013 ] - - [ -150.29, 0.84607, 0.30692, 0.47680 ] - - [ -148.00, 0.91115, 0.35287, 0.47162 ] - - [ -143.86, 0.84257, 0.44061, 0.45656 ] - - [ -139.71, 0.78187, 0.53255, 0.44202 ] - - [ -135.57, 0.72448, 0.62677, 0.43452 ] - - [ -131.43, 0.66755, 0.72131, 0.42701 ] - - [ -127.29, 0.60928, 0.81421, 0.42483 ] - - [ -123.14, 0.54868, 0.90355, 0.42544 ] - - [ -119.00, 0.48530, 0.98748, 0.42634 ] - - [ -114.86, 0.41915, 1.06425, 0.42813 ] - - [ -110.71, 0.35056, 1.13227, 0.42992 ] - - [ -106.57, 0.28017, 1.19015, 0.42916 ] - - [ -102.43, 0.20881, 1.23669, 0.42788 ] - - [ -98.29, 0.13754, 1.27093, 0.42444 ] - - [ -94.14, 0.06751, 1.29218, 0.41794 ] - - [ -90.00, 0.00000, 1.30000, 0.41144 ] - - [ -85.86, -0.06751, 1.29218, 0.39804 ] - - [ -81.71, -0.13754, 1.27093, 0.38464 ] - - [ -77.57, -0.20881, 1.23669, 0.36892 ] - - [ -73.43, -0.28017, 1.19015, 0.35157 ] - - [ -69.29, -0.35056, 1.13227, 0.33391 ] - - [ -65.14, -0.41915, 1.06425, 0.31474 ] - - [ -61.00, -0.48530, 0.98748, 0.29557 ] - - [ -56.86, -0.54868, 0.90355, 0.27653 ] - - [ -52.71, -0.60928, 0.81421, 0.25754 ] - - [ -48.57, -0.66755, 0.72131, 0.23873 ] - - [ -44.43, -0.72448, 0.62677, 0.22027 ] - - [ -40.29, -0.78187, 0.53255, 0.20181 ] - - [ -36.14, -0.84257, 0.44061, 0.13644 ] - - [ -32.00, -0.91115, 0.35287, 0.06760 ] - - [ -28.00, -1.10349, 0.21721, 0.04231 ] - - [ -24.00, -1.10737, 0.15629, 0.02026 ] - - [ -20.00, -1.11815, 0.10335, 0.00407 ] - - [ -18.00, -1.12332, 0.08180, 0.00017 ] - - [ -16.00, -1.11865, 0.06331, -0.00167 ] - - [ -14.00, -1.11620, 0.04718, -0.00120 ] - - [ -12.00, -1.09588, 0.03280, -0.00463 ] - - [ -10.00, -0.91767, 0.02351, -0.02494 ] - - [ -8.00, -0.69311, 0.01793, -0.04304 ] - - [ -6.00, -0.45396, 0.01431, -0.05868 ] - - [ -4.00, -0.17779, 0.01242, -0.07601 ] - - [ -2.00, 0.10480, 0.01160, -0.09121 ] - - [ -1.00, 0.24383, 0.01143, -0.09763 ] - - [ 0.00, 0.38111, 0.01138, -0.10341 ] - - [ 1.00, 0.51660, 0.01143, -0.10861 ] - - [ 2.00, 0.65044, 0.01156, -0.11333 ] - - [ 3.00, 0.78267, 0.01177, -0.11762 ] - - [ 4.00, 0.91326, 0.01204, -0.12154 ] - - [ 5.00, 1.04207, 0.01239, -0.12510 ] - - [ 6.00, 1.16873, 0.01283, -0.12828 ] - - [ 7.00, 1.29296, 0.01338, -0.13104 ] - - [ 8.00, 1.41390, 0.01406, -0.13332 ] - - [ 9.00, 1.53088, 0.01488, -0.13503 ] - - [ 10.00, 1.64208, 0.01592, -0.13599 ] - - [ 11.00, 1.74568, 0.01726, -0.13605 ] - - [ 12.00, 1.83887, 0.01908, -0.13514 ] - - [ 13.00, 1.91764, 0.02169, -0.13322 ] - - [ 14.00, 1.97413, 0.02572, -0.13020 ] - - [ 15.00, 1.99916, 0.03222, -0.12641 ] - - [ 16.00, 1.99377, 0.04157, -0.12265 ] - - [ 18.00, 1.91720, 0.06731, -0.11675 ] - - [ 20.00, 1.73683, 0.10526, -0.11652 ] - - [ 24.00, 1.47321, 0.19229, -0.13790 ] - - [ 28.00, 1.36017, 0.27449, -0.16242 ] - - [ 32.00, 1.30164, 0.35287, -0.18463 ] - - [ 36.14, 1.20367, 0.44061, -0.20894 ] - - [ 40.29, 1.11695, 0.53255, -0.23276 ] - - [ 44.43, 1.03498, 0.62677, -0.25011 ] - - [ 48.57, 0.95364, 0.72131, -0.26746 ] - - [ 52.71, 0.87040, 0.81421, -0.28365 ] - - [ 56.86, 0.78383, 0.90355, -0.29923 ] - - [ 61.00, 0.69329, 0.98748, -0.31472 ] - - [ 65.14, 0.59878, 1.06425, -0.32988 ] - - [ 69.29, 0.50080, 1.13227, -0.34505 ] - - [ 73.43, 0.40024, 1.19015, -0.35942 ] - - [ 77.57, 0.29831, 1.23669, -0.37363 ] - - [ 81.71, 0.19648, 1.27093, -0.38702 ] - - [ 85.86, 0.09644, 1.29218, -0.39923 ] - - [ 90.00, 0.00000, 1.30000, -0.41144 ] - - [ 94.14, -0.06751, 1.29218, -0.41794 ] - - [ 98.29, -0.13754, 1.27093, -0.42444 ] - - [ 102.43, -0.20881, 1.23669, -0.42788 ] - - [ 106.57, -0.28017, 1.19015, -0.42916 ] - - [ 110.71, -0.35056, 1.13227, -0.42992 ] - - [ 114.86, -0.41915, 1.06425, -0.42813 ] - - [ 119.00, -0.48530, 0.98748, -0.42634 ] - - [ 123.14, -0.54868, 0.90355, -0.42544 ] - - [ 127.29, -0.60928, 0.81421, -0.42483 ] - - [ 131.43, -0.66755, 0.72131, -0.42701 ] - - [ 135.57, -0.72448, 0.62677, -0.43452 ] - - [ 139.71, -0.78187, 0.53255, -0.44202 ] - - [ 143.86, -0.84257, 0.44061, -0.45656 ] - - [ 148.00, -0.91115, 0.35287, -0.47162 ] - - [ 150.29, -0.84607, 0.30692, -0.47680 ] - - [ 152.57, -0.78098, 0.26309, -0.46013 ] - - [ 154.86, -0.71590, 0.22166, -0.44345 ] - - [ 157.14, -0.65082, 0.18290, -0.42678 ] - - [ 159.43, -0.58574, 0.14704, -0.41010 ] - - [ 161.71, -0.52066, 0.11433, -0.42206 ] - - [ 164.00, -0.45557, 0.08495, -0.44356 ] - - [ 166.29, -0.39049, 0.05910, -0.46506 ] - - [ 168.57, -0.32541, 0.03938, -0.48656 ] - - [ 170.86, -0.26033, 0.03408, -0.45714 ] - - [ 173.14, -0.19525, 0.02993, -0.34286 ] - - [ 175.43, -0.13016, 0.02694, -0.22857 ] - - [ 177.71, -0.06508, 0.02514, -0.11429 ] - - [ 179.91, 0.00000, 0.02454, 0.00000 ] - - name : FFA-W3-330blend # - relative_thickness : 0.33 # - data: # alpha c_l c_d c_m - # (deg) (-) (-) (-) - - [ -179.91, 0.00000, 0.03169, 0.00000 ] - - [ -177.71, 0.06960, 0.03228, 0.09143 ] - - [ -175.43, 0.13920, 0.03406, 0.18286 ] - - [ -173.14, 0.20880, 0.03702, 0.27429 ] - - [ -170.86, 0.27841, 0.04114, 0.36571 ] - - [ -168.57, 0.34801, 0.04638, 0.40308 ] - - [ -166.29, 0.41761, 0.05732, 0.40801 ] - - [ -164.00, 0.48721, 0.08319, 0.41294 ] - - [ -161.71, 0.55681, 0.11258, 0.41788 ] - - [ -159.43, 0.62641, 0.14533, 0.42586 ] - - [ -157.14, 0.69601, 0.18121, 0.44302 ] - - [ -154.86, 0.76562, 0.22000, 0.46017 ] - - [ -152.57, 0.83522, 0.26146, 0.47732 ] - - [ -150.29, 0.90482, 0.30532, 0.49447 ] - - [ -148.00, 0.97442, 0.35131, 0.48743 ] - - [ -143.86, 0.89412, 0.43913, 0.46839 ] - - [ -139.71, 0.82382, 0.53115, 0.44996 ] - - [ -135.57, 0.75845, 0.62546, 0.43985 ] - - [ -131.43, 0.69477, 0.72010, 0.42974 ] - - [ -127.29, 0.63079, 0.81310, 0.42589 ] - - [ -123.14, 0.56532, 0.90255, 0.42535 ] - - [ -119.00, 0.49783, 0.98659, 0.42528 ] - - [ -114.86, 0.42823, 1.06348, 0.42673 ] - - [ -110.71, 0.35680, 1.13162, 0.42817 ] - - [ -106.57, 0.28412, 1.18963, 0.42745 ] - - [ -102.43, 0.21103, 1.23629, 0.42628 ] - - [ -98.29, 0.13851, 1.27067, 0.42303 ] - - [ -94.14, 0.06775, 1.29204, 0.41683 ] - - [ -90.00, 0.00000, 1.30000, 0.41063 ] - - [ -85.86, -0.06775, 1.29204, 0.39752 ] - - [ -81.71, -0.13851, 1.27067, 0.38441 ] - - [ -77.57, -0.21103, 1.23629, 0.36905 ] - - [ -73.43, -0.28412, 1.18963, 0.35212 ] - - [ -69.29, -0.35680, 1.13162, 0.33491 ] - - [ -65.14, -0.42823, 1.06348, 0.31634 ] - - [ -61.00, -0.49783, 0.98659, 0.29777 ] - - [ -56.86, -0.56532, 0.90255, 0.27947 ] - - [ -52.71, -0.63079, 0.81310, 0.26125 ] - - [ -48.57, -0.69477, 0.72010, 0.24322 ] - - [ -44.43, -0.75845, 0.62546, 0.22556 ] - - [ -40.29, -0.82382, 0.53115, 0.20789 ] - - [ -36.14, -0.89412, 0.43913, 0.13731 ] - - [ -32.00, -0.97442, 0.35131, 0.06280 ] - - [ -28.00, -1.16308, 0.20648, 0.03905 ] - - [ -24.00, -1.14892, 0.15001, 0.01853 ] - - [ -20.00, -1.09451, 0.10600, 0.00441 ] - - [ -18.00, -1.05801, 0.08732, -0.00061 ] - - [ -16.00, -1.02281, 0.07051, -0.00342 ] - - [ -14.00, -0.99810, 0.05474, -0.00401 ] - - [ -12.00, -0.98515, 0.04052, -0.00272 ] - - [ -10.00, -0.89583, 0.02929, -0.01198 ] - - [ -8.00, -0.67539, 0.02207, -0.03458 ] - - [ -6.00, -0.43247, 0.01735, -0.05466 ] - - [ -4.00, -0.15881, 0.01473, -0.07425 ] - - [ -2.00, 0.13456, 0.01362, -0.09270 ] - - [ -1.00, 0.28014, 0.01339, -0.10074 ] - - [ 0.00, 0.42386, 0.01330, -0.10802 ] - - [ 1.00, 0.56519, 0.01333, -0.11450 ] - - [ 2.00, 0.70410, 0.01345, -0.12028 ] - - [ 3.00, 0.84071, 0.01366, -0.12546 ] - - [ 4.00, 0.97500, 0.01397, -0.13011 ] - - [ 5.00, 1.10680, 0.01437, -0.13425 ] - - [ 6.00, 1.23603, 0.01486, -0.13793 ] - - [ 7.00, 1.36223, 0.01547, -0.14108 ] - - [ 8.00, 1.48424, 0.01623, -0.14363 ] - - [ 9.00, 1.60097, 0.01718, -0.14545 ] - - [ 10.00, 1.71010, 0.01841, -0.14636 ] - - [ 11.00, 1.80957, 0.02010, -0.14635 ] - - [ 12.00, 1.89473, 0.02258, -0.14544 ] - - [ 13.00, 1.95698, 0.02671, -0.14378 ] - - [ 14.00, 1.98576, 0.03380, -0.14185 ] - - [ 15.00, 1.99260, 0.04333, -0.14004 ] - - [ 16.00, 1.99617, 0.05354, -0.13823 ] - - [ 18.00, 1.96398, 0.07706, -0.13351 ] - - [ 20.00, 1.81179, 0.11169, -0.13135 ] - - [ 24.00, 1.56073, 0.19103, -0.14660 ] - - [ 28.00, 1.46798, 0.27199, -0.17242 ] - - [ 32.00, 1.39203, 0.35131, -0.19417 ] - - [ 36.14, 1.27731, 0.43913, -0.21792 ] - - [ 40.29, 1.17689, 0.53115, -0.24115 ] - - [ 44.43, 1.08350, 0.62546, -0.25734 ] - - [ 48.57, 0.99253, 0.72010, -0.27354 ] - - [ 52.71, 0.90112, 0.81310, -0.28862 ] - - [ 56.86, 0.80760, 0.90255, -0.30311 ] - - [ 61.00, 0.71119, 0.98659, -0.31757 ] - - [ 65.14, 0.61175, 1.06348, -0.33194 ] - - [ 69.29, 0.50971, 1.13162, -0.34631 ] - - [ 73.43, 0.40589, 1.18963, -0.36014 ] - - [ 77.57, 0.30146, 1.23629, -0.37385 ] - - [ 81.71, 0.19788, 1.27067, -0.38681 ] - - [ 85.86, 0.09679, 1.29204, -0.39872 ] - - [ 90.00, 0.00000, 1.30000, -0.41063 ] - - [ 94.14, -0.06775, 1.29204, -0.41683 ] - - [ 98.29, -0.13851, 1.27067, -0.42303 ] - - [ 102.43, -0.21103, 1.23629, -0.42628 ] - - [ 106.57, -0.28412, 1.18963, -0.42745 ] - - [ 110.71, -0.35680, 1.13162, -0.42817 ] - - [ 114.86, -0.42823, 1.06348, -0.42673 ] - - [ 119.00, -0.49783, 0.98659, -0.42528 ] - - [ 123.14, -0.56532, 0.90255, -0.42535 ] - - [ 127.29, -0.63079, 0.81310, -0.42589 ] - - [ 131.43, -0.69477, 0.72010, -0.42974 ] - - [ 135.57, -0.75845, 0.62546, -0.43985 ] - - [ 139.71, -0.82382, 0.53115, -0.44996 ] - - [ 143.86, -0.89412, 0.43913, -0.46839 ] - - [ 148.00, -0.97442, 0.35131, -0.48743 ] - - [ 150.29, -0.90482, 0.30532, -0.49447 ] - - [ 152.57, -0.83522, 0.26146, -0.47732 ] - - [ 154.86, -0.76562, 0.22000, -0.46017 ] - - [ 157.14, -0.69601, 0.18121, -0.44302 ] - - [ 159.43, -0.62641, 0.14533, -0.42586 ] - - [ 161.71, -0.55681, 0.11258, -0.43502 ] - - [ 164.00, -0.48721, 0.08319, -0.45294 ] - - [ 166.29, -0.41761, 0.05732, -0.47087 ] - - [ 168.57, -0.34801, 0.04638, -0.48880 ] - - [ 170.86, -0.27841, 0.04114, -0.45714 ] - - [ 173.14, -0.20880, 0.03702, -0.34286 ] - - [ 175.43, -0.13920, 0.03406, -0.22857 ] - - [ 177.71, -0.06960, 0.03228, -0.11429 ] - - [ 179.91, 0.00000, 0.03169, 0.00000 ] - - name : FFA-W3-360 # - relative_thickness : 0.36 # - data: # alpha c_l c_d c_m - # (deg) (-) (-) (-) - - [ -179.91, 0.00000, 0.03715, 0.00000 ] - - [ -177.71, 0.07178, 0.03774, 0.09143 ] - - [ -175.43, 0.14356, 0.03951, 0.18286 ] - - [ -173.14, 0.21534, 0.04245, 0.27429 ] - - [ -170.86, 0.28713, 0.04653, 0.36571 ] - - [ -168.57, 0.35891, 0.05174, 0.40313 ] - - [ -166.29, 0.43069, 0.06068, 0.40814 ] - - [ -164.00, 0.50247, 0.08651, 0.41315 ] - - [ -161.71, 0.57425, 0.11586, 0.41816 ] - - [ -159.43, 0.64603, 0.14856, 0.42627 ] - - [ -157.14, 0.71781, 0.18439, 0.44370 ] - - [ -154.86, 0.78960, 0.22313, 0.46114 ] - - [ -152.57, 0.86138, 0.26453, 0.47857 ] - - [ -150.29, 0.93316, 0.30832, 0.49600 ] - - [ -148.00, 1.00494, 0.35424, 0.48830 ] - - [ -143.86, 0.91898, 0.44192, 0.46784 ] - - [ -139.71, 0.84406, 0.53379, 0.44803 ] - - [ -135.57, 0.77483, 0.62793, 0.43697 ] - - [ -131.43, 0.70790, 0.72238, 0.42591 ] - - [ -127.29, 0.64116, 0.81520, 0.42150 ] - - [ -123.14, 0.57335, 0.90444, 0.42058 ] - - [ -119.00, 0.50388, 0.98826, 0.42024 ] - - [ -114.86, 0.43261, 1.06493, 0.42168 ] - - [ -110.71, 0.35981, 1.13285, 0.42312 ] - - [ -106.57, 0.28603, 1.19061, 0.42258 ] - - [ -102.43, 0.21209, 1.23704, 0.42163 ] - - [ -98.29, 0.13899, 1.27116, 0.41864 ] - - [ -94.14, 0.06787, 1.29229, 0.41277 ] - - [ -90.00, 0.00000, 1.30000, 0.40690 ] - - [ -85.86, -0.06787, 1.29229, 0.39426 ] - - [ -81.71, -0.13899, 1.27116, 0.38162 ] - - [ -77.57, -0.21209, 1.23704, 0.36676 ] - - [ -73.43, -0.28603, 1.19061, 0.35033 ] - - [ -69.29, -0.35981, 1.13285, 0.33362 ] - - [ -65.14, -0.43261, 1.06493, 0.31561 ] - - [ -61.00, -0.50388, 0.98826, 0.29759 ] - - [ -56.86, -0.57335, 0.90444, 0.27989 ] - - [ -52.71, -0.64116, 0.81520, 0.26230 ] - - [ -48.57, -0.70790, 0.72238, 0.24491 ] - - [ -44.43, -0.77483, 0.62793, 0.22794 ] - - [ -40.29, -0.84406, 0.53379, 0.21097 ] - - [ -36.14, -0.91898, 0.44192, 0.13525 ] - - [ -32.00, -1.00494, 0.35424, 0.05517 ] - - [ -28.00, -1.11306, 0.20494, 0.03211 ] - - [ -24.00, -1.05425, 0.15434, 0.01268 ] - - [ -20.00, -0.98247, 0.10967, -0.00282 ] - - [ -18.00, -0.94173, 0.09249, -0.00741 ] - - [ -16.00, -0.89333, 0.07597, -0.01107 ] - - [ -14.00, -0.85472, 0.06054, -0.01250 ] - - [ -12.00, -0.82348, 0.04641, -0.01177 ] - - [ -10.00, -0.79541, 0.03441, -0.01082 ] - - [ -8.00, -0.63650, 0.02548, -0.02769 ] - - [ -6.00, -0.39095, 0.01994, -0.05107 ] - - [ -4.00, -0.13071, 0.01653, -0.07148 ] - - [ -2.00, 0.16173, 0.01507, -0.09179 ] - - [ -1.00, 0.31121, 0.01477, -0.10119 ] - - [ 0.00, 0.45956, 0.01465, -0.10988 ] - - [ 1.00, 0.60566, 0.01466, -0.11776 ] - - [ 2.00, 0.74868, 0.01481, -0.12477 ] - - [ 3.00, 0.88862, 0.01507, -0.13098 ] - - [ 4.00, 1.02544, 0.01544, -0.13648 ] - - [ 5.00, 1.15878, 0.01593, -0.14130 ] - - [ 6.00, 1.28822, 0.01654, -0.14540 ] - - [ 7.00, 1.41282, 0.01731, -0.14875 ] - - [ 8.00, 1.53090, 0.01831, -0.15118 ] - - [ 9.00, 1.64065, 0.01963, -0.15262 ] - - [ 10.00, 1.73926, 0.02150, -0.15310 ] - - [ 11.00, 1.81971, 0.02445, -0.15254 ] - - [ 12.00, 1.87065, 0.02966, -0.15121 ] - - [ 13.00, 1.89221, 0.03770, -0.14969 ] - - [ 14.00, 1.87910, 0.04824, -0.14562 ] - - [ 15.00, 1.88111, 0.05838, -0.14358 ] - - [ 16.00, 1.86359, 0.06992, -0.14095 ] - - [ 18.00, 1.73324, 0.10166, -0.13711 ] - - [ 20.00, 1.59357, 0.13916, -0.14082 ] - - [ 24.00, 1.46708, 0.21002, -0.15693 ] - - [ 28.00, 1.44834, 0.28200, -0.17979 ] - - [ 32.00, 1.43563, 0.35424, -0.20147 ] - - [ 36.14, 1.31283, 0.44192, -0.22409 ] - - [ 40.29, 1.20580, 0.53379, -0.24619 ] - - [ 44.43, 1.10690, 0.62793, -0.26133 ] - - [ 48.57, 1.01129, 0.72238, -0.27648 ] - - [ 52.71, 0.91594, 0.81520, -0.29062 ] - - [ 56.86, 0.81907, 0.90444, -0.30424 ] - - [ 61.00, 0.71982, 0.98826, -0.31787 ] - - [ 65.14, 0.61801, 1.06493, -0.33154 ] - - [ 69.29, 0.51401, 1.13285, -0.34522 ] - - [ 73.43, 0.40862, 1.19061, -0.35846 ] - - [ 77.57, 0.30299, 1.23704, -0.37161 ] - - [ 81.71, 0.19855, 1.27116, -0.38405 ] - - [ 85.86, 0.09695, 1.29229, -0.39547 ] - - [ 90.00, 0.00000, 1.30000, -0.40690 ] - - [ 94.14, -0.06787, 1.29229, -0.41277 ] - - [ 98.29, -0.13899, 1.27116, -0.41864 ] - - [ 102.43, -0.21209, 1.23704, -0.42163 ] - - [ 106.57, -0.28603, 1.19061, -0.42258 ] - - [ 110.71, -0.35981, 1.13285, -0.42312 ] - - [ 114.86, -0.43261, 1.06493, -0.42168 ] - - [ 119.00, -0.50388, 0.98826, -0.42024 ] - - [ 123.14, -0.57335, 0.90444, -0.42058 ] - - [ 127.29, -0.64116, 0.81520, -0.42150 ] - - [ 131.43, -0.70790, 0.72238, -0.42591 ] - - [ 135.57, -0.77483, 0.62793, -0.43697 ] - - [ 139.71, -0.84406, 0.53379, -0.44803 ] - - [ 143.86, -0.91898, 0.44192, -0.46784 ] - - [ 148.00, -1.00494, 0.35424, -0.48830 ] - - [ 150.29, -0.93316, 0.30832, -0.49600 ] - - [ 152.57, -0.86138, 0.26453, -0.47857 ] - - [ 154.86, -0.78960, 0.22313, -0.46114 ] - - [ 157.14, -0.71781, 0.18439, -0.44370 ] - - [ 159.43, -0.64603, 0.14856, -0.42627 ] - - [ 161.71, -0.57425, 0.11586, -0.43530 ] - - [ 164.00, -0.50247, 0.08651, -0.45315 ] - - [ 166.29, -0.43069, 0.06068, -0.47100 ] - - [ 168.57, -0.35891, 0.05174, -0.48884 ] - - [ 170.86, -0.28713, 0.04653, -0.45714 ] - - [ 173.14, -0.21534, 0.04245, -0.34286 ] - - [ 175.43, -0.14356, 0.03951, -0.22857 ] - - [ 177.71, -0.07178, 0.03774, -0.11429 ] - - [ 179.91, 0.00000, 0.03715, 0.00000 ] - - - pitch_control: - GS_Angles: [0.06019804, 0.08713416, 0.10844806, 0.12685912, 0.14339822, 0.1586021 , 0.17279614, 0.18618935, 0.19892772, 0.21111989, 0.22285021, 0.23417256, 0.2451469 , 0.25580691, 0.26619545, 0.27632495, 0.28623134, 0.29593266, 0.30544521, 0.314779 , 0.32395154, 0.33297489, 0.3418577 , 0.35060844, 0.35923641, 0.36774807, 0.37614942, 0.38444655, 0.39264363, 0.40074407] - GS_Kp: [-0.9394215 , -0.80602855, -0.69555026, -0.60254912, -0.52318192, -0.45465531, -0.39489024, -0.34230736, -0.29568537, -0.25406506, -0.2166825 , -0.18292183, -0.15228099, -0.12434663, -0.09877533, -0.0752794 , -0.05361604, -0.0335789 , -0.01499149, 0.00229803, 0.01842102, 0.03349169, 0.0476098 , 0.0608629 , 0.07332812, 0.0850737 , 0.0961602 , 0.10664158, 0.11656607, 0.12597691] - GS_Ki: [-0.07416547, -0.06719673, -0.0614251 , -0.05656651, -0.0524202 , -0.04884022, -0.04571796, -0.04297091, -0.04053528, -0.03836094, -0.03640799, -0.03464426, -0.03304352, -0.03158417, -0.03024826, -0.02902079, -0.02788904, -0.02684226, -0.02587121, -0.02496797, -0.02412567, -0.02333834, -0.02260078, -0.02190841, -0.0212572 , -0.02064359, -0.0200644 , -0.01951683, -0.01899836, -0.01850671] - Fl_Kp: -9.35 - wt_ops: # operating points: wind speed [m/s], blade pitch [deg], rotor speed [rpm] - v: [3.0, 3.266896551724138, 3.533793103448276, 3.800689655172414, 4.067586206896552, 4.334482758620689, 4.601379310344828, 4.868275862068966, 5.135172413793104, 5.402068965517241, 5.6689655172413795, 5.935862068965518, 6.2027586206896554, 6.469655172413793, 6.736551724137931, 7.00344827586207, 7.270344827586207, 7.537241379310345, 7.804137931034483, 8.071034482758622, 8.337931034482759, 8.604827586206897, 8.871724137931036, 9.138620689655173, 9.405517241379311, 9.672413793103448, 9.939310344827586, 10.206206896551725, 10.473103448275863, 10.74, 11.231724137931035, 11.723448275862069, 12.215172413793104, 12.706896551724139, 13.198620689655172, 13.690344827586207, 14.182068965517242, 14.673793103448276, 15.16551724137931, 15.657241379310346, 16.14896551724138, 16.640689655172416, 17.13241379310345, 17.624137931034483, 18.11586206896552, 18.607586206896553, 19.099310344827586, 19.591034482758623, 20.082758620689653, 20.57448275862069, 21.066206896551726, 21.557931034482756, 22.049655172413793, 22.54137931034483, 23.03310344827586, 23.524827586206897, 24.016551724137933, 24.508275862068963, 25.0] - pitch_op: [-0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, 3.57152, 5.12896, 6.36736, 7.43866, 8.40197, 9.28843, 10.1161, 10.8974, 11.641, 12.3529, 13.038, 13.6997, 14.3409, 14.9642, 15.5713, 16.1639, 16.7435, 17.3109, 17.8673, 18.4136, 18.9506, 19.4788, 19.9989, 20.5112, 21.0164, 21.5147, 22.0067, 22.4925, 22.9724] - omega_op: [2.1486, 2.3397, 2.5309, 2.722, 2.9132, 3.1043, 3.2955, 3.4866, 3.6778, 3.8689, 4.0601, 4.2512, 4.4424, 4.6335, 4.8247, 5.0159, 5.207, 5.3982, 5.5893, 5.7805, 5.9716, 6.1628, 6.3539, 6.5451, 6.7362, 6.9274, 7.1185, 7.3097, 7.5008, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56, 7.56] - gear_ratio: 1 - torque_control: - VS_KP: -38609162.66552 - VS_KI: -4588245.18720 - - - tower: # (could remove some entries that don't apply for the tower) - - - name: main - type: 1 # 1 to signify that this member is a tower (2 for if it's part of the platform/substructure) - - dlsMax : 5.0 # maximum node splitting section amount; can't be 0 - - name : tower # [-] an identifier (no longer has to be number) - type : 1 # [-] - rA : [ 0, 150, 15] # [m] end A coordinates - rB : [ 0, 150, -144.582] # [m] and B coordinates - shape : circ # [-] circular or rectangular - gamma : 0.0 # [deg] twist angle about the member's z-axis - - # --- outer shell including hydro--- - stations : [ 15, 28, 28.001, 41, 41.001, 54, 54.001, 67, 67.001, 80, 80.001, 93, 93.001, 106, 106.001, 119, 119.001, 132, 132.001, 144.582 ] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB - d : [ 10, 9.964, 9.964, 9.967, 9.967, 9.927, 9.927, 9.528, 9.528, 9.149, 9.149, 8.945, 8.945, 8.735, 8.735, 8.405, 8.405, 7.321, 7.321, 6.5 ] # [m] diameters if circular or side lengths if rectangular (can be pairs) - t : [ 0.082954, 0.082954, 0.083073, 0.083073, 0.082799, 0.082799, 0.0299, 0.0299, 0.027842, 0.027842, 0.025567, 0.025567, 0.022854, 0.022854, 0.02025, 0.02025, 0.018339, 0.018339, 0.021211, 0.021211 ] # [m] wall thicknesses (scalar or list of same length as stations) - Cd : 0.0 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) - Ca : 0.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) - # (neglecting axial coefficients for now) - CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) - CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) - rho_shell : 7850 # [kg/m3] material density - - - name: main2 - type: 1 # 1 to signify that this member is a tower (2 for if it's part of the platform/substructure) - - dlsMax : 5.0 # maximum node splitting section amount; can't be 0 - - name : tower # [-] an identifier (no longer has to be number) - type : 1 # [-] - rA : [ 0, -150, 15] # [m] end A coordinates - rB : [ 0, -150, -144.582] # [m] and B coordinates - shape : circ # [-] circular or rectangular - gamma : 0.0 # [deg] twist angle about the member's z-axis - - # --- outer shell including hydro--- - stations : [ 15, 28, 28.001, 41, 41.001, 54, 54.001, 67, 67.001, 80, 80.001, 93, 93.001, 106, 106.001, 119, 119.001, 132, 132.001, 144.582 ] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB - d : [ 10, 9.964, 9.964, 9.967, 9.967, 9.927, 9.927, 9.528, 9.528, 9.149, 9.149, 8.945, 8.945, 8.735, 8.735, 8.405, 8.405, 7.321, 7.321, 6.5 ] # [m] diameters if circular or side lengths if rectangular (can be pairs) - t : [ 0.082954, 0.082954, 0.083073, 0.083073, 0.082799, 0.082799, 0.0299, 0.0299, 0.027842, 0.027842, 0.025567, 0.025567, 0.022854, 0.022854, 0.02025, 0.02025, 0.018339, 0.018339, 0.021211, 0.021211 ] # [m] wall thicknesses (scalar or list of same length as stations) - Cd : 0.0 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) - Ca : 0.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) - # (neglecting axial coefficients for now) - CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) - CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) - rho_shell : 7850 # [kg/m3] material density - - - - - - - -platform: - - potModMaster : 1 # [int] master switch for potMod variables; 0=keeps all member potMod vars the same, 1=turns all potMod vars to False (no HAMS), 2=turns all potMod vars to True (no strip) - dlsMax : 5.0 # maximum node splitting section amount for platform members; can't be 0 - - members: # list all members here - - - name : pontoon1 # [-] an identifier (no longer has to be number) - type : 2 # [-] - rA : [ -80, 300, -1] # [m] end A coordinates - rB : [ 20, 300, -1] # [m] and B coordinates - shape : circ # [-] circular or rectangular - gamma : 0.0 # [deg] twist angle about the member's z-axis - potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory - # --- outer shell including hydro--- - stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB - d : 30.0 # [m] diameters if circular or side lengths if rectangular (can be pairs) - t : 0.05 # [m] wall thicknesses (scalar or list of same length as stations) - Cd : 0.8 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) - Ca : 1.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) - CdEnd : 0.6 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) - CaEnd : 1.2 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) - rho_shell : 7850 # [kg/m3] - # --- handling of end caps or any internal structures if we need them --- - cap_stations : [ 0 ] # [m] location along member of any inner structures (in same scaling as set by 'stations') - cap_t : [ 0.001 ] # [m] thickness of any internal structures - cap_d_in : [ 0 ] # [m] inner diameter of internal structures (0 for full cap/bulkhead, >0 for a ring shape) - - - name : pontoon2 # [-] an identifier (no longer has to be number) - type : 2 # [-] - rA : [ -80, -300, -1] # [m] end A coordinates - rB : [ 20, -300, -1] # [m] and B coordinates - shape : circ # [-] circular or rectangular - gamma : 0.0 # [deg] twist angle about the member's z-axis - potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory - # --- outer shell including hydro--- - stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB - d : 30.0 # [m] diameters if circular or side lengths if rectangular (can be pairs) - t : 0.05 # [m] wall thicknesses (scalar or list of same length as stations) - Cd : 0.8 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) - Ca : 1.0 # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) - CdEnd : 0.6 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) - CaEnd : 1.2 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) - rho_shell : 7850 # [kg/m3] - # --- handling of end caps or any internal structures if we need them --- - cap_stations : [ 0 ] # [m] location along member of any inner structures (in same scaling as set by 'stations') - cap_t : [ 0.001 ] # [m] thickness of any internal structures - cap_d_in : [ 0 ] # [m] inner diameter of internal structures (0 for full cap/bulkhead, >0 for a ring shape) - - - - name : deck # [-] an identifier (no longer has to be number) - type : 2 # [-] - rA : [ -5, -300, 10] # [m] end A coordinates - rB : [ -5, 300, 10] # [m] and B coordinates - shape : rect # [-] circular or rectangular - gamma : 0.0 # [deg] twist angle about the member's z-axis - potMod : False # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory - # --- outer shell including hydro--- - stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB - d : [30, 4] # [m] diameters if circular or side lengths if rectangular (can be pairs) - t : 0.05 # [m] wall thicknesses (scalar or list of same length as stations) - Cd : [1.1, 0.8 ] # [-] transverse drag coefficient (optional, scalar or list of same length as stations) - Ca : [2.25, 0.75] # [-] transverse added mass coefficient (optional, scalar or list of same length as stations) - CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) - CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) - rho_shell : 7850 # [kg/m3] - l_fill : 43.0 # [m] - rho_fill : 1025.0 # [kg/m3] - - -mooring: - water_depth: 400 # [m] uniform water depth - - points: - - name: line1_anchor - type: fixed - location: [-900, 300, -400] - anchor_type: drag_embedment - - - name: line2_anchor - type: fixed - location: [-900, -300, -400] - anchor_type: drag_embedment - - - name: line3_anchor - type: fixed - location: [800, 300, -400] - anchor_type: drag_embedment - - - name: line4_anchor - type: fixed - location: [800, -300, -400] - anchor_type: drag_embedment - - - name: line1_vessel - type: vessel - location: [-80, 300, -14.0] - - - name: line2_vessel - type: vessel - location: [-80, -300, -14.0] - - - name: line3_vessel - type: vessel - location: [20, 300, -14.0] - - - name: line4_vessel - type: vessel - location: [20, -300, -14.0] - - lines: - - name: line1 - endA: line1_anchor - endB: line1_vessel - type: chain - length: 890 - - - name: line2 - endA: line2_anchor - endB: line2_vessel - type: chain - length: 890 - - - name: line3 - endA: line3_anchor - endB: line3_vessel - type: chain - length: 890 - - - name: line4 - endA: line4_anchor - endB: line4_vessel - type: chain - length: 890 - - line_types: - - name: chain - diameter: 0.185 - mass_density: 685.0 - stiffness: 3270e6 - breaking_load: 1e8 - cost: 100.0 - transverse_added_mass: 1.0 - tangential_added_mass: 0.0 - transverse_drag: 1.6 - tangential_drag: 0.1 - - anchor_types: - - name: drag_embedment - mass: 1e3 - cost: 1e4 - max_vertical_load: 0.0 - max_lateral_load: 1e5 \ No newline at end of file diff --git a/RAFT/docs/conf.py b/RAFT/docs/conf.py index 640dc3be3..4f8adf439 100644 --- a/RAFT/docs/conf.py +++ b/RAFT/docs/conf.py @@ -30,8 +30,7 @@ # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. -extensions = ['sphinx_rtd_theme' -] +extensions = ['sphinx_rtd_theme', 'sphinx.ext.autosectionlabel'] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] diff --git a/RAFT/docs/ctopt.rst b/RAFT/docs/ctopt.rst new file mode 100644 index 000000000..fdb815415 --- /dev/null +++ b/RAFT/docs/ctopt.rst @@ -0,0 +1,148 @@ +MHK Turbine Applications +======================== + +As part of the CT-Opt project, RAFT is being expanded to also support underwater +marine hydrokinetic (MHK) turbines. Just as with floating wind turbines, RAFT +supports frequency-domain modeling of the global response and linearized controlled +rotor dynamics of a moored, floating, MHK turbine system. The initial capability +for floating MHK systems, which is still being developed, is available in `RAFT's +CT-Opt branch on GitHub `_. + +This page provides +information about using the under-development MHK capabilities of RAFT. Please +refer to the other pages for general usage, and then this page for specific +usage changes needed for MHK applications. + + +Setting up and Running RAFT +--------------------------- + +Usage patterns for MHK applications are identical to those for floating wind turbine +applications. Refer to the :ref:`Usage and Workflow page` for more information. + +The main differences for MHK applications are in how the design is set up in the input +dictionary or YAML file. Current speed, shear exponent, and heading must be entered in +the Case input section. And the rotor location must be specified beneath the seabed. + + +Additional Phenomena +-------------------- + +For MHK applications, RAFT simulates a number of additional phenomena. The features that have +been added are as follows. + +- Rotor added mass +- Rotor buoyancy +- Multiple rotors with arbitrary positions and attachments +- Cavitation check +- Rotor gyroscopic reactions +- Mean current drag loads on floating structure + + +Input File Differences +---------------------- + +(This section to be updated) + +There are no changes in the modeling settings. + +In site characteristics, viscosity and shear exponent have been added for water to use in current loading and rotor hydrodynamic calculations: + +.. code-block:: python + :emphasize-lines: 7,8 + + site: + water_depth : 60 # [m] uniform water depth + rho_water : 1025.0 # [kg/m^3] water density + rho_air : 1.225 # [kg/m^3] air density + mu_air : 1.81e-05 # air dynamic viscosity + shearExp_air: 0.12 # wind shear exponent + mu_water : 1.00e-03 # [kg/ms] water dynamic viscosity + shearExp_water : 0.12 # current shear exponent + +In Load Cases, the list of case parameters has been edited and expanded to consist of the following: + + - wind_speed + - wind_heading + - wind_turbulence + - turbine_status + - turbine_heading (replaces yaw_misalign, applies to wind or water turbine) + - wave_spectrum + - wave_period + - wave_height + - wave_heading + - current_speed (new) + - current_heading (new) + - current_turbulence (new) + +This section lists the environmental and operating conditions of each load case to be analyzed. + +The reference height of current_speed depends on whether it is a MHK or floating wind application. +If the first (or only) rotor is underwater, then the current speed refers to the hub height of the first rotor. +Otherwise, the current speed is taken to be at the water surface. + +Nonzero turbine headings are not yet supported but will be in the future. + +The turbine inputs have been modified in a number of ways. (To be added...) + + +There are no changes in the platform or mooring sections. + + + +Example MHK Turbine Case +------------------------ + +A rough example MHK turbine case has been added to the designs included in RAFT. +While a proper reference design is in development, this example can be used to +demonstrate the new features. See the FOCTT_example.yaml file for more information. + + +The figure below is generated by RAFT and shows the calcualted system +equilibrium state in unloaded and loaded conditions (produced using the Model.plot method). + +.. image:: /images/FOCTT.png + :align: center + :scale: 80 % + +As with FOWTs, properties like natural frequencies and mode shapes can be calculated. + +The plot below show the power spectral densities of select responses calculated from +a basic load case (produced using the Model.plotResponse method). + +.. image:: /images/FOCTT_response.png + :align: center + :scale: 50 % + + +The table below shows the corresponded response statistics: + +================== ========= ======== ========= +Response channel Average RMS Maximum +================== ========= ======== ========= +surge (m) 6.49e+00 5.43e-03 6.51e+00 +sway (m) -5.00e+00 1.83e-01 -5.00e+00 +heave (m) -8.03e+00 4.32e-01 -6.74e+00 +roll (deg) 6.08e+00 7.80e-01 8.42e+00 +pitch (deg) 4.21e+00 7.98e-03 4.23e+00 +yaw (deg) 1.24e+01 2.51e-01 1.32e+01 +nacelle acc. (m/s) 0.00e+00 1.98e-03 0.00e+00 +tower bending (Nm) -1.42e+06 1.10e+05 0.00e+00 +rotor speed (RPM) 6.00e+00 0.00e+00 6.00e+00 +blade pitch (deg) -2.50e-01 0.00e+00 +rotor power 2.77e+05 +line 0 tension (N) 2.14e+05 1.07e+04 2.46e+05 +line 1 tension (N) 1.35e+04 7.32e+02 1.57e+04 +line 2 tension (N) 1.85e+05 5.23e+03 2.01e+05 +line 3 tension (N) 1.31e+05 3.40e+03 1.42e+05 +line 4 tension (N) 2.98e+04 4.39e+02 3.11e+04 +line 5 tension (N) 4.56e+04 1.20e+03 4.92e+04 +================== ========= ======== ========= + + + + + + + + diff --git a/RAFT/docs/images/FOCTT.png b/RAFT/docs/images/FOCTT.png new file mode 100644 index 000000000..149e11d26 Binary files /dev/null and b/RAFT/docs/images/FOCTT.png differ diff --git a/RAFT/docs/images/FOCTT_response.png b/RAFT/docs/images/FOCTT_response.png new file mode 100644 index 000000000..2d12101eb Binary files /dev/null and b/RAFT/docs/images/FOCTT_response.png differ diff --git a/RAFT/docs/index.rst b/RAFT/docs/index.rst index 0f1d0d94d..1eeb8fcd8 100644 --- a/RAFT/docs/index.rst +++ b/RAFT/docs/index.rst @@ -7,6 +7,7 @@ starting structure usage + ctopt theory @@ -34,6 +35,12 @@ combines multiple NREL-developed tools to enable design optimization of floating offshore wind turbines. See the `WEIS documentation `_ and `GitHub repository `_ for more information. +As part of the CT-Opt project, RAFT is being expanded to also support underwater +marine hydrokinetic (MHK) turbines. Just as with floating wind turbines, RAFT +supports frequency-domain modeling of the global response and linearized controlled +rotor dynamics of a moored, floating, MHK turbine system. More information about +this capability is in the :ref:`MHK Turbine Applications page`. + Following a modular philosophy, RAFT can be used independently for various frequency-domain modeling needs. Or, it can be used as an integrated part of WEIS through its OpenMDAO wrapper. The pages in this documentation site provide diff --git a/RAFT/docs/structure.rst b/RAFT/docs/structure.rst index b40714b77..0d32b3f29 100644 --- a/RAFT/docs/structure.rst +++ b/RAFT/docs/structure.rst @@ -42,6 +42,17 @@ the use of the BEM solver, `pyHAMS `_, or it c It can also calculate the hydrodynamic damping and forcing as a result of nonlinear drag, which is dependent upon the platform positions. Lastly, it can calculate the aerodynamic added mass, damping, and forcing matrices of the rotor. +The FOWT object processes and stores a large set of information about a +floating system. Some of the key properties are: + +- M_struc: 6x6 mass matrix of the complete structure (excluding mooring + system and hydrodynamic added mass) +- C_struc: 6x6 stiffness matrix of the complete structure considering + only the effect of weight +- AWP: waterplane area +- rCG: overall center of gravity location +- rCG_sub: substructure center of gravity location (excludes turbine) + Member ^^^^^^ diff --git a/RAFT/docs/usage.rst b/RAFT/docs/usage.rst index bb354ad92..d458aa5d2 100644 --- a/RAFT/docs/usage.rst +++ b/RAFT/docs/usage.rst @@ -157,12 +157,21 @@ Site Characteristics Load Cases ^^^^^^^^^^ +This section lists the environmental and operating conditions of each load case to be analyzed. + .. code-block:: python cases: - keys : [wind_speed, wind_heading, turbulence, turbine_status, yaw_misalign, wave_spectrum, wave_period, wave_height, wave_heading ] - data : # m/s deg % or e.g. 2B_NTM string deg string (s) (m) (deg) - - [ 12, 0, 0.01, operating, 0, JONSWAP, 13.1, 8.5, 0 ] + keys : [wind_speed, wind_heading, turbulence, turbine_status, turbine_heading, wave_spectrum, wave_period, wave_height, wave_heading, current_speed, current_heading, current_turbulence ] + data : # m/s deg % or e.g. IIB_NTM string deg string (s) (m) (deg) (m/s) (deg) % or e.g. IIB_NTM + - [ 0, 0, 0, operating, 0, JONSWAP, 12, 1, 0, 1, 0, 0 ] + +The reference height of current_speed depends on whether it is a MHK or floating wind application. +If the first (or only) rotor is underwater, then the current speed refers to the hub height of the first rotor. +Otherwise, the current speed is taken to be at the water surface. + +Nonzero turbine headings are not yet supported but will be in the future. + Turbine ^^^^^^^ @@ -471,7 +480,40 @@ Load-Case-Specific Outputs The load-case-specific outputs consist of motion and load response amplitude spectra, and statistics of these responses from which mean and extreme values -can be estimated. Additional calculation of fatigue loads is planned for future work +can be estimated. Additional calculation of fatigue loads is planned for future work. + +When interfacing with RAFT, the case results can be found in 'case_metrics' +in the Model.results data structure. Case metrics is a dictionary containing +sub-dictionaries for each turbine, identified by the numbers 0 to N-1 (where +N is the number of turbines). In the case of an array-level mooring system, +the mooring system results will be stored at the top level. Otherwise, they +will be stored individually. A partial view of the case metrics data +structure is shown below. Typically, each of these entries will be an array +of data, with entries corresponding to the different environmental cases. + +.. code-block:: yaml + case_metrics: + 0: # turbine 1 results + surge_avg # FOWT's global response results + surge_std + surge_max + surge_PSD + sway_avg + ... + AxRNA_avg # FOWT's turbine results + AxRNA_std + ... + Tmoor_avg # FOWT's mooring results + Tmoor_std + ... + 1: # turbine 2 results + ... + array_mooring: # array-level mooring results + Tmoor_avg + Tmoor_std + Tmoor_max + Tmoor_DEL + Tmoor_PSD The plots below show the power spectral densities of select responses calculated from several load cases (produced using the Model.plotResponse method). diff --git a/RAFT/environment.yml b/RAFT/environment.yml new file mode 100644 index 000000000..76dcbb2cc --- /dev/null +++ b/RAFT/environment.yml @@ -0,0 +1,18 @@ +name: test + +channels: + - conda-forge + - defaults + +dependencies: + - matplotlib + - moorpy + - numpy + - openmdao + - pyhams + - pip + - python + - pyyaml + - scipy + - setuptools + - wisdem diff --git a/RAFT/examples/IEA-15-240-RWT-UMaineSemi.12d b/RAFT/examples/IEA-15-240-RWT-UMaineSemi.12d new file mode 100644 index 000000000..2d162fd44 --- /dev/null +++ b/RAFT/examples/IEA-15-240-RWT-UMaineSemi.12d @@ -0,0 +1,9576 @@ + 0.25133E+02 0.25133E+02 0.00000E+00 0.00000E+00 1 2.77205E-02 1.80000E+02 -2.77205E-02 0.00000E+00 + 0.25133E+02 0.25133E+02 0.00000E+00 0.00000E+00 3 5.03997E-01 1.80000E+02 -5.03997E-01 0.00000E+00 + 0.25133E+02 0.25133E+02 0.00000E+00 0.00000E+00 5 1.81440E+00 1.80000E+02 -1.81440E+00 0.00000E+00 + 0.25133E+02 0.25133E+02 0.00000E+00 0.00000E+00 2 5.76573E-06 0.00000E+00 5.76573E-06 0.00000E+00 + 0.25133E+02 0.25133E+02 0.00000E+00 0.00000E+00 4 2.94257E-05 1.80000E+02 -2.94257E-05 0.00000E+00 + 0.25133E+02 0.25133E+02 0.00000E+00 0.00000E+00 6 4.87109E-05 1.80000E+02 -4.87109E-05 0.00000E+00 + 0.20944E+02 0.25133E+02 0.00000E+00 0.00000E+00 1 1.12881E-01 1.06256E+02 -3.15991E-02 1.08368E-01 + 0.20944E+02 0.25133E+02 0.00000E+00 0.00000E+00 3 1.17257E+00 -1.79729E+02 -1.17255E+00 -5.54312E-03 + 0.20944E+02 0.25133E+02 0.00000E+00 0.00000E+00 5 3.03456E+00 1.35825E+02 -2.17644E+00 2.11464E+00 + 0.20944E+02 0.25133E+02 0.00000E+00 0.00000E+00 2 1.84574E-06 1.77658E+02 -1.84420E-06 7.54296E-08 + 0.20944E+02 0.25133E+02 0.00000E+00 0.00000E+00 4 3.19106E-05 -1.71804E+02 -3.15847E-05 -4.54891E-06 + 0.20944E+02 0.25133E+02 0.00000E+00 0.00000E+00 6 7.20902E-05 -1.72624E+02 -7.14936E-05 -9.25541E-06 + 0.17952E+02 0.25133E+02 0.00000E+00 0.00000E+00 1 8.97039E-02 1.18463E+02 -4.27526E-02 7.88606E-02 + 0.17952E+02 0.25133E+02 0.00000E+00 0.00000E+00 3 5.91433E-01 -1.78195E+02 -5.91140E-01 -1.86339E-02 + 0.17952E+02 0.25133E+02 0.00000E+00 0.00000E+00 5 6.03054E+00 1.08173E+02 -1.88088E+00 5.72973E+00 + 0.17952E+02 0.25133E+02 0.00000E+00 0.00000E+00 2 2.99515E-06 1.65432E+02 -2.89886E-06 7.53365E-07 + 0.17952E+02 0.25133E+02 0.00000E+00 0.00000E+00 4 3.03969E-05 1.36058E+02 -2.18869E-05 2.10935E-05 + 0.17952E+02 0.25133E+02 0.00000E+00 0.00000E+00 6 8.39686E-05 1.30862E+01 8.17880E-05 1.90118E-05 + 0.15708E+02 0.25133E+02 0.00000E+00 0.00000E+00 1 2.70833E-01 -1.05556E+02 -7.26310E-02 -2.60912E-01 + 0.15708E+02 0.25133E+02 0.00000E+00 0.00000E+00 3 3.37703E-01 -9.27177E+00 3.33291E-01 -5.44098E-02 + 0.15708E+02 0.25133E+02 0.00000E+00 0.00000E+00 5 1.30180E+01 8.98116E+01 4.28090E-02 1.30179E+01 + 0.15708E+02 0.25133E+02 0.00000E+00 0.00000E+00 2 8.90470E-06 1.79003E+00 8.90036E-06 2.78154E-07 + 0.15708E+02 0.25133E+02 0.00000E+00 0.00000E+00 4 1.96769E-04 1.77370E+02 -1.96561E-04 9.02936E-06 + 0.15708E+02 0.25133E+02 0.00000E+00 0.00000E+00 6 9.62943E-05 -5.86892E+00 9.57896E-05 -9.84638E-06 + 0.13963E+02 0.25133E+02 0.00000E+00 0.00000E+00 1 1.06361E+00 -9.82741E+01 -1.53062E-01 -1.05253E+00 + 0.13963E+02 0.25133E+02 0.00000E+00 0.00000E+00 3 1.80079E+00 -4.84475E+00 1.79436E+00 -1.52088E-01 + 0.13963E+02 0.25133E+02 0.00000E+00 0.00000E+00 5 2.79217E+01 7.98291E+01 4.93053E+00 2.74830E+01 + 0.13963E+02 0.25133E+02 0.00000E+00 0.00000E+00 2 3.04983E-06 2.46982E+01 2.77083E-06 1.27434E-06 + 0.13963E+02 0.25133E+02 0.00000E+00 0.00000E+00 4 4.55808E-05 9.46939E+01 -3.72997E-06 4.54279E-05 + 0.13963E+02 0.25133E+02 0.00000E+00 0.00000E+00 6 1.89901E-04 -1.09257E+02 -6.26314E-05 -1.79276E-04 + 0.12566E+02 0.25133E+02 0.00000E+00 0.00000E+00 1 2.34984E+00 -9.87102E+01 -3.55853E-01 -2.32273E+00 + 0.12566E+02 0.25133E+02 0.00000E+00 0.00000E+00 3 3.90736E+00 -5.76805E+00 3.88758E+00 -3.92696E-01 + 0.12566E+02 0.25133E+02 0.00000E+00 0.00000E+00 5 5.52364E+01 7.51344E+01 1.41710E+01 5.33876E+01 + 0.12566E+02 0.25133E+02 0.00000E+00 0.00000E+00 2 3.39662E-06 6.57139E+01 1.39701E-06 3.09603E-06 + 0.12566E+02 0.25133E+02 0.00000E+00 0.00000E+00 4 2.00742E-05 -1.67872E+02 -1.96261E-05 -4.21755E-06 + 0.12566E+02 0.25133E+02 0.00000E+00 0.00000E+00 6 1.37430E-04 -5.85477E+01 7.17094E-05 -1.17238E-04 + 0.11424E+02 0.25133E+02 0.00000E+00 0.00000E+00 1 4.02604E+00 -1.01528E+02 -8.04580E-01 -3.94483E+00 + 0.11424E+02 0.25133E+02 0.00000E+00 0.00000E+00 3 6.55301E+00 -7.77357E+00 6.49279E+00 -8.86351E-01 + 0.11424E+02 0.25133E+02 0.00000E+00 0.00000E+00 5 9.86904E+01 7.28981E+01 2.90222E+01 9.43267E+01 + 0.11424E+02 0.25133E+02 0.00000E+00 0.00000E+00 2 4.74006E-06 -1.06750E+02 -1.36604E-06 -4.53895E-06 + 0.11424E+02 0.25133E+02 0.00000E+00 0.00000E+00 4 6.40291E-05 -1.40640E+02 -4.95054E-05 -4.06071E-05 + 0.11424E+02 0.25133E+02 0.00000E+00 0.00000E+00 6 7.30845E-05 -9.77919E+01 -9.90848E-06 -7.24097E-05 + 0.10472E+02 0.25133E+02 0.00000E+00 0.00000E+00 1 5.86480E+00 -1.06259E+02 -1.64200E+00 -5.63025E+00 + 0.10472E+02 0.25133E+02 0.00000E+00 0.00000E+00 3 9.40462E+00 -1.02713E+01 9.25391E+00 -1.67693E+00 + 0.10472E+02 0.25133E+02 0.00000E+00 0.00000E+00 5 1.59291E+02 7.16964E+01 5.00257E+01 1.51232E+02 + 0.10472E+02 0.25133E+02 0.00000E+00 0.00000E+00 2 7.12873E-06 1.76127E+02 -7.11245E-06 4.81519E-07 + 0.10472E+02 0.25133E+02 0.00000E+00 0.00000E+00 4 1.91229E-04 -2.15199E+01 1.77898E-04 -7.01473E-05 + 0.10472E+02 0.25133E+02 0.00000E+00 0.00000E+00 6 3.15126E-04 9.05204E+01 -2.86196E-06 3.15113E-04 + 0.96664E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 7.62008E+00 -1.13188E+02 -3.00035E+00 -7.00453E+00 + 0.96664E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 1.20634E+01 -1.29655E+01 1.17559E+01 -2.70661E+00 + 0.96664E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 2.34384E+02 7.10365E+01 7.61667E+01 2.21663E+02 + 0.96664E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 5.62441E-06 1.28290E+02 -3.48516E-06 4.41449E-06 + 0.96664E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 1.44446E-05 8.02326E+01 2.45052E-06 1.42352E-05 + 0.96664E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 2.25660E-05 1.38738E+02 -1.69630E-05 1.48823E-05 + 0.89760E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 9.20569E+00 -1.23532E+02 -5.08526E+00 -7.67366E+00 + 0.89760E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 1.42177E+01 -1.65883E+01 1.36260E+01 -4.05906E+00 + 0.89760E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 3.18719E+02 7.03404E+01 1.07227E+02 3.00140E+02 + 0.89760E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 6.85027E-06 8.46425E+01 6.39613E-07 6.82034E-06 + 0.89760E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 5.10829E-05 1.01752E+02 -1.04046E-05 5.00121E-05 + 0.89760E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 6.84592E-05 -8.29743E+01 8.37350E-06 -6.79452E-05 + 0.83776E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 1.07458E+01 -1.38841E+02 -8.09046E+00 -7.07232E+00 + 0.83776E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 1.53840E+01 -2.29143E+01 1.41700E+01 -5.98982E+00 + 0.83776E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 4.00148E+02 6.84546E+01 1.46950E+02 3.72189E+02 + 0.83776E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 6.05157E-06 -3.19917E+01 5.13249E-06 -3.20610E-06 + 0.83776E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 6.16275E-05 -1.61488E+02 -5.84387E-05 -1.95669E-05 + 0.83776E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 6.31080E-05 4.94747E+01 4.10065E-05 4.79696E-05 + 0.78540E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 1.24736E+01 -1.57531E+02 -1.15267E+01 -4.76722E+00 + 0.78540E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 1.48338E+01 -3.24916E+01 1.25118E+01 -7.96834E+00 + 0.78540E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 4.50868E+02 6.54304E+01 1.87470E+02 4.10045E+02 + 0.78540E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 1.68540E-06 -4.26118E+01 1.24038E-06 -1.14106E-06 + 0.78540E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 6.19281E-05 1.67262E+02 -6.04040E-05 1.36545E-05 + 0.78540E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 6.74683E-05 -9.16401E+01 -1.93101E-06 -6.74406E-05 + 0.73920E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 1.47919E+01 -1.73687E+02 -1.47022E+01 -1.62659E+00 + 0.73920E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 1.30101E+01 -4.36211E+01 9.41821E+00 -8.97547E+00 + 0.73920E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 4.55132E+02 6.39423E+01 1.99929E+02 4.08869E+02 + 0.73920E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 1.70031E-06 -1.40585E+02 -1.31360E-06 -1.07959E-06 + 0.73920E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 1.44374E-05 -1.62952E+02 -1.38030E-05 -4.23275E-06 + 0.73920E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 1.55781E-04 8.65209E+00 1.54008E-04 2.34348E-05 + 0.69813E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 1.81411E+01 1.75533E+02 -1.80860E+01 1.41282E+00 + 0.69813E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 1.18656E+01 -5.65843E+01 6.53450E+00 -9.90419E+00 + 0.69813E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 4.44891E+02 6.57722E+01 1.82567E+02 4.05705E+02 + 0.69813E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 4.37055E-07 -1.56809E+02 -4.01741E-07 -1.72108E-07 + 0.69813E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 6.74603E-05 1.46172E+02 -5.60402E-05 3.75551E-05 + 0.69813E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 1.13717E-04 1.65860E+02 -1.10271E-04 2.77808E-05 + 0.66139E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 2.18903E+01 1.64653E+02 -2.11097E+01 5.79365E+00 + 0.66139E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 1.30550E+01 -7.70242E+01 2.93138E+00 -1.27217E+01 + 0.66139E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 4.79083E+02 6.31377E+01 2.16473E+02 4.27388E+02 + 0.66139E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 3.70643E-06 1.19455E+02 -1.82262E-06 3.22733E-06 + 0.66139E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 4.75424E-05 9.97899E+01 -8.08392E-06 4.68500E-05 + 0.66139E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 2.34596E-04 3.46990E+01 1.92874E-04 1.33547E-04 + 0.62832E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 2.00993E+01 1.52251E+02 -1.77877E+01 9.35834E+00 + 0.62832E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 1.37261E+01 -1.02969E+02 -3.08038E+00 -1.33760E+01 + 0.62832E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 4.44487E+02 4.37023E+01 3.21337E+02 3.07102E+02 + 0.62832E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 3.26454E-06 1.59816E+02 -3.06406E-06 1.12638E-06 + 0.62832E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 6.67843E-06 -6.51110E+01 2.81069E-06 -6.05817E-06 + 0.62832E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 2.81264E-04 5.04458E+01 1.79111E-04 2.16861E-04 + 0.59840E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 1.39582E+01 1.54402E+02 -1.25882E+01 6.03067E+00 + 0.59840E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 1.27240E+01 -1.12929E+02 -4.95706E+00 -1.17187E+01 + 0.59840E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 3.15168E+02 2.52681E+01 2.85013E+02 1.34531E+02 + 0.59840E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 3.45018E-06 3.33471E+01 2.88213E-06 1.89660E-06 + 0.59840E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 3.01712E-05 8.11261E+01 4.65422E-06 2.98100E-05 + 0.59840E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 8.51631E-05 1.36560E+02 -6.18365E-05 5.85576E-05 + 0.57120E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 8.64195E+00 1.66441E+02 -8.40108E+00 2.02613E+00 + 0.57120E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 1.30636E+01 -1.05128E+02 -3.40919E+00 -1.26109E+01 + 0.57120E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 2.26404E+02 1.06031E+01 2.22538E+02 4.16593E+01 + 0.57120E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 9.36711E-07 3.78380E+01 7.39766E-07 5.74607E-07 + 0.57120E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 1.77114E-05 -1.32011E+02 -1.18537E-05 -1.31599E-05 + 0.57120E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 4.93417E-05 9.90758E+01 -7.78319E-06 4.87239E-05 + 0.54636E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 2.98017E+00 -1.67582E+02 -2.91044E+00 -6.40880E-01 + 0.54636E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 1.71361E+01 -1.02531E+02 -3.71794E+00 -1.67279E+01 + 0.54636E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 1.80497E+02 -1.21483E+01 1.76455E+02 -3.79842E+01 + 0.54636E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 2.35700E-06 3.41045E+00 2.35283E-06 1.40214E-07 + 0.54636E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 4.33040E-05 9.54020E+01 -4.07679E-06 4.31117E-05 + 0.54636E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 1.80780E-04 3.71605E+01 1.44072E-04 1.09201E-04 + 0.52360E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 2.45818E+00 -6.33137E+00 2.44318E+00 -2.71084E-01 + 0.52360E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 1.98593E+01 -1.18212E+02 -9.38827E+00 -1.75000E+01 + 0.52360E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 1.46544E+02 -3.96071E+01 1.12902E+02 -9.34244E+01 + 0.52360E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 2.22718E-06 1.69573E+02 -2.19040E-06 4.03076E-07 + 0.52360E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 4.72913E-05 9.70880E+01 -5.83541E-06 4.69299E-05 + 0.52360E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 2.48389E-04 -1.59460E+02 -2.32598E-04 -8.71491E-05 + 0.50265E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 1.01569E+01 2.92493E+01 8.86195E+00 4.96279E+00 + 0.50265E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 1.53855E+01 -1.39960E+02 -1.17790E+01 -9.89787E+00 + 0.50265E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 1.16552E+02 -5.85783E+01 6.07622E+01 -9.94598E+01 + 0.50265E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 1.58771E-06 5.90882E+01 8.15635E-07 1.36219E-06 + 0.50265E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 8.35520E-06 -6.26096E+01 3.84382E-06 -7.41852E-06 + 0.50265E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 2.19321E-04 -7.22607E+01 6.68239E-05 -2.08893E-04 + 0.48332E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 1.74787E+01 9.65027E+00 1.72314E+01 2.93003E+00 + 0.48332E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 9.50675E+00 -1.60180E+02 -8.94360E+00 -3.22341E+00 + 0.48332E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 1.12281E+02 -3.91085E+01 8.71245E+01 -7.08256E+01 + 0.48332E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 2.03319E-06 1.25752E+02 -1.18795E-06 1.65004E-06 + 0.48332E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 2.68250E-05 -1.57357E+02 -2.47574E-05 -1.03273E-05 + 0.48332E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 1.45732E-04 1.05933E+02 -4.00048E-05 1.40133E-04 + 0.46542E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 1.38788E+01 5.70314E+00 1.38102E+01 1.37920E+00 + 0.46542E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 4.68017E+00 -1.78375E+02 -4.67829E+00 -1.32691E-01 + 0.46542E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 1.26412E+02 -3.78189E+01 9.98595E+01 -7.75117E+01 + 0.46542E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 1.05212E-06 1.77315E+02 -1.05096E-06 4.92922E-08 + 0.46542E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 8.49406E-06 -9.27357E+01 -4.05409E-07 -8.48438E-06 + 0.46542E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 8.62041E-05 1.34215E+02 -6.01147E-05 6.17849E-05 + 0.44880E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 9.35485E+00 -3.56084E+01 7.60564E+00 -5.44680E+00 + 0.44880E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 2.35147E+00 1.62927E+02 -2.24784E+00 6.90360E-01 + 0.44880E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 1.03446E+02 -1.32080E+01 1.00710E+02 -2.36361E+01 + 0.44880E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 1.12055E-06 -3.99664E+01 8.58812E-07 -7.19772E-07 + 0.44880E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 4.03269E-06 -7.98098E+01 7.13452E-07 -3.96908E-06 + 0.44880E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 1.09763E-04 -1.33023E+02 -7.48898E-05 -8.02455E-05 + 0.43332E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 1.31760E+01 -1.02912E+02 -2.94419E+00 -1.28428E+01 + 0.43332E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 1.72279E+00 1.63305E+02 -1.65017E+00 4.94924E-01 + 0.43332E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 1.26721E+02 2.66653E+01 1.13243E+02 5.68697E+01 + 0.43332E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 5.41324E-07 -1.09188E+02 -1.77915E-07 -5.11251E-07 + 0.43332E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 1.37734E-05 -2.98275E+01 1.19488E-05 -6.85076E-06 + 0.43332E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 1.59762E-04 1.31087E+02 -1.04996E-04 1.20414E-04 + 0.41888E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 2.05302E+01 -1.17783E+02 -9.56948E+00 -1.81635E+01 + 0.41888E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 2.94815E+00 1.63374E+02 -2.82490E+00 8.43527E-01 + 0.41888E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 1.55290E+02 4.31485E+01 1.13297E+02 1.06201E+02 + 0.41888E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 1.46507E-06 -5.14432E+01 9.13164E-07 -1.14567E-06 + 0.41888E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 5.32803E-06 -1.08905E+02 -1.72626E-06 -5.04063E-06 + 0.41888E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 9.76302E-05 3.49115E+01 8.00604E-05 5.58748E-05 + 0.40537E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 2.19477E+01 -1.03865E+02 -5.25953E+00 -2.13082E+01 + 0.40537E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 3.46967E+00 1.26400E+02 -2.05895E+00 2.79273E+00 + 0.40537E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 1.35593E+02 7.56804E+01 3.35363E+01 1.31380E+02 + 0.40537E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 1.90068E-06 -1.75158E+02 -1.89390E-06 -1.60445E-07 + 0.40537E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 3.05008E-06 -2.86116E+00 3.04627E-06 -1.52247E-07 + 0.40537E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 5.87298E-05 1.02488E+02 -1.26998E-05 5.73403E-05 + 0.39270E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 2.34347E+01 -1.01978E+02 -4.86347E+00 -2.29245E+01 + 0.39270E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 1.54223E+00 1.21218E+02 -7.99323E-01 1.31893E+00 + 0.39270E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 1.31818E+02 8.43194E+01 1.30477E+01 1.31171E+02 + 0.39270E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 1.84183E-06 -1.57334E+02 -1.69958E-06 -7.09753E-07 + 0.39270E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 4.79054E-06 -9.27249E+01 -2.27746E-07 -4.78512E-06 + 0.39270E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 4.53838E-05 5.59886E+01 2.53858E-05 3.76198E-05 + 0.38080E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 1.82782E+01 -1.06046E+02 -5.05227E+00 -1.75661E+01 + 0.38080E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 1.18514E+00 1.38995E+02 -8.94376E-01 7.77597E-01 + 0.38080E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 8.20877E+01 7.84244E+01 1.64718E+01 8.04181E+01 + 0.38080E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 2.01908E-06 1.79570E+02 -2.01902E-06 1.51370E-08 + 0.38080E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 1.56185E-06 8.65766E+01 9.32650E-08 1.55906E-06 + 0.38080E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 2.79505E-05 -9.57229E+01 -2.78715E-06 -2.78111E-05 + 0.36960E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 1.30081E+01 -1.37929E+02 -9.65614E+00 -8.71609E+00 + 0.36960E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 6.26498E-01 1.35869E+02 -4.49672E-01 4.36228E-01 + 0.36960E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 4.38875E+01 -2.65647E+00 4.38403E+01 -2.03408E+00 + 0.36960E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 1.92985E-07 -1.55704E+02 -1.75892E-07 -7.94034E-08 + 0.36960E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 2.23608E-06 2.94147E+01 1.94782E-06 1.09820E-06 + 0.36960E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 9.76984E-05 9.77663E+00 9.62796E-05 1.65899E-05 + 0.35904E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 1.88994E+01 -1.69079E+02 -1.85571E+01 -3.58070E+00 + 0.35904E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 5.09836E-01 6.75169E+01 1.94966E-01 4.71085E-01 + 0.35904E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 9.40558E+01 -1.84293E+01 8.92320E+01 -2.97343E+01 + 0.35904E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 3.46770E-07 -1.68455E+02 -3.39755E-07 -6.93989E-08 + 0.35904E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 1.62872E-06 -8.72141E+01 7.91620E-08 -1.62679E-06 + 0.35904E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 3.31130E-05 -1.03662E+01 3.25725E-05 -5.95830E-06 + 0.34907E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 2.25029E+01 1.55676E+02 -2.05054E+01 9.26880E+00 + 0.34907E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 1.40934E+00 -3.55808E+01 1.14621E+00 -8.20024E-01 + 0.34907E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 1.14652E+02 -2.89406E+01 1.00335E+02 -5.54804E+01 + 0.34907E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 1.16012E-06 -1.08943E+02 -3.76610E-07 -1.09729E-06 + 0.34907E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 2.30496E-06 -1.00085E+02 -4.03607E-07 -2.26935E-06 + 0.34907E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 1.78632E-05 -1.79241E+02 -1.78617E-05 -2.36548E-07 + 0.33963E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 1.20051E+01 1.70081E+02 -1.18256E+01 2.06795E+00 + 0.33963E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 2.34457E-01 -1.53531E+02 -2.09880E-01 -1.04501E-01 + 0.33963E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 7.88413E+01 -1.01308E+01 7.76120E+01 -1.38679E+01 + 0.33963E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 8.10032E-07 1.41383E+01 7.85495E-07 1.97861E-07 + 0.33963E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 3.02325E-06 -1.52950E+02 -2.69253E-06 -1.37489E-06 + 0.33963E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 1.66007E-05 -1.39783E+02 -1.26763E-05 -1.07189E-05 + 0.33069E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 7.70060E+00 1.47907E+02 -6.52385E+00 4.09128E+00 + 0.33069E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 5.89938E-01 6.21623E+01 2.75483E-01 5.21666E-01 + 0.33069E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 3.29725E+01 -4.04937E+01 2.50748E+01 -2.14111E+01 + 0.33069E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 1.16739E-06 1.20595E+02 -5.94158E-07 1.00487E-06 + 0.33069E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 3.18167E-06 -1.39482E+02 -2.41870E-06 -2.06709E-06 + 0.33069E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 8.64026E-05 -9.88115E+01 -1.32355E-05 -8.53828E-05 + 0.32221E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 1.45088E+01 5.71111E+01 7.87842E+00 1.21834E+01 + 0.32221E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 3.82018E-01 6.34843E+01 1.70549E-01 3.41834E-01 + 0.32221E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 4.93492E+01 -1.40579E+02 -3.81224E+01 -3.13373E+01 + 0.32221E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 5.28904E-07 2.68273E+01 4.71978E-07 2.38696E-07 + 0.32221E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 6.30555E-06 -1.78410E+02 -6.30312E-06 -1.74987E-07 + 0.32221E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 6.38927E-05 -7.65121E+01 1.49024E-05 -6.21305E-05 + 0.31416E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 1.11069E+01 3.06573E+01 9.55452E+00 5.66343E+00 + 0.31416E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 2.58249E-01 9.60929E+01 -2.74107E-02 2.56790E-01 + 0.31416E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 5.18331E+01 -1.48470E+02 -4.41810E+01 -2.71055E+01 + 0.31416E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 2.31915E-07 -1.65166E+01 2.22346E-07 -6.59318E-08 + 0.31416E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 2.56920E-06 1.34104E+01 2.49915E-06 5.95863E-07 + 0.31416E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 3.75133E-05 -9.68821E+01 -4.49510E-06 -3.72430E-05 + 0.30650E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 7.84084E+00 5.86536E+01 4.07889E+00 6.69638E+00 + 0.30650E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 2.30129E-01 1.23975E+02 -1.28604E-01 1.90841E-01 + 0.30650E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 4.00593E+01 -1.30848E+02 -2.62007E+01 -3.03030E+01 + 0.30650E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 2.83693E-07 -8.34386E+01 3.24172E-08 -2.81835E-07 + 0.30650E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 1.81022E-06 -7.02534E+01 6.11603E-07 -1.70377E-06 + 0.30650E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 1.71648E-05 -1.10376E+00 1.71617E-05 -3.30647E-07 + 0.29920E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 4.74525E+00 1.33191E+01 4.61762E+00 1.09318E+00 + 0.29920E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 4.74803E-02 -6.54595E+01 1.97203E-02 -4.31913E-02 + 0.29920E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 2.10122E+01 1.75394E+02 -2.09443E+01 1.68744E+00 + 0.29920E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 6.42021E-07 1.62337E+02 -6.11754E-07 1.94802E-07 + 0.29920E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 7.95998E-07 -2.25846E+01 7.34956E-07 -3.05701E-07 + 0.29920E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 4.33664E-05 -1.71532E+02 -4.28937E-05 -6.38593E-06 + 0.29224E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 1.91786E+01 -3.85865E+01 1.49913E+01 -1.19616E+01 + 0.29224E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 1.24592E-02 -1.43917E+02 -1.00691E-02 -7.33793E-03 + 0.29224E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 5.70050E+01 1.35670E+02 -4.07771E+01 3.98347E+01 + 0.29224E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 2.26052E-07 8.82218E+01 7.01445E-09 2.25943E-07 + 0.29224E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 9.43243E-07 -9.83355E+01 -1.36742E-07 -9.33279E-07 + 0.29224E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 4.20423E-05 -3.45099E+01 3.46440E-05 -2.38190E-05 + 0.28560E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 1.55859E+01 -8.47748E+01 1.41942E+00 -1.55211E+01 + 0.28560E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 6.43565E-02 5.35070E+01 3.82744E-02 5.17381E-02 + 0.28560E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 4.59226E+01 1.09747E+02 -1.55157E+01 4.32221E+01 + 0.28560E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 6.64387E-07 -8.53346E+01 5.40387E-08 -6.62186E-07 + 0.28560E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 1.05016E-06 -3.05094E+01 9.04763E-07 -5.33145E-07 + 0.28560E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 1.95875E-05 -3.06448E+01 1.68520E-05 -9.98403E-06 + 0.27925E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 4.20612E+00 -8.46229E+01 3.94158E-01 -4.18762E+00 + 0.27925E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 1.39496E-01 1.64462E+02 -1.34398E-01 3.73687E-02 + 0.27925E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 1.97693E+01 1.34292E+02 -1.38052E+01 1.41507E+01 + 0.27925E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 5.05516E-07 7.78777E+01 1.06158E-07 4.94244E-07 + 0.27925E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 1.49505E-06 -5.63877E+01 8.27614E-07 -1.24508E-06 + 0.27925E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 1.39500E-05 4.08010E+01 1.05599E-05 9.11543E-06 + 0.27318E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 5.71370E+00 -1.27742E+02 -3.49737E+00 -4.51827E+00 + 0.27318E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 2.63126E-01 1.42194E+02 -2.07893E-01 1.61295E-01 + 0.27318E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 1.98921E+01 6.55825E+01 8.22304E+00 1.81129E+01 + 0.27318E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 4.06012E-07 -1.52876E+02 -3.61360E-07 -1.85107E-07 + 0.27318E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 9.74523E-08 7.62148E+01 2.32212E-08 9.46452E-08 + 0.27318E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 1.22349E-05 -1.34620E+02 -8.59383E-06 -8.70849E-06 + 0.26737E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 1.06497E+01 -1.36098E+02 -7.67345E+00 -7.38474E+00 + 0.26737E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 1.47133E-01 1.12459E+02 -5.62080E-02 1.35974E-01 + 0.26737E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 3.13466E+01 5.10583E+01 1.97022E+01 2.43810E+01 + 0.26737E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 8.58402E-08 -8.49513E+01 7.55418E-09 -8.55071E-08 + 0.26737E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 8.11211E-07 -3.58440E+00 8.09624E-07 -5.07160E-08 + 0.26737E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 5.15717E-05 1.42703E+02 -4.10255E-05 3.12498E-05 + 0.26180E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 7.72291E+00 -9.80729E+01 -1.08455E+00 -7.64638E+00 + 0.26180E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 1.18126E-01 1.00194E+02 -2.09060E-02 1.16261E-01 + 0.26180E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 2.99218E+01 8.19284E+01 4.20133E+00 2.96254E+01 + 0.26180E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 4.85663E-08 -5.23644E+01 2.96564E-08 -3.84602E-08 + 0.26180E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 1.18686E-06 -1.70216E+02 -1.16960E-06 -2.01694E-07 + 0.26180E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 3.49183E-05 -1.64619E+02 -3.36676E-05 -9.26175E-06 + 0.25646E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 2.21633E+00 -8.88030E+01 4.62978E-02 -2.21585E+00 + 0.25646E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 2.50082E-01 7.63037E+01 5.92132E-02 2.42971E-01 + 0.25646E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 9.13415E+00 5.30516E+01 5.49050E+00 7.29980E+00 + 0.25646E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 8.55222E-08 -8.16979E+01 1.23488E-08 -8.46259E-08 + 0.25646E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 1.81059E-07 1.43578E+02 -1.45693E-07 1.07499E-07 + 0.25646E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 1.48817E-05 2.59573E+01 1.33804E-05 6.51374E-06 + 0.25133E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 6.06256E+00 -1.50089E+02 -5.25503E+00 -3.02314E+00 + 0.25133E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 2.12882E-01 7.04942E+01 7.10817E-02 2.00664E-01 + 0.25133E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 1.61063E+01 1.01614E+01 1.58537E+01 2.84151E+00 + 0.25133E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 1.52826E-07 -8.39827E+01 1.60206E-08 -1.51984E-07 + 0.25133E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 3.30042E-07 -9.68318E+01 -3.92599E-08 -3.27698E-07 + 0.25133E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 3.66724E-05 6.73523E+01 1.41212E-05 3.38446E-05 + 0.24640E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 6.67457E+00 -1.76703E+02 -6.66353E+00 -3.83832E-01 + 0.24640E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 1.09239E-01 6.95564E+01 3.81557E-02 1.02359E-01 + 0.24640E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 2.31329E+01 -1.02153E+01 2.27662E+01 -4.10256E+00 + 0.24640E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 3.57645E-07 3.27427E+01 3.00818E-07 1.93438E-07 + 0.24640E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 9.07856E-07 -6.64828E+01 3.62257E-07 -8.32450E-07 + 0.24640E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 3.49012E-05 6.73175E+01 1.34587E-05 3.22018E-05 + 0.24166E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 5.63012E+00 -1.40095E+02 -4.31893E+00 -3.61180E+00 + 0.24166E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 1.90495E-01 -1.70496E+01 1.82123E-01 -5.58533E-02 + 0.24166E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 1.13542E+01 -2.65044E+01 1.01609E+01 -5.06699E+00 + 0.24166E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 2.29266E-07 -5.22277E+01 1.40431E-07 -1.81223E-07 + 0.24166E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 3.34606E-07 -1.47702E+01 3.23550E-07 -8.53053E-08 + 0.24166E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 4.81364E-05 -1.04663E+02 -1.21847E-05 -4.65687E-05 + 0.23710E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 3.13985E+00 1.13154E+02 -1.23459E+00 2.88694E+00 + 0.23710E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 1.40428E-01 -2.56117E+01 1.26630E-01 -6.07026E-02 + 0.23710E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 1.55326E+01 -1.12359E+02 -5.90880E+00 -1.43648E+01 + 0.23710E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 3.67216E-07 9.78479E+01 -5.01411E-08 3.63777E-07 + 0.23710E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 3.66591E-07 1.30967E+02 -2.40344E-07 2.76810E-07 + 0.23710E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 2.09395E-05 9.93097E+01 -3.38740E-06 2.06637E-05 + 0.23271E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 1.19022E+01 7.20982E+01 3.65860E+00 1.13260E+01 + 0.23271E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 1.12092E-01 2.80369E+01 9.89372E-02 5.26875E-02 + 0.23271E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 3.14889E+01 -1.10846E+02 -1.12055E+01 -2.94277E+01 + 0.23271E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 1.39943E-07 4.75167E+01 9.45141E-08 1.03204E-07 + 0.23271E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 1.03185E-07 -1.18204E+02 -4.87672E-08 -9.09341E-08 + 0.23271E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 1.23672E-05 -1.27937E+02 -7.60331E-06 -9.75390E-06 + 0.22848E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 6.41453E+00 4.35702E+01 4.64752E+00 4.42117E+00 + 0.22848E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 5.47210E-02 1.62301E+02 -5.21310E-02 1.66357E-02 + 0.22848E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 1.94287E+01 -1.52975E+02 -1.73072E+01 -8.82809E+00 + 0.22848E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 1.18452E-07 -1.51156E+02 -1.03757E-07 -5.71440E-08 + 0.22848E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 6.98796E-08 -1.68783E+02 -6.85447E-08 -1.35934E-08 + 0.22848E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 1.32650E-05 9.97987E+01 -2.25754E-06 1.30715E-05 + 0.22440E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 1.26238E+01 -1.14023E+01 1.23746E+01 -2.49567E+00 + 0.22440E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 3.84655E-02 -1.77113E+02 -3.84166E-02 -1.93757E-03 + 0.22440E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 2.98446E+01 1.65766E+02 -2.89283E+01 7.33827E+00 + 0.22440E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 3.93212E-07 -1.28041E+02 -2.42309E-07 -3.09680E-07 + 0.22440E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 2.00682E-07 1.41686E+02 -1.57461E-07 1.24417E-07 + 0.22440E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 3.65855E-05 1.57509E+02 -3.38029E-05 1.39951E-05 + 0.22046E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 1.33561E+01 -4.00872E+01 1.02183E+01 -8.60068E+00 + 0.22046E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 1.09689E-01 -7.92130E+01 2.05292E-02 -1.07751E-01 + 0.22046E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 2.60925E+01 1.53063E+02 -2.32616E+01 1.18202E+01 + 0.22046E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 2.29887E-07 -7.86275E+01 4.53306E-08 -2.25374E-07 + 0.22046E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 1.17104E-07 -4.04081E+01 8.91682E-08 -7.59098E-08 + 0.22046E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 3.30370E-05 -8.92109E+01 4.54983E-07 -3.30339E-05 + 0.21666E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 5.55272E+00 -6.30029E+01 2.52063E+00 -4.94764E+00 + 0.21666E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 8.18254E-02 2.82392E+01 7.20866E-02 3.87160E-02 + 0.21666E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 8.35387E+00 8.32299E+01 9.84797E-01 8.29562E+00 + 0.21666E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 1.33203E-07 -1.75990E+00 1.33140E-07 -4.09083E-09 + 0.21666E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 9.49326E-08 9.52669E+01 -8.71429E-09 9.45318E-08 + 0.21666E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 1.66412E-05 -1.00049E+02 -2.90366E-06 -1.63859E-05 + 0.21299E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 8.34877E+00 -8.45129E+01 7.98319E-01 -8.31052E+00 + 0.21299E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 1.49451E-01 3.85074E+01 1.16950E-01 9.30507E-02 + 0.21299E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 1.42097E+01 8.47189E+01 1.30788E+00 1.41494E+01 + 0.21299E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 3.79620E-07 9.18944E+01 -1.25491E-08 3.79413E-07 + 0.21299E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 2.40326E-07 -8.72621E+01 1.14797E-08 -2.40052E-07 + 0.21299E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 3.44884E-05 -5.88010E+01 1.78654E-05 -2.95005E-05 + 0.20944E+01 0.25133E+02 0.00000E+00 0.00000E+00 1 3.28015E+00 -1.15839E+02 -1.42964E+00 -2.95221E+00 + 0.20944E+01 0.25133E+02 0.00000E+00 0.00000E+00 3 1.90348E-01 9.82281E+01 -2.72417E-02 1.88389E-01 + 0.20944E+01 0.25133E+02 0.00000E+00 0.00000E+00 5 5.92812E+00 1.12093E+02 -2.22961E+00 5.49285E+00 + 0.20944E+01 0.25133E+02 0.00000E+00 0.00000E+00 2 9.89781E-08 -1.15532E+02 -4.26611E-08 -8.93124E-08 + 0.20944E+01 0.25133E+02 0.00000E+00 0.00000E+00 4 3.90039E-08 9.39909E+01 -2.71458E-09 3.89094E-08 + 0.20944E+01 0.25133E+02 0.00000E+00 0.00000E+00 6 3.76779E-05 -1.08667E+01 3.70022E-05 -7.10320E-06 + 0.20944E+02 0.20944E+02 0.00000E+00 0.00000E+00 1 3.35391E-02 1.80000E+02 -3.35391E-02 0.00000E+00 + 0.20944E+02 0.20944E+02 0.00000E+00 0.00000E+00 3 3.77622E-02 1.80000E+02 -3.77622E-02 0.00000E+00 + 0.20944E+02 0.20944E+02 0.00000E+00 0.00000E+00 5 3.03036E+00 1.80000E+02 -3.03036E+00 0.00000E+00 + 0.20944E+02 0.20944E+02 0.00000E+00 0.00000E+00 2 9.07539E-06 1.80000E+02 -9.07539E-06 0.00000E+00 + 0.20944E+02 0.20944E+02 0.00000E+00 0.00000E+00 4 1.15082E-04 1.80000E+02 -1.15082E-04 0.00000E+00 + 0.20944E+02 0.20944E+02 0.00000E+00 0.00000E+00 6 6.91642E-06 1.80000E+02 -6.91642E-06 0.00000E+00 + 0.17952E+02 0.20944E+02 0.00000E+00 0.00000E+00 1 5.98862E-02 1.33733E+02 -4.13989E-02 4.32723E-02 + 0.17952E+02 0.20944E+02 0.00000E+00 0.00000E+00 3 3.37984E-01 -1.77384E+02 -3.37631E-01 -1.54251E-02 + 0.17952E+02 0.20944E+02 0.00000E+00 0.00000E+00 5 4.75323E+00 1.36593E+02 -3.45315E+00 3.26633E+00 + 0.17952E+02 0.20944E+02 0.00000E+00 0.00000E+00 2 1.46082E-05 1.75780E+02 -1.45686E-05 1.07497E-06 + 0.17952E+02 0.20944E+02 0.00000E+00 0.00000E+00 4 6.85171E-05 1.74728E+02 -6.82272E-05 6.29579E-06 + 0.17952E+02 0.20944E+02 0.00000E+00 0.00000E+00 6 2.32814E-05 -1.62913E+02 -2.22537E-05 -6.84073E-06 + 0.15708E+02 0.20944E+02 0.00000E+00 0.00000E+00 1 1.51243E-01 -1.13923E+02 -6.13303E-02 -1.38250E-01 + 0.15708E+02 0.20944E+02 0.00000E+00 0.00000E+00 3 4.46993E-01 -7.30298E+00 4.43367E-01 -5.68200E-02 + 0.15708E+02 0.20944E+02 0.00000E+00 0.00000E+00 5 9.84066E+00 1.05837E+02 -2.68556E+00 9.46712E+00 + 0.15708E+02 0.20944E+02 0.00000E+00 0.00000E+00 2 5.32833E-06 -7.26755E-01 5.32790E-06 -6.75842E-08 + 0.15708E+02 0.20944E+02 0.00000E+00 0.00000E+00 4 1.64605E-04 -1.73277E+02 -1.63473E-04 -1.92688E-05 + 0.15708E+02 0.20944E+02 0.00000E+00 0.00000E+00 6 6.22283E-05 -1.06040E+02 -1.71942E-05 -5.98057E-05 + 0.13963E+02 0.20944E+02 0.00000E+00 0.00000E+00 1 7.27070E-01 -9.89361E+01 -1.12938E-01 -7.18245E-01 + 0.13963E+02 0.20944E+02 0.00000E+00 0.00000E+00 3 1.68474E+00 -5.52257E+00 1.67692E+00 -1.62136E-01 + 0.13963E+02 0.20944E+02 0.00000E+00 0.00000E+00 5 2.15756E+01 8.86529E+01 5.07215E-01 2.15697E+01 + 0.13963E+02 0.20944E+02 0.00000E+00 0.00000E+00 2 5.59819E-06 -1.79004E+02 -5.59735E-06 -9.72992E-08 + 0.13963E+02 0.20944E+02 0.00000E+00 0.00000E+00 4 2.88348E-05 7.48857E+01 7.51855E-06 2.78373E-05 + 0.13963E+02 0.20944E+02 0.00000E+00 0.00000E+00 6 2.45632E-04 1.60004E+02 -2.30824E-04 8.39963E-05 + 0.12566E+02 0.20944E+02 0.00000E+00 0.00000E+00 1 1.80058E+00 -9.78619E+01 -2.46295E-01 -1.78366E+00 + 0.12566E+02 0.20944E+02 0.00000E+00 0.00000E+00 3 3.50679E+00 -6.56271E+00 3.48381E+00 -4.00793E-01 + 0.12566E+02 0.20944E+02 0.00000E+00 0.00000E+00 5 4.42023E+01 8.00877E+01 7.60906E+00 4.35425E+01 + 0.12566E+02 0.20944E+02 0.00000E+00 0.00000E+00 2 4.34634E-06 -1.07017E+02 -1.27196E-06 -4.15606E-06 + 0.12566E+02 0.20944E+02 0.00000E+00 0.00000E+00 4 2.52306E-05 -1.61051E+02 -2.38634E-05 -8.19287E-06 + 0.12566E+02 0.20944E+02 0.00000E+00 0.00000E+00 6 1.88768E-04 1.01637E+02 -3.80768E-05 1.84887E-04 + 0.11424E+02 0.20944E+02 0.00000E+00 0.00000E+00 1 3.32363E+00 -9.97525E+01 -5.62996E-01 -3.27560E+00 + 0.11424E+02 0.20944E+02 0.00000E+00 0.00000E+00 3 5.86476E+00 -8.39920E+00 5.80186E+00 -8.56661E-01 + 0.11424E+02 0.20944E+02 0.00000E+00 0.00000E+00 5 8.17658E+01 7.57746E+01 2.00929E+01 7.92586E+01 + 0.11424E+02 0.20944E+02 0.00000E+00 0.00000E+00 2 2.44037E-06 -9.50832E+01 -2.16224E-07 -2.43078E-06 + 0.11424E+02 0.20944E+02 0.00000E+00 0.00000E+00 4 7.86286E-05 -1.35213E+02 -5.58056E-05 -5.53913E-05 + 0.11424E+02 0.20944E+02 0.00000E+00 0.00000E+00 6 1.81131E-04 -7.85634E+01 3.59154E-05 -1.77535E-04 + 0.10472E+02 0.20944E+02 0.00000E+00 0.00000E+00 1 5.11233E+00 -1.03659E+02 -1.20725E+00 -4.96774E+00 + 0.10472E+02 0.20944E+02 0.00000E+00 0.00000E+00 3 8.48955E+00 -1.04879E+01 8.34772E+00 -1.54533E+00 + 0.10472E+02 0.20944E+02 0.00000E+00 0.00000E+00 5 1.36175E+02 7.34035E+01 3.88956E+01 1.30502E+02 + 0.10472E+02 0.20944E+02 0.00000E+00 0.00000E+00 2 8.38609E-06 1.74382E+02 -8.34581E-06 8.20971E-07 + 0.10472E+02 0.20944E+02 0.00000E+00 0.00000E+00 4 1.64308E-04 -1.66900E+02 -1.60032E-04 -3.72403E-05 + 0.10472E+02 0.20944E+02 0.00000E+00 0.00000E+00 6 8.88997E-05 1.53253E+02 -7.93878E-05 4.00093E-05 + 0.96664E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 6.90870E+00 -1.09632E+02 -2.32114E+00 -6.50710E+00 + 0.96664E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 1.10363E+01 -1.24557E+01 1.07765E+01 -2.38035E+00 + 0.96664E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 2.05824E+02 7.20525E+01 6.34238E+01 1.95808E+02 + 0.96664E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 5.16024E-06 -5.66035E+00 5.13508E-06 -5.08960E-07 + 0.96664E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 1.15355E-04 -1.67038E+01 1.10487E-04 -3.31558E-05 + 0.96664E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 6.13675E-05 -1.61072E+02 -5.80491E-05 -1.99067E-05 + 0.89760E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 8.54764E+00 -1.18682E+02 -4.10239E+00 -7.49884E+00 + 0.89760E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 1.32599E+01 -1.48981E+01 1.28142E+01 -3.40914E+00 + 0.89760E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 2.86374E+02 7.10029E+01 9.32204E+01 2.70776E+02 + 0.89760E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 3.86834E-06 6.53979E+01 1.61044E-06 3.51718E-06 + 0.89760E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 1.04653E-04 5.87303E+01 5.43220E-05 8.94505E-05 + 0.89760E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 2.50948E-04 8.29428E+01 3.08313E-05 2.49047E-04 + 0.83776E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 1.00080E+01 -1.32621E+02 -6.77684E+00 -7.36444E+00 + 0.83776E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 1.47928E+01 -1.96226E+01 1.39337E+01 -4.96775E+00 + 0.83776E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 3.67141E+02 6.90172E+01 1.31469E+02 3.42795E+02 + 0.83776E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 4.56040E-06 1.87029E+00 4.55797E-06 1.48837E-07 + 0.83776E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 6.41566E-05 1.30721E+02 -4.18543E-05 4.86239E-05 + 0.83776E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 5.70751E-05 1.33182E+02 -3.90575E-05 4.16182E-05 + 0.78540E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 1.13889E+01 -1.50809E+02 -9.94246E+00 -5.55470E+00 + 0.78540E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 1.49109E+01 -2.75783E+01 1.32167E+01 -6.90318E+00 + 0.78540E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 4.22066E+02 6.60243E+01 1.71506E+02 3.85649E+02 + 0.78540E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 5.10769E-06 5.30760E+01 3.06847E-06 4.08325E-06 + 0.78540E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 3.73725E-05 1.10898E+02 -1.33310E-05 3.49140E-05 + 0.78540E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 9.65499E-05 -1.49261E+02 -8.29850E-05 -4.93495E-05 + 0.73920E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 1.31639E+01 -1.67956E+02 -1.28741E+01 -2.74682E+00 + 0.73920E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 1.36725E+01 -3.76047E+01 1.08319E+01 -8.34313E+00 + 0.73920E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 4.33336E+02 6.45217E+01 1.86407E+02 3.91193E+02 + 0.73920E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 3.42886E-06 -1.28488E+02 -2.13393E-06 -2.68391E-06 + 0.73920E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 1.81141E-05 -3.23632E+01 1.53005E-05 -9.69619E-06 + 0.73920E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 7.83018E-05 -4.45136E+01 5.58357E-05 -5.48957E-05 + 0.69813E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 1.58607E+01 -1.79925E+02 -1.58607E+01 -2.07334E-02 + 0.69813E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 1.26260E+01 -5.00826E+01 8.10185E+00 -9.68373E+00 + 0.69813E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 4.23431E+02 6.65112E+01 1.68766E+02 3.88344E+02 + 0.69813E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 3.30954E-06 -2.52258E+01 2.99392E-06 -1.41048E-06 + 0.69813E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 3.22197E-05 -1.16815E+02 -1.45345E-05 -2.87551E-05 + 0.69813E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 1.08550E-04 -7.14825E+00 1.07707E-04 -1.35077E-05 + 0.66139E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 1.92850E+01 1.70701E+02 -1.90315E+01 3.11627E+00 + 0.66139E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 1.34501E+01 -7.09874E+01 4.38172E+00 -1.27163E+01 + 0.66139E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 4.49170E+02 6.68202E+01 1.76801E+02 4.12910E+02 + 0.66139E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 2.30957E-06 -1.04841E+02 -5.91564E-07 -2.23252E-06 + 0.66139E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 4.80353E-05 4.78950E+01 3.22072E-05 3.56382E-05 + 0.66139E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 2.71432E-04 1.73300E+02 -2.69578E-04 3.16682E-05 + 0.62832E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 1.97764E+01 1.60545E+02 -1.86472E+01 6.58697E+00 + 0.62832E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 1.36847E+01 -9.90492E+01 -2.15237E+00 -1.35144E+01 + 0.62832E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 4.36485E+02 5.22001E+01 2.67524E+02 3.44891E+02 + 0.62832E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 1.90548E-06 2.33832E+00 1.90389E-06 7.77435E-08 + 0.62832E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 3.46466E-05 -9.77869E+01 -4.69423E-06 -3.43271E-05 + 0.62832E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 1.88690E-04 -1.27687E+02 -1.15355E-04 -1.49322E-04 + 0.59840E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 1.61656E+01 1.58850E+02 -1.50766E+01 5.83279E+00 + 0.59840E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 1.25977E+01 -1.12454E+02 -4.81158E+00 -1.16426E+01 + 0.59840E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 3.33327E+02 3.65812E+01 2.67666E+02 1.98650E+02 + 0.59840E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 6.73833E-06 -8.99965E+01 4.15394E-10 -6.73833E-06 + 0.59840E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 6.10812E-05 6.93626E+01 2.15282E-05 5.71616E-05 + 0.59840E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 9.43873E-05 -8.68421E+01 5.19959E-06 -9.42440E-05 + 0.57120E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 1.15509E+01 1.61391E+02 -1.09470E+01 3.68597E+00 + 0.57120E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 1.23789E+01 -1.09644E+02 -4.16145E+00 -1.16584E+01 + 0.57120E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 2.54860E+02 2.36129E+01 2.33521E+02 1.02086E+02 + 0.57120E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 2.62148E-06 -1.04069E+01 2.57835E-06 -4.73535E-07 + 0.57120E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 6.41680E-06 6.74070E+01 2.46522E-06 5.92435E-06 + 0.57120E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 1.13477E-04 1.07890E+02 -3.48595E-05 1.07990E-04 + 0.54636E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 4.60841E+00 1.58833E+02 -4.29748E+00 1.66406E+00 + 0.54636E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 1.42020E+01 -1.05606E+02 -3.82053E+00 -1.36784E+01 + 0.54636E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 2.09827E+02 -1.50976E-01 2.09827E+02 -5.52900E-01 + 0.54636E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 1.44796E-06 -4.74222E+00 1.44300E-06 -1.19707E-07 + 0.54636E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 4.53354E-05 9.20038E+01 -1.58517E-06 4.53077E-05 + 0.54636E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 8.25997E-05 1.71702E+02 -8.17349E-05 1.19212E-05 + 0.52360E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 2.20643E+00 1.45885E+01 2.13530E+00 5.55744E-01 + 0.52360E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 1.57843E+01 -1.08090E+02 -4.90128E+00 -1.50041E+01 + 0.52360E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 1.68397E+02 -3.12463E+01 1.43971E+02 -8.73507E+01 + 0.52360E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 4.42996E-06 1.60592E+02 -4.17824E-06 1.47202E-06 + 0.52360E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 2.56076E-05 -1.67530E+02 -2.50035E-05 -5.52943E-06 + 0.52360E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 2.13277E-04 -2.64555E+01 1.90943E-04 -9.50153E-05 + 0.50265E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 9.11089E+00 2.21149E+01 8.44061E+00 3.42993E+00 + 0.50265E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 1.67479E+01 -1.19942E+02 -8.35916E+00 -1.45127E+01 + 0.50265E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 1.38301E+02 -5.74695E+01 7.43713E+01 -1.16603E+02 + 0.50265E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 1.35585E-06 -1.20941E+02 -6.97123E-07 -1.16290E-06 + 0.50265E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 1.99143E-05 8.94658E+01 1.85682E-07 1.99134E-05 + 0.50265E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 1.38126E-04 9.06600E+01 -1.59095E-06 1.38117E-04 + 0.48332E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 1.52732E+01 1.05255E+01 1.50163E+01 2.79002E+00 + 0.48332E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 1.30767E+01 -1.53700E+02 -1.17231E+01 -5.79395E+00 + 0.48332E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 1.12883E+02 -5.45238E+01 6.55132E+01 -9.19270E+01 + 0.48332E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 1.41654E-06 1.93242E+01 1.33673E-06 4.68750E-07 + 0.48332E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 9.15884E-06 5.76394E+01 4.90224E-06 7.73644E-06 + 0.48332E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 2.15752E-04 8.04772E+01 3.56942E-05 2.12779E-04 + 0.46542E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 1.45960E+01 1.44748E+01 1.41327E+01 3.64833E+00 + 0.46542E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 6.08890E+00 1.77112E+02 -6.08117E+00 3.06750E-01 + 0.46542E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 1.08164E+02 -4.79713E+01 7.24161E+01 -8.03451E+01 + 0.46542E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 5.42805E-07 -6.68826E+01 2.13114E-07 -4.99219E-07 + 0.46542E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 1.83694E-05 -1.20184E+01 1.79667E-05 -3.82498E-06 + 0.46542E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 4.48857E-05 4.63681E+01 3.09722E-05 3.24878E-05 + 0.44880E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 1.25506E+01 -1.61374E+01 1.20561E+01 -3.48832E+00 + 0.44880E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 2.72322E+00 1.48000E+02 -2.30941E+00 1.44310E+00 + 0.44880E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 9.37592E+01 -1.22410E+01 9.16275E+01 -1.98792E+01 + 0.44880E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 2.21524E-06 8.68259E+01 1.22658E-07 2.21184E-06 + 0.44880E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 6.61332E-06 -1.42188E+02 -5.22471E-06 -4.05442E-06 + 0.44880E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 1.23276E-04 7.53533E+01 3.11714E-05 1.19270E-04 + 0.43332E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 1.31921E+01 -9.27339E+01 -6.29230E-01 -1.31771E+01 + 0.43332E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 1.77801E+00 1.36691E+02 -1.29380E+00 1.21958E+00 + 0.43332E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 1.25778E+02 1.94645E+01 1.18590E+02 4.19121E+01 + 0.43332E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 2.30999E-06 5.18199E+01 1.42789E-06 1.81582E-06 + 0.43332E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 7.28719E-06 1.57426E+02 -6.72888E-06 2.79737E-06 + 0.43332E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 1.59392E-04 1.06801E+02 -4.60714E-05 1.52589E-04 + 0.41888E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 1.93161E+01 -1.16800E+02 -8.70905E+00 -1.72414E+01 + 0.41888E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 2.25582E+00 1.43024E+02 -1.80215E+00 1.35682E+00 + 0.41888E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 1.37791E+02 4.09367E+01 1.04092E+02 9.02840E+01 + 0.41888E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 3.42999E-06 1.43071E+02 -2.74187E-06 2.06081E-06 + 0.41888E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 3.28553E-06 7.93733E+01 6.05884E-07 3.22918E-06 + 0.41888E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 8.03162E-05 -8.39942E+01 8.40348E-06 -7.98754E-05 + 0.40537E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 2.20210E+01 -1.15809E+02 -9.58726E+00 -1.98245E+01 + 0.40537E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 2.70236E+00 1.33217E+02 -1.85049E+00 1.96937E+00 + 0.40537E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 1.30849E+02 6.97351E+01 4.53212E+01 1.22750E+02 + 0.40537E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 2.72327E-07 -1.47874E+02 -2.30628E-07 -1.44819E-07 + 0.40537E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 9.27693E-06 -2.09024E+00 9.27075E-06 -3.38362E-07 + 0.40537E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 1.59647E-04 6.84785E+01 5.85666E-05 1.48516E-04 + 0.39270E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 2.15509E+01 -1.13111E+02 -8.45889E+00 -1.98215E+01 + 0.39270E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 2.33092E+00 1.18351E+02 -1.10688E+00 2.05135E+00 + 0.39270E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 1.26504E+02 8.10248E+01 1.97355E+01 1.24955E+02 + 0.39270E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 2.39934E-06 1.75073E+02 -2.39047E-06 2.06087E-07 + 0.39270E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 6.85696E-06 -9.99296E+01 -1.18240E-06 -6.75424E-06 + 0.39270E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 3.75739E-05 -1.02886E+02 -8.37950E-06 -3.66276E-05 + 0.38080E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 1.45838E+01 -1.08771E+02 -4.69298E+00 -1.38081E+01 + 0.38080E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 1.33829E+00 1.32439E+02 -9.03079E-01 9.87657E-01 + 0.38080E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 7.65320E+01 9.12240E+01 -1.63484E+00 7.65146E+01 + 0.38080E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 8.51556E-07 1.07008E+02 -2.49081E-07 8.14313E-07 + 0.38080E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 5.13471E-06 -1.07828E+02 -1.57203E-06 -4.88815E-06 + 0.38080E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 1.02125E-04 1.63223E+02 -9.77782E-05 2.94778E-05 + 0.36960E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 8.55688E+00 -1.30313E+02 -5.53597E+00 -6.52483E+00 + 0.36960E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 7.71132E-01 1.33780E+02 -5.33537E-01 5.56762E-01 + 0.36960E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 2.68302E+01 4.13460E-01 2.68295E+01 1.93611E-01 + 0.36960E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 7.54295E-07 -7.10456E+01 2.45007E-07 -7.13395E-07 + 0.36960E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 6.30309E-06 -1.12476E+02 -2.40964E-06 -5.82432E-06 + 0.36960E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 1.18818E-04 -1.65943E+02 -1.15260E-04 -2.88592E-05 + 0.35904E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 1.76100E+01 -1.58537E+02 -1.63887E+01 -6.44358E+00 + 0.35904E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 3.59479E-01 1.10409E+02 -1.25356E-01 3.36914E-01 + 0.35904E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 8.12352E+01 -1.60183E+01 7.80811E+01 -2.24164E+01 + 0.35904E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 1.39565E-06 -1.67265E+02 -1.36132E-06 -3.07662E-07 + 0.35904E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 4.44923E-07 1.14324E+01 4.36095E-07 8.81888E-08 + 0.35904E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 5.00955E-05 -3.45804E+01 4.12452E-05 -2.84323E-05 + 0.34907E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 2.57664E+01 1.48104E+02 -2.18758E+01 1.36144E+01 + 0.34907E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 9.61694E-01 9.58982E+00 9.48255E-01 1.60212E-01 + 0.34907E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 1.31471E+02 -3.90183E+01 1.02146E+02 -8.27700E+01 + 0.34907E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 5.66699E-07 -7.05836E+01 1.88388E-07 -5.34469E-07 + 0.34907E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 4.10214E-06 1.26605E+02 -2.44607E-06 3.29306E-06 + 0.34907E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 1.17805E-04 -9.56758E+00 1.16166E-04 -1.95804E-05 + 0.33963E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 1.14937E+01 1.44979E+02 -9.41265E+00 6.59595E+00 + 0.33963E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 9.11774E-01 -5.19544E+01 5.61916E-01 -7.18040E-01 + 0.33963E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 7.35611E+01 -2.28029E+01 6.78119E+01 -2.85095E+01 + 0.33963E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 8.67496E-07 -1.54075E+01 8.36319E-07 -2.30479E-07 + 0.33963E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 2.58840E-06 1.55689E+02 -2.35887E-06 1.06563E-06 + 0.33963E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 5.30484E-05 1.74133E+02 -5.27705E-05 5.42292E-06 + 0.33069E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 5.02698E+00 1.41471E+02 -3.93258E+00 3.13135E+00 + 0.33069E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 6.87900E-01 9.43318E+01 -5.19586E-02 6.85935E-01 + 0.33069E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 4.02319E+01 -3.01269E+01 3.47972E+01 -2.01930E+01 + 0.33069E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 4.71587E-07 -6.44468E+01 2.03419E-07 -4.25459E-07 + 0.33069E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 3.21629E-06 1.46696E+02 -2.68809E-06 1.76599E-06 + 0.33069E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 1.08119E-04 -1.11274E+02 -3.92279E-05 -1.00751E-04 + 0.32221E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 7.26444E+00 1.00651E+02 -1.34262E+00 7.13929E+00 + 0.32221E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 4.73051E-01 7.18468E+01 1.47383E-01 4.49506E-01 + 0.32221E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 2.92654E+01 -1.22722E+02 -1.58196E+01 -2.46212E+01 + 0.32221E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 2.99557E-07 9.64216E+01 -3.35034E-08 2.97678E-07 + 0.32221E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 2.20853E-06 -2.89846E+01 1.93192E-06 -1.07020E-06 + 0.32221E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 1.49704E-04 9.87000E+01 -2.26442E-05 1.47981E-04 + 0.31416E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 1.66763E+01 3.67452E+01 1.33628E+01 9.97673E+00 + 0.31416E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 5.78674E-01 9.90210E+01 -9.07342E-02 5.71516E-01 + 0.31416E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 6.91597E+01 -1.50977E+02 -6.04749E+01 -3.35537E+01 + 0.31416E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 3.36918E-07 7.38575E+01 9.36723E-08 3.23634E-07 + 0.31416E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 1.83835E-06 -1.75478E+02 -1.83263E-06 -1.44929E-07 + 0.31416E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 1.72890E-04 -8.73497E+01 7.99430E-06 -1.72705E-04 + 0.30650E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 4.47592E+00 5.70377E+01 2.43529E+00 3.75543E+00 + 0.30650E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 1.63367E-01 1.05887E+02 -4.47201E-02 1.57127E-01 + 0.30650E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 3.37080E+01 -1.34152E+02 -2.34798E+01 -2.41853E+01 + 0.30650E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 4.44261E-07 -1.23734E+02 -2.46717E-07 -3.69457E-07 + 0.30650E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 2.38433E-06 -7.91568E+01 4.48543E-07 -2.34176E-06 + 0.30650E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 3.63241E-05 1.78535E+02 -3.63122E-05 9.28599E-07 + 0.29920E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 3.06459E+00 -9.83707E+00 3.01953E+00 -5.23576E-01 + 0.29920E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 1.29429E-02 1.08502E+02 -4.10726E-03 1.22739E-02 + 0.29920E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 2.08365E+01 1.76937E+02 -2.08067E+01 1.11337E+00 + 0.29920E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 7.51189E-07 -1.44746E+02 -6.13425E-07 -4.33583E-07 + 0.29920E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 8.77321E-07 -1.43396E+02 -7.04294E-07 -5.23128E-07 + 0.29920E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 7.33396E-06 1.61815E+02 -6.96765E-06 2.28884E-06 + 0.29224E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 8.55640E+00 -2.91724E+01 7.47108E+00 -4.17072E+00 + 0.29224E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 7.29296E-02 -1.33507E+02 -5.02074E-02 -5.28955E-02 + 0.29224E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 2.92161E+01 1.36591E+02 -2.12244E+01 2.00775E+01 + 0.29224E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 4.27341E-07 1.14426E+02 -1.76715E-07 3.89091E-07 + 0.29224E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 3.08677E-06 -1.58391E+02 -2.86983E-06 -1.13675E-06 + 0.29224E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 5.08580E-06 1.28750E+01 4.95793E-06 1.13324E-06 + 0.28560E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 2.04985E+01 -5.68414E+01 1.12118E+01 -1.71605E+01 + 0.28560E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 7.01761E-02 3.00270E+01 6.07577E-02 3.51167E-02 + 0.28560E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 6.24150E+01 1.26655E+02 -3.72611E+01 5.00724E+01 + 0.28560E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 3.94939E-07 -6.69333E+01 1.54738E-07 -3.63364E-07 + 0.28560E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 6.85425E-07 8.87053E+01 1.54871E-08 6.85250E-07 + 0.28560E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 7.79078E-05 -6.57142E+01 3.20425E-05 -7.10134E-05 + 0.27925E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 8.04975E+00 -8.61471E+01 5.40900E-01 -8.03156E+00 + 0.27925E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 1.63712E-01 1.47764E+02 -1.38477E-01 8.73250E-02 + 0.27925E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 2.66160E+01 1.19446E+02 -1.30845E+01 2.31777E+01 + 0.27925E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 8.32675E-07 -1.41253E+02 -6.49417E-07 -5.21158E-07 + 0.27925E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 1.39527E-06 -1.77325E+02 -1.39374E-06 -6.51293E-08 + 0.27925E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 1.82969E-05 4.83801E+01 1.21525E-05 1.36781E-05 + 0.27318E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 9.33488E+00 -1.32379E+02 -6.29198E+00 -6.89572E+00 + 0.27318E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 3.05142E-01 1.40725E+02 -2.36214E-01 1.93169E-01 + 0.27318E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 2.78891E+01 5.64834E+01 1.53998E+01 2.32518E+01 + 0.27318E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 2.54938E-07 -1.30267E+02 -1.64778E-07 -1.94530E-07 + 0.27318E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 7.88626E-07 1.26150E+02 -4.65214E-07 6.36793E-07 + 0.27318E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 5.20913E-05 1.33404E+02 -3.57938E-05 3.78457E-05 + 0.26737E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 1.31672E+01 -1.21318E+02 -6.84411E+00 -1.12487E+01 + 0.26737E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 2.17326E-01 1.16477E+02 -9.68907E-02 1.94532E-01 + 0.26737E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 3.82333E+01 6.02971E+01 1.89447E+01 3.32097E+01 + 0.26737E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 1.53332E-07 1.73350E+02 -1.52301E-07 1.77554E-08 + 0.26737E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 6.27847E-07 -8.26134E+01 8.07185E-08 -6.22637E-07 + 0.26737E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 1.88747E-05 1.34392E+02 -1.32040E-05 1.34873E-05 + 0.26180E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 9.40560E+00 -1.25641E+02 -5.48072E+00 -7.64376E+00 + 0.26180E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 1.83447E-01 9.21000E+01 -6.72203E-03 1.83324E-01 + 0.26180E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 3.13857E+01 6.58647E+01 1.28334E+01 2.86420E+01 + 0.26180E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 3.49640E-07 -5.11092E+01 2.19517E-07 -2.72140E-07 + 0.26180E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 5.02212E-07 -1.55577E+02 -4.57272E-07 -2.07651E-07 + 0.26180E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 1.94188E-05 1.28468E+02 -1.20801E-05 1.52040E-05 + 0.25646E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 3.39351E+00 -1.43671E+02 -2.73391E+00 -2.01038E+00 + 0.25646E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 3.34964E-01 7.41818E+01 9.13064E-02 3.22279E-01 + 0.25646E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 1.20147E+01 4.02117E+01 9.17523E+00 7.75688E+00 + 0.25646E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 6.85512E-08 3.70359E+01 5.47215E-08 4.12894E-08 + 0.25646E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 5.61168E-07 1.17140E+02 -2.55982E-07 4.99382E-07 + 0.25646E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 1.37391E-05 -1.08767E+02 -4.42019E-06 -1.30086E-05 + 0.25133E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 4.40451E+00 -1.71408E+02 -4.35507E+00 -6.58054E-01 + 0.25133E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 1.87823E-01 7.02130E+01 6.35826E-02 1.76733E-01 + 0.25133E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 1.45144E+01 3.22693E-01 1.45142E+01 8.17456E-02 + 0.25133E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 2.71712E-07 1.12391E+01 2.66501E-07 5.29577E-08 + 0.25133E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 2.72490E-07 1.36328E+01 2.64813E-07 6.42254E-08 + 0.25133E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 3.02574E-05 -8.10034E+01 4.73150E-06 -2.98851E-05 + 0.24640E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 5.84232E+00 -1.68644E+02 -5.72795E+00 -1.15036E+00 + 0.24640E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 1.28613E-01 7.78334E+01 2.71059E-02 1.25724E-01 + 0.24640E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 2.12130E+01 -6.23782E+00 2.10874E+01 -2.30491E+00 + 0.24640E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 4.00446E-07 -7.38566E+01 1.11341E-07 -3.84656E-07 + 0.24640E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 2.68934E-07 1.20559E+02 -1.36735E-07 2.31579E-07 + 0.24640E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 9.42487E-06 -1.27754E+02 -5.77054E-06 -7.45178E-06 + 0.24166E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 3.15606E+00 -1.94748E+01 2.97550E+00 -1.05220E+00 + 0.24166E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 1.51210E-01 -1.02151E+00 1.51186E-01 -2.69574E-03 + 0.24166E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 8.88626E+00 -1.06589E+02 -2.53712E+00 -8.51637E+00 + 0.24166E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 2.01724E-07 -1.13718E+02 -8.11399E-08 -1.84686E-07 + 0.24166E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 1.15580E-07 1.75960E+02 -1.15293E-07 8.14374E-09 + 0.24166E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 2.35937E-05 1.13623E+02 -9.45443E-06 2.16166E-05 + 0.23710E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 3.83906E+00 1.40317E+00 3.83791E+00 9.40092E-02 + 0.23710E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 1.12199E-01 -2.85134E+01 9.85896E-02 -5.35596E-02 + 0.23710E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 1.65649E+01 -1.42470E+02 -1.31366E+01 -1.00909E+01 + 0.23710E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 2.88864E-07 4.95929E+01 1.87246E-07 2.19958E-07 + 0.23710E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 4.08389E-07 5.16800E+00 4.06729E-07 3.67862E-08 + 0.23710E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 3.07268E-05 -5.98452E+00 3.05594E-05 -3.20357E-06 + 0.23271E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 7.05206E+00 6.85309E+01 2.58105E+00 6.56275E+00 + 0.23271E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 7.97044E-02 5.81301E+00 7.92945E-02 8.07264E-03 + 0.23271E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 2.48963E+01 -1.16139E+02 -1.09682E+01 -2.23500E+01 + 0.23271E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 1.61995E-07 1.67150E+02 -1.57939E-07 3.60269E-08 + 0.23271E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 1.63390E-07 1.14489E+02 -6.77280E-08 1.48691E-07 + 0.23271E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 9.47952E-06 -1.73336E+02 -9.41547E-06 -1.10006E-06 + 0.22848E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 5.78127E+00 2.22510E+01 5.35076E+00 2.18917E+00 + 0.22848E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 2.47599E-02 -1.65041E+02 -2.39209E-02 -6.39117E-03 + 0.22848E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 1.89211E+01 -1.62636E+02 -1.80588E+01 -5.64676E+00 + 0.22848E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 1.73448E-07 4.69570E+01 1.18387E-07 1.26763E-07 + 0.22848E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 2.87471E-07 7.90831E+01 5.44429E-08 2.82269E-07 + 0.22848E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 3.05211E-05 2.22911E+00 3.04980E-05 1.18713E-06 + 0.22440E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 1.29213E+01 -1.84054E+01 1.22603E+01 -4.07977E+00 + 0.22440E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 5.96860E-02 1.75603E+02 -5.95103E-02 4.57600E-03 + 0.22440E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 3.22763E+01 1.63030E+02 -3.08709E+01 9.42057E+00 + 0.22440E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 1.99066E-07 1.67724E+02 -1.94514E-07 4.23260E-08 + 0.22440E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 3.69851E-07 9.47186E+01 -3.04246E-08 3.68597E-07 + 0.22440E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 3.56877E-05 -1.90451E+01 3.37343E-05 -1.16454E-05 + 0.22046E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 1.27527E+01 -2.14283E+01 1.18712E+01 -4.65902E+00 + 0.22046E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 8.68154E-02 -7.71429E+01 1.93182E-02 -8.46388E-02 + 0.22046E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 2.93130E+01 1.66006E+02 -2.84431E+01 7.08828E+00 + 0.22046E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 1.95271E-07 -9.95680E+01 -3.24577E-08 -1.92555E-07 + 0.22046E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 2.70048E-07 6.91947E+01 9.59191E-08 2.52439E-07 + 0.22046E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 1.78655E-05 -1.54151E+02 -1.60781E-05 -7.78932E-06 + 0.21666E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 6.83785E+00 -2.43257E+01 6.23078E+00 -2.81667E+00 + 0.21666E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 6.63214E-02 -1.06648E+01 6.51758E-02 -1.22736E-02 + 0.21666E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 6.23411E+00 1.40532E+02 -4.81261E+00 3.96269E+00 + 0.21666E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 2.85637E-07 -7.83133E+01 5.78583E-08 -2.79715E-07 + 0.21666E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 1.86469E-07 -2.34473E+01 1.71072E-07 -7.41971E-08 + 0.21666E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 3.54415E-06 8.59516E+01 2.50215E-07 3.53530E-06 + 0.21299E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 3.46000E+00 -1.74970E+02 -3.44668E+00 -3.03369E-01 + 0.21299E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 9.91235E-02 4.47265E+01 7.04246E-02 6.97556E-02 + 0.21299E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 8.46700E+00 9.17797E+00 8.35860E+00 1.35050E+00 + 0.21299E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 3.56856E-07 -3.61596E+00 3.56145E-07 -2.25063E-08 + 0.21299E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 3.30533E-07 -7.53563E+01 8.35613E-08 -3.19796E-07 + 0.21299E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 1.86432E-05 1.39412E+02 -1.41577E-05 1.21296E-05 + 0.20944E+01 0.20944E+02 0.00000E+00 0.00000E+00 1 3.19028E+00 -1.60311E+02 -3.00375E+00 -1.07486E+00 + 0.20944E+01 0.20944E+02 0.00000E+00 0.00000E+00 3 1.11689E-01 9.67827E+01 -1.31909E-02 1.10908E-01 + 0.20944E+01 0.20944E+02 0.00000E+00 0.00000E+00 5 3.90917E+00 4.07756E+01 2.96031E+00 2.55307E+00 + 0.20944E+01 0.20944E+02 0.00000E+00 0.00000E+00 2 2.12216E-07 4.75552E+01 1.43220E-07 1.56600E-07 + 0.20944E+01 0.20944E+02 0.00000E+00 0.00000E+00 4 1.30327E-07 4.13042E+01 9.79034E-08 8.60228E-08 + 0.20944E+01 0.20944E+02 0.00000E+00 0.00000E+00 6 6.04640E-06 -2.40014E+01 5.52360E-06 -2.45942E-06 + 0.17952E+02 0.17952E+02 0.00000E+00 0.00000E+00 1 4.65232E-02 1.80000E+02 -4.65232E-02 0.00000E+00 + 0.17952E+02 0.17952E+02 0.00000E+00 0.00000E+00 3 7.65102E-01 0.00000E+00 7.65102E-01 0.00000E+00 + 0.17952E+02 0.17952E+02 0.00000E+00 0.00000E+00 5 4.74202E+00 1.80000E+02 -4.74202E+00 0.00000E+00 + 0.17952E+02 0.17952E+02 0.00000E+00 0.00000E+00 2 3.80490E-06 0.00000E+00 3.80490E-06 0.00000E+00 + 0.17952E+02 0.17952E+02 0.00000E+00 0.00000E+00 4 1.82663E-04 1.80000E+02 -1.82663E-04 0.00000E+00 + 0.17952E+02 0.17952E+02 0.00000E+00 0.00000E+00 6 4.65143E-05 0.00000E+00 4.65143E-05 0.00000E+00 + 0.15708E+02 0.17952E+02 0.00000E+00 0.00000E+00 1 9.03097E-02 -1.30270E+02 -5.83754E-02 -6.89069E-02 + 0.15708E+02 0.17952E+02 0.00000E+00 0.00000E+00 3 7.85631E-01 -3.40848E+00 7.84241E-01 -4.67090E-02 + 0.15708E+02 0.17952E+02 0.00000E+00 0.00000E+00 5 7.66750E+00 1.32954E+02 -5.22471E+00 5.61186E+00 + 0.15708E+02 0.17952E+02 0.00000E+00 0.00000E+00 2 1.05014E-05 4.53449E+00 1.04685E-05 8.30232E-07 + 0.15708E+02 0.17952E+02 0.00000E+00 0.00000E+00 4 1.37896E-04 1.77853E+02 -1.37799E-04 5.16635E-06 + 0.15708E+02 0.17952E+02 0.00000E+00 0.00000E+00 6 1.84594E-04 -1.79839E+02 -1.84594E-04 -5.18232E-07 + 0.13963E+02 0.17952E+02 0.00000E+00 0.00000E+00 1 4.49073E-01 -1.00871E+02 -8.46963E-02 -4.41014E-01 + 0.13963E+02 0.17952E+02 0.00000E+00 0.00000E+00 3 1.84264E+00 -5.00989E+00 1.83560E+00 -1.60914E-01 + 0.13963E+02 0.17952E+02 0.00000E+00 0.00000E+00 5 1.65282E+01 1.03744E+02 -3.92675E+00 1.60550E+01 + 0.13963E+02 0.17952E+02 0.00000E+00 0.00000E+00 2 7.72952E-06 1.74973E+02 -7.69980E-06 6.77251E-07 + 0.13963E+02 0.17952E+02 0.00000E+00 0.00000E+00 4 4.41996E-05 5.07603E+01 2.79592E-05 3.42329E-05 + 0.13963E+02 0.17952E+02 0.00000E+00 0.00000E+00 6 4.84972E-04 -1.74721E+02 -4.82916E-04 -4.46178E-05 + 0.12566E+02 0.17952E+02 0.00000E+00 0.00000E+00 1 1.29449E+00 -9.69152E+01 -1.55857E-01 -1.28507E+00 + 0.12566E+02 0.17952E+02 0.00000E+00 0.00000E+00 3 3.40707E+00 -6.83359E+00 3.38286E+00 -4.05394E-01 + 0.12566E+02 0.17952E+02 0.00000E+00 0.00000E+00 5 3.49511E+01 8.89109E+01 6.64305E-01 3.49448E+01 + 0.12566E+02 0.17952E+02 0.00000E+00 0.00000E+00 2 1.78099E-06 1.00356E+02 -3.20160E-07 1.75197E-06 + 0.12566E+02 0.17952E+02 0.00000E+00 0.00000E+00 4 1.40602E-04 2.41572E+01 1.28289E-04 5.75401E-05 + 0.12566E+02 0.17952E+02 0.00000E+00 0.00000E+00 6 2.48445E-04 -1.76616E+02 -2.48011E-04 -1.46644E-05 + 0.11424E+02 0.17952E+02 0.00000E+00 0.00000E+00 1 2.65409E+00 -9.76335E+01 -3.52556E-01 -2.63057E+00 + 0.11424E+02 0.17952E+02 0.00000E+00 0.00000E+00 3 5.49859E+00 -8.84134E+00 5.43326E+00 -8.45127E-01 + 0.11424E+02 0.17952E+02 0.00000E+00 0.00000E+00 5 6.72072E+01 8.11156E+01 1.03796E+01 6.64008E+01 + 0.11424E+02 0.17952E+02 0.00000E+00 0.00000E+00 2 1.42526E-05 -1.73260E+02 -1.41541E-05 -1.67269E-06 + 0.11424E+02 0.17952E+02 0.00000E+00 0.00000E+00 4 6.95581E-05 -1.42296E+02 -5.50328E-05 -4.25409E-05 + 0.11424E+02 0.17952E+02 0.00000E+00 0.00000E+00 6 1.44839E-04 -1.75443E+02 -1.44381E-04 -1.15086E-05 + 0.10472E+02 0.17952E+02 0.00000E+00 0.00000E+00 1 4.39926E+00 -1.00746E+02 -8.20268E-01 -4.32211E+00 + 0.10472E+02 0.17952E+02 0.00000E+00 0.00000E+00 3 7.92629E+00 -1.07311E+01 7.78767E+00 -1.47587E+00 + 0.10472E+02 0.17952E+02 0.00000E+00 0.00000E+00 5 1.16217E+02 7.66939E+01 2.67476E+01 1.13097E+02 + 0.10472E+02 0.17952E+02 0.00000E+00 0.00000E+00 2 6.80591E-06 -5.10481E+01 4.27866E-06 -5.29277E-06 + 0.10472E+02 0.17952E+02 0.00000E+00 0.00000E+00 4 1.15503E-04 4.47905E+01 8.19713E-05 8.13741E-05 + 0.10472E+02 0.17952E+02 0.00000E+00 0.00000E+00 6 2.01033E-04 -1.62011E+02 -1.91205E-04 -6.20853E-05 + 0.96664E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 6.27129E+00 -1.05973E+02 -1.72573E+00 -6.02917E+00 + 0.96664E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 1.03965E+01 -1.22145E+01 1.01611E+01 -2.19960E+00 + 0.96664E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 1.81600E+02 7.40675E+01 4.98502E+01 1.74624E+02 + 0.96664E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 6.84740E-06 -1.20664E+02 -3.49220E-06 -5.88995E-06 + 0.96664E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 6.88263E-05 7.07671E+01 2.26720E-05 6.49849E-05 + 0.96664E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 3.21635E-05 -1.52000E+02 -2.83988E-05 -1.50996E-05 + 0.89760E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 8.02107E+00 -1.14014E+02 -3.26421E+00 -7.32683E+00 + 0.89760E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 1.26832E+01 -1.37976E+01 1.23172E+01 -3.02484E+00 + 0.89760E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 2.59800E+02 7.22419E+01 7.92389E+01 2.47421E+02 + 0.89760E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 6.90562E-06 -6.72930E+01 2.66570E-06 -6.37037E-06 + 0.89760E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 5.37905E-05 1.04112E+02 -1.31153E-05 5.21671E-05 + 0.89760E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 1.42215E-04 1.25406E+02 -8.23954E-05 1.15915E-04 + 0.83776E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 9.48060E+00 -1.26651E+02 -5.65939E+00 -7.60612E+00 + 0.83776E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 1.44642E+01 -1.71457E+01 1.38214E+01 -4.26408E+00 + 0.83776E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 3.40984E+02 6.98994E+01 1.17186E+02 3.20214E+02 + 0.83776E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 5.02402E-06 5.52644E+01 2.86264E-06 4.12869E-06 + 0.83776E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 1.65705E-04 -3.25197E+00 1.65438E-04 -9.39996E-06 + 0.83776E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 2.74876E-04 -7.51645E+01 7.03807E-05 -2.65713E-04 + 0.78540E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 1.05975E+01 -1.43963E+02 -8.56948E+00 -6.23466E+00 + 0.78540E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 1.50440E+01 -2.32235E+01 1.38251E+01 -5.93214E+00 + 0.78540E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 4.00475E+02 6.69076E+01 1.57072E+02 3.68386E+02 + 0.78540E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 3.76616E-06 1.16343E+02 -1.67121E-06 3.37506E-06 + 0.78540E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 2.01558E-06 -6.08126E+00 2.00423E-06 -2.13528E-07 + 0.78540E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 1.83017E-04 7.94045E+01 3.36522E-05 1.79897E-04 + 0.73920E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 1.18893E+01 -1.61673E+02 -1.12862E+01 -3.73849E+00 + 0.73920E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 1.43164E+01 -3.11452E+01 1.22529E+01 -7.40458E+00 + 0.73920E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 4.19875E+02 6.56080E+01 1.73399E+02 3.82398E+02 + 0.73920E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 5.00585E-06 3.18028E+01 4.25431E-06 2.63807E-06 + 0.73920E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 6.94980E-06 -1.65807E+02 -6.73766E-06 -1.70399E-06 + 0.73920E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 1.16958E-04 -9.01838E+01 -3.75131E-07 -1.16958E-04 + 0.69813E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 1.40551E+01 -1.75059E+02 -1.40029E+01 -1.21051E+00 + 0.69813E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 1.35093E+01 -4.18265E+01 1.00667E+01 -9.00904E+00 + 0.69813E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 4.16263E+02 6.77747E+01 1.57452E+02 3.85336E+02 + 0.69813E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 1.44927E-06 -1.79347E+02 -1.44917E-06 -1.65071E-08 + 0.69813E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 4.26520E-05 2.24373E-01 4.26517E-05 1.67027E-07 + 0.69813E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 4.57267E-05 1.54924E+02 -4.14170E-05 1.93796E-05 + 0.66139E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 1.70977E+01 1.75959E+02 -1.70552E+01 1.20493E+00 + 0.66139E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 1.41244E+01 -6.21563E+01 6.59698E+00 -1.24892E+01 + 0.66139E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 4.39104E+02 6.93261E+01 1.55025E+02 4.10828E+02 + 0.66139E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 2.98756E-06 5.03350E+01 1.90695E-06 2.29979E-06 + 0.66139E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 3.75271E-05 -1.25774E+02 -2.19381E-05 -3.04467E-05 + 0.66139E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 1.10736E-04 1.52276E+02 -9.80239E-05 5.15150E-05 + 0.62832E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 1.88256E+01 1.68044E+02 -1.84172E+01 3.89978E+00 + 0.62832E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 1.39383E+01 -9.21386E+01 -5.20134E-01 -1.39286E+01 + 0.62832E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 4.30437E+02 5.79722E+01 2.28274E+02 3.64921E+02 + 0.62832E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 3.39262E-06 -1.06286E+02 -9.51379E-07 -3.25650E-06 + 0.62832E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 2.32748E-05 -1.34906E+02 -1.64307E-05 -1.64848E-05 + 0.62832E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 2.03594E-04 2.95521E+01 1.77108E-04 1.00416E-04 + 0.59840E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 1.75407E+01 1.66584E+02 -1.70620E+01 4.06988E+00 + 0.59840E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 1.27524E+01 -1.09194E+02 -4.19263E+00 -1.20434E+01 + 0.59840E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 3.36307E+02 4.61140E+01 2.33137E+02 2.42384E+02 + 0.59840E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 5.75804E-06 -1.79209E+02 -5.75749E-06 -7.94938E-08 + 0.59840E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 3.80868E-05 -6.08869E+01 1.85306E-05 -3.32750E-05 + 0.59840E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 2.23929E-05 8.14274E+01 3.33795E-06 2.21427E-05 + 0.57120E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 1.50919E+01 1.66696E+02 -1.46869E+01 3.47293E+00 + 0.57120E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 1.24972E+01 -1.11115E+02 -4.50193E+00 -1.16582E+01 + 0.57120E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 2.68967E+02 3.81945E+01 2.11385E+02 1.66311E+02 + 0.57120E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 1.44232E-06 -1.11434E+02 -5.27056E-07 -1.34257E-06 + 0.57120E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 2.37611E-05 6.76811E+01 9.02356E-06 2.19811E-05 + 0.57120E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 5.96140E-05 -6.94595E+00 5.91765E-05 -7.20930E-06 + 0.54636E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 8.71588E+00 1.53739E+02 -7.81630E+00 3.85642E+00 + 0.54636E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 1.34840E+01 -1.09948E+02 -4.60023E+00 -1.26750E+01 + 0.54636E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 2.40375E+02 1.56983E+01 2.31409E+02 6.50387E+01 + 0.54636E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 4.77959E-06 -1.72834E+02 -4.74226E-06 -5.96226E-07 + 0.54636E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 8.16096E-05 9.15554E+01 -2.21510E-06 8.15795E-05 + 0.54636E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 1.91118E-04 -9.93010E+01 -3.08885E-05 -1.88605E-04 + 0.52360E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 2.68930E+00 6.79612E+01 1.00912E+00 2.49280E+00 + 0.52360E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 1.36417E+01 -1.10242E+02 -4.71986E+00 -1.27991E+01 + 0.52360E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 1.95309E+02 -1.88714E+01 1.84810E+02 -6.31717E+01 + 0.52360E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 1.53947E-06 8.97427E+00 1.52062E-06 2.40142E-07 + 0.52360E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 3.87569E-05 5.40544E+01 2.27510E-05 3.13766E-05 + 0.52360E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 2.72924E-04 4.74602E+01 1.84525E-04 2.01093E-04 + 0.50265E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 9.07079E+00 2.11825E+01 8.45792E+00 3.27763E+00 + 0.50265E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 1.37136E+01 -1.08835E+02 -4.42742E+00 -1.29793E+01 + 0.50265E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 1.64167E+02 -5.03572E+01 1.04738E+02 -1.26414E+02 + 0.50265E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 1.60146E-06 -2.61129E+01 1.43800E-06 -7.04869E-07 + 0.50265E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 1.61996E-05 -6.04861E+01 7.98049E-06 -1.40975E-05 + 0.50265E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 1.37847E-04 -4.51745E-01 1.37842E-04 -1.08683E-06 + 0.48332E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 1.50006E+01 1.08909E+01 1.47304E+01 2.83420E+00 + 0.48332E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 1.57399E+01 -1.30868E+02 -1.02988E+01 -1.19029E+01 + 0.48332E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 1.39115E+02 -6.21414E+01 6.50073E+01 -1.22992E+02 + 0.48332E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 1.28753E-06 1.29918E+02 -8.26195E-07 9.87485E-07 + 0.48332E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 1.88556E-05 -4.65945E+01 1.29568E-05 -1.36988E-05 + 0.48332E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 4.06473E-05 -1.16465E+02 -1.81144E-05 -3.63878E-05 + 0.46542E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 1.57429E+01 1.73055E+01 1.50302E+01 4.68299E+00 + 0.46542E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 9.33618E+00 -1.75208E+02 -9.30355E+00 -7.79866E-01 + 0.46542E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 1.16387E+02 -6.37511E+01 5.14748E+01 -1.04386E+02 + 0.46542E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 1.22345E-06 1.61393E+01 1.17524E-06 3.40089E-07 + 0.46542E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 1.73425E-05 -1.76750E+02 -1.73146E-05 -9.83158E-07 + 0.46542E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 1.65173E-04 7.71125E+01 3.68399E-05 1.61013E-04 + 0.44880E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 1.52718E+01 -1.17998E+00 1.52686E+01 -3.14495E-01 + 0.44880E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 4.18946E+00 1.41770E+02 -3.29095E+00 2.59253E+00 + 0.44880E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 7.41705E+01 -2.08282E+01 6.93235E+01 -2.63726E+01 + 0.44880E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 7.90033E-07 5.93745E+01 4.02462E-07 6.79836E-07 + 0.44880E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 6.14948E-06 -1.60359E+02 -5.79169E-06 -2.06701E-06 + 0.44880E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 8.35633E-05 -1.74713E+02 -8.32078E-05 -7.69925E-06 + 0.43332E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 1.40360E+01 -7.19392E+01 4.35152E+00 -1.33444E+01 + 0.43332E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 2.30864E+00 1.20576E+02 -1.17434E+00 1.98764E+00 + 0.43332E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 1.31981E+02 1.69148E+01 1.26271E+02 3.83996E+01 + 0.43332E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 1.58196E-06 -9.95121E+01 -2.61429E-07 -1.56021E-06 + 0.43332E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 2.04994E-05 1.27715E+01 1.99922E-05 4.53168E-06 + 0.43332E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 2.15569E-04 1.17820E+02 -1.00605E-04 1.90653E-04 + 0.41888E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 2.00500E+01 -1.17520E+02 -9.26430E+00 -1.77813E+01 + 0.41888E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 2.73257E+00 1.28046E+02 -1.68407E+00 2.15195E+00 + 0.41888E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 1.37349E+02 2.93766E+01 1.19688E+02 6.73766E+01 + 0.41888E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 3.22487E-06 1.52027E+02 -2.84810E-06 1.51264E-06 + 0.41888E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 7.17876E-06 6.98027E+01 2.47849E-06 6.73734E-06 + 0.41888E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 2.96087E-05 -8.05045E+01 4.88456E-06 -2.92030E-05 + 0.40537E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 2.33133E+01 -1.20701E+02 -1.19027E+01 -2.00458E+01 + 0.40537E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 2.97543E+00 1.13618E+02 -1.19207E+00 2.72619E+00 + 0.40537E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 1.21043E+02 6.62577E+01 4.87348E+01 1.10798E+02 + 0.40537E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 1.99611E-06 -1.00466E+02 -3.62614E-07 -1.96290E-06 + 0.40537E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 2.60352E-06 -6.21575E+01 1.21596E-06 -2.30213E-06 + 0.40537E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 1.37155E-04 3.38088E+01 1.13962E-04 7.63161E-05 + 0.39270E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 2.30749E+01 -1.20437E+02 -1.16895E+01 -1.98950E+01 + 0.39270E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 2.20878E+00 1.37885E+02 -1.63846E+00 1.48127E+00 + 0.39270E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 1.30754E+02 7.94442E+01 2.39532E+01 1.28541E+02 + 0.39270E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 1.08413E-06 -9.19014E+01 -3.59707E-08 -1.08354E-06 + 0.39270E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 3.10561E-06 6.33121E+00 3.08667E-06 3.42473E-07 + 0.39270E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 7.86464E-05 4.09765E+01 5.93764E-05 5.15724E-05 + 0.38080E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 1.47782E+01 -1.23228E+02 -8.09799E+00 -1.23620E+01 + 0.38080E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 2.18615E+00 1.28026E+02 -1.34672E+00 1.72209E+00 + 0.38080E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 6.73769E+01 8.86292E+01 1.61187E+00 6.73576E+01 + 0.38080E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 8.76062E-07 3.03438E+01 7.56050E-07 4.42575E-07 + 0.38080E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 5.18161E-06 -3.87899E+01 4.03880E-06 -3.24610E-06 + 0.38080E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 1.70623E-04 2.65457E+00 1.70440E-04 7.90229E-06 + 0.36960E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 7.84244E+00 -1.37159E+02 -5.75043E+00 -5.33257E+00 + 0.36960E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 1.01842E+00 1.37391E+02 -7.49552E-01 6.89455E-01 + 0.36960E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 1.05483E+01 1.56205E+01 1.01587E+01 2.84029E+00 + 0.36960E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 1.50114E-07 -9.09079E+00 1.48228E-07 -2.37178E-08 + 0.36960E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 1.97713E-06 -9.69428E+01 -2.38993E-07 -1.96264E-06 + 0.36960E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 1.39206E-04 1.63941E+01 1.33546E-04 3.92899E-05 + 0.35904E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 1.22747E+01 -1.49799E+02 -1.06086E+01 -6.17464E+00 + 0.35904E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 6.33565E-01 1.26708E+02 -3.78709E-01 5.07922E-01 + 0.35904E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 6.37193E+01 -2.15722E+01 5.92560E+01 -2.34279E+01 + 0.35904E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 7.56370E-07 -1.34357E+02 -5.28802E-07 -5.40800E-07 + 0.35904E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 2.00256E-06 8.71132E+01 1.00856E-07 2.00002E-06 + 0.35904E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 4.83517E-05 8.00397E+01 8.36320E-06 4.76229E-05 + 0.34907E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 3.00891E+01 1.57077E+02 -2.77129E+01 1.17197E+01 + 0.34907E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 4.51444E-01 2.40865E+01 4.12137E-01 1.84241E-01 + 0.34907E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 1.60766E+02 -3.67277E+01 1.28851E+02 -9.61400E+01 + 0.34907E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 9.05269E-07 -1.07449E+02 -2.71456E-07 -8.63610E-07 + 0.34907E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 2.72449E-06 4.69444E+01 1.86003E-06 1.99076E-06 + 0.34907E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 7.82447E-05 -2.55463E+01 7.05952E-05 -3.37422E-05 + 0.33963E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 1.72325E+01 1.36029E+02 -1.24021E+01 1.19645E+01 + 0.33963E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 6.63327E-01 6.54391E+00 6.59005E-01 7.55958E-02 + 0.33963E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 9.41105E+01 -3.64299E+01 7.57198E+01 -5.58864E+01 + 0.33963E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 1.42661E-06 1.12175E+00 1.42634E-06 2.79288E-08 + 0.33963E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 4.12874E-06 -2.22231E+01 3.82205E-06 -1.56155E-06 + 0.33963E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 1.30412E-05 -5.89049E+01 6.73527E-06 -1.11673E-05 + 0.33069E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 6.70353E+00 1.25199E+02 -3.86408E+00 5.47780E+00 + 0.33069E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 1.47401E-01 -7.30746E+01 4.29122E-02 -1.41016E-01 + 0.33069E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 4.69148E+01 -2.65799E+01 4.19564E+01 -2.09918E+01 + 0.33069E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 1.02724E-06 1.68740E+02 -1.00746E-06 2.00578E-07 + 0.33069E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 3.35297E-06 -1.67341E+02 -3.27146E-06 -7.34823E-07 + 0.33069E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 1.60027E-04 9.09095E+01 -2.54014E-06 1.60007E-04 + 0.32221E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 2.22570E+00 5.25796E+01 1.35247E+00 1.76764E+00 + 0.32221E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 7.31813E-01 1.04710E+02 -1.85833E-01 7.07825E-01 + 0.32221E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 1.98576E+01 -1.18690E+02 -9.53316E+00 -1.74196E+01 + 0.32221E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 1.49328E-06 -1.18717E+02 -7.17493E-07 -1.30961E-06 + 0.32221E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 2.93798E-06 -5.27550E+01 1.77814E-06 -2.33879E-06 + 0.32221E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 1.22435E-05 1.28817E+02 -7.67462E-06 9.53961E-06 + 0.31416E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 1.29782E+01 7.01139E+01 4.41456E+00 1.22044E+01 + 0.31416E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 8.31602E-01 1.14820E+02 -3.49083E-01 7.54787E-01 + 0.31416E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 6.49729E+01 -1.35075E+02 -4.60031E+01 -4.58823E+01 + 0.31416E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 4.27962E-07 7.28457E+00 4.24508E-07 5.42645E-08 + 0.31416E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 1.03098E-06 5.75476E+00 1.02579E-06 1.03377E-07 + 0.31416E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 2.18920E-05 8.83785E+01 6.19476E-07 2.18832E-05 + 0.30650E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 6.70200E+00 2.04003E+01 6.28165E+00 2.33617E+00 + 0.30650E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 3.98161E-01 1.03352E+02 -9.19454E-02 3.87399E-01 + 0.30650E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 4.12617E+01 -1.53107E+02 -3.67993E+01 -1.86637E+01 + 0.30650E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 2.91378E-07 6.95026E+01 1.02030E-07 2.72930E-07 + 0.30650E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 1.59845E-06 8.29413E+01 1.96427E-07 1.58634E-06 + 0.30650E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 1.76770E-05 -1.12378E+02 -6.72998E-06 -1.63457E-05 + 0.29920E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 4.37034E-01 -2.42628E-02 4.37034E-01 -1.85069E-04 + 0.29920E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 2.39515E-02 -1.41011E+02 -1.86166E-02 -1.50696E-02 + 0.29920E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 1.32999E+01 -1.62445E+02 -1.26805E+01 -4.01143E+00 + 0.29920E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 1.42540E-07 1.30285E+02 -9.21654E-08 1.08734E-07 + 0.29920E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 2.13698E-06 1.60812E+02 -2.01826E-06 7.02363E-07 + 0.29920E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 6.16673E-05 1.67228E+02 -6.01415E-05 1.36330E-05 + 0.29224E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 7.89156E+00 -6.95730E+01 2.75427E+00 -7.39532E+00 + 0.29224E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 8.95297E-02 -1.19528E+02 -4.41242E-02 -7.79014E-02 + 0.29224E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 2.95440E+01 1.11823E+02 -1.09827E+01 2.74268E+01 + 0.29224E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 1.41019E-06 1.75423E+02 -1.40569E-06 1.12528E-07 + 0.29224E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 2.30404E-06 5.51542E+01 1.31646E-06 1.89091E-06 + 0.29224E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 4.34703E-05 -1.59643E+02 -4.07553E-05 -1.51218E-05 + 0.28560E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 1.21961E+01 -4.73676E+01 8.26031E+00 -8.97283E+00 + 0.28560E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 5.78497E-02 5.02947E+01 3.69566E-02 4.45061E-02 + 0.28560E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 4.26309E+01 1.34011E+02 -2.96196E+01 3.06606E+01 + 0.28560E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 5.33497E-07 -5.60873E+01 2.97653E-07 -4.42743E-07 + 0.28560E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 2.83763E-06 1.73046E+02 -2.81675E-06 3.43562E-07 + 0.28560E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 2.62832E-05 -1.66414E+02 -2.55478E-05 -6.17383E-06 + 0.27925E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 1.18609E+01 -5.71164E+01 6.43969E+00 -9.96050E+00 + 0.27925E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 1.85951E-01 1.75452E+02 -1.85366E-01 1.47436E-02 + 0.27925E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 4.00055E+01 1.29768E+02 -2.55908E+01 3.07498E+01 + 0.27925E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 3.79627E-07 7.08592E+01 1.24476E-07 3.58640E-07 + 0.27925E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 8.11504E-07 -1.45323E+02 -6.67359E-07 -4.61703E-07 + 0.27925E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 6.90859E-06 -1.28615E+02 -4.31157E-06 -5.39806E-06 + 0.27318E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 1.35440E+01 -9.66634E+01 -1.57160E+00 -1.34525E+01 + 0.27318E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 3.37046E-01 1.46264E+02 -2.80290E-01 1.87184E-01 + 0.27318E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 3.98284E+01 8.35591E+01 4.46791E+00 3.95770E+01 + 0.27318E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 2.25321E-07 5.59930E+01 1.26021E-07 1.86784E-07 + 0.27318E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 1.21494E-07 3.53613E+00 1.21263E-07 7.49348E-09 + 0.27318E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 3.80531E-05 9.39805E+01 -2.64153E-06 3.79613E-05 + 0.26737E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 1.23243E+01 -1.13587E+02 -4.93142E+00 -1.12947E+01 + 0.26737E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 3.06857E-01 1.30356E+02 -1.98700E-01 2.33836E-01 + 0.26737E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 3.56722E+01 6.59244E+01 1.45522E+01 3.25690E+01 + 0.26737E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 2.88114E-07 -4.17297E-01 2.88107E-07 -2.09838E-09 + 0.26737E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 1.26985E-06 1.10470E+02 -4.44098E-07 1.18967E-06 + 0.26737E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 3.89602E-05 -1.58910E+02 -3.63506E-05 -1.40190E-05 + 0.26180E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 1.35030E+01 -1.12526E+02 -5.17295E+00 -1.24728E+01 + 0.26180E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 2.48600E-01 1.18947E+02 -1.20324E-01 2.17541E-01 + 0.26180E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 4.14541E+01 7.09550E+01 1.35269E+01 3.91850E+01 + 0.26180E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 1.98833E-07 2.87898E+01 1.74256E-07 9.57576E-08 + 0.26180E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 3.16764E-07 -9.53142E+01 -2.93379E-08 -3.15403E-07 + 0.26180E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 3.15885E-05 -1.61841E+02 -3.00152E-05 -9.84463E-06 + 0.25646E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 1.10698E+01 -1.19338E+02 -5.42380E+00 -9.65006E+00 + 0.25646E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 3.85163E-01 8.41124E+01 3.95089E-02 3.83131E-01 + 0.25646E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 2.71048E+01 5.92502E+01 1.38584E+01 2.32941E+01 + 0.25646E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 2.08788E-07 -1.58080E+02 -1.93694E-07 -7.79434E-08 + 0.25646E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 1.52891E-06 3.31128E+01 1.28061E-06 8.35228E-07 + 0.25646E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 4.37430E-05 1.49513E+02 -3.76953E-05 2.21927E-05 + 0.25133E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 2.88121E+00 1.75106E+02 -2.87070E+00 2.45815E-01 + 0.25133E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 2.56121E-01 5.87142E+01 1.33006E-01 2.18878E-01 + 0.25133E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 7.97621E+00 4.36279E-01 7.97598E+00 6.07343E-02 + 0.25133E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 1.15369E-07 2.51623E+01 1.04422E-07 4.90533E-08 + 0.25133E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 2.14060E-07 -1.47072E+02 -1.79672E-07 -1.16359E-07 + 0.25133E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 3.43452E-05 1.54733E+02 -3.10593E-05 1.46599E-05 + 0.24640E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 5.10923E+00 -1.79511E+02 -5.10905E+00 -4.36307E-02 + 0.24640E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 1.48191E-01 8.25829E+01 1.91303E-02 1.46951E-01 + 0.24640E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 2.10072E+01 -1.11990E+01 2.06072E+01 -4.07997E+00 + 0.24640E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 5.48249E-07 9.31543E+01 -3.01671E-08 5.47418E-07 + 0.24640E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 3.41811E-07 -1.78234E+02 -3.41648E-07 -1.05361E-08 + 0.24640E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 8.99880E-06 9.22435E+01 -3.52272E-07 8.99190E-06 + 0.24166E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 4.08677E+00 -1.75922E+02 -4.07642E+00 -2.90656E-01 + 0.24166E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 1.14696E-01 4.16994E+00 1.14392E-01 8.34011E-03 + 0.24166E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 1.44280E+01 -4.05111E+01 1.09693E+01 -9.37235E+00 + 0.24166E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 3.59203E-07 -1.05495E+02 -9.59610E-08 -3.46148E-07 + 0.24166E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 3.56727E-07 -1.63855E+02 -3.42657E-07 -9.91974E-08 + 0.24166E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 1.46125E-05 -1.14898E+02 -6.15184E-06 -1.32544E-05 + 0.23710E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 9.26902E+00 3.11256E+01 7.93462E+00 4.79130E+00 + 0.23710E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 1.45176E-01 -4.00417E+01 1.11143E-01 -9.33980E-02 + 0.23710E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 2.66231E+01 -1.39169E+02 -2.01442E+01 -1.74069E+01 + 0.23710E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 3.63248E-07 -1.16485E+02 -1.61997E-07 -3.25124E-07 + 0.23710E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 3.42090E-07 -1.55551E+02 -3.11414E-07 -1.41587E-07 + 0.23710E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 6.98036E-06 -9.55752E+01 -6.78155E-07 -6.94734E-06 + 0.23271E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 9.54848E+00 4.45995E+01 6.79882E+00 6.70444E+00 + 0.23271E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 1.30744E-01 -2.41422E+00 1.30628E-01 -5.50741E-03 + 0.23271E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 3.09637E+01 -1.27274E+02 -1.87524E+01 -2.46394E+01 + 0.23271E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 2.72206E-07 4.23852E+01 2.01060E-07 1.83497E-07 + 0.23271E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 5.25009E-07 -1.37782E+01 5.09902E-07 -1.25038E-07 + 0.23271E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 1.65900E-05 -1.26081E+02 -9.77029E-06 -1.34078E-05 + 0.22848E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 7.86717E+00 4.88820E+01 5.17355E+00 5.92679E+00 + 0.22848E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 5.47978E-02 -1.47692E+02 -4.63147E-02 -2.92874E-02 + 0.22848E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 2.30548E+01 -1.43431E+02 -1.85161E+01 -1.37359E+01 + 0.22848E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 1.01944E-07 -1.71453E+02 -1.00812E-07 -1.51505E-08 + 0.22848E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 1.55581E-07 -1.09974E+02 -5.31464E-08 -1.46222E-07 + 0.22848E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 1.00979E-04 -1.76094E+02 -1.00744E-04 -6.87891E-06 + 0.22440E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 1.17637E+01 -7.56822E+00 1.16613E+01 -1.54936E+00 + 0.22440E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 1.28158E-01 -1.73437E+02 -1.27318E-01 -1.46475E-02 + 0.22440E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 2.87013E+01 1.73412E+02 -2.85118E+01 3.29307E+00 + 0.22440E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 2.67555E-07 7.13431E+01 8.55909E-08 2.53495E-07 + 0.22440E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 5.00671E-07 1.57819E+00 5.00481E-07 1.37890E-08 + 0.22440E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 2.61239E-05 1.68757E+01 2.49989E-05 7.58367E-06 + 0.22046E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 1.04237E+01 -1.39674E+01 1.01155E+01 -2.51598E+00 + 0.22046E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 1.50738E-01 -1.21338E+02 -7.83963E-02 -1.28748E-01 + 0.22046E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 2.73289E+01 1.72687E+02 -2.71066E+01 3.47888E+00 + 0.22046E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 3.52775E-07 -1.08266E+02 -1.10571E-07 -3.34999E-07 + 0.22046E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 8.00094E-08 -1.72054E+00 7.99733E-08 -2.40224E-09 + 0.22046E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 2.37247E-05 2.33528E+01 2.17812E-05 9.40427E-06 + 0.21666E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 3.23951E+00 -4.24443E+00 3.23063E+00 -2.39761E-01 + 0.21666E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 1.00819E-01 -1.70087E+01 9.64089E-02 -2.94912E-02 + 0.21666E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 9.94740E-01 1.40169E+02 -7.63897E-01 6.37158E-01 + 0.21666E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 1.15664E-07 1.68143E+02 -1.13196E-07 2.37657E-08 + 0.21666E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 1.40807E-07 5.02090E+01 9.01148E-08 1.08194E-07 + 0.21666E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 2.28088E-05 1.31730E+02 -1.51819E-05 1.70221E-05 + 0.21299E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 9.10205E+00 -1.31283E+02 -6.00536E+00 -6.83980E+00 + 0.21299E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 1.44375E-01 1.59016E+01 1.38850E-01 3.95566E-02 + 0.21299E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 1.70476E+01 3.93142E+01 1.31894E+01 1.08009E+01 + 0.21299E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 2.42429E-07 -6.27158E+01 1.11130E-07 -2.15457E-07 + 0.21299E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 1.04253E-07 8.40489E+01 1.08089E-08 1.03691E-07 + 0.21299E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 1.94987E-05 -6.22964E+01 9.06490E-06 -1.72635E-05 + 0.20944E+01 0.17952E+02 0.00000E+00 0.00000E+00 1 1.35339E+00 -1.60636E+02 -1.27683E+00 -4.48740E-01 + 0.20944E+01 0.17952E+02 0.00000E+00 0.00000E+00 3 1.86287E-01 7.74704E+01 4.04139E-02 1.81850E-01 + 0.20944E+01 0.17952E+02 0.00000E+00 0.00000E+00 5 3.07688E+00 8.23803E+01 4.07985E-01 3.04971E+00 + 0.20944E+01 0.17952E+02 0.00000E+00 0.00000E+00 2 9.30991E-08 -6.92723E+01 3.29503E-08 -8.70731E-08 + 0.20944E+01 0.17952E+02 0.00000E+00 0.00000E+00 4 4.55057E-08 3.64422E+01 3.66074E-08 2.70309E-08 + 0.20944E+01 0.17952E+02 0.00000E+00 0.00000E+00 6 1.92981E-05 -1.72674E+02 -1.91406E-05 -2.46085E-06 + 0.15708E+02 0.15708E+02 0.00000E+00 0.00000E+00 1 6.06971E-02 1.80000E+02 -6.06971E-02 0.00000E+00 + 0.15708E+02 0.15708E+02 0.00000E+00 0.00000E+00 3 2.00854E+00 0.00000E+00 2.00854E+00 0.00000E+00 + 0.15708E+02 0.15708E+02 0.00000E+00 0.00000E+00 5 7.19833E+00 1.80000E+02 -7.19833E+00 0.00000E+00 + 0.15708E+02 0.15708E+02 0.00000E+00 0.00000E+00 2 2.46735E-06 1.80000E+02 -2.46735E-06 0.00000E+00 + 0.15708E+02 0.15708E+02 0.00000E+00 0.00000E+00 4 1.18106E-04 1.80000E+02 -1.18106E-04 0.00000E+00 + 0.15708E+02 0.15708E+02 0.00000E+00 0.00000E+00 6 3.16398E-04 1.80000E+02 -3.16398E-04 0.00000E+00 + 0.13963E+02 0.15708E+02 0.00000E+00 0.00000E+00 1 2.15503E-01 -1.06681E+02 -6.18575E-02 -2.06434E-01 + 0.13963E+02 0.15708E+02 0.00000E+00 0.00000E+00 3 2.31122E+00 -3.02134E+00 2.30801E+00 -1.21820E-01 + 0.13963E+02 0.15708E+02 0.00000E+00 0.00000E+00 5 1.24361E+01 1.30019E+02 -7.99691E+00 9.52393E+00 + 0.13963E+02 0.15708E+02 0.00000E+00 0.00000E+00 2 7.30454E-06 -8.11542E+00 7.23139E-06 -1.03116E-06 + 0.13963E+02 0.15708E+02 0.00000E+00 0.00000E+00 4 3.21064E-05 -1.76196E+02 -3.20357E-05 -2.13028E-06 + 0.13963E+02 0.15708E+02 0.00000E+00 0.00000E+00 6 2.93780E-04 2.81658E+00 2.93425E-04 1.44360E-05 + 0.12566E+02 0.15708E+02 0.00000E+00 0.00000E+00 1 7.95503E-01 -9.51231E+01 -7.10349E-02 -7.92325E-01 + 0.12566E+02 0.15708E+02 0.00000E+00 0.00000E+00 3 3.62445E+00 -5.90431E+00 3.60523E+00 -3.72838E-01 + 0.12566E+02 0.15708E+02 0.00000E+00 0.00000E+00 5 2.68934E+01 1.03752E+02 -6.39331E+00 2.61225E+01 + 0.12566E+02 0.15708E+02 0.00000E+00 0.00000E+00 2 1.80399E-07 -8.71130E+00 1.78318E-07 -2.73225E-08 + 0.12566E+02 0.15708E+02 0.00000E+00 0.00000E+00 4 6.01084E-06 4.91506E+01 3.93153E-06 4.54679E-06 + 0.12566E+02 0.15708E+02 0.00000E+00 0.00000E+00 6 6.58473E-05 1.26181E+02 -3.88720E-05 5.31491E-05 + 0.11424E+02 0.15708E+02 0.00000E+00 0.00000E+00 1 1.93172E+00 -9.43669E+01 -1.47086E-01 -1.92612E+00 + 0.11424E+02 0.15708E+02 0.00000E+00 0.00000E+00 3 5.41272E+00 -8.54530E+00 5.35263E+00 -8.04282E-01 + 0.11424E+02 0.15708E+02 0.00000E+00 0.00000E+00 5 5.39057E+01 9.02516E+01 -2.36705E-01 5.39052E+01 + 0.11424E+02 0.15708E+02 0.00000E+00 0.00000E+00 2 3.51192E-06 1.60972E+02 -3.32003E-06 1.14498E-06 + 0.11424E+02 0.15708E+02 0.00000E+00 0.00000E+00 4 3.17063E-05 1.47135E+02 -2.66319E-05 1.72056E-05 + 0.11424E+02 0.15708E+02 0.00000E+00 0.00000E+00 6 2.72849E-04 1.54362E+02 -2.45985E-04 1.18057E-04 + 0.10472E+02 0.15708E+02 0.00000E+00 0.00000E+00 1 3.58358E+00 -9.69242E+01 -4.32020E-01 -3.55744E+00 + 0.10472E+02 0.15708E+02 0.00000E+00 0.00000E+00 3 7.59402E+00 -1.05872E+01 7.46474E+00 -1.39526E+00 + 0.10472E+02 0.15708E+02 0.00000E+00 0.00000E+00 5 9.71610E+01 8.24376E+01 1.27869E+01 9.63159E+01 + 0.10472E+02 0.15708E+02 0.00000E+00 0.00000E+00 2 1.18041E-05 8.90036E-01 1.18027E-05 1.83358E-07 + 0.10472E+02 0.15708E+02 0.00000E+00 0.00000E+00 4 6.32746E-05 -1.07051E+02 -1.85536E-05 -6.04933E-05 + 0.10472E+02 0.15708E+02 0.00000E+00 0.00000E+00 6 8.73215E-05 -1.24806E+02 -4.98426E-05 -7.16991E-05 + 0.96664E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 5.51572E+00 -1.01716E+02 -1.12007E+00 -5.40080E+00 + 0.96664E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 9.95784E+00 -1.18550E+01 9.74545E+00 -2.04569E+00 + 0.96664E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 1.57780E+02 7.76932E+01 3.36301E+01 1.54154E+02 + 0.96664E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 2.51569E-06 -1.17400E+02 -1.15774E-06 -2.23346E-06 + 0.96664E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 2.38763E-04 2.77869E+00 2.38482E-04 1.15748E-05 + 0.96664E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 1.75517E-04 1.29463E+02 -1.11556E-04 1.35505E-04 + 0.89760E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 7.40911E+00 -1.09115E+02 -2.42626E+00 -7.00058E+00 + 0.89760E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 1.22985E+01 -1.29323E+01 1.19865E+01 -2.75240E+00 + 0.89760E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 2.33455E+02 7.45365E+01 6.22449E+01 2.25004E+02 + 0.89760E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 5.44842E-06 1.28169E+02 -3.36706E-06 4.28348E-06 + 0.89760E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 1.96829E-04 -1.77315E+02 -1.96613E-04 -9.21979E-06 + 0.89760E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 1.92162E-04 1.09476E+02 -6.40691E-05 1.81167E-04 + 0.83776E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 8.93457E+00 -1.20674E+02 -4.55799E+00 -7.68449E+00 + 0.83776E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 1.42813E+01 -1.53559E+01 1.37715E+01 -3.78189E+00 + 0.83776E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 3.15225E+02 7.14435E+01 1.00317E+02 2.98837E+02 + 0.83776E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 7.12059E-06 1.02627E+02 -1.55658E-06 6.94837E-06 + 0.83776E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 2.01882E-04 1.80667E+01 1.91928E-04 6.26083E-05 + 0.83776E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 1.42432E-04 4.59147E+01 9.90942E-05 1.02310E-04 + 0.78540E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 9.85651E+00 -1.36817E+02 -7.18714E+00 -6.74506E+00 + 0.78540E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 1.51924E+01 -1.98740E+01 1.42875E+01 -5.16469E+00 + 0.78540E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 3.79501E+02 6.82214E+01 1.40803E+02 3.52414E+02 + 0.78540E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 2.67691E-06 -2.82285E+01 2.35854E-06 -1.26615E-06 + 0.78540E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 1.20398E-04 1.33596E+02 -8.30221E-05 8.71953E-05 + 0.78540E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 3.83864E-04 -1.62258E+02 -3.65606E-04 -1.16977E-04 + 0.73920E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 1.06756E+01 -1.54488E+02 -9.63466E+00 -4.59796E+00 + 0.73920E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 1.48485E+01 -2.54901E+01 1.34032E+01 -6.39012E+00 + 0.73920E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 4.07622E+02 6.71046E+01 1.58586E+02 3.75508E+02 + 0.73920E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 3.88850E-06 -1.70753E+02 -3.83797E-06 -6.24851E-07 + 0.73920E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 5.06710E-05 -1.58752E+02 -4.72265E-05 -1.83633E-05 + 0.73920E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 1.61512E-04 -6.93287E+01 5.70148E-05 -1.51114E-04 + 0.69813E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 1.23072E+01 -1.69147E+02 -1.20870E+01 -2.31737E+00 + 0.69813E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 1.43035E+01 -3.33887E+01 1.19428E+01 -7.87147E+00 + 0.69813E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 4.13634E+02 6.95659E+01 1.44412E+02 3.87606E+02 + 0.69813E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 3.20461E-06 2.33753E+01 2.94160E-06 1.27144E-06 + 0.69813E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 1.04108E-04 1.23115E+01 1.01714E-04 2.21985E-05 + 0.69813E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 5.77271E-05 -5.13160E-01 5.77248E-05 -5.17016E-07 + 0.66139E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 1.50462E+01 -1.78315E+02 -1.50397E+01 -4.42324E-01 + 0.66139E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 1.48461E+01 -5.13917E+01 9.26385E+00 -1.16012E+01 + 0.66139E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 4.40936E+02 7.16965E+01 1.38476E+02 4.18627E+02 + 0.66139E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 6.48917E-06 4.50500E+00 6.46912E-06 5.09699E-07 + 0.66139E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 1.05640E-04 7.80434E+01 2.18854E-05 1.03348E-04 + 0.66139E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 4.37136E-04 -1.08910E+01 4.29263E-04 -8.25933E-05 + 0.62832E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 1.77133E+01 1.74825E+02 -1.76411E+01 1.59771E+00 + 0.62832E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 1.43128E+01 -8.18834E+01 2.02081E+00 -1.41694E+01 + 0.62832E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 4.35211E+02 6.21251E+01 2.03480E+02 3.84714E+02 + 0.62832E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 3.52729E-06 1.16148E+02 -1.55447E-06 3.16629E-06 + 0.62832E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 8.28264E-05 6.28801E+01 3.77567E-05 7.37200E-05 + 0.62832E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 1.24675E-04 -1.37756E+02 -9.22955E-05 -8.38181E-05 + 0.59840E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 1.82228E+01 1.73365E+02 -1.81008E+01 2.10547E+00 + 0.59840E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 1.30217E+01 -1.02606E+02 -2.84187E+00 -1.27078E+01 + 0.59840E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 3.40485E+02 5.25791E+01 2.06901E+02 2.70411E+02 + 0.59840E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 3.37164E-06 6.87539E+01 1.22179E-06 3.14247E-06 + 0.59840E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 2.48869E-05 1.30001E+02 -1.59974E-05 1.90641E-05 + 0.59840E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 1.03959E-04 1.55112E+02 -9.43046E-05 4.37504E-05 + 0.57120E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 1.77663E+01 1.73906E+02 -1.76659E+01 1.88591E+00 + 0.57120E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 1.29636E+01 -1.09292E+02 -4.28289E+00 -1.22357E+01 + 0.57120E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 2.68335E+02 4.98279E+01 1.73099E+02 2.05038E+02 + 0.57120E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 1.89503E-06 5.16568E+01 1.17562E-06 1.48629E-06 + 0.57120E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 3.93441E-05 1.60589E+02 -3.71077E-05 1.30758E-05 + 0.57120E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 6.77918E-05 1.17182E+02 -3.09685E-05 6.03050E-05 + 0.54636E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 1.35117E+01 1.61914E+02 -1.28441E+01 4.19465E+00 + 0.54636E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 1.37685E+01 -1.12272E+02 -5.21825E+00 -1.27414E+01 + 0.54636E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 2.56800E+02 3.35871E+01 2.13926E+02 1.42062E+02 + 0.54636E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 4.90609E-06 -9.31514E+00 4.84139E-06 -7.94122E-07 + 0.54636E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 3.21452E-05 -8.77852E+01 1.24229E-06 -3.21212E-05 + 0.54636E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 7.04955E-05 -1.76369E+02 -7.03540E-05 -4.46424E-06 + 0.52360E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 5.38948E+00 1.15157E+02 -2.29110E+00 4.87826E+00 + 0.52360E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 1.33767E+01 -1.14137E+02 -5.46989E+00 -1.22072E+01 + 0.52360E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 2.22594E+02 -1.34829E+00 2.22532E+02 -5.23761E+00 + 0.52360E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 1.47270E-06 2.77783E+01 1.30298E-06 6.86352E-07 + 0.52360E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 1.31886E-05 6.68577E+01 5.18334E-06 1.21274E-05 + 0.52360E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 9.66180E-05 2.93139E+01 8.42461E-05 4.73036E-05 + 0.50265E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 8.98096E+00 2.96593E+01 7.80430E+00 4.44415E+00 + 0.50265E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 1.22389E+01 -1.11054E+02 -4.39671E+00 -1.14219E+01 + 0.50265E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 1.91203E+02 -3.78692E+01 1.50938E+02 -1.17372E+02 + 0.50265E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 2.15007E-06 -1.56894E+02 -1.97759E-06 -8.43774E-07 + 0.50265E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 3.34678E-05 9.22266E+01 -1.30026E-06 3.34425E-05 + 0.50265E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 2.64868E-04 1.59462E+02 -2.48033E-04 9.29250E-05 + 0.48332E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 1.51302E+01 1.37815E+01 1.46946E+01 3.60433E+00 + 0.48332E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 1.36402E+01 -1.15646E+02 -5.90354E+00 -1.22964E+01 + 0.48332E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 1.73696E+02 -5.78697E+01 9.23797E+01 -1.47093E+02 + 0.48332E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 4.86192E-06 -1.69679E+02 -4.78325E-06 -8.71074E-07 + 0.48332E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 3.64754E-05 7.74813E+01 7.90635E-06 3.56082E-05 + 0.48332E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 2.84349E-04 9.41822E+01 -2.07372E-05 2.83592E-04 + 0.46542E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 1.78861E+01 1.92993E+01 1.68810E+01 5.91140E+00 + 0.46542E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 1.22594E+01 -1.48554E+02 -1.04589E+01 -6.39572E+00 + 0.46542E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 1.53777E+02 -7.05237E+01 5.12719E+01 -1.44978E+02 + 0.46542E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 3.72992E-07 1.35796E+02 -2.67383E-07 2.60056E-07 + 0.46542E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 3.87538E-05 -1.59470E+01 3.72624E-05 -1.06475E-05 + 0.46542E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 2.34733E-04 7.49860E+01 6.08086E-05 2.26719E-04 + 0.44880E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 1.82590E+01 6.73729E+00 1.81329E+01 2.14209E+00 + 0.44880E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 7.22124E+00 1.54570E+02 -6.52157E+00 3.10087E+00 + 0.44880E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 7.22696E+01 -5.09696E+01 4.55105E+01 -5.61399E+01 + 0.44880E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 1.05005E-06 1.06350E+02 -2.95592E-07 1.00759E-06 + 0.44880E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 7.34435E-06 -1.50794E+02 -6.41067E-06 -3.58370E-06 + 0.44880E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 3.40751E-05 -6.42867E+01 1.47841E-05 -3.07009E-05 + 0.43332E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 1.44080E+01 -4.77186E+01 9.69328E+00 -1.06597E+01 + 0.43332E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 3.49671E+00 1.16778E+02 -1.57537E+00 3.12173E+00 + 0.43332E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 1.23064E+02 1.70554E+01 1.17652E+02 3.60941E+01 + 0.43332E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 8.71262E-07 1.29821E+02 -5.57951E-07 6.69170E-07 + 0.43332E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 1.72777E-05 1.64727E+02 -1.66674E-05 4.55141E-06 + 0.43332E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 2.53605E-04 -1.17588E+02 -1.17448E-04 -2.24770E-04 + 0.41888E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 2.04933E+01 -1.08365E+02 -6.45693E+00 -1.94495E+01 + 0.41888E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 3.51294E+00 1.24526E+02 -1.99108E+00 2.89419E+00 + 0.41888E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 1.54138E+02 2.16228E+01 1.43291E+02 5.67990E+01 + 0.41888E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 8.25753E-07 2.83352E+01 7.26816E-07 3.91926E-07 + 0.41888E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 4.23657E-06 -8.98846E+01 8.53215E-09 -4.23656E-06 + 0.41888E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 2.69965E-04 6.79848E+01 1.01197E-04 2.50280E-04 + 0.40537E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 2.60143E+01 -1.22181E+02 -1.38549E+01 -2.20178E+01 + 0.40537E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 3.98620E+00 1.06691E+02 -1.14486E+00 3.81826E+00 + 0.40537E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 1.16147E+02 5.29447E+01 6.99883E+01 9.26915E+01 + 0.40537E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 2.37168E-06 1.05583E+02 -6.37113E-07 2.28451E-06 + 0.40537E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 8.25500E-06 1.37519E+02 -6.08806E-06 5.57499E-06 + 0.40537E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 6.83807E-05 -5.63692E-01 6.83774E-05 -6.72738E-07 + 0.39270E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 2.65468E+01 -1.26435E+02 -1.57664E+01 -2.13577E+01 + 0.39270E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 2.06617E+00 1.23378E+02 -1.13672E+00 1.72538E+00 + 0.39270E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 1.32016E+02 7.63159E+01 3.12310E+01 1.28269E+02 + 0.39270E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 1.89695E-06 4.10501E+01 1.43056E-06 1.24576E-06 + 0.39270E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 5.89019E-06 5.05440E-02 5.89019E-06 5.19608E-09 + 0.39270E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 1.31381E-04 -1.01713E+02 -2.66718E-05 -1.28645E-04 + 0.38080E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 1.82416E+01 -1.31331E+02 -1.20470E+01 -1.36977E+01 + 0.38080E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 2.69486E+00 1.54691E+02 -2.43618E+00 1.15207E+00 + 0.38080E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 7.25106E+01 8.05177E+01 1.19455E+01 7.15199E+01 + 0.38080E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 1.68949E-06 -2.56416E+01 1.52310E-06 -7.31110E-07 + 0.38080E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 6.80757E-06 -1.34049E+02 -4.73313E-06 -4.89290E-06 + 0.38080E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 1.16722E-04 -6.75653E+01 4.45447E-05 -1.07888E-04 + 0.36960E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 9.72722E+00 -1.42172E+02 -7.68305E+00 -5.96569E+00 + 0.36960E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 1.82278E+00 1.32944E+02 -1.24184E+00 1.33431E+00 + 0.36960E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 3.59466E+00 8.19554E+01 5.03051E-01 3.55929E+00 + 0.36960E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 1.30796E-06 -1.73918E+02 -1.30060E-06 -1.38584E-07 + 0.36960E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 4.69688E-06 1.03123E+02 -1.06639E-06 4.57422E-06 + 0.36960E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 2.36680E-05 -1.27930E+02 -1.45488E-05 -1.86684E-05 + 0.35904E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 1.05245E+01 -1.65739E+02 -1.02001E+01 -2.59268E+00 + 0.35904E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 9.12374E-01 1.44443E+02 -7.42248E-01 5.30560E-01 + 0.35904E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 6.21087E+01 -3.28395E+01 5.21833E+01 -3.36808E+01 + 0.35904E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 5.90843E-07 -9.67496E+01 -6.94423E-08 -5.86748E-07 + 0.35904E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 3.69758E-06 -1.15540E+02 -1.59415E-06 -3.33628E-06 + 0.35904E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 2.91538E-05 6.95699E+01 1.01766E-05 2.73200E-05 + 0.34907E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 2.69711E+01 1.68518E+02 -2.64313E+01 5.36891E+00 + 0.34907E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 8.30824E-02 1.49940E+00 8.30540E-02 2.17398E-03 + 0.34907E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 1.65063E+02 -3.03562E+01 1.42433E+02 -8.34184E+01 + 0.34907E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 7.16531E-07 -1.56842E+02 -6.58793E-07 -2.81794E-07 + 0.34907E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 5.22878E-07 1.41046E+02 -4.06618E-07 3.28730E-07 + 0.34907E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 8.37429E-05 4.22480E+01 6.19900E-05 5.63038E-05 + 0.33963E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 2.38137E+01 1.48619E+02 -2.03302E+01 1.24005E+01 + 0.33963E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 4.88491E-01 3.01816E+01 4.22269E-01 2.45585E-01 + 0.33963E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 1.39383E+02 -3.61162E+01 1.12597E+02 -8.21556E+01 + 0.33963E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 8.57949E-07 -8.25529E+01 1.11200E-07 -8.50713E-07 + 0.33963E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 1.08271E-06 -2.73384E+01 9.61786E-07 -4.97231E-07 + 0.33963E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 7.45285E-05 4.63121E+01 5.14790E-05 5.38926E-05 + 0.33069E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 1.27148E+01 1.22280E+02 -6.79038E+00 1.07497E+01 + 0.33069E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 6.73685E-01 3.42885E+01 5.56607E-01 3.79527E-01 + 0.33069E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 6.38150E+01 -3.69801E+01 5.09782E+01 -3.83871E+01 + 0.33069E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 2.17738E-06 6.46322E+00 2.16355E-06 2.45098E-07 + 0.33069E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 7.00614E-06 -1.78926E+02 -7.00491E-06 -1.31351E-07 + 0.33069E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 2.31475E-05 -6.98303E+00 2.29758E-05 -2.81417E-06 + 0.32221E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 3.15097E+00 4.56372E+01 2.20316E+00 2.25271E+00 + 0.32221E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 3.42007E-01 -1.79447E+02 -3.41991E-01 -3.30381E-03 + 0.32221E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 1.26723E+01 -6.90136E+01 4.53853E+00 -1.18317E+01 + 0.32221E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 1.62407E-06 -8.68406E+01 8.95094E-08 -1.62160E-06 + 0.32221E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 1.51082E-06 -9.80873E+01 -2.12546E-07 -1.49580E-06 + 0.32221E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 1.92806E-05 4.51512E+01 1.35974E-05 1.36693E-05 + 0.31416E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 5.92887E+00 6.32995E+01 2.66400E+00 5.29666E+00 + 0.31416E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 1.21200E+00 1.36430E+02 -8.78136E-01 8.35361E-01 + 0.31416E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 4.82966E+01 -1.37102E+02 -3.53803E+01 -3.28754E+01 + 0.31416E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 8.51286E-07 -1.63067E+02 -8.14380E-07 -2.47938E-07 + 0.31416E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 1.19571E-06 3.50230E+01 9.79195E-07 6.86226E-07 + 0.31416E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 4.01718E-05 -1.06264E+02 -1.12508E-05 -3.85642E-05 + 0.30650E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 7.61857E+00 5.27683E+01 4.60953E+00 6.06587E+00 + 0.30650E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 7.21246E-01 1.19175E+02 -3.51592E-01 6.29745E-01 + 0.30650E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 4.91973E+01 -1.43974E+02 -3.97881E+01 -2.89357E+01 + 0.30650E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 5.15107E-07 -4.32383E+01 3.75261E-07 -3.52865E-07 + 0.30650E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 1.29498E-06 5.83613E+01 6.79298E-07 1.10251E-06 + 0.30650E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 1.40692E-04 -1.04485E+02 -3.51899E-05 -1.36220E-04 + 0.29920E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 3.47992E+00 -6.62612E+01 1.40091E+00 -3.18549E+00 + 0.29920E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 5.11800E-02 9.65285E+01 -5.81908E-03 5.08481E-02 + 0.29920E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 1.76653E+01 1.62014E+02 -1.68020E+01 5.45486E+00 + 0.29920E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 1.58834E-06 -9.06805E+01 -1.88642E-08 -1.58823E-06 + 0.29920E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 2.66649E-06 -9.51148E+01 -2.37720E-07 -2.65588E-06 + 0.29920E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 2.83549E-05 3.18276E+01 2.40914E-05 1.49534E-05 + 0.29224E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 7.30380E+00 -7.57348E+01 1.79973E+00 -7.07859E+00 + 0.29224E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 2.55667E-01 -1.25574E+02 -1.48734E-01 -2.07951E-01 + 0.29224E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 2.13227E+01 1.08749E+02 -6.85347E+00 2.01913E+01 + 0.29224E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 5.40635E-07 1.57185E+02 -4.98336E-07 2.09637E-07 + 0.29224E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 2.13412E-06 2.40528E+01 1.94881E-06 8.69821E-07 + 0.29224E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 1.09293E-04 -1.43684E+02 -8.80647E-05 -6.47269E-05 + 0.28560E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 1.12427E+01 -6.90222E+01 4.02497E+00 -1.04976E+01 + 0.28560E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 7.79170E-02 -7.28099E+01 2.30278E-02 -7.44364E-02 + 0.28560E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 4.00780E+01 1.17770E+02 -1.86734E+01 3.54620E+01 + 0.28560E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 5.91054E-07 5.59401E+01 3.31025E-07 4.89660E-07 + 0.28560E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 2.02425E-06 8.38638E+00 2.00260E-06 2.95232E-07 + 0.28560E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 5.12593E-05 -2.48424E+01 4.65161E-05 -2.15352E-05 + 0.27925E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 8.36838E+00 -4.22831E+01 6.19117E+00 -5.63020E+00 + 0.27925E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 6.70451E-02 -1.60194E+02 -6.30789E-02 -2.27176E-02 + 0.27925E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 3.42589E+01 1.39340E+02 -2.59886E+01 2.23219E+01 + 0.27925E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 2.85897E-07 2.12525E+01 2.66453E-07 1.03632E-07 + 0.27925E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 2.46125E-06 9.97518E+01 -4.16887E-07 2.42568E-06 + 0.27925E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 5.24454E-05 -8.26072E+01 6.74822E-06 -5.20094E-05 + 0.27318E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 1.19511E+01 -4.54371E+01 8.38600E+00 -8.51493E+00 + 0.27318E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 3.88064E-01 1.54089E+02 -3.49055E-01 1.69572E-01 + 0.27318E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 3.55739E+01 1.24692E+02 -2.02474E+01 2.92496E+01 + 0.27318E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 1.99754E-07 -4.26532E+01 1.46912E-07 -1.35345E-07 + 0.27318E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 7.02507E-07 1.66856E+02 -6.84103E-07 1.59750E-07 + 0.27318E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 2.58551E-05 2.89040E+00 2.58222E-05 1.30376E-06 + 0.26737E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 1.43008E+01 -9.93757E+01 -2.32972E+00 -1.41098E+01 + 0.26737E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 2.91172E-01 1.48491E+02 -2.48240E-01 1.52177E-01 + 0.26737E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 4.10628E+01 7.75705E+01 8.83828E+00 4.01003E+01 + 0.26737E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 6.61127E-07 -7.51792E+01 1.69114E-07 -6.39132E-07 + 0.26737E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 1.05964E-06 7.86298E+01 2.08906E-07 1.03885E-06 + 0.26737E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 3.40416E-05 -8.20276E+01 4.72144E-06 -3.37126E-05 + 0.26180E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 1.25641E+01 -8.86742E+01 2.90696E-01 -1.25607E+01 + 0.26180E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 2.54091E-01 1.38174E+02 -1.89340E-01 1.69447E-01 + 0.26180E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 3.97301E+01 8.91067E+01 6.19415E-01 3.97253E+01 + 0.26180E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 2.57622E-07 -1.23071E+02 -1.40580E-07 -2.15885E-07 + 0.26180E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 5.04605E-07 5.54262E+01 2.86346E-07 4.15490E-07 + 0.26180E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 1.48932E-05 8.61238E+01 1.00678E-06 1.48591E-05 + 0.25646E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 1.08722E+01 -7.60493E+01 2.62116E+00 -1.05515E+01 + 0.25646E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 4.35629E-01 9.64595E+01 -4.90085E-02 4.32863E-01 + 0.25646E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 2.54977E+01 9.87545E+01 -3.88079E+00 2.52006E+01 + 0.25646E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 4.79371E-08 8.61049E+00 4.73968E-08 7.17696E-09 + 0.25646E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 6.14579E-07 -5.03769E+01 3.91939E-07 -4.73384E-07 + 0.25646E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 3.57982E-05 -1.58487E+02 -3.33044E-05 -1.31274E-05 + 0.25133E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 6.32404E+00 -1.53271E+02 -5.64828E+00 -2.84436E+00 + 0.25133E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 2.64514E-01 6.21541E+01 1.23553E-01 2.33885E-01 + 0.25133E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 1.38236E+01 2.21441E+01 1.28040E+01 5.21063E+00 + 0.25133E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 2.35787E-07 1.22763E+02 -1.27601E-07 1.98276E-07 + 0.25133E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 7.91127E-07 1.05390E+02 -2.09954E-07 7.62759E-07 + 0.25133E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 4.00563E-05 1.57862E+02 -3.71033E-05 1.50949E-05 + 0.24640E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 3.05112E+00 -1.69626E+02 -3.00124E+00 -5.49404E-01 + 0.24640E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 1.51627E-01 8.72154E+01 7.36613E-03 1.51448E-01 + 0.24640E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 1.57345E+01 -7.05991E+00 1.56152E+01 -1.93388E+00 + 0.24640E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 2.85739E-07 7.02764E+01 9.64320E-08 2.68975E-07 + 0.24640E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 5.77361E-07 -9.08761E+01 -8.82749E-09 -5.77293E-07 + 0.24640E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 1.06661E-05 -1.13853E+02 -4.31334E-06 -9.75505E-06 + 0.24166E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 1.56118E+00 -1.30487E+02 -1.01362E+00 -1.18737E+00 + 0.24166E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 1.22839E-01 8.07849E+00 1.21620E-01 1.72625E-02 + 0.24166E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 9.63236E+00 -5.61186E+01 5.36981E+00 -7.99672E+00 + 0.24166E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 1.74997E-07 -6.34779E+01 7.81437E-08 -1.56581E-07 + 0.24166E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 5.94213E-07 -1.70732E+02 -5.86456E-07 -9.56991E-08 + 0.24166E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 5.30818E-05 1.14655E+02 -2.21433E-05 4.82426E-05 + 0.23710E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 6.22349E+00 8.82708E+01 1.87797E-01 6.22065E+00 + 0.23710E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 1.69709E-01 -3.36321E+01 1.41302E-01 -9.39950E-02 + 0.23710E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 2.10301E+01 -1.04333E+02 -5.20618E+00 -2.03755E+01 + 0.23710E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 1.82224E-07 -5.42137E+01 1.06558E-07 -1.47820E-07 + 0.23710E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 1.11546E-06 1.46495E+01 1.07920E-06 2.82106E-07 + 0.23710E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 4.23795E-05 -1.17054E+02 -1.92754E-05 -3.77423E-05 + 0.23271E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 1.16830E+01 5.85072E+01 6.10309E+00 9.96213E+00 + 0.23271E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 1.27537E-01 -2.22733E+00 1.27441E-01 -4.95666E-03 + 0.23271E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 3.58419E+01 -1.18495E+02 -1.70995E+01 -3.14999E+01 + 0.23271E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 1.96717E-07 2.15693E+01 1.82942E-07 7.23184E-08 + 0.23271E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 2.25572E-07 5.58490E-01 2.25562E-07 2.19873E-09 + 0.23271E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 7.20522E-05 -1.03551E+02 -1.68828E-05 -7.00464E-05 + 0.22848E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 7.28601E+00 7.08588E+01 2.38906E+00 6.88319E+00 + 0.22848E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 8.99597E-02 -5.36923E+01 5.32671E-02 -7.24939E-02 + 0.22848E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 2.12542E+01 -1.26520E+02 -1.26484E+01 -1.70809E+01 + 0.22848E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 1.14140E-07 -9.46301E+01 -9.21358E-09 -1.13767E-07 + 0.22848E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 4.06794E-07 -9.07216E+01 -5.12299E-09 -4.06762E-07 + 0.22848E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 5.06454E-05 1.71482E+02 -5.00867E-05 7.50151E-06 + 0.22440E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 8.20875E+00 2.48435E+01 7.44910E+00 3.44883E+00 + 0.22440E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 9.78049E-02 -1.24356E+02 -5.51946E-02 -8.07425E-02 + 0.22440E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 2.18527E+01 -1.67767E+02 -2.13565E+01 -4.63042E+00 + 0.22440E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 3.05732E-07 1.17685E+02 -1.42047E-07 2.70730E-07 + 0.22440E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 7.64470E-07 -5.26836E+01 4.63434E-07 -6.07983E-07 + 0.22440E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 3.53837E-05 1.28470E+02 -2.20125E-05 2.77030E-05 + 0.22046E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 1.00028E+01 -2.69227E+00 9.99174E+00 -4.69847E-01 + 0.22046E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 1.52852E-01 -8.08755E+01 2.42392E-02 -1.50918E-01 + 0.22046E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 2.72470E+01 1.79797E+02 -2.72469E+01 9.63776E-02 + 0.22046E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 1.81387E-07 2.08513E+01 1.69507E-07 6.45635E-08 + 0.22046E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 2.98425E-07 -1.18498E+02 -1.42386E-07 -2.62267E-07 + 0.22046E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 1.67563E-05 -6.92499E+01 5.93664E-06 -1.56694E-05 + 0.21666E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 3.68683E+00 2.75657E+00 3.68256E+00 1.77310E-01 + 0.21666E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 1.01788E-01 -2.79826E+01 8.98881E-02 -4.77593E-02 + 0.21666E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 2.61414E+00 -1.59306E+02 -2.44549E+00 -9.23757E-01 + 0.21666E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 3.18757E-07 -1.56767E+02 -2.92907E-07 -1.25743E-07 + 0.21666E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 5.47218E-07 -8.34252E+01 6.26567E-08 -5.43619E-07 + 0.21666E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 1.08566E-05 -1.71587E+02 -1.07398E-05 -1.58835E-06 + 0.21299E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 3.66300E+00 -1.32731E+02 -2.48554E+00 -2.69066E+00 + 0.21299E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 1.86044E-01 2.72118E+01 1.65453E-01 8.50744E-02 + 0.21299E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 1.04004E+01 2.03524E+01 9.75114E+00 3.61721E+00 + 0.21299E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 7.90869E-08 -7.63444E+01 1.86713E-08 -7.68513E-08 + 0.21299E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 4.03662E-07 4.94707E+01 2.62314E-07 3.06813E-07 + 0.21299E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 3.60803E-05 4.69686E+01 2.46212E-05 2.63740E-05 + 0.20944E+01 0.15708E+02 0.00000E+00 0.00000E+00 1 6.00575E+00 -1.53961E+02 -5.39614E+00 -2.63643E+00 + 0.20944E+01 0.15708E+02 0.00000E+00 0.00000E+00 3 1.79016E-01 7.86465E+01 3.52415E-02 1.75513E-01 + 0.20944E+01 0.15708E+02 0.00000E+00 0.00000E+00 5 1.03866E+01 3.44278E+01 8.56727E+00 5.87225E+00 + 0.20944E+01 0.15708E+02 0.00000E+00 0.00000E+00 2 2.85606E-07 1.48350E+00 2.85511E-07 7.39406E-09 + 0.20944E+01 0.15708E+02 0.00000E+00 0.00000E+00 4 1.15605E-07 -8.95109E+01 9.86832E-10 -1.15600E-07 + 0.20944E+01 0.15708E+02 0.00000E+00 0.00000E+00 6 8.88339E-06 1.79280E+02 -8.88269E-06 1.11606E-07 + 0.13963E+02 0.13963E+02 0.00000E+00 0.00000E+00 1 3.19227E-02 1.80000E+02 -3.19227E-02 0.00000E+00 + 0.13963E+02 0.13963E+02 0.00000E+00 0.00000E+00 3 3.69488E+00 0.00000E+00 3.69488E+00 0.00000E+00 + 0.13963E+02 0.13963E+02 0.00000E+00 0.00000E+00 5 1.12067E+01 1.80000E+02 -1.12067E+01 0.00000E+00 + 0.13963E+02 0.13963E+02 0.00000E+00 0.00000E+00 2 5.86473E-06 0.00000E+00 5.86473E-06 0.00000E+00 + 0.13963E+02 0.13963E+02 0.00000E+00 0.00000E+00 4 7.89694E-05 1.80000E+02 -7.89694E-05 0.00000E+00 + 0.13963E+02 0.13963E+02 0.00000E+00 0.00000E+00 6 1.69087E-04 0.00000E+00 1.69087E-04 0.00000E+00 + 0.12566E+02 0.13963E+02 0.00000E+00 0.00000E+00 1 3.62621E-01 -8.66025E+01 2.14900E-02 -3.61984E-01 + 0.12566E+02 0.13963E+02 0.00000E+00 0.00000E+00 3 4.19557E+00 -3.50738E+00 4.18771E+00 -2.56673E-01 + 0.12566E+02 0.13963E+02 0.00000E+00 0.00000E+00 5 2.00180E+01 1.29926E+02 -1.28476E+01 1.53512E+01 + 0.12566E+02 0.13963E+02 0.00000E+00 0.00000E+00 2 7.91548E-06 1.77285E+02 -7.90659E-06 3.75002E-07 + 0.12566E+02 0.13963E+02 0.00000E+00 0.00000E+00 4 5.78378E-05 1.73986E+02 -5.75194E-05 6.06013E-06 + 0.12566E+02 0.13963E+02 0.00000E+00 0.00000E+00 6 1.09959E-04 2.48882E+01 9.97473E-05 4.62763E-05 + 0.11424E+02 0.13963E+02 0.00000E+00 0.00000E+00 1 1.20133E+00 -8.68863E+01 6.52534E-02 -1.19956E+00 + 0.11424E+02 0.13963E+02 0.00000E+00 0.00000E+00 3 5.63954E+00 -6.93803E+00 5.59825E+00 -6.81233E-01 + 0.11424E+02 0.13963E+02 0.00000E+00 0.00000E+00 5 4.17455E+01 1.05207E+02 -1.09503E+01 4.02837E+01 + 0.11424E+02 0.13963E+02 0.00000E+00 0.00000E+00 2 3.75427E-06 1.28321E+00 3.75333E-06 8.40743E-08 + 0.11424E+02 0.13963E+02 0.00000E+00 0.00000E+00 4 6.20888E-05 1.50020E+02 -5.37814E-05 3.10254E-05 + 0.11424E+02 0.13963E+02 0.00000E+00 0.00000E+00 6 1.46553E-04 1.79535E+02 -1.46548E-04 1.18817E-06 + 0.10472E+02 0.13963E+02 0.00000E+00 0.00000E+00 1 2.65133E+00 -9.07133E+01 -3.30050E-02 -2.65112E+00 + 0.10472E+02 0.13963E+02 0.00000E+00 0.00000E+00 3 7.47264E+00 -9.54902E+00 7.36910E+00 -1.23965E+00 + 0.10472E+02 0.13963E+02 0.00000E+00 0.00000E+00 5 7.85796E+01 9.17741E+01 -2.43276E+00 7.85420E+01 + 0.10472E+02 0.13963E+02 0.00000E+00 0.00000E+00 2 7.52488E-06 -1.51766E+02 -6.62959E-06 -3.55983E-06 + 0.10472E+02 0.13963E+02 0.00000E+00 0.00000E+00 4 2.47150E-04 -1.07564E+00 2.47107E-04 -4.63958E-06 + 0.10472E+02 0.13963E+02 0.00000E+00 0.00000E+00 6 7.86032E-05 1.60603E+02 -7.41418E-05 2.61046E-05 + 0.96664E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 4.55003E+00 -9.61141E+01 -4.84622E-01 -4.52415E+00 + 0.96664E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 9.62225E+00 -1.09662E+01 9.44654E+00 -1.83044E+00 + 0.96664E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 1.32871E+02 8.36479E+01 1.47005E+01 1.32056E+02 + 0.96664E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 6.84213E-06 1.72943E+01 6.53280E-06 2.03402E-06 + 0.96664E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 3.56474E-04 1.27566E+01 3.47676E-04 7.87127E-05 + 0.96664E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 2.83829E-04 1.31615E+02 -1.88497E-04 2.12197E-04 + 0.89760E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 6.54979E+00 -1.03517E+02 -1.53093E+00 -6.36836E+00 + 0.89760E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 1.19482E+01 -1.18663E+01 1.16929E+01 -2.45690E+00 + 0.89760E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 2.04196E+02 7.84077E+01 4.10325E+01 2.00031E+02 + 0.89760E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 4.91493E-06 4.34144E+01 3.57021E-06 3.37789E-06 + 0.89760E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 4.46934E-05 3.09077E+01 3.83467E-05 2.29571E-05 + 0.89760E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 1.89734E-04 -9.30901E+01 -1.02280E-05 -1.89458E-04 + 0.83776E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 8.18457E+00 -1.14418E+02 -3.38336E+00 -7.45252E+00 + 0.83776E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 1.40996E+01 -1.38242E+01 1.36912E+01 -3.36901E+00 + 0.83776E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 2.85307E+02 7.40727E+01 7.82933E+01 2.74354E+02 + 0.83776E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 2.62304E-06 -6.42405E+01 1.13996E-06 -2.36238E-06 + 0.83776E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 5.36411E-05 1.19529E+02 -2.64375E-05 4.66736E-05 + 0.83776E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 1.18576E-04 -5.04563E+01 7.54933E-05 -9.14385E-05 + 0.78540E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 9.00823E+00 -1.29298E+02 -5.70540E+00 -6.97112E+00 + 0.78540E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 1.52835E+01 -1.73414E+01 1.45888E+01 -4.55547E+00 + 0.78540E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 3.54012E+02 7.02593E+01 1.19572E+02 3.33207E+02 + 0.78540E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 5.71590E-06 2.59207E+01 5.14088E-06 2.49858E-06 + 0.78540E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 1.02097E-04 1.53473E+02 -9.13482E-05 4.55985E-05 + 0.78540E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 1.38219E-04 -1.08952E+02 -4.48894E-05 -1.30726E-04 + 0.73920E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 9.40820E+00 -1.46115E+02 -7.81031E+00 -5.24530E+00 + 0.73920E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 1.52356E+01 -2.10108E+01 1.42226E+01 -5.46263E+00 + 0.73920E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 3.91223E+02 6.91091E+01 1.39506E+02 3.65505E+02 + 0.73920E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 4.90733E-06 -4.33933E+01 3.56594E-06 -3.37135E-06 + 0.73920E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 1.24364E-04 -1.50577E+02 -1.08323E-04 -6.10944E-05 + 0.73920E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 1.19587E-04 -1.68726E+02 -1.17280E-04 -2.33787E-05 + 0.69813E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 1.04718E+01 -1.61359E+02 -9.92245E+00 -3.34723E+00 + 0.69813E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 1.49287E+01 -2.59096E+01 1.34281E+01 -6.52314E+00 + 0.69813E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 4.08653E+02 7.18373E+01 1.27384E+02 3.88292E+02 + 0.69813E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 1.31245E-06 -7.56849E+01 3.24509E-07 -1.27170E-06 + 0.69813E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 3.96782E-05 1.35730E+02 -2.84118E-05 2.76971E-05 + 0.69813E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 5.11233E-05 -1.32809E+02 -3.47412E-05 -3.75053E-05 + 0.66139E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 1.29507E+01 -1.70758E+02 -1.27826E+01 -2.08004E+00 + 0.66139E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 1.54725E+01 -4.02213E+01 1.18141E+01 -9.99121E+00 + 0.66139E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 4.45306E+02 7.43466E+01 1.20151E+02 4.28790E+02 + 0.66139E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 2.57050E-06 1.21365E+01 2.51305E-06 5.40425E-07 + 0.66139E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 1.54231E-04 -1.39801E+02 -1.17802E-04 -9.95485E-05 + 0.66139E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 3.38766E-04 1.76836E+02 -3.38249E-04 1.86991E-05 + 0.62832E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 1.65014E+01 -1.77918E+02 -1.64906E+01 -5.99511E-01 + 0.62832E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 1.46478E+01 -6.88612E+01 5.28240E+00 -1.36621E+01 + 0.62832E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 4.46248E+02 6.59220E+01 1.82060E+02 4.07421E+02 + 0.62832E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 4.79455E-06 3.80307E+01 3.77658E-06 2.95385E-06 + 0.62832E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 1.08816E-04 8.27504E+01 1.37317E-05 1.07946E-04 + 0.62832E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 3.04349E-04 -1.64713E+02 -2.93580E-04 -8.02431E-05 + 0.59840E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 1.85643E+01 1.79266E+02 -1.85628E+01 2.37925E-01 + 0.59840E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 1.31953E+01 -9.21935E+01 -5.05049E-01 -1.31856E+01 + 0.59840E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 3.52895E+02 5.77340E+01 1.88394E+02 2.98401E+02 + 0.59840E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 3.29535E-06 -2.60212E+01 2.96130E-06 -1.44568E-06 + 0.59840E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 1.59368E-04 9.75406E+01 -2.09135E-05 1.57990E-04 + 0.59840E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 1.27572E-04 -4.77376E+01 8.57958E-05 -9.44127E-05 + 0.57120E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 1.96049E+01 1.79275E+02 -1.96033E+01 2.48209E-01 + 0.57120E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 1.34344E+01 -1.03611E+02 -3.16159E+00 -1.30571E+01 + 0.57120E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 2.70304E+02 5.75011E+01 1.45230E+02 2.27975E+02 + 0.57120E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 3.31739E-06 -1.57899E+02 -3.07364E-06 -1.24813E-06 + 0.57120E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 3.68217E-05 -6.11316E+01 1.77775E-05 -3.22459E-05 + 0.57120E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 7.29933E-05 -8.36794E+01 8.03602E-06 -7.25496E-05 + 0.54636E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 1.72905E+01 1.70850E+02 -1.70704E+01 2.74957E+00 + 0.54636E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 1.44610E+01 -1.11497E+02 -5.29934E+00 -1.34550E+01 + 0.54636E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 2.56645E+02 4.84988E+01 1.70062E+02 1.92212E+02 + 0.54636E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 2.47840E-06 1.01204E+02 -4.81547E-07 2.43116E-06 + 0.54636E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 2.30808E-05 -4.49878E+01 1.63241E-05 -1.63171E-05 + 0.54636E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 1.31384E-04 1.19391E+02 -6.44790E-05 1.14473E-04 + 0.52360E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 9.43732E+00 1.43622E+02 -7.59818E+00 5.59738E+00 + 0.52360E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 1.39434E+01 -1.16103E+02 -6.13480E+00 -1.25213E+01 + 0.52360E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 2.34408E+02 1.88457E+01 2.21842E+02 7.57185E+01 + 0.52360E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 6.79844E-06 -1.76457E+02 -6.78545E-06 -4.20164E-07 + 0.52360E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 2.91775E-05 1.27555E+01 2.84574E-05 6.44212E-06 + 0.52360E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 5.78420E-05 1.52484E+02 -5.12989E-05 2.67230E-05 + 0.50265E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 7.92192E+00 5.18949E+01 4.88866E+00 6.23360E+00 + 0.50265E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 1.24396E+01 -1.14746E+02 -5.20724E+00 -1.12972E+01 + 0.50265E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 2.11115E+02 -1.94766E+01 1.99035E+02 -7.03904E+01 + 0.50265E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 3.99833E-06 1.74891E+02 -3.98244E-06 3.56087E-07 + 0.50265E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 2.60618E-05 -5.83562E+01 1.36730E-05 -2.21871E-05 + 0.50265E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 4.23376E-04 1.19357E+02 -2.07558E-04 3.69008E-04 + 0.48332E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 1.48825E+01 2.21434E+01 1.37849E+01 5.60962E+00 + 0.48332E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 1.23254E+01 -1.14587E+02 -5.12822E+00 -1.12079E+01 + 0.48332E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 2.04719E+02 -4.57207E+01 1.42926E+02 -1.46568E+02 + 0.48332E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 2.91928E-06 -1.61318E+02 -2.76546E-06 -9.35110E-07 + 0.48332E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 1.92032E-05 -1.41875E+02 -1.51065E-05 -1.18556E-05 + 0.48332E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 1.61159E-04 8.77395E+01 6.35655E-06 1.61034E-04 + 0.46542E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 2.06643E+01 2.27888E+01 1.90512E+01 8.00401E+00 + 0.46542E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 1.12197E+01 -1.28699E+02 -7.01493E+00 -8.75623E+00 + 0.46542E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 2.02201E+02 -6.56942E+01 8.32275E+01 -1.84279E+02 + 0.46542E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 2.22622E-06 1.29567E+02 -1.41807E-06 1.71615E-06 + 0.46542E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 2.21673E-06 1.42967E+02 -1.76958E-06 1.33509E-06 + 0.46542E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 7.16209E-05 7.40295E+01 1.97059E-05 6.88566E-05 + 0.44880E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 2.23467E+01 1.10781E+01 2.19303E+01 4.29386E+00 + 0.44880E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 1.02064E+01 -1.70788E+02 -1.00748E+01 -1.63386E+00 + 0.44880E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 1.14103E+02 -7.12191E+01 3.67355E+01 -1.08028E+02 + 0.44880E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 3.45386E-07 -1.45918E+02 -2.86061E-07 -1.93547E-07 + 0.44880E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 1.10897E-05 -1.75928E+02 -1.10617E-05 -7.87471E-07 + 0.44880E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 3.76596E-05 1.47712E+02 -3.18362E-05 2.01171E-05 + 0.43332E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 1.62586E+01 -2.93546E+01 1.41711E+01 -7.97020E+00 + 0.43332E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 5.99702E+00 1.29304E+02 -3.79876E+00 4.64044E+00 + 0.43332E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 9.74294E+01 9.55573E+00 9.60776E+01 1.61740E+01 + 0.43332E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 1.72488E-06 -1.46431E+02 -1.43721E-06 -9.53755E-07 + 0.43332E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 1.98310E-05 -1.59223E+02 -1.85413E-05 -7.03467E-06 + 0.43332E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 2.64922E-04 -6.79807E+01 9.93244E-05 -2.45598E-04 + 0.41888E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 1.86197E+01 -9.64590E+01 -2.09458E+00 -1.85015E+01 + 0.41888E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 4.60235E+00 1.26128E+02 -2.71350E+00 3.71733E+00 + 0.41888E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 1.65278E+02 2.05650E+01 1.54746E+02 5.80574E+01 + 0.41888E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 1.80696E-06 9.07814E+01 -2.46422E-08 1.80679E-06 + 0.41888E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 5.01978E-06 1.36878E+02 -3.66393E-06 3.43129E-06 + 0.41888E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 2.20255E-04 -1.05067E+02 -5.72538E-05 -2.12683E-04 + 0.40537E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 2.67643E+01 -1.17328E+02 -1.22871E+01 -2.37772E+01 + 0.40537E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 5.38220E+00 1.06568E+02 -1.53474E+00 5.15875E+00 + 0.40537E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 1.36571E+02 4.01946E+01 1.04321E+02 8.81408E+01 + 0.40537E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 3.75433E-06 6.04126E+01 1.85370E-06 3.26478E-06 + 0.40537E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 2.19065E-06 1.36596E+02 -1.59158E-06 1.50527E-06 + 0.40537E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 6.88594E-05 5.06583E+01 4.36530E-05 5.32545E-05 + 0.39270E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 3.23105E+01 -1.27788E+02 -1.97981E+01 -2.55343E+01 + 0.39270E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 2.61328E+00 1.12017E+02 -9.79676E-01 2.42270E+00 + 0.39270E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 1.27776E+02 6.65467E+01 5.08548E+01 1.17219E+02 + 0.39270E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 1.31983E-06 -1.70987E+02 -1.30353E-06 -2.06768E-07 + 0.39270E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 7.97743E-06 -1.71584E+02 -7.89152E-06 -1.16763E-06 + 0.39270E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 1.34382E-04 1.44260E+02 -1.09074E-04 7.84944E-05 + 0.38080E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 2.37689E+01 -1.33032E+02 -1.62200E+01 -1.73745E+01 + 0.38080E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 2.37453E+00 1.57215E+02 -2.18923E+00 9.19608E-01 + 0.38080E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 8.85940E+01 7.58858E+01 2.16041E+01 8.59195E+01 + 0.38080E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 3.57471E-07 8.02382E+01 6.06099E-08 3.52295E-07 + 0.38080E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 5.40366E-06 -1.35723E+02 -3.86890E-06 -3.77242E-06 + 0.38080E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 1.59033E-04 -7.01111E+01 5.41026E-05 -1.49547E-04 + 0.36960E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 1.40844E+01 -1.46011E+02 -1.16781E+01 -7.87356E+00 + 0.36960E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 2.99156E+00 1.63506E+02 -2.86845E+00 8.49363E-01 + 0.36960E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 6.88060E+00 4.55402E+01 4.81923E+00 4.91098E+00 + 0.36960E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 2.89792E-06 -7.37596E+01 8.10459E-07 -2.78229E-06 + 0.36960E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 9.73577E-06 9.72579E+01 -1.22998E-06 9.65776E-06 + 0.36960E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 2.10497E-05 -6.08420E+01 1.02558E-05 -1.83822E-05 + 0.35904E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 1.12964E+01 -1.62614E+02 -1.07803E+01 -3.37551E+00 + 0.35904E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 1.55287E+00 1.46196E+02 -1.29034E+00 8.63954E-01 + 0.35904E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 5.08641E+01 -3.11804E+01 4.35164E+01 -2.63341E+01 + 0.35904E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 4.66339E-07 -1.05183E+02 -1.22138E-07 -4.50060E-07 + 0.35904E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 3.64262E-06 1.17528E+02 -1.68356E-06 3.23022E-06 + 0.35904E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 7.64740E-05 6.93166E+01 2.70110E-05 7.15449E-05 + 0.34907E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 2.37971E+01 1.70313E+02 -2.34579E+01 4.00408E+00 + 0.34907E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 1.75199E-01 -9.98493E+01 -2.99691E-02 -1.72617E-01 + 0.34907E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 1.61916E+02 -2.96650E+01 1.40694E+02 -8.01366E+01 + 0.34907E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 1.69100E-06 -5.33386E+01 1.00967E-06 -1.35648E-06 + 0.34907E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 3.07421E-06 -1.08197E+02 -9.60057E-07 -2.92046E-06 + 0.34907E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 1.28582E-04 3.52898E+00 1.28338E-04 7.91464E-06 + 0.33963E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 2.29323E+01 1.64139E+02 -2.20592E+01 6.26758E+00 + 0.33963E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 1.13308E-01 3.63991E+01 9.12016E-02 6.72375E-02 + 0.33963E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 1.60219E+02 -2.58985E+01 1.44128E+02 -6.99802E+01 + 0.33963E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 2.52419E-07 -1.37470E+02 -1.86013E-07 -1.70630E-07 + 0.33963E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 9.56965E-06 -1.38260E+02 -7.14064E-06 -6.37099E-06 + 0.33963E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 3.00552E-04 1.79857E+02 -3.00551E-04 7.49534E-07 + 0.33069E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 2.16610E+01 1.46163E+02 -1.79921E+01 1.20616E+01 + 0.33069E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 6.37510E-01 4.93654E+01 4.15168E-01 4.83793E-01 + 0.33069E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 1.18406E+02 -3.21957E+01 1.00199E+02 -6.30881E+01 + 0.33069E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 1.64836E-06 1.65998E+02 -1.59938E-06 3.98816E-07 + 0.33069E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 8.26076E-06 -9.70068E+00 8.14265E-06 -1.39195E-06 + 0.33069E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 1.01379E-04 -9.19699E+01 -3.48476E-06 -1.01319E-04 + 0.32221E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 5.18558E+00 5.92255E+01 2.65326E+00 4.45539E+00 + 0.32221E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 5.73703E-01 3.67723E+01 4.59548E-01 3.43440E-01 + 0.32221E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 1.41172E+01 -5.64206E+01 7.80810E+00 -1.17613E+01 + 0.32221E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 1.73770E-07 -7.65729E+01 4.03508E-08 -1.69021E-07 + 0.32221E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 3.61716E-06 7.78958E+01 7.58486E-07 3.53675E-06 + 0.32221E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 1.09741E-04 7.06891E+01 3.62906E-05 1.03567E-04 + 0.31416E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 4.29062E+00 2.88240E+01 3.75903E+00 2.06860E+00 + 0.31416E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 8.83039E-01 -1.55876E+02 -8.05917E-01 -3.60910E-01 + 0.31416E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 3.63595E+01 -1.51422E+02 -3.19297E+01 -1.73927E+01 + 0.31416E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 1.60841E-06 1.58488E+01 1.54727E-06 4.39256E-07 + 0.31416E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 2.22819E-06 1.37425E+01 2.16441E-06 5.29326E-07 + 0.31416E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 2.67235E-05 1.06025E+02 -7.37724E-06 2.56851E-05 + 0.30650E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 4.17227E+00 2.95507E+01 3.62954E+00 2.05773E+00 + 0.30650E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 9.86723E-01 1.37300E+02 -7.25154E-01 6.69159E-01 + 0.30650E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 4.71805E+01 -1.55423E+02 -4.29062E+01 -1.96228E+01 + 0.30650E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 5.45598E-07 -3.89534E+01 4.24288E-07 -3.43011E-07 + 0.30650E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 1.38631E-07 1.56520E+02 -1.27152E-07 5.52358E-08 + 0.30650E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 7.08625E-05 1.33668E+02 -4.89293E-05 5.12584E-05 + 0.29920E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 3.48270E+00 -1.09635E+01 3.41913E+00 -6.62352E-01 + 0.29920E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 2.21523E-01 1.24885E+02 -1.26696E-01 1.81716E-01 + 0.29920E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 2.84538E+01 -1.79727E+02 -2.84534E+01 -1.35528E-01 + 0.29920E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 3.96973E-07 2.71499E+01 3.53233E-07 1.81147E-07 + 0.29920E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 2.15745E-06 -1.16210E+02 -9.52857E-07 -1.93563E-06 + 0.29920E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 5.87910E-05 -1.74442E+02 -5.85146E-05 -5.69423E-06 + 0.29224E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 9.64821E+00 -8.57634E+01 7.12766E-01 -9.62184E+00 + 0.29224E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 4.13835E-01 -9.82011E+01 -5.90325E-02 -4.09603E-01 + 0.29224E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 2.45103E+01 9.24519E+01 -1.04855E+00 2.44878E+01 + 0.29224E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 7.50288E-07 5.98190E+01 3.77195E-07 6.48580E-07 + 0.29224E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 9.63891E-07 -1.78860E+02 -9.63700E-07 -1.91828E-08 + 0.29224E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 1.06932E-04 1.21157E+02 -5.53254E-05 9.15072E-05 + 0.28560E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 1.16098E+01 -7.14522E+01 3.69302E+00 -1.10067E+01 + 0.28560E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 2.93760E-01 -7.84244E+01 5.89459E-02 -2.87785E-01 + 0.28560E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 3.71782E+01 1.16303E+02 -1.64741E+01 3.33290E+01 + 0.28560E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 1.01898E-06 8.27370E+00 1.00838E-06 1.46633E-07 + 0.28560E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 1.19210E-06 -5.32785E+01 7.12787E-07 -9.55529E-07 + 0.28560E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 7.15417E-05 -7.71872E+01 1.58656E-05 -6.97603E-05 + 0.27925E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 8.34060E+00 -4.97421E+01 5.38993E+00 -6.36507E+00 + 0.27925E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 2.88030E-02 1.69049E+02 -2.82786E-02 5.47146E-03 + 0.27925E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 3.45098E+01 1.34013E+02 -2.39784E+01 2.48186E+01 + 0.27925E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 1.04915E-06 1.19227E+02 -5.12269E-07 9.15585E-07 + 0.27925E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 1.84472E-06 1.77232E+02 -1.84257E-06 8.90745E-08 + 0.27925E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 4.86954E-05 -6.72349E+01 1.88429E-05 -4.49020E-05 + 0.27318E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 5.93409E+00 -2.10293E+01 5.53886E+00 -2.12942E+00 + 0.27318E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 3.27656E-01 1.57442E+02 -3.02588E-01 1.25694E-01 + 0.27318E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 2.20620E+01 1.33201E+02 -1.51026E+01 1.60823E+01 + 0.27318E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 1.13219E-07 1.77637E+02 -1.13122E-07 4.66835E-09 + 0.27318E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 8.67596E-07 -1.72027E+02 -8.59210E-07 -1.20342E-07 + 0.27318E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 4.89037E-05 1.48277E+02 -4.15976E-05 2.57140E-05 + 0.26737E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 1.13019E+01 -6.01149E+01 5.63134E+00 -9.79909E+00 + 0.26737E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 2.99987E-01 1.41394E+02 -2.34426E-01 1.87181E-01 + 0.26737E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 3.32916E+01 1.12690E+02 -1.28421E+01 3.07150E+01 + 0.26737E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 2.20507E-07 2.12216E+00 2.20356E-07 8.16541E-09 + 0.26737E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 2.21075E-07 3.55804E+01 1.79800E-07 1.28631E-07 + 0.26737E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 5.09003E-05 -1.24950E+02 -2.91591E-05 -4.17203E-05 + 0.26180E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 7.99829E+00 -9.05342E+01 -7.45716E-02 -7.99794E+00 + 0.26180E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 2.66862E-01 1.37892E+02 -1.97981E-01 1.78938E-01 + 0.26180E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 2.80110E+01 8.72752E+01 1.33161E+00 2.79793E+01 + 0.26180E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 2.73825E-07 -8.47528E+01 2.50421E-08 -2.72677E-07 + 0.26180E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 1.08591E-06 -3.59772E+00 1.08377E-06 -6.81418E-08 + 0.26180E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 2.84216E-05 4.12675E+01 2.13628E-05 1.87462E-05 + 0.25646E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 7.29096E+00 -6.45006E+01 3.13877E+00 -6.58075E+00 + 0.25646E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 4.27220E-01 1.10383E+02 -1.48796E-01 4.00470E-01 + 0.25646E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 1.81317E+01 1.07189E+02 -5.35836E+00 1.73219E+01 + 0.25646E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 7.07525E-07 -1.23654E+02 -3.92095E-07 -5.88943E-07 + 0.25646E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 1.55786E-06 1.77601E+02 -1.55650E-06 6.52164E-08 + 0.25646E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 3.01165E-05 -1.70642E+02 -2.97157E-05 -4.89709E-06 + 0.25133E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 2.59448E+00 -6.70593E+01 1.01127E+00 -2.38928E+00 + 0.25133E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 3.25521E-01 4.98786E+01 2.09769E-01 2.48919E-01 + 0.25133E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 6.00655E+00 1.17736E+02 -2.79542E+00 5.31642E+00 + 0.25133E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 1.82458E-07 -1.18820E+02 -8.79552E-08 -1.59859E-07 + 0.25133E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 9.86204E-07 -4.72762E+01 6.69104E-07 -7.24498E-07 + 0.25133E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 1.05273E-05 -4.22095E+01 7.79748E-06 -7.07269E-06 + 0.24640E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 5.17366E+00 1.41109E+02 -4.02689E+00 3.24822E+00 + 0.24640E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 1.85687E-01 7.01659E+01 6.30033E-02 1.74672E-01 + 0.24640E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 2.02830E+01 -3.44169E+01 1.67324E+01 -1.14642E+01 + 0.24640E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 2.69702E-07 8.02635E+01 4.56113E-08 2.65817E-07 + 0.24640E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 3.42506E-07 -1.31020E+02 -2.24794E-07 -2.58415E-07 + 0.24640E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 2.71281E-05 -1.71300E+02 -2.68160E-05 -4.10359E-06 + 0.24166E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 2.76828E+00 1.47300E+02 -2.32955E+00 1.49552E+00 + 0.24166E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 1.02645E-01 1.59569E+01 9.86897E-02 2.82186E-02 + 0.24166E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 1.71378E+01 -5.26421E+01 1.03991E+01 -1.36221E+01 + 0.24166E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 3.04986E-07 9.56008E+01 -2.97657E-08 3.03530E-07 + 0.24166E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 5.73683E-07 1.02895E+02 -1.28027E-07 5.59215E-07 + 0.24166E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 1.56979E-05 -1.14769E+02 -6.57668E-06 -1.42538E-05 + 0.23710E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 2.43158E+00 8.14088E+01 3.63236E-01 2.40429E+00 + 0.23710E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 1.47808E-01 -4.16521E+01 1.10441E-01 -9.82342E-02 + 0.23710E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 1.37722E+01 -1.06351E+02 -3.87715E+00 -1.32152E+01 + 0.23710E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 4.00765E-07 -2.43004E+01 3.65257E-07 -1.64923E-07 + 0.23710E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 5.09688E-07 -5.99222E+01 2.55443E-07 -4.41056E-07 + 0.23710E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 4.29191E-05 1.25306E+02 -2.48050E-05 3.50252E-05 + 0.23271E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 1.02444E+01 6.80769E+01 3.82486E+00 9.50359E+00 + 0.23271E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 1.57973E-01 -6.58440E+00 1.56931E-01 -1.81142E-02 + 0.23271E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 3.39747E+01 -1.12883E+02 -1.32111E+01 -3.13008E+01 + 0.23271E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 4.28036E-07 4.55328E+01 2.99839E-07 3.05469E-07 + 0.23271E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 5.81828E-07 7.80089E+01 1.20881E-07 5.69132E-07 + 0.23271E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 4.41702E-05 6.90202E+01 1.58146E-05 4.12420E-05 + 0.22848E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 5.65714E+00 7.04323E+01 1.89469E+00 5.33042E+00 + 0.22848E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 1.10597E-01 -1.35154E+01 1.07534E-01 -2.58473E-02 + 0.22848E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 1.92956E+01 -1.23952E+02 -1.07766E+01 -1.60058E+01 + 0.22848E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 2.68166E-07 -6.93827E+01 9.44277E-08 -2.50991E-07 + 0.22848E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 1.00113E-07 -1.19741E+02 -4.96639E-08 -8.69260E-08 + 0.22848E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 1.88369E-05 -1.74479E+01 1.79702E-05 -5.64803E-06 + 0.22440E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 1.10087E+00 -1.71519E+02 -1.08883E+00 -1.62367E-01 + 0.22440E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 1.74045E-02 8.44744E+01 1.67590E-03 1.73236E-02 + 0.22440E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 5.56289E+00 -1.78262E+02 -5.56033E+00 -1.68725E-01 + 0.22440E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 2.74492E-07 6.81162E-01 2.74472E-07 3.26322E-09 + 0.22440E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 1.27992E-07 1.67000E+02 -1.24711E-07 2.87921E-08 + 0.22440E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 6.25364E-05 1.69905E+02 -6.15682E-05 1.09618E-05 + 0.22046E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 4.47247E+00 -1.88813E+01 4.23181E+00 -1.44733E+00 + 0.22046E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 1.13956E-01 -7.35028E+01 3.23599E-02 -1.09265E-01 + 0.22046E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 1.73906E+01 1.67927E+02 -1.70060E+01 3.63732E+00 + 0.22046E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 2.41612E-07 -1.73961E+01 2.30561E-07 -7.22363E-08 + 0.22046E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 4.50429E-07 -1.47682E+02 -3.80654E-07 -2.40810E-07 + 0.22046E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 2.91983E-05 5.21217E+01 1.79274E-05 2.30467E-05 + 0.21666E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 2.95539E+00 -6.73292E+01 1.13912E+00 -2.72704E+00 + 0.21666E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 1.13982E-01 -2.84781E+01 1.00190E-01 -5.43490E-02 + 0.21666E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 4.38566E+00 8.12805E+01 6.64850E-01 4.33497E+00 + 0.21666E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 1.43990E-07 -1.20537E+02 -7.31597E-08 -1.24019E-07 + 0.21666E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 8.61525E-08 -8.26828E+01 1.09726E-08 -8.54509E-08 + 0.21666E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 2.05351E-05 1.18888E+02 -9.92042E-06 1.79798E-05 + 0.21299E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 5.61596E+00 -1.32259E+02 -3.77666E+00 -4.15642E+00 + 0.21299E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 1.56932E-01 6.59466E+00 1.55894E-01 1.80228E-02 + 0.21299E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 1.43336E+01 3.21472E+01 1.21360E+01 7.62686E+00 + 0.21299E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 3.48825E-07 -8.30874E+01 4.19832E-08 -3.46290E-07 + 0.21299E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 4.43192E-07 1.35480E+02 -3.15997E-07 3.10750E-07 + 0.21299E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 3.41270E-05 1.08578E+02 -1.08727E-05 3.23486E-05 + 0.20944E+01 0.13963E+02 0.00000E+00 0.00000E+00 1 4.31536E+00 -1.30250E+02 -2.78828E+00 -3.29360E+00 + 0.20944E+01 0.13963E+02 0.00000E+00 0.00000E+00 3 1.74395E-01 7.16270E+01 5.49696E-02 1.65505E-01 + 0.20944E+01 0.13963E+02 0.00000E+00 0.00000E+00 5 9.78913E+00 5.13508E+01 6.11380E+00 7.64517E+00 + 0.20944E+01 0.13963E+02 0.00000E+00 0.00000E+00 2 2.27885E-07 -1.00239E+02 -4.05077E-08 -2.24256E-07 + 0.20944E+01 0.13963E+02 0.00000E+00 0.00000E+00 4 1.84418E-07 -1.38058E+02 -1.37175E-07 -1.23260E-07 + 0.20944E+01 0.13963E+02 0.00000E+00 0.00000E+00 6 2.13743E-05 9.46769E+00 2.10831E-05 3.51589E-06 + 0.12566E+02 0.12566E+02 0.00000E+00 0.00000E+00 1 1.44918E-01 0.00000E+00 1.44918E-01 0.00000E+00 + 0.12566E+02 0.12566E+02 0.00000E+00 0.00000E+00 3 5.66995E+00 0.00000E+00 5.66995E+00 0.00000E+00 + 0.12566E+02 0.12566E+02 0.00000E+00 0.00000E+00 5 1.80042E+01 1.80000E+02 -1.80042E+01 0.00000E+00 + 0.12566E+02 0.12566E+02 0.00000E+00 0.00000E+00 2 1.44713E-05 0.00000E+00 1.44713E-05 0.00000E+00 + 0.12566E+02 0.12566E+02 0.00000E+00 0.00000E+00 4 2.22996E-04 0.00000E+00 2.22996E-04 0.00000E+00 + 0.12566E+02 0.12566E+02 0.00000E+00 0.00000E+00 6 1.14134E-05 0.00000E+00 1.14134E-05 0.00000E+00 + 0.11424E+02 0.12566E+02 0.00000E+00 0.00000E+00 1 6.29402E-01 -6.16589E+01 2.98790E-01 -5.53960E-01 + 0.11424E+02 0.12566E+02 0.00000E+00 0.00000E+00 3 6.20797E+00 -3.89884E+00 6.19360E+00 -4.22111E-01 + 0.11424E+02 0.12566E+02 0.00000E+00 0.00000E+00 5 3.10906E+01 1.31314E+02 -2.05253E+01 2.33524E+01 + 0.11424E+02 0.12566E+02 0.00000E+00 0.00000E+00 2 1.82994E-05 1.79962E+02 -1.82994E-05 1.20197E-08 + 0.11424E+02 0.12566E+02 0.00000E+00 0.00000E+00 4 1.06737E-05 -7.91235E+01 2.01405E-06 -1.04819E-05 + 0.11424E+02 0.12566E+02 0.00000E+00 0.00000E+00 6 2.51524E-04 1.42696E+01 2.43764E-04 6.19969E-05 + 0.10472E+02 0.12566E+02 0.00000E+00 0.00000E+00 1 1.71827E+00 -7.75240E+01 3.71197E-01 -1.67769E+00 + 0.10472E+02 0.12566E+02 0.00000E+00 0.00000E+00 3 7.60349E+00 -7.21246E+00 7.54332E+00 -9.54611E-01 + 0.10472E+02 0.12566E+02 0.00000E+00 0.00000E+00 5 6.06052E+01 1.06609E+02 -1.73230E+01 5.80767E+01 + 0.10472E+02 0.12566E+02 0.00000E+00 0.00000E+00 2 2.08654E-05 -7.40687E+00 2.06912E-05 -2.68984E-06 + 0.10472E+02 0.12566E+02 0.00000E+00 0.00000E+00 4 2.06168E-05 -8.53016E+01 1.68875E-06 -2.05475E-05 + 0.10472E+02 0.12566E+02 0.00000E+00 0.00000E+00 6 7.95063E-05 -6.04099E+01 3.92596E-05 -6.91371E-05 + 0.96664E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 3.39710E+00 -8.74676E+01 1.50100E-01 -3.39378E+00 + 0.96664E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 9.38225E+00 -9.17585E+00 9.26219E+00 -1.49614E+00 + 0.96664E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 1.06776E+02 9.28962E+01 -5.39509E+00 1.06640E+02 + 0.96664E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 4.62674E-06 1.66264E+01 4.43330E-06 1.32385E-06 + 0.96664E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 1.89906E-04 1.76319E+02 -1.89514E-04 1.21926E-05 + 0.96664E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 2.17346E-04 -1.24328E+02 -1.22567E-04 -1.79490E-04 + 0.89760E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 5.35820E+00 -9.65640E+01 -6.12513E-01 -5.32307E+00 + 0.89760E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 1.15445E+01 -1.02675E+01 1.13596E+01 -2.05774E+00 + 0.89760E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 1.70845E+02 8.44216E+01 1.66075E+01 1.70036E+02 + 0.89760E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 1.03862E-05 -8.85098E+01 2.70109E-07 -1.03827E-05 + 0.89760E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 1.10379E-04 1.15790E+02 -4.80237E-05 9.93838E-05 + 0.89760E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 9.82572E-05 -1.60849E+02 -9.28197E-05 -3.22334E-05 + 0.83776E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 7.07153E+00 -1.07571E+02 -2.13482E+00 -6.74160E+00 + 0.83776E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 1.37760E+01 -1.21302E+01 1.34684E+01 -2.89482E+00 + 0.83776E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 2.48344E+02 7.81978E+01 5.07947E+01 2.43094E+02 + 0.83776E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 8.04170E-06 -1.22001E+02 -4.26161E-06 -6.81965E-06 + 0.83776E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 1.06825E-04 8.67785E+01 6.00312E-06 1.06657E-04 + 0.83776E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 2.91972E-05 -1.50070E+01 2.82014E-05 -7.56025E-06 + 0.78540E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 7.92247E+00 -1.21324E+02 -4.11869E+00 -6.76771E+00 + 0.78540E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 1.52046E+01 -1.51919E+01 1.46732E+01 -3.98439E+00 + 0.78540E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 3.19893E+02 7.33618E+01 9.15939E+01 3.06500E+02 + 0.78540E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 8.84228E-06 -1.71229E+02 -8.73888E-06 -1.34829E-06 + 0.78540E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 6.12927E-05 1.18009E+02 -2.87840E-05 5.41136E-05 + 0.78540E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 1.44199E-05 1.45192E+02 -1.18398E-05 8.23120E-06 + 0.73920E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 8.07284E+00 -1.36402E+02 -5.84632E+00 -5.56699E+00 + 0.73920E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 1.54180E+01 -1.75342E+01 1.47016E+01 -4.64506E+00 + 0.73920E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 3.66095E+02 7.18426E+01 1.14085E+02 3.47865E+02 + 0.73920E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 9.90525E-06 1.00978E+01 9.75181E-06 1.73668E-06 + 0.73920E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 1.33946E-04 -1.71051E+02 -1.32316E-04 -2.08363E-05 + 0.73920E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 2.65916E-04 8.83498E+01 7.65765E-06 2.65805E-04 + 0.69813E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 8.63233E+00 -1.50717E+02 -7.52925E+00 -4.22226E+00 + 0.69813E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 1.53410E+01 -1.97665E+01 1.44371E+01 -5.18812E+00 + 0.69813E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 3.95868E+02 7.46513E+01 1.04784E+02 3.81748E+02 + 0.69813E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 1.03685E-05 1.65488E+02 -1.00377E-05 2.59811E-06 + 0.69813E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 7.85606E-05 -1.57148E+02 -7.23944E-05 -3.05094E-05 + 0.69813E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 2.49660E-04 1.19575E+02 -1.23224E-04 2.17131E-04 + 0.66139E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 1.09030E+01 -1.59910E+02 -1.02396E+01 -3.74508E+00 + 0.66139E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 1.59662E+01 -2.99671E+01 1.38317E+01 -7.97515E+00 + 0.66139E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 4.44492E+02 7.73928E+01 9.70172E+01 4.33775E+02 + 0.66139E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 1.85512E-06 7.46707E+00 1.83939E-06 2.41085E-07 + 0.66139E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 1.04039E-04 -1.70045E+02 -1.02472E-04 -1.79861E-05 + 0.66139E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 1.92222E-04 -1.68354E+02 -1.88265E-04 -3.88033E-05 + 0.62832E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 1.52105E+01 -1.69216E+02 -1.49419E+01 -2.84593E+00 + 0.62832E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 1.49193E+01 -5.46748E+01 8.62661E+00 -1.21724E+01 + 0.62832E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 4.55479E+02 6.98611E+01 1.56820E+02 4.27632E+02 + 0.62832E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 1.95254E-06 -1.22516E+02 -1.04955E-06 -1.64647E-06 + 0.62832E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 4.85812E-05 -9.08585E+01 -7.27906E-07 -4.85757E-05 + 0.62832E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 2.66049E-04 -1.60710E+02 -2.51112E-04 -8.78909E-05 + 0.59840E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 1.85467E+01 -1.74808E+02 -1.84706E+01 -1.67837E+00 + 0.59840E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 1.31504E+01 -7.83423E+01 2.65723E+00 -1.28792E+01 + 0.59840E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 3.68699E+02 6.29335E+01 1.67767E+02 3.28319E+02 + 0.59840E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 2.05691E-06 9.46434E+01 -1.66515E-07 2.05015E-06 + 0.59840E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 5.49058E-05 7.15204E+01 1.74033E-05 5.20746E-05 + 0.59840E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 4.52098E-04 -1.72723E+02 -4.48457E-04 -5.72665E-05 + 0.57120E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 2.08584E+01 -1.76595E+02 -2.08215E+01 -1.23897E+00 + 0.57120E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 1.35777E+01 -9.37760E+01 -8.94185E-01 -1.35483E+01 + 0.57120E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 2.82546E+02 6.36535E+01 1.25393E+02 2.53197E+02 + 0.57120E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 2.92542E-06 -1.19772E+02 -1.45261E-06 -2.53929E-06 + 0.57120E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 9.81379E-06 -2.42883E+01 8.94514E-06 -4.03669E-06 + 0.57120E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 5.68915E-05 1.53088E+02 -5.07301E-05 2.57506E-05 + 0.54636E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 1.98717E+01 1.76913E+02 -1.98429E+01 1.07011E+00 + 0.54636E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 1.51274E+01 -1.06941E+02 -4.40790E+00 -1.44710E+01 + 0.54636E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 2.57773E+02 5.86886E+01 1.33962E+02 2.20230E+02 + 0.54636E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 5.79982E-06 5.65158E+00 5.77162E-06 5.71159E-07 + 0.54636E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 5.48278E-05 7.26810E+01 1.63218E-05 5.23421E-05 + 0.54636E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 5.47797E-05 -1.30247E+01 5.33704E-05 -1.23458E-05 + 0.52360E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 1.31326E+01 1.61227E+02 -1.24339E+01 4.22639E+00 + 0.52360E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 1.48023E+01 -1.15314E+02 -6.32907E+00 -1.33810E+01 + 0.52360E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 2.30948E+02 3.59552E+01 1.86947E+02 1.35602E+02 + 0.52360E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 2.73704E-06 -8.73401E+01 1.27019E-07 -2.73409E-06 + 0.52360E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 5.51167E-06 1.48583E+02 -4.70362E-06 2.87305E-06 + 0.52360E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 1.67175E-04 1.60163E+02 -1.57255E-04 5.67310E-05 + 0.50265E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 6.52269E+00 9.30808E+01 -3.50558E-01 6.51326E+00 + 0.50265E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 1.33622E+01 -1.16108E+02 -5.88023E+00 -1.19988E+01 + 0.50265E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 2.11080E+02 1.79784E+00 2.10976E+02 6.62223E+00 + 0.50265E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 3.93142E-06 -1.68814E+02 -3.85673E-06 -7.62660E-07 + 0.50265E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 3.21222E-05 1.88883E+01 3.03924E-05 1.03987E-05 + 0.50265E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 2.86476E-04 3.47340E+01 2.35428E-04 1.63225E-04 + 0.48332E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 1.31269E+01 3.89035E+01 1.02154E+01 8.24385E+00 + 0.48332E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 1.25068E+01 -1.16716E+02 -5.62256E+00 -1.11717E+01 + 0.48332E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 2.20976E+02 -2.64173E+01 1.97901E+02 -9.83134E+01 + 0.48332E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 5.53590E-06 1.74025E+02 -5.50583E-06 5.76209E-07 + 0.48332E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 3.14916E-05 -8.92130E+01 4.32534E-07 -3.14886E-05 + 0.48332E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 3.76562E-04 1.25770E+02 -2.20111E-04 3.05533E-04 + 0.46542E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 2.32554E+01 2.98926E+01 2.01615E+01 1.15899E+01 + 0.46542E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 1.04737E+01 -1.23193E+02 -5.73396E+00 -8.76473E+00 + 0.46542E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 2.47700E+02 -5.25213E+01 1.50717E+02 -1.96569E+02 + 0.46542E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 1.99465E-06 -2.62283E+01 1.78928E-06 -8.81534E-07 + 0.46542E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 1.08511E-05 1.62389E+02 -1.03425E-05 3.28306E-06 + 0.46542E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 1.64797E-04 1.60355E+02 -1.55205E-04 5.54036E-05 + 0.44880E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 2.72308E+01 1.54926E+01 2.62414E+01 7.27371E+00 + 0.44880E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 9.68836E+00 -1.41782E+02 -7.61182E+00 -5.99370E+00 + 0.44880E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 1.80765E+02 -6.94587E+01 6.34273E+01 -1.69272E+02 + 0.44880E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 5.88309E-07 -1.16533E+02 -2.62802E-07 -5.26348E-07 + 0.44880E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 1.02136E-05 -3.39711E+01 8.47031E-06 -5.70708E-06 + 0.44880E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 2.03910E-04 1.20897E+02 -1.04706E-04 1.74974E-04 + 0.43332E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 1.99398E+01 -1.60268E+01 1.91648E+01 -5.50513E+00 + 0.43332E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 8.74055E+00 1.67069E+02 -8.51888E+00 1.95600E+00 + 0.43332E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 8.28113E+01 -2.06466E+01 7.74926E+01 -2.91995E+01 + 0.43332E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 1.23458E-06 -9.92870E+01 -1.99236E-07 -1.21840E-06 + 0.43332E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 7.87125E-06 1.55507E+02 -7.16291E-06 3.26333E-06 + 0.43332E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 1.15294E-04 -1.23863E+02 -6.42437E-05 -9.57365E-05 + 0.41888E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 1.62666E+01 -8.35191E+01 1.83605E+00 -1.61627E+01 + 0.41888E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 6.66280E+00 1.37696E+02 -4.92773E+00 4.48446E+00 + 0.41888E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 1.56148E+02 1.86099E+01 1.47983E+02 4.98304E+01 + 0.41888E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 2.47155E-06 4.41517E+01 1.77333E-06 1.72158E-06 + 0.41888E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 1.17018E-05 4.29149E+01 8.57000E-06 7.96788E-06 + 0.41888E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 3.12015E-04 -9.80112E+01 -4.34847E-05 -3.08970E-04 + 0.40537E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 2.36437E+01 -1.11250E+02 -8.56940E+00 -2.20361E+01 + 0.40537E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 7.61599E+00 1.12018E+02 -2.85522E+00 7.06053E+00 + 0.40537E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 1.55777E+02 3.82651E+01 1.22309E+02 9.64729E+01 + 0.40537E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 3.91903E-06 7.26029E+01 1.17176E-06 3.73976E-06 + 0.40537E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 1.51518E-05 -1.41311E+02 -1.18268E-05 -9.47126E-06 + 0.40537E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 2.82406E-04 -1.26589E+02 -1.68336E-04 -2.26752E-04 + 0.39270E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 3.73284E+01 -1.19806E+02 -1.85544E+01 -3.23905E+01 + 0.39270E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 3.59028E+00 1.03584E+02 -8.43233E-01 3.48985E+00 + 0.39270E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 1.54037E+02 5.19966E+01 9.48421E+01 1.21377E+02 + 0.39270E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 5.09803E-06 3.88213E+00 5.08634E-06 3.45158E-07 + 0.39270E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 1.19123E-05 1.73322E+02 -1.18315E-05 1.38532E-06 + 0.39270E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 3.01204E-04 1.07891E+02 -9.25305E-05 2.86639E-04 + 0.38080E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 3.13483E+01 -1.31794E+02 -2.08921E+01 -2.33717E+01 + 0.38080E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 2.40982E+00 1.53916E+02 -2.16439E+00 1.05956E+00 + 0.38080E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 1.02034E+02 6.94273E+01 3.58545E+01 9.55274E+01 + 0.38080E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 2.44629E-06 1.42798E+02 -1.94849E-06 1.47909E-06 + 0.38080E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 7.30394E-06 -1.55435E+02 -6.64288E-06 -3.03639E-06 + 0.38080E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 4.42547E-05 1.04215E+02 -1.08669E-05 4.28998E-05 + 0.36960E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 2.05356E+01 -1.42071E+02 -1.61979E+01 -1.26230E+01 + 0.36960E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 3.05422E+00 1.79775E+02 -3.05419E+00 1.20206E-02 + 0.36960E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 2.47966E+01 5.13586E+01 1.54841E+01 1.93679E+01 + 0.36960E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 1.20616E-06 6.80740E+01 4.50389E-07 1.11891E-06 + 0.36960E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 6.52470E-06 1.50411E+02 -5.67380E-06 3.22177E-06 + 0.36960E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 2.26663E-05 9.57458E+01 -2.26923E-06 2.25524E-05 + 0.35904E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 1.23286E+01 -1.56402E+02 -1.12976E+01 -4.93543E+00 + 0.35904E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 2.72399E+00 -1.78888E+02 -2.72348E+00 -5.28668E-02 + 0.35904E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 3.82394E+01 -2.97508E+01 3.31991E+01 -1.89755E+01 + 0.35904E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 8.60124E-07 8.04987E+01 1.41981E-07 8.48325E-07 + 0.35904E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 2.07401E-06 2.28871E+01 1.91073E-06 8.06616E-07 + 0.35904E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 9.30748E-05 -6.38084E+01 4.10808E-05 -8.35182E-05 + 0.34907E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 2.21049E+01 1.74554E+02 -2.20051E+01 2.09801E+00 + 0.34907E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 4.76022E-01 1.45960E+02 -3.94453E-01 2.66464E-01 + 0.34907E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 1.57906E+02 -2.76053E+01 1.39930E+02 -7.31705E+01 + 0.34907E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 1.38538E-06 -1.76129E+02 -1.38222E-06 -9.35190E-08 + 0.34907E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 2.76342E-06 1.53254E+02 -2.46776E-06 1.24364E-06 + 0.34907E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 2.32838E-04 1.77562E+02 -2.32627E-04 9.90279E-06 + 0.33963E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 2.09093E+01 1.64296E+02 -2.01288E+01 5.65930E+00 + 0.33963E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 2.47314E-01 -9.49312E+01 -2.12588E-02 -2.46398E-01 + 0.33963E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 1.67588E+02 -2.34425E+01 1.53755E+02 -6.66712E+01 + 0.33963E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 1.31079E-06 -1.56863E+02 -1.20536E-06 -5.15046E-07 + 0.33963E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 5.15861E-06 1.09948E+01 5.06392E-06 9.83848E-07 + 0.33963E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 1.48212E-04 -4.60172E+00 1.47735E-04 -1.18909E-05 + 0.33069E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 2.09897E+01 1.71965E+02 -2.07836E+01 2.93407E+00 + 0.33069E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 5.53715E-01 4.09561E+01 4.18172E-01 3.62949E-01 + 0.33069E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 1.49081E+02 -1.46176E+01 1.44256E+02 -3.76232E+01 + 0.33069E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 3.59690E-08 -1.02943E+02 -8.05665E-09 -3.50551E-08 + 0.33069E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 5.53721E-06 6.52536E+00 5.50134E-06 6.29265E-07 + 0.33069E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 4.74294E-05 -1.02062E+02 -9.91119E-06 -4.63822E-05 + 0.32221E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 9.27746E+00 1.23974E+02 -5.18440E+00 7.69372E+00 + 0.32221E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 8.14301E-01 5.74589E+01 4.38016E-01 6.86460E-01 + 0.32221E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 5.11866E+01 -3.44740E+01 4.21974E+01 -2.89732E+01 + 0.32221E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 1.24464E-06 -6.74536E+00 1.23602E-06 -1.46191E-07 + 0.32221E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 4.22200E-06 1.95890E+01 3.97764E-06 1.41551E-06 + 0.32221E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 1.63536E-04 8.94222E+01 1.64902E-06 1.63528E-04 + 0.31416E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 6.05071E+00 4.12428E+00 6.03504E+00 4.35167E-01 + 0.31416E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 5.43139E-01 5.71247E+01 2.94822E-01 4.56157E-01 + 0.31416E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 3.95439E+01 -1.76852E+02 -3.94843E+01 -2.17180E+00 + 0.31416E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 1.69047E-06 2.92275E+01 1.47525E-06 8.25422E-07 + 0.31416E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 4.72762E-06 -4.53808E+01 3.32064E-06 -3.36507E-06 + 0.31416E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 1.72636E-04 -9.05754E+01 -1.73373E-06 -1.72628E-04 + 0.30650E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 6.71696E+00 -5.23295E+00 6.68896E+00 -6.12622E-01 + 0.30650E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 9.76642E-01 -1.68819E+02 -9.58106E-01 -1.89376E-01 + 0.30650E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 5.48599E+01 -1.73799E+02 -5.45388E+01 -5.92607E+00 + 0.30650E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 4.81453E-07 -8.14232E+01 7.18012E-08 -4.76069E-07 + 0.30650E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 2.05895E-06 1.20991E+01 2.01321E-06 4.31561E-07 + 0.30650E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 1.73219E-04 9.41249E+01 -1.24598E-05 1.72770E-04 + 0.29920E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 4.79187E+00 -1.76561E+01 4.56614E+00 -1.45339E+00 + 0.29920E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 3.51239E-01 1.41064E+02 -2.73210E-01 2.20737E-01 + 0.29920E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 4.02044E+01 -1.76133E+02 -4.01129E+01 -2.71132E+00 + 0.29920E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 1.42904E-07 -8.01322E+01 2.44903E-08 -1.40790E-07 + 0.29920E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 3.74108E-06 8.75113E+01 1.62447E-07 3.73755E-06 + 0.29920E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 4.67586E-05 -8.08785E+00 4.62935E-05 -6.57852E-06 + 0.29224E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 1.11490E+01 -6.84144E+01 4.10164E+00 -1.03671E+01 + 0.29224E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 5.08898E-01 -7.51915E+01 1.30069E-01 -4.91995E-01 + 0.29224E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 2.93064E+01 1.12399E+02 -1.11675E+01 2.70953E+01 + 0.29224E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 2.25429E-07 1.00259E+01 2.21986E-07 3.92455E-08 + 0.29224E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 3.99880E-06 4.19562E+01 2.97373E-06 2.67345E-06 + 0.29224E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 7.47766E-05 1.28979E+02 -4.70374E-05 5.81293E-05 + 0.28560E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 1.16705E+01 -7.91062E+01 2.20561E+00 -1.14602E+01 + 0.28560E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 4.60889E-01 -5.20838E+01 2.83220E-01 -3.63600E-01 + 0.28560E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 3.21998E+01 1.03218E+02 -7.36284E+00 3.13467E+01 + 0.28560E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 1.47577E-06 -3.73590E+00 1.47264E-06 -9.61578E-08 + 0.28560E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 1.83244E-06 1.90852E+01 1.73171E-06 5.99158E-07 + 0.28560E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 7.25961E-05 1.61076E+01 6.97462E-05 2.01412E-05 + 0.27925E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 8.77274E+00 -5.54971E+01 4.96930E+00 -7.22960E+00 + 0.27925E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 2.43915E-01 -8.81435E+01 7.90177E-03 -2.43787E-01 + 0.27925E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 3.41434E+01 1.27164E+02 -2.06258E+01 2.72093E+01 + 0.27925E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 1.33772E-06 -3.79272E+01 1.05518E-06 -8.22241E-07 + 0.27925E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 1.54353E-06 -2.29058E+01 1.42181E-06 -6.00768E-07 + 0.27925E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 1.04475E-04 -4.09599E+01 7.88965E-05 -6.84868E-05 + 0.27318E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 5.54377E+00 -2.96452E+01 4.81812E+00 -2.74210E+00 + 0.27318E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 2.92635E-01 1.37631E+02 -2.16206E-01 1.97206E-01 + 0.27318E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 2.67688E+01 1.35341E+02 -1.90408E+01 1.88153E+01 + 0.27318E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 3.68283E-07 1.33898E+01 3.58272E-07 8.52849E-08 + 0.27318E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 1.45231E-06 -2.21949E+01 1.34470E-06 -5.48621E-07 + 0.27318E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 1.28245E-04 -1.27188E+02 -7.75146E-05 -1.02167E-04 + 0.26737E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 4.85298E+00 -3.22454E+01 4.10451E+00 -2.58929E+00 + 0.26737E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 4.56128E-01 1.34799E+02 -3.21400E-01 3.23659E-01 + 0.26737E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 1.67567E+01 1.31205E+02 -1.10385E+01 1.26070E+01 + 0.26737E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 1.05856E-07 -3.11551E+01 9.05885E-08 -5.47654E-08 + 0.26737E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 1.02563E-06 1.76809E+01 9.77184E-07 3.11501E-07 + 0.26737E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 7.43439E-05 1.35694E+01 7.22687E-05 1.74428E-05 + 0.26180E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 8.78520E+00 -9.08408E+01 -1.28910E-01 -8.78425E+00 + 0.26180E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 3.35465E-01 1.45375E+02 -2.76049E-01 1.90613E-01 + 0.26180E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 2.92732E+01 8.93932E+01 3.10033E-01 2.92716E+01 + 0.26180E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 1.68397E-07 1.33226E+02 -1.15331E-07 1.22704E-07 + 0.26180E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 4.19631E-07 -1.34857E+01 4.08061E-07 -9.78593E-08 + 0.26180E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 3.85027E-05 -1.21281E+02 -1.99921E-05 -3.29055E-05 + 0.25646E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 5.30995E+00 -9.23072E+01 -2.13763E-01 -5.30565E+00 + 0.25646E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 4.33922E-01 1.09287E+02 -1.43327E-01 4.09567E-01 + 0.25646E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 1.30370E+01 8.53510E+01 1.05668E+00 1.29942E+01 + 0.25646E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 3.69953E-07 1.54939E+02 -3.35125E-07 1.56704E-07 + 0.25646E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 2.60419E-07 -5.97941E+01 1.31019E-07 -2.25060E-07 + 0.25646E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 1.55400E-05 1.01879E+02 -3.19883E-06 1.52072E-05 + 0.25133E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 2.93842E+00 1.13034E+02 -1.14976E+00 2.70414E+00 + 0.25133E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 4.47864E-01 5.98596E+01 2.24881E-01 3.87312E-01 + 0.25133E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 7.09086E+00 -7.33945E+01 2.02642E+00 -6.79514E+00 + 0.25133E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 2.28683E-07 -1.49651E+02 -1.97345E-07 -1.15545E-07 + 0.25133E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 9.25343E-07 -9.86191E+01 -1.38676E-07 -9.14892E-07 + 0.25133E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 4.67072E-05 1.28142E+02 -2.88470E-05 3.67344E-05 + 0.24640E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 5.66527E+00 1.60312E+02 -5.33408E+00 1.90862E+00 + 0.24640E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 2.63424E-01 6.23310E+01 1.22324E-01 2.33300E-01 + 0.24640E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 2.23515E+01 -2.20663E+01 2.07142E+01 -8.39698E+00 + 0.24640E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 1.74526E-07 3.18876E+01 1.48188E-07 9.21943E-08 + 0.24640E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 4.88132E-07 -1.30533E+02 -3.17230E-07 -3.70995E-07 + 0.24640E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 7.74196E-05 -1.60998E+02 -7.32010E-05 -2.52073E-05 + 0.24166E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 8.71162E+00 1.40987E+02 -6.76895E+00 5.48394E+00 + 0.24166E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 1.93268E-01 2.14843E+01 1.79839E-01 7.07836E-02 + 0.24166E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 2.89172E+01 -4.81064E+01 1.93095E+01 -2.15256E+01 + 0.24166E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 1.37081E-07 1.26581E+02 -8.16944E-08 1.10078E-07 + 0.24166E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 5.54851E-07 -6.14500E+01 2.65177E-07 -4.87382E-07 + 0.24166E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 5.94113E-05 -1.01247E+02 -1.15876E-05 -5.82703E-05 + 0.23710E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 4.58416E+00 8.69277E+01 2.45697E-01 4.57757E+00 + 0.23710E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 2.56295E-01 -3.82047E+01 2.01398E-01 -1.58511E-01 + 0.23710E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 1.70330E+01 -9.56142E+01 -1.66632E+00 -1.69513E+01 + 0.23710E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 3.74745E-07 9.03955E+01 -2.58677E-09 3.74736E-07 + 0.23710E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 5.18912E-07 -1.07531E+02 -1.56311E-07 -4.94809E-07 + 0.23710E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 1.92854E-05 8.12059E+01 2.94843E-06 1.90587E-05 + 0.23271E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 9.55344E+00 7.53570E+01 2.41507E+00 9.24314E+00 + 0.23271E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 1.32144E-01 -6.03037E+00 1.31413E-01 -1.38825E-02 + 0.23271E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 3.37104E+01 -1.06699E+02 -9.68646E+00 -3.22887E+01 + 0.23271E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 3.30010E-07 2.21660E+01 3.05621E-07 1.24510E-07 + 0.23271E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 7.87076E-07 5.40753E+01 4.61794E-07 6.37366E-07 + 0.23271E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 1.19059E-04 -9.99486E+01 -2.05690E-05 -1.17268E-04 + 0.22848E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 7.52344E+00 7.76037E+01 1.61508E+00 7.34803E+00 + 0.22848E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 1.14096E-01 8.06521E+00 1.12968E-01 1.60077E-02 + 0.22848E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 2.22497E+01 -1.14518E+02 -9.23312E+00 -2.02435E+01 + 0.22848E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 2.02208E-07 1.43905E+02 -1.63392E-07 1.19127E-07 + 0.22848E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 1.08229E-07 4.92433E+01 7.06570E-08 8.19821E-08 + 0.22848E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 1.70588E-05 1.31201E+02 -1.12368E-05 1.28350E-05 + 0.22440E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 1.19630E+01 -5.91796E+01 6.12923E+00 -1.02736E+01 + 0.22440E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 4.61233E-02 1.21374E+02 -2.40126E-02 3.93796E-02 + 0.22440E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 2.52130E+01 1.34166E+02 -1.75668E+01 1.80859E+01 + 0.22440E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 1.72918E-07 -1.41798E+02 -1.35885E-07 -1.06940E-07 + 0.22440E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 3.07242E-07 -2.86981E+01 2.69501E-07 -1.47536E-07 + 0.22440E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 1.06373E-04 3.11057E+01 9.10781E-05 5.49541E-05 + 0.22046E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 7.48561E+00 -5.36897E+01 4.43267E+00 -6.03207E+00 + 0.22046E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 5.17763E-02 -6.74149E+01 1.98850E-02 -4.78055E-02 + 0.22046E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 2.32593E+01 1.46807E+02 -1.94642E+01 1.27334E+01 + 0.22046E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 4.17194E-07 1.25405E+02 -2.41704E-07 3.40044E-07 + 0.22046E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 3.19159E-07 1.75040E+01 3.04381E-07 9.59941E-08 + 0.22046E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 4.18025E-05 -1.70474E+02 -4.12261E-05 -6.91777E-06 + 0.21666E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 7.50829E+00 -5.78785E+01 3.99228E+00 -6.35893E+00 + 0.21666E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 7.19975E-02 -3.88003E-01 7.19959E-02 -4.87558E-04 + 0.21666E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 1.27719E+01 1.17832E+02 -5.96300E+00 1.12944E+01 + 0.21666E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 2.29077E-07 -4.26978E+01 1.68358E-07 -1.55345E-07 + 0.21666E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 8.88830E-08 -1.44515E+02 -7.23746E-08 -5.15957E-08 + 0.21666E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 2.21832E-05 8.96358E+01 1.40997E-07 2.21828E-05 + 0.21299E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 7.93741E+00 -1.43137E+02 -6.35052E+00 -4.76166E+00 + 0.21299E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 2.22559E-01 3.16348E+01 1.89488E-01 1.16733E-01 + 0.21299E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 1.63107E+01 2.80769E+01 1.43912E+01 7.67674E+00 + 0.21299E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 3.04003E-07 -3.08436E+01 2.61008E-07 -1.55861E-07 + 0.21299E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 4.74813E-07 -1.71089E+01 4.53801E-07 -1.39685E-07 + 0.21299E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 1.98892E-05 1.19761E+02 -9.87255E-06 1.72659E-05 + 0.20944E+01 0.12566E+02 0.00000E+00 0.00000E+00 1 6.40242E+00 -1.40942E+02 -4.97155E+00 -4.03420E+00 + 0.20944E+01 0.12566E+02 0.00000E+00 0.00000E+00 3 2.07836E-01 8.16789E+01 3.00783E-02 2.05648E-01 + 0.20944E+01 0.12566E+02 0.00000E+00 0.00000E+00 5 1.47142E+01 4.29795E+01 1.07648E+01 1.00312E+01 + 0.20944E+01 0.12566E+02 0.00000E+00 0.00000E+00 2 2.50066E-07 1.49186E+02 -2.14765E-07 1.28097E-07 + 0.20944E+01 0.12566E+02 0.00000E+00 0.00000E+00 4 1.56024E-07 -6.29793E+01 7.08837E-08 -1.38993E-07 + 0.20944E+01 0.12566E+02 0.00000E+00 0.00000E+00 6 4.22319E-06 8.23784E+01 5.60125E-07 4.18589E-06 + 0.11424E+02 0.11424E+02 0.00000E+00 0.00000E+00 1 5.52886E-01 0.00000E+00 5.52886E-01 0.00000E+00 + 0.11424E+02 0.11424E+02 0.00000E+00 0.00000E+00 3 7.61614E+00 0.00000E+00 7.61614E+00 0.00000E+00 + 0.11424E+02 0.11424E+02 0.00000E+00 0.00000E+00 5 2.74195E+01 1.80000E+02 -2.74195E+01 0.00000E+00 + 0.11424E+02 0.11424E+02 0.00000E+00 0.00000E+00 2 2.46888E-06 0.00000E+00 2.46888E-06 0.00000E+00 + 0.11424E+02 0.11424E+02 0.00000E+00 0.00000E+00 4 1.07269E-04 1.80000E+02 -1.07269E-04 0.00000E+00 + 0.11424E+02 0.11424E+02 0.00000E+00 0.00000E+00 6 2.84738E-04 1.80000E+02 -2.84738E-04 0.00000E+00 + 0.10472E+02 0.11424E+02 0.00000E+00 0.00000E+00 1 1.07584E+00 -4.56376E+01 7.52222E-01 -7.69152E-01 + 0.10472E+02 0.11424E+02 0.00000E+00 0.00000E+00 3 8.01415E+00 -3.73221E+00 7.99715E+00 -5.21667E-01 + 0.10472E+02 0.11424E+02 0.00000E+00 0.00000E+00 5 4.38407E+01 1.32009E+02 -2.93405E+01 3.25752E+01 + 0.10472E+02 0.11424E+02 0.00000E+00 0.00000E+00 2 2.28225E-06 -8.40272E+01 2.37484E-07 -2.26986E-06 + 0.10472E+02 0.11424E+02 0.00000E+00 0.00000E+00 4 3.28589E-04 4.96344E+00 3.27357E-04 2.84296E-05 + 0.10472E+02 0.11424E+02 0.00000E+00 0.00000E+00 6 6.78679E-05 -1.62170E+02 -6.46080E-05 -2.07813E-05 + 0.96664E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 2.22232E+00 -7.13236E+01 7.11637E-01 -2.10530E+00 + 0.96664E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 9.28925E+00 -6.37007E+00 9.23190E+00 -1.03064E+00 + 0.96664E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 7.98193E+01 1.07025E+02 -2.33705E+01 7.63212E+01 + 0.96664E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 6.60133E-06 1.54339E+02 -5.95025E-06 2.85867E-06 + 0.96664E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 8.32607E-05 1.35071E+02 -5.89472E-05 5.88012E-05 + 0.96664E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 2.11947E-05 1.07772E+02 -6.46933E-06 2.01832E-05 + 0.89760E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 3.87287E+00 -8.68925E+01 2.09943E-01 -3.86718E+00 + 0.89760E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 1.10842E+01 -8.02000E+00 1.09758E+01 -1.54646E+00 + 0.89760E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 1.33610E+02 9.31865E+01 -7.42679E+00 1.33403E+02 + 0.89760E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 8.62447E-06 1.76824E+02 -8.61122E-06 4.77887E-07 + 0.89760E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 2.98346E-04 -1.79996E+02 -2.98346E-04 -1.85666E-08 + 0.89760E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 4.86905E-05 -9.77517E+01 -6.56741E-06 -4.82455E-05 + 0.83776E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 5.51897E+00 -9.97617E+01 -9.35742E-01 -5.43906E+00 + 0.83776E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 1.32145E+01 -1.01375E+01 1.30082E+01 -2.32590E+00 + 0.83776E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 2.03297E+02 8.40557E+01 2.10538E+01 2.02204E+02 + 0.83776E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 3.36816E-06 6.52900E+01 1.40798E-06 3.05975E-06 + 0.83776E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 7.91324E-05 -1.58143E+02 -7.34442E-05 -2.94600E-05 + 0.83776E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 1.20143E-04 1.47782E+02 -1.01644E-04 6.40537E-05 + 0.78540E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 6.48956E+00 -1.12690E+02 -2.50332E+00 -5.98731E+00 + 0.78540E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 1.48104E+01 -1.31303E+01 1.44232E+01 -3.36443E+00 + 0.78540E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 2.74119E+02 7.76606E+01 5.85797E+01 2.67787E+02 + 0.78540E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 5.28272E-06 2.59653E+01 4.74948E-06 2.31292E-06 + 0.78540E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 1.78063E-04 1.40815E+02 -1.38019E-04 1.12504E-04 + 0.78540E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 1.02965E-04 -5.98710E+01 5.16833E-05 -8.90545E-05 + 0.73920E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 6.68346E+00 -1.25094E+02 -3.84244E+00 -5.46848E+00 + 0.73920E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 1.52904E+01 -1.47779E+01 1.47846E+01 -3.90015E+00 + 0.73920E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 3.27881E+02 7.53948E+01 8.26775E+01 3.17286E+02 + 0.73920E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 1.06125E-05 -1.39976E+02 -8.12683E-06 -6.82499E-06 + 0.73920E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 2.07293E-04 -1.42783E+02 -1.65077E-04 -1.25379E-04 + 0.73920E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 1.06680E-04 1.75739E+02 -1.06385E-04 7.92589E-06 + 0.69813E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 7.01422E+00 -1.36073E+02 -5.05179E+00 -4.86607E+00 + 0.69813E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 1.54568E+01 -1.49720E+01 1.49321E+01 -3.99322E+00 + 0.69813E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 3.69933E+02 7.80054E+01 7.68795E+01 3.61857E+02 + 0.69813E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 4.51715E-06 -2.63647E+01 4.04730E-06 -2.00599E-06 + 0.69813E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 3.52356E-05 -3.76041E+00 3.51598E-05 -2.31091E-06 + 0.69813E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 1.45622E-04 1.47939E+02 -1.23413E-04 7.72986E-05 + 0.66139E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 9.24092E+00 -1.44467E+02 -7.52006E+00 -5.37060E+00 + 0.66139E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 1.62733E+01 -2.13666E+01 1.51548E+01 -5.92891E+00 + 0.66139E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 4.31621E+02 8.07748E+01 6.91955E+01 4.26039E+02 + 0.66139E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 3.95865E-06 1.78833E+02 -3.95782E-06 8.06455E-08 + 0.66139E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 8.80039E-05 -2.75195E+01 7.80466E-05 -4.06622E-05 + 0.66139E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 5.22279E-05 -8.27116E+01 6.62586E-06 -5.18059E-05 + 0.62832E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 1.39608E+01 -1.58587E+02 -1.29972E+01 -5.09688E+00 + 0.62832E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 1.51776E+01 -4.11856E+01 1.14223E+01 -9.99444E+00 + 0.62832E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 4.55339E+02 7.38803E+01 1.26423E+02 4.37436E+02 + 0.62832E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 5.99484E-07 -1.05333E+02 -1.58525E-07 -5.78144E-07 + 0.62832E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 6.37787E-05 -9.79613E+01 -8.83361E-06 -6.31640E-05 + 0.62832E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 1.69273E-04 -5.30252E-02 1.69273E-04 -1.56656E-07 + 0.59840E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 1.80271E+01 -1.68400E+02 -1.76589E+01 -3.62484E+00 + 0.59840E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 1.29729E+01 -6.24902E+01 5.99220E+00 -1.15061E+01 + 0.59840E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 3.80295E+02 6.82866E+01 1.40696E+02 3.53311E+02 + 0.59840E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 3.22449E-07 2.86540E+01 2.82959E-07 1.54620E-07 + 0.59840E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 7.08562E-05 9.88427E+01 -1.08921E-05 7.00141E-05 + 0.59840E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 3.52522E-04 -7.70754E+00 3.49337E-04 -4.72791E-05 + 0.57120E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 2.13128E+01 -1.72743E+02 -2.11421E+01 -2.69229E+00 + 0.57120E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 1.32088E+01 -8.01370E+01 2.26258E+00 -1.30136E+01 + 0.57120E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 3.00124E+02 6.99231E+01 1.03027E+02 2.81887E+02 + 0.57120E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 2.19618E-06 4.84761E+01 1.45592E-06 1.64423E-06 + 0.57120E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 1.55329E-04 -8.62526E+01 1.01519E-05 -1.54997E-04 + 0.57120E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 6.56186E-05 1.20365E+02 -3.31706E-05 5.66173E-05 + 0.54636E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 2.14721E+01 -1.79014E+02 -2.14689E+01 -3.69586E-01 + 0.54636E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 1.53133E+01 -9.81901E+01 -2.18149E+00 -1.51571E+01 + 0.54636E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 2.70023E+02 6.64328E+01 1.07962E+02 2.47501E+02 + 0.54636E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 1.41466E-06 1.10857E+02 -5.03661E-07 1.32196E-06 + 0.54636E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 3.31634E-05 -4.97289E+01 2.14370E-05 -2.53035E-05 + 0.54636E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 1.36052E-05 1.27743E+01 1.32685E-05 3.00828E-06 + 0.52360E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 1.59750E+01 1.71337E+02 -1.57927E+01 2.40622E+00 + 0.52360E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 1.55681E+01 -1.11248E+02 -5.64187E+00 -1.45099E+01 + 0.52360E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 2.30858E+02 4.82121E+01 1.53838E+02 1.72132E+02 + 0.52360E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 9.44541E-06 7.31361E+00 9.36857E-06 1.20240E-06 + 0.52360E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 2.26169E-05 -5.76619E+01 1.20981E-05 -1.91092E-05 + 0.52360E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 1.22505E-04 -1.45640E+02 -1.01129E-04 -6.91399E-05 + 0.50265E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 7.32881E+00 1.39933E+02 -5.60870E+00 4.71741E+00 + 0.50265E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 1.44622E+01 -1.14727E+02 -6.04957E+00 -1.31361E+01 + 0.50265E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 1.97880E+02 2.06315E+01 1.85189E+02 6.97245E+01 + 0.50265E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 8.29921E-06 -1.82714E+01 7.88078E-06 -2.60196E-06 + 0.50265E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 6.01276E-05 1.10012E+02 -2.05763E-05 5.64973E-05 + 0.50265E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 1.73230E-04 1.43253E+02 -1.38806E-04 1.03641E-04 + 0.48332E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 9.83120E+00 6.72971E+01 3.79437E+00 9.06946E+00 + 0.48332E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 1.34730E+01 -1.17609E+02 -6.24395E+00 -1.19388E+01 + 0.48332E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 2.11208E+02 -2.85266E+00 2.10946E+02 -1.05113E+01 + 0.48332E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 3.17940E-06 1.17690E+02 -1.47743E-06 2.81527E-06 + 0.48332E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 1.60326E-05 -1.19584E+02 -7.91535E-06 -1.39424E-05 + 0.48332E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 7.35731E-05 1.25322E+02 -4.25374E-05 6.00297E-05 + 0.46542E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 2.38494E+01 4.17990E+01 1.77794E+01 1.58961E+01 + 0.46542E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 1.08087E+01 -1.21589E+02 -5.66177E+00 -9.20715E+00 + 0.46542E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 2.72755E+02 -3.20884E+01 2.31086E+02 -1.44895E+02 + 0.46542E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 3.66296E-06 6.49269E+01 1.55227E-06 3.31779E-06 + 0.46542E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 3.53896E-05 9.37035E+01 -2.28594E-06 3.53157E-05 + 0.46542E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 3.27355E-04 6.59141E+01 1.33595E-04 2.98854E-04 + 0.44880E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 3.17619E+01 2.20325E+01 2.94424E+01 1.19149E+01 + 0.44880E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 9.03515E+00 -1.28218E+02 -5.58964E+00 -7.09859E+00 + 0.44880E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 2.48160E+02 -5.62747E+01 1.37782E+02 -2.06397E+02 + 0.44880E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 1.47685E-06 4.39922E+00 1.47249E-06 1.13282E-07 + 0.44880E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 4.13057E-05 -1.36531E+00 4.12940E-05 -9.84184E-07 + 0.44880E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 2.84354E-04 3.33651E+01 2.37487E-04 1.56387E-04 + 0.43332E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 2.47808E+01 -5.79049E+00 2.46544E+01 -2.50017E+00 + 0.43332E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 8.49370E+00 -1.56742E+02 -7.80346E+00 -3.35394E+00 + 0.43332E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 1.25418E+02 -4.72432E+01 8.51451E+01 -9.20874E+01 + 0.43332E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 5.47829E-07 -1.42296E+02 -4.33431E-07 -3.35044E-07 + 0.43332E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 5.14097E-06 -4.99476E+00 5.12145E-06 -4.47596E-07 + 0.43332E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 8.20228E-05 -3.96309E+01 6.31714E-05 -5.23174E-05 + 0.41888E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 1.48241E+01 -6.60158E+01 6.02580E+00 -1.35442E+01 + 0.41888E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 8.51101E+00 1.70162E+02 -8.38586E+00 1.45417E+00 + 0.41888E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 1.37681E+02 8.97866E+00 1.35994E+02 2.14874E+01 + 0.41888E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 9.60461E-07 9.68317E+01 -1.14251E-07 9.53641E-07 + 0.41888E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 1.30980E-05 -4.32117E+00 1.30608E-05 -9.86896E-07 + 0.41888E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 3.77242E-04 8.39823E+01 3.95483E-05 3.75163E-04 + 0.40537E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 1.91042E+01 -1.05832E+02 -5.21199E+00 -1.83795E+01 + 0.40537E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 1.10779E+01 1.29940E+02 -7.11184E+00 8.49358E+00 + 0.40537E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 1.51350E+02 3.73110E+01 1.20377E+02 9.17391E+01 + 0.40537E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 4.85016E-06 -2.59738E+01 4.36026E-06 -2.12417E-06 + 0.40537E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 2.01071E-05 8.57297E+01 1.49722E-06 2.00512E-05 + 0.40537E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 3.80629E-04 1.30582E+02 -2.47610E-04 2.89080E-04 + 0.39270E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 3.59839E+01 -1.10895E+02 -1.28338E+01 -3.36174E+01 + 0.39270E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 5.51054E+00 1.02294E+02 -1.17332E+00 5.38418E+00 + 0.39270E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 1.96852E+02 5.11255E+01 1.23548E+02 1.53254E+02 + 0.39270E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 2.81271E-06 1.76826E+02 -2.80840E-06 1.55743E-07 + 0.39270E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 1.73905E-06 -1.55990E+02 -1.58857E-06 -7.07619E-07 + 0.39270E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 1.43840E-04 3.66977E+01 1.15331E-04 8.59577E-05 + 0.38080E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 3.84714E+01 -1.23053E+02 -2.09831E+01 -3.22453E+01 + 0.38080E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 2.40433E+00 1.45965E+02 -1.99244E+00 1.34572E+00 + 0.38080E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 1.31052E+02 5.76937E+01 7.00404E+01 1.10766E+02 + 0.38080E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 6.78582E-07 -1.15020E+02 -2.86994E-07 -6.14904E-07 + 0.38080E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 9.52393E-06 -1.67571E+02 -9.30071E-06 -2.04988E-06 + 0.38080E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 8.60633E-05 -8.22751E+01 1.15683E-05 -8.52823E-05 + 0.36960E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 2.87776E+01 -1.34059E+02 -2.00119E+01 -2.06802E+01 + 0.36960E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 3.05265E+00 -1.72112E+02 -3.02377E+00 -4.18911E-01 + 0.36960E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 5.17719E+01 5.57868E+01 2.91100E+01 4.28128E+01 + 0.36960E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 2.31579E-06 -5.36590E+01 1.37231E-06 -1.86538E-06 + 0.36960E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 4.38242E-06 -7.58876E+01 1.06854E-06 -4.25016E-06 + 0.36960E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 1.97754E-04 -4.10344E+00 1.97247E-04 -1.41507E-05 + 0.35904E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 1.51059E+01 -1.48666E+02 -1.29028E+01 -7.85544E+00 + 0.35904E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 2.86446E+00 -1.56472E+02 -2.62632E+00 -1.14349E+00 + 0.35904E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 2.84525E+01 -1.74203E+01 2.71475E+01 -8.51807E+00 + 0.35904E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 2.45075E-06 1.63821E+01 2.35126E-06 6.91216E-07 + 0.35904E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 5.57041E-06 1.89241E+01 5.26932E-06 1.80656E-06 + 0.35904E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 1.02035E-04 -1.67346E+02 -9.95569E-05 -2.23526E-05 + 0.34907E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 1.99469E+01 -1.78038E+02 -1.99352E+01 -6.83063E-01 + 0.34907E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 2.33988E+00 -1.57223E+02 -2.15742E+00 -9.05862E-01 + 0.34907E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 1.42159E+02 -2.34478E+01 1.30420E+02 -5.65671E+01 + 0.34907E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 7.20524E-07 3.07256E+01 6.19379E-07 3.68135E-07 + 0.34907E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 9.40309E-06 1.67237E+02 -9.17078E-06 2.07724E-06 + 0.34907E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 8.09187E-05 5.57508E+00 8.05359E-05 7.86125E-06 + 0.33963E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 1.97565E+01 1.64934E+02 -1.90774E+01 5.13533E+00 + 0.33963E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 2.39419E-01 -1.00967E+02 -4.55480E-02 -2.35046E-01 + 0.33963E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 1.68147E+02 -2.13600E+01 1.56597E+02 -6.12437E+01 + 0.33963E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 1.07239E-06 -1.38402E+02 -8.01961E-07 -7.11953E-07 + 0.33963E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 3.26883E-06 7.39318E+01 9.04752E-07 3.14113E-06 + 0.33963E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 3.25949E-05 -1.70183E+02 -3.21176E-05 -5.55757E-06 + 0.33069E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 1.76244E+01 1.74240E+02 -1.75355E+01 1.76870E+00 + 0.33069E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 5.58779E-01 2.55570E+01 5.04106E-01 2.41062E-01 + 0.33069E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 1.59431E+02 -7.30104E+00 1.58138E+02 -2.02609E+01 + 0.33069E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 9.20213E-07 1.56171E+02 -8.41769E-07 3.71777E-07 + 0.33069E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 3.43460E-06 1.12168E+02 -1.29594E-06 3.18073E-06 + 0.33069E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 8.48938E-05 -1.53364E+02 -7.58844E-05 -3.80594E-05 + 0.32221E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 1.07628E+01 1.69785E+02 -1.05922E+01 1.90874E+00 + 0.32221E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 8.91852E-01 6.40419E+01 3.90376E-01 8.01877E-01 + 0.32221E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 8.88647E+01 -8.66132E+00 8.78513E+01 -1.33824E+01 + 0.32221E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 2.29903E-06 1.60041E+02 -2.16094E-06 7.84781E-07 + 0.32221E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 1.32861E-06 -7.47682E+01 3.49058E-07 -1.28193E-06 + 0.32221E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 1.71810E-05 1.05976E+02 -4.72874E-06 1.65174E-05 + 0.31416E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 6.01420E+00 2.28973E+01 5.54030E+00 2.34001E+00 + 0.31416E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 1.18823E+00 8.30588E+01 1.43598E-01 1.17953E+00 + 0.31416E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 4.28989E+01 -1.71438E+02 -4.24209E+01 -6.38642E+00 + 0.31416E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 6.83860E-07 2.85897E+00 6.83008E-07 3.41093E-08 + 0.31416E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 4.72281E-06 3.13178E+01 4.03469E-06 2.45484E-06 + 0.31416E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 4.76450E-05 -9.80831E+01 -6.69934E-06 -4.71716E-05 + 0.30650E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 1.10484E+01 -3.72771E+00 1.10250E+01 -7.18311E-01 + 0.30650E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 3.34777E-01 9.15893E+01 -9.28524E-03 3.34648E-01 + 0.30650E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 7.76037E+01 1.77539E+02 -7.75321E+01 3.33258E+00 + 0.30650E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 6.51427E-07 -1.77344E+02 -6.50727E-07 -3.01869E-08 + 0.30650E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 2.84635E-06 1.55538E+01 2.74211E-06 7.63229E-07 + 0.30650E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 1.32478E-04 -9.60738E+01 -1.40174E-05 -1.31735E-04 + 0.29920E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 8.93437E+00 -6.46004E+00 8.87765E+00 -1.00521E+00 + 0.29920E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 4.61478E-01 1.79840E+02 -4.61477E-01 1.28904E-03 + 0.29920E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 5.78243E+01 -1.76295E+02 -5.77034E+01 -3.73608E+00 + 0.29920E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 7.49650E-07 -1.05173E+02 -1.96214E-07 -7.23516E-07 + 0.29920E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 6.84540E-07 -9.28762E+01 -3.43486E-08 -6.83677E-07 + 0.29920E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 6.68868E-05 -1.54806E+01 6.44602E-05 -1.78528E-05 + 0.29224E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 1.08630E+01 -5.42324E+01 6.34941E+00 -8.81417E+00 + 0.29224E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 5.09819E-01 -5.44161E+01 2.96661E-01 -4.14617E-01 + 0.29224E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 2.92214E+01 1.46773E+02 -2.44439E+01 1.60121E+01 + 0.29224E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 2.22105E-06 -1.39749E+02 -1.69515E-06 -1.43510E-06 + 0.29224E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 2.88404E-06 -6.57303E+01 1.18543E-06 -2.62915E-06 + 0.29224E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 7.78664E-05 -1.46844E+02 -6.51883E-05 -4.25872E-05 + 0.28560E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 1.16517E+01 -7.92176E+01 2.17980E+00 -1.14460E+01 + 0.28560E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 6.68511E-01 -3.60347E+01 5.40599E-01 -3.93268E-01 + 0.28560E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 3.25748E+01 9.90045E+01 -5.09834E+00 3.21734E+01 + 0.28560E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 4.00319E-07 -2.79053E+01 3.53771E-07 -1.87354E-07 + 0.28560E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 2.62824E-06 -2.71402E+01 2.33885E-06 -1.19892E-06 + 0.28560E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 7.18330E-05 1.16719E+02 -3.22976E-05 6.41626E-05 + 0.27925E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 9.26347E+00 -5.54354E+01 5.25550E+00 -7.62834E+00 + 0.27925E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 3.39031E-01 -3.20047E+01 2.87500E-01 -1.79683E-01 + 0.27925E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 3.26244E+01 1.23231E+02 -1.78785E+01 2.72893E+01 + 0.27925E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 9.73594E-07 -6.27074E+01 4.46426E-07 -8.65210E-07 + 0.27925E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 5.20177E-06 -1.68526E+02 -5.09782E-06 -1.03473E-06 + 0.27925E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 2.54500E-05 -1.38319E+02 -1.90076E-05 -1.69238E-05 + 0.27318E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 3.36346E+00 -2.84000E+01 2.95866E+00 -1.59974E+00 + 0.27318E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 3.66536E-01 1.45557E+02 -3.02279E-01 2.07306E-01 + 0.27318E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 2.06054E+01 1.41671E+02 -1.61641E+01 1.27791E+01 + 0.27318E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 1.49960E-06 1.23687E+02 -8.31759E-07 1.24779E-06 + 0.27318E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 1.49415E-06 -7.73120E+01 3.28179E-07 -1.45766E-06 + 0.27318E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 3.40551E-05 7.82587E+01 6.93000E-06 3.33426E-05 + 0.26737E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 2.35055E+00 -3.39742E+01 1.94929E+00 -1.31354E+00 + 0.26737E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 5.42631E-01 1.48230E+02 -4.61328E-01 2.85702E-01 + 0.26737E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 1.57326E+01 1.33197E+02 -1.07691E+01 1.14691E+01 + 0.26737E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 1.39085E-07 4.31347E+01 1.01497E-07 9.50945E-08 + 0.26737E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 6.17779E-07 8.14461E+01 9.18880E-08 6.10907E-07 + 0.26737E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 2.09870E-05 8.63649E+01 1.33062E-06 2.09448E-05 + 0.26180E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 3.27787E+00 -8.38017E+01 3.53910E-01 -3.25871E+00 + 0.26180E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 4.46467E-01 1.43118E+02 -3.57117E-01 2.67956E-01 + 0.26180E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 1.25152E+01 1.01424E+02 -2.47892E+00 1.22673E+01 + 0.26180E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 4.45660E-07 6.96161E+01 1.55227E-07 4.17753E-07 + 0.26180E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 3.00172E-06 -2.48830E+00 2.99889E-06 -1.30321E-07 + 0.26180E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 1.11844E-04 -7.53855E+01 2.82198E-05 -1.08225E-04 + 0.25646E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 9.59907E+00 -1.00597E+02 -1.76522E+00 -9.43537E+00 + 0.25646E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 5.50063E-01 1.24196E+02 -3.09148E-01 4.54969E-01 + 0.25646E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 2.28158E+01 7.28893E+01 6.71285E+00 2.18059E+01 + 0.25646E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 3.59562E-07 -1.07837E+02 -1.10136E-07 -3.42279E-07 + 0.25646E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 1.04146E-06 4.48361E+01 7.38525E-07 7.34312E-07 + 0.25646E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 2.81615E-05 -3.86055E+01 2.20071E-05 -1.75715E-05 + 0.25133E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 6.20755E+00 -1.73840E+02 -6.17170E+00 -6.66129E-01 + 0.25133E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 4.32710E-01 6.99394E+01 1.48426E-01 4.06458E-01 + 0.25133E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 1.40465E+01 5.41047E+00 1.39839E+01 1.32445E+00 + 0.25133E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 7.23478E-07 -1.23290E+02 -3.97104E-07 -6.04755E-07 + 0.25133E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 2.13409E-06 1.18874E+02 -1.03051E-06 1.86880E-06 + 0.25133E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 5.96186E-05 1.71393E+02 -5.89472E-05 8.92211E-06 + 0.24640E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 5.04594E+00 1.71055E+02 -4.98456E+00 7.84593E-01 + 0.24640E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 4.44514E-01 6.68837E+01 1.74516E-01 4.08824E-01 + 0.24640E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 2.04268E+01 -1.78403E+01 1.94446E+01 -6.25807E+00 + 0.24640E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 1.24086E-07 -1.08637E+02 -3.96545E-08 -1.17579E-07 + 0.24640E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 4.69579E-07 -6.35839E+01 2.08910E-07 -4.20549E-07 + 0.24640E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 7.05477E-05 1.76840E+02 -7.04404E-05 3.88906E-06 + 0.24166E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 1.23601E+01 -1.77374E+02 -1.23471E+01 -5.66241E-01 + 0.24166E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 2.83458E-01 5.39803E+01 1.66691E-01 2.29265E-01 + 0.24166E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 3.58786E+01 -1.63894E+01 3.44207E+01 -1.01237E+01 + 0.24166E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 6.53885E-07 1.02156E+02 -1.37693E-07 6.39223E-07 + 0.24166E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 1.60188E-07 9.32899E+00 1.58069E-07 2.59669E-08 + 0.24166E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 3.97484E-05 1.00808E+02 -7.45372E-06 3.90433E-05 + 0.23710E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 9.05879E+00 1.48321E+02 -7.70904E+00 4.75735E+00 + 0.23710E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 2.83275E-01 -1.23465E+01 2.76724E-01 -6.05707E-02 + 0.23710E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 2.26275E+01 -4.58760E+01 1.57536E+01 -1.62428E+01 + 0.23710E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 2.82577E-07 -1.73977E+02 -2.81017E-07 -2.96491E-08 + 0.23710E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 7.51741E-07 1.78825E+02 -7.51583E-07 1.54107E-08 + 0.23710E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 3.58474E-05 6.53862E+01 1.49304E-05 3.25901E-05 + 0.23271E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 6.62554E+00 8.18698E+01 9.37005E-01 6.55895E+00 + 0.23271E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 2.51119E-01 -2.02880E+01 2.35540E-01 -8.70725E-02 + 0.23271E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 2.60114E+01 -1.03872E+02 -6.23640E+00 -2.52527E+01 + 0.23271E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 3.40837E-07 -1.63055E+02 -3.26041E-07 -9.93355E-08 + 0.23271E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 7.60401E-07 9.38621E+01 -5.12167E-08 7.58674E-07 + 0.23271E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 8.46377E-06 2.66607E+00 8.45461E-06 3.93692E-07 + 0.22848E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 7.18863E+00 7.44277E+01 1.92982E+00 6.92476E+00 + 0.22848E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 1.28971E-01 -5.45284E+00 1.28387E-01 -1.22556E-02 + 0.22848E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 2.29567E+01 -1.16842E+02 -1.03657E+01 -2.04833E+01 + 0.22848E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 1.19347E-07 1.27871E+02 -7.32655E-08 9.42119E-08 + 0.22848E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 2.49910E-07 1.58433E+01 2.40416E-07 6.82274E-08 + 0.22848E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 2.16794E-05 -1.48615E+02 -1.85074E-05 -1.12903E-05 + 0.22440E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 9.15326E+00 1.61238E+01 8.79321E+00 2.54198E+00 + 0.22440E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 6.86431E-02 1.15782E+02 -2.98557E-02 6.18103E-02 + 0.22440E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 2.31835E+01 -1.62816E+02 -2.21487E+01 -6.84921E+00 + 0.22440E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 8.57953E-08 -1.78771E+02 -8.57756E-08 -1.84075E-09 + 0.22440E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 3.62970E-07 1.26204E+01 3.54201E-07 7.93055E-08 + 0.22440E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 3.68366E-05 1.34013E+01 3.58336E-05 8.53760E-06 + 0.22046E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 1.25473E+01 -3.56660E+01 1.01938E+01 -7.31580E+00 + 0.22046E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 2.54400E-02 -1.07895E+02 -7.81701E-03 -2.42093E-02 + 0.22046E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 3.32286E+01 1.51818E+02 -2.92895E+01 1.56929E+01 + 0.22046E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 7.02854E-07 -5.24116E+01 4.28731E-07 -5.56950E-07 + 0.22046E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 1.67409E-07 1.29480E+02 -1.06440E-07 1.29214E-07 + 0.22046E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 4.83284E-05 -6.93331E+01 1.70568E-05 -4.52184E-05 + 0.21666E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 1.30831E+01 -3.88915E+01 1.01831E+01 -8.21422E+00 + 0.21666E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 4.28189E-02 -1.09191E+02 -1.40751E-02 -4.04394E-02 + 0.21666E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 2.50094E+01 1.41451E+02 -1.95593E+01 1.55854E+01 + 0.21666E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 2.53029E-07 -1.64215E+02 -2.43486E-07 -6.88318E-08 + 0.21666E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 6.87723E-08 2.32777E+01 6.31742E-08 2.71780E-08 + 0.21666E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 8.27993E-05 8.52833E+01 6.80845E-06 8.25189E-05 + 0.21299E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 9.20374E+00 -7.38266E+01 2.56366E+00 -8.83948E+00 + 0.21299E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 1.44859E-01 4.27070E+01 1.06447E-01 9.82506E-02 + 0.21299E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 1.31573E+01 9.48996E+01 -1.12376E+00 1.31092E+01 + 0.21299E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 8.29235E-07 -1.15542E+01 8.12431E-07 -1.66092E-07 + 0.21299E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 5.77952E-07 1.35318E+02 -4.10939E-07 4.06396E-07 + 0.21299E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 4.11999E-05 -1.73076E+01 3.93344E-05 -1.22570E-05 + 0.20944E+01 0.11424E+02 0.00000E+00 0.00000E+00 1 6.86831E+00 -7.87858E+01 1.33573E+00 -6.73718E+00 + 0.20944E+01 0.11424E+02 0.00000E+00 0.00000E+00 3 1.11364E-01 6.79465E+01 4.18139E-02 1.03216E-01 + 0.20944E+01 0.11424E+02 0.00000E+00 0.00000E+00 5 1.30105E+01 8.69383E+01 6.94919E-01 1.29920E+01 + 0.20944E+01 0.11424E+02 0.00000E+00 0.00000E+00 2 1.14482E-07 9.28884E+01 -5.76876E-09 1.14336E-07 + 0.20944E+01 0.11424E+02 0.00000E+00 0.00000E+00 4 1.92694E-07 4.51741E+00 1.92095E-07 1.51769E-08 + 0.20944E+01 0.11424E+02 0.00000E+00 0.00000E+00 6 2.87561E-05 -5.78102E+01 1.53191E-05 -2.43359E-05 + 0.10472E+02 0.10472E+02 0.00000E+00 0.00000E+00 1 1.03269E+00 0.00000E+00 1.03269E+00 0.00000E+00 + 0.10472E+02 0.10472E+02 0.00000E+00 0.00000E+00 3 9.20949E+00 0.00000E+00 9.20949E+00 0.00000E+00 + 0.10472E+02 0.10472E+02 0.00000E+00 0.00000E+00 5 3.57161E+01 1.80000E+02 -3.57161E+01 0.00000E+00 + 0.10472E+02 0.10472E+02 0.00000E+00 0.00000E+00 2 3.23486E-06 0.00000E+00 3.23486E-06 0.00000E+00 + 0.10472E+02 0.10472E+02 0.00000E+00 0.00000E+00 4 1.78386E-04 0.00000E+00 1.78386E-04 0.00000E+00 + 0.10472E+02 0.10472E+02 0.00000E+00 0.00000E+00 6 1.09596E-04 1.80000E+02 -1.09596E-04 0.00000E+00 + 0.96664E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 1.40929E+00 -3.92500E+01 1.09135E+00 -8.91667E-01 + 0.96664E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 9.42857E+00 -3.04061E+00 9.41530E+00 -5.00127E-01 + 0.96664E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 5.34658E+01 1.30707E+02 -3.48701E+01 4.05299E+01 + 0.96664E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 8.44722E-07 -1.55802E+02 -7.70499E-07 -3.46247E-07 + 0.96664E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 1.16065E-04 -1.70023E+02 -1.14310E-04 -2.01086E-05 + 0.96664E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 1.43730E-04 1.55685E+02 -1.30980E-04 5.91821E-05 + 0.89760E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 2.34228E+00 -7.04912E+01 7.82207E-01 -2.20781E+00 + 0.89760E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 1.06809E+01 -5.35182E+00 1.06344E+01 -9.96221E-01 + 0.89760E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 9.43069E+01 1.05605E+02 -2.53696E+01 9.08304E+01 + 0.89760E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 1.85863E-05 -1.79635E+02 -1.85859E-05 -1.18289E-07 + 0.89760E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 6.88392E-06 5.35298E+00 6.85390E-06 6.42210E-07 + 0.89760E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 4.37840E-05 -1.66067E+02 -4.24958E-05 -1.05429E-05 + 0.83776E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 3.65725E+00 -8.97399E+01 1.66016E-02 -3.65722E+00 + 0.83776E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 1.24618E+01 -8.03282E+00 1.23395E+01 -1.74142E+00 + 0.83776E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 1.52315E+02 9.15962E+01 -4.24290E+00 1.52256E+02 + 0.83776E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 6.45697E-06 7.34198E+01 1.84254E-06 6.18849E-06 + 0.83776E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 2.04187E-04 2.25657E+00 2.04028E-04 8.03973E-06 + 0.83776E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 4.84269E-04 9.18824E+01 -1.59074E-05 4.84007E-04 + 0.78540E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 4.73257E+00 -1.02555E+02 -1.02878E+00 -4.61940E+00 + 0.78540E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 1.40403E+01 -1.12480E+01 1.37706E+01 -2.73865E+00 + 0.78540E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 2.17433E+02 8.28221E+01 2.71683E+01 2.15729E+02 + 0.78540E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 6.45140E-06 -3.47703E+01 5.29947E-06 -3.67915E-06 + 0.78540E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 1.50626E-04 -1.74200E+02 -1.49854E-04 -1.52226E-05 + 0.78540E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 3.94067E-04 9.26004E+01 -1.78787E-05 3.93661E-04 + 0.73920E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 5.27844E+00 -1.11225E+02 -1.91099E+00 -4.92038E+00 + 0.73920E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 1.47590E+01 -1.26305E+01 1.44018E+01 -3.22725E+00 + 0.73920E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 2.75038E+02 7.94077E+01 5.05571E+01 2.70351E+02 + 0.73920E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 6.28580E-06 9.89627E+01 -9.79268E-07 6.20905E-06 + 0.73920E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 4.10914E-05 -1.51291E+02 -3.60401E-05 -1.97387E-05 + 0.73920E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 1.86282E-04 -1.00323E+02 -3.33804E-05 -1.83267E-04 + 0.69813E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 5.88394E+00 -1.16702E+02 -2.64396E+00 -5.25644E+00 + 0.69813E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 1.52031E+01 -1.15096E+01 1.48974E+01 -3.03351E+00 + 0.69813E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 3.27422E+02 8.15516E+01 4.81047E+01 3.23869E+02 + 0.69813E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 3.63294E-06 -2.72609E+01 3.22943E-06 -1.66405E-06 + 0.69813E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 8.52672E-05 7.46452E+01 2.25784E-05 8.22236E-05 + 0.69813E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 3.38037E-04 -1.31885E+02 -2.25686E-04 -2.51665E-04 + 0.66139E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 8.37985E+00 -1.24997E+02 -4.80615E+00 -6.86460E+00 + 0.66139E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 1.63062E+01 -1.48200E+01 1.57638E+01 -4.17085E+00 + 0.66139E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 4.01643E+02 8.41589E+01 4.08755E+01 3.99558E+02 + 0.66139E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 1.63323E-06 -9.42117E+01 -1.19946E-07 -1.62882E-06 + 0.66139E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 1.67983E-05 -1.27464E+02 -1.02177E-05 -1.33334E-05 + 0.66139E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 2.05520E-04 -9.40508E+00 2.02757E-04 -3.35847E-05 + 0.62832E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 1.29266E+01 -1.46298E+02 -1.07542E+01 -7.17260E+00 + 0.62832E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 1.53983E+01 -2.98981E+01 1.33490E+01 -7.67541E+00 + 0.62832E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 4.40614E+02 7.75661E+01 9.48698E+01 4.30280E+02 + 0.62832E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 1.96288E-06 1.37092E+02 -1.43770E-06 1.33637E-06 + 0.62832E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 3.87434E-05 -1.68692E+02 -3.79914E-05 -7.59668E-06 + 0.62832E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 6.34823E-05 -1.65651E+02 -6.15020E-05 -1.57324E-05 + 0.59840E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 1.69386E+01 -1.61504E+02 -1.60636E+01 -5.37360E+00 + 0.59840E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 1.28566E+01 -4.67990E+01 8.80112E+00 -9.37190E+00 + 0.59840E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 3.82340E+02 7.32131E+01 1.10425E+02 3.66047E+02 + 0.59840E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 1.07689E-06 -1.22284E+02 -5.75182E-07 -9.10421E-07 + 0.59840E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 3.76057E-05 8.81680E+01 1.20225E-06 3.75865E-05 + 0.59840E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 4.02678E-05 -1.33431E+00 4.02569E-05 -9.37674E-07 + 0.57120E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 2.06856E+01 -1.69009E+02 -2.03062E+01 -3.94397E+00 + 0.57120E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 1.24818E+01 -6.38547E+01 5.50009E+00 -1.12046E+01 + 0.57120E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 3.15853E+02 7.60990E+01 7.58820E+01 3.06602E+02 + 0.57120E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 2.07239E-06 1.17728E+01 2.02880E-06 4.22832E-07 + 0.57120E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 9.91529E-05 -1.04690E+02 -2.51438E-05 -9.59118E-05 + 0.57120E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 2.89304E-04 1.74346E+02 -2.87896E-04 2.85049E-05 + 0.54636E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 2.19480E+01 -1.75969E+02 -2.18937E+01 -1.54272E+00 + 0.54636E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 1.46861E+01 -8.54964E+01 1.15319E+00 -1.46408E+01 + 0.54636E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 2.89726E+02 7.35734E+01 8.19308E+01 2.77900E+02 + 0.54636E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 4.79713E-06 -1.58580E+02 -4.46579E-06 -1.75190E-06 + 0.54636E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 1.08524E-04 -9.51967E+01 -9.82956E-06 -1.08078E-04 + 0.54636E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 5.46672E-05 1.73064E+02 -5.42672E-05 6.60164E-06 + 0.52360E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 1.80393E+01 1.77130E+02 -1.80167E+01 9.03212E-01 + 0.52360E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 1.57709E+01 -1.03521E+02 -3.68737E+00 -1.53338E+01 + 0.52360E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 2.42135E+02 5.81039E+01 1.27940E+02 2.05574E+02 + 0.52360E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 1.98080E-06 -1.10053E+02 -6.79200E-07 -1.86072E-06 + 0.52360E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 6.92322E-05 -1.24776E+02 -3.94876E-05 -5.68667E-05 + 0.52360E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 9.73457E-05 3.24607E+01 8.21364E-05 5.22475E-05 + 0.50265E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 1.01454E+01 1.66135E+02 -9.84980E+00 2.43126E+00 + 0.50265E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 1.53375E+01 -1.10655E+02 -5.41023E+00 -1.43515E+01 + 0.50265E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 1.89640E+02 3.59861E+01 1.53449E+02 1.11430E+02 + 0.50265E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 6.18891E-06 -1.62281E+02 -5.89530E-06 -1.88362E-06 + 0.50265E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 9.47389E-05 -1.27424E+02 -5.75737E-05 -7.52378E-05 + 0.50265E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 1.07248E-04 1.74224E+02 -1.06704E-04 1.07943E-05 + 0.48332E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 7.79068E+00 1.11140E+02 -2.80967E+00 7.26639E+00 + 0.48332E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 1.47085E+01 -1.16315E+02 -6.52036E+00 -1.31843E+01 + 0.48332E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 1.87012E+02 1.97468E+01 1.76015E+02 6.31848E+01 + 0.48332E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 4.80792E-06 6.77204E+01 1.82281E-06 4.44898E-06 + 0.48332E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 9.99089E-06 1.00615E+01 9.83724E-06 1.74546E-06 + 0.48332E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 2.08625E-04 4.48112E+01 1.48005E-04 1.47033E-04 + 0.46542E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 2.06961E+01 5.68325E+01 1.13226E+01 1.73242E+01 + 0.46542E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 1.17614E+01 -1.20159E+02 -5.90891E+00 -1.01693E+01 + 0.46542E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 2.57769E+02 -7.66481E+00 2.55466E+02 -3.43806E+01 + 0.46542E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 3.97379E-06 1.15138E+02 -1.68808E-06 3.59742E-06 + 0.46542E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 2.71200E-05 -7.99037E+01 4.75424E-06 -2.67001E-05 + 0.46542E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 3.50962E-04 6.33100E+01 1.57639E-04 3.13567E-04 + 0.44880E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 3.33087E+01 3.13358E+01 2.84501E+01 1.73223E+01 + 0.44880E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 9.13045E+00 -1.22066E+02 -4.84737E+00 -7.73745E+00 + 0.44880E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 2.89104E+02 -3.56329E+01 2.34974E+02 -1.68429E+02 + 0.44880E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 2.46666E-06 -7.00691E+01 8.40852E-07 -2.31891E-06 + 0.44880E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 1.45285E-05 1.28530E+02 -9.05018E-06 1.13654E-05 + 0.44880E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 4.79335E-04 -1.16234E+02 -2.11884E-04 -4.29962E-04 + 0.43332E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 2.95627E+01 3.63262E+00 2.95033E+01 1.87305E+00 + 0.43332E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 7.84740E+00 -1.35429E+02 -5.59031E+00 -5.50728E+00 + 0.43332E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 1.97590E+02 -4.67926E+01 1.35278E+02 -1.44019E+02 + 0.43332E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 4.79246E-06 3.90637E+00 4.78133E-06 3.26492E-07 + 0.43332E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 1.08537E-05 -3.01134E+01 9.38883E-06 -5.44545E-06 + 0.43332E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 1.81246E-04 -1.74014E+02 -1.80257E-04 -1.89019E-05 + 0.41888E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 1.51472E+01 -4.33845E+01 1.10084E+01 -1.04044E+01 + 0.41888E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 7.48797E+00 -1.58545E+02 -6.96908E+00 -2.73891E+00 + 0.41888E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 1.38092E+02 -9.80661E+00 1.36075E+02 -2.35203E+01 + 0.41888E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 2.24216E-06 3.45419E+01 1.84690E-06 1.27133E-06 + 0.41888E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 5.36184E-06 -1.33632E+02 -3.69981E-06 -3.88082E-06 + 0.41888E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 6.13846E-05 -1.05578E+02 -1.64846E-05 -5.91298E-05 + 0.40537E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 1.39500E+01 -9.47355E+01 -1.15166E+00 -1.39023E+01 + 0.40537E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 1.25153E+01 1.67185E+02 -1.22036E+01 2.77600E+00 + 0.40537E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 1.29774E+02 2.77810E+01 1.14815E+02 6.04866E+01 + 0.40537E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 9.97252E-07 1.87605E+01 9.44270E-07 3.20729E-07 + 0.40537E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 1.41093E-05 7.57276E+01 3.47841E-06 1.36738E-05 + 0.40537E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 1.46276E-04 9.56905E+01 -1.45040E-05 1.45556E-04 + 0.39270E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 3.19751E+01 -1.04834E+02 -8.18648E+00 -3.09093E+01 + 0.39270E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 8.98556E+00 1.16264E+02 -3.97614E+00 8.05795E+00 + 0.39270E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 2.11083E+02 5.56873E+01 1.18990E+02 1.74349E+02 + 0.39270E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 4.30652E-06 -1.25470E+01 4.20367E-06 -9.35548E-07 + 0.39270E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 1.15315E-05 3.47717E+01 9.47231E-06 6.57648E-06 + 0.39270E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 3.17100E-04 1.15054E+02 -1.34283E-04 2.87263E-04 + 0.38080E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 3.94477E+01 -1.14237E+02 -1.61940E+01 -3.59705E+01 + 0.38080E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 2.81574E+00 1.23451E+02 -1.55210E+00 2.34933E+00 + 0.38080E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 1.79066E+02 5.68894E+01 9.78159E+01 1.49989E+02 + 0.38080E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 1.35176E-06 -2.63465E+01 1.21134E-06 -5.99908E-07 + 0.38080E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 1.17254E-05 -1.71934E+02 -1.16094E-05 -1.64516E-06 + 0.38080E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 1.31420E-04 4.51386E-01 1.31416E-04 1.03534E-06 + 0.36960E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 3.59385E+01 -1.22060E+02 -1.90763E+01 -3.04576E+01 + 0.36960E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 2.73880E+00 -1.66580E+02 -2.66401E+00 -6.35656E-01 + 0.36960E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 9.47950E+01 5.52037E+01 5.40958E+01 7.78443E+01 + 0.36960E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 1.12306E-06 9.75686E+01 -1.47923E-07 1.11328E-06 + 0.36960E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 9.18079E-06 -2.49673E+01 8.32283E-06 -3.87523E-06 + 0.36960E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 7.88555E-05 1.79345E+01 7.50239E-05 2.42820E-05 + 0.35904E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 2.07834E+01 -1.37003E+02 -1.52007E+01 -1.41735E+01 + 0.35904E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 2.85784E+00 -1.43105E+02 -2.28552E+00 -1.71570E+00 + 0.35904E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 2.94055E+01 1.84102E+01 2.79005E+01 9.28679E+00 + 0.35904E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 2.53615E-06 -1.70490E+01 2.42470E-06 -7.43572E-07 + 0.35904E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 7.78119E-06 8.61793E+00 7.69333E-06 1.16597E-06 + 0.35904E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 9.75731E-05 1.67670E+02 -9.53223E-05 2.08368E-05 + 0.34907E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 1.88704E+01 -1.70181E+02 -1.85940E+01 -3.21809E+00 + 0.34907E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 3.04245E+00 -1.28401E+02 -1.88986E+00 -2.38431E+00 + 0.34907E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 1.13233E+02 -2.03325E+01 1.06178E+02 -3.93450E+01 + 0.34907E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 4.06995E-06 6.03147E+00 4.04742E-06 4.27648E-07 + 0.34907E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 1.49532E-05 -2.55499E+01 1.34909E-05 -6.44926E-06 + 0.34907E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 1.12931E-04 5.85506E+01 5.89215E-05 9.63419E-05 + 0.33963E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 1.77796E+01 1.63638E+02 -1.70595E+01 5.00869E+00 + 0.33963E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 1.33702E+00 -1.37163E+02 -9.80427E-01 -9.09060E-01 + 0.33963E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 1.56598E+02 -2.13072E+01 1.45894E+02 -5.69028E+01 + 0.33963E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 1.02806E-06 -5.27856E+01 6.21770E-07 -8.18724E-07 + 0.33963E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 1.76357E-06 1.46858E+02 -1.47667E-06 9.64173E-07 + 0.33963E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 1.61986E-04 1.64887E+02 -1.56383E-04 4.22341E-05 + 0.33069E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 1.65204E+01 1.69396E+02 -1.62382E+01 3.04007E+00 + 0.33069E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 5.68220E-01 2.12156E+01 5.29709E-01 2.05627E-01 + 0.33069E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 1.61390E+02 -3.84452E+00 1.61027E+02 -1.08210E+01 + 0.33069E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 1.52323E-06 6.70033E+01 5.95091E-07 1.40217E-06 + 0.33069E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 1.43924E-05 -1.73237E+02 -1.42922E-05 -1.69492E-06 + 0.33069E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 4.46975E-05 1.55877E+02 -4.07940E-05 1.82680E-05 + 0.32221E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 1.14100E+01 1.77485E+02 -1.13990E+01 5.00711E-01 + 0.32221E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 8.92693E-01 6.62708E+01 3.59232E-01 8.17223E-01 + 0.32221E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 1.14943E+02 1.44783E-01 1.14943E+02 2.90455E-01 + 0.32221E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 1.44587E-06 1.09206E+02 -4.75643E-07 1.36540E-06 + 0.32221E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 9.60358E-07 -1.04891E+02 -2.46793E-07 -9.28106E-07 + 0.32221E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 3.46117E-05 -1.68130E+02 -3.38715E-05 -7.11963E-06 + 0.31416E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 4.76927E+00 2.65364E+01 4.26683E+00 2.13075E+00 + 0.31416E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 1.55114E+00 9.59277E+01 -1.60192E-01 1.54285E+00 + 0.31416E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 3.03718E+01 -1.63078E+02 -2.90567E+01 -8.84038E+00 + 0.31416E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 1.12358E-06 1.60529E+02 -1.05932E-06 3.74524E-07 + 0.31416E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 1.13954E-05 -1.74663E+02 -1.13460E-05 -1.05995E-06 + 0.31416E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 5.65684E-05 -8.85915E+01 1.39045E-06 -5.65514E-05 + 0.30650E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 1.25128E+01 1.53501E+01 1.20664E+01 3.31236E+00 + 0.30650E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 1.04491E+00 9.42449E+01 -7.73435E-02 1.04204E+00 + 0.30650E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 9.55309E+01 -1.75242E+02 -9.52018E+01 -7.92331E+00 + 0.30650E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 2.06664E-06 1.17719E+01 2.02317E-06 4.21627E-07 + 0.30650E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 2.56982E-06 1.39589E+02 -1.95670E-06 1.66593E-06 + 0.30650E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 2.13107E-04 9.28117E+01 -1.04537E-05 2.12850E-04 + 0.29920E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 1.42758E+01 7.73021E+00 1.41461E+01 1.92022E+00 + 0.29920E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 2.58459E-01 9.19034E+01 -8.58456E-03 2.58316E-01 + 0.29920E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 8.69384E+01 -1.74618E+02 -8.65552E+01 -8.15368E+00 + 0.29920E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 7.27715E-07 -2.96080E+01 6.32694E-07 -3.59538E-07 + 0.29920E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 2.40907E-06 -1.58174E+01 2.31785E-06 -6.56645E-07 + 0.29920E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 4.62958E-05 -1.70606E+02 -4.56749E-05 -7.55670E-06 + 0.29224E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 1.18922E+01 -3.45477E+01 9.79507E+00 -6.74397E+00 + 0.29224E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 2.15273E-01 -2.91769E+01 1.87959E-01 -1.04947E-01 + 0.29224E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 3.56877E+01 1.74364E+02 -3.55152E+01 3.50470E+00 + 0.29224E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 1.17186E-06 -1.73214E+02 -1.16365E-06 -1.38468E-07 + 0.29224E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 4.06645E-06 8.99056E+01 6.70072E-09 4.06644E-06 + 0.29224E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 7.02638E-05 -1.73218E+02 -6.97721E-05 -8.29794E-06 + 0.28560E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 1.12706E+01 -7.95787E+01 2.03869E+00 -1.10847E+01 + 0.28560E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 7.57361E-01 -4.07878E+00 7.55443E-01 -5.38697E-02 + 0.28560E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 2.45680E+01 1.10459E+02 -8.58728E+00 2.30184E+01 + 0.28560E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 1.53436E-06 1.51398E+02 -1.34712E-06 7.34531E-07 + 0.28560E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 1.80174E-06 3.87665E+01 1.40482E-06 1.12815E-06 + 0.28560E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 2.80791E-04 -1.70621E+02 -2.77037E-04 -4.57605E-05 + 0.27925E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 7.43091E+00 -5.59595E+01 4.15966E+00 -6.15756E+00 + 0.27925E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 3.95135E-01 -2.12203E+01 3.68344E-01 -1.43021E-01 + 0.27925E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 2.58107E+01 1.11955E+02 -9.64990E+00 2.39389E+01 + 0.27925E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 1.90585E-06 1.27083E+01 1.85917E-06 4.19263E-07 + 0.27925E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 1.89128E-06 3.02109E+00 1.88865E-06 9.96768E-08 + 0.27925E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 1.09679E-04 1.49415E+02 -9.44201E-05 5.58059E-05 + 0.27318E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 6.06321E+00 -8.30064E+01 7.38243E-01 -6.01809E+00 + 0.27318E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 2.92242E-01 1.34707E+02 -2.05586E-01 2.07701E-01 + 0.27318E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 2.44642E+01 1.08085E+02 -7.59428E+00 2.32556E+01 + 0.27318E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 1.18355E-06 -1.58708E+02 -1.10277E-06 -4.29772E-07 + 0.27318E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 1.55452E-06 1.32678E+02 -1.05377E-06 1.14284E-06 + 0.27318E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 2.18891E-05 -1.65088E+02 -2.11519E-05 -5.63275E-06 + 0.26737E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 1.73541E+00 9.18579E+01 -5.62646E-02 1.73450E+00 + 0.26737E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 6.12472E-01 1.45122E+02 -5.02456E-01 3.50228E-01 + 0.26737E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 1.00686E+01 -1.66988E+02 -9.81008E+00 -2.26698E+00 + 0.26737E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 1.95417E-07 -1.25971E+02 -1.14783E-07 -1.58154E-07 + 0.26737E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 9.76570E-07 4.15022E+01 7.31383E-07 6.47123E-07 + 0.26737E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 5.37718E-05 -1.11483E+02 -1.96927E-05 -5.00361E-05 + 0.26180E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 4.44467E+00 -1.50783E+02 -3.87923E+00 -2.16949E+00 + 0.26180E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 5.86931E-01 1.51280E+02 -5.14724E-01 2.82042E-01 + 0.26180E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 1.24029E+01 4.53160E+01 8.72170E+00 8.81843E+00 + 0.26180E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 1.05264E-07 1.18973E+02 -5.09902E-08 9.20901E-08 + 0.26180E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 1.08219E-06 1.34444E+02 -7.57759E-07 7.72611E-07 + 0.26180E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 5.67947E-05 1.37130E+02 -4.16246E-05 3.86398E-05 + 0.25646E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 7.09135E+00 -8.85418E+01 1.80460E-01 -7.08905E+00 + 0.25646E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 5.39406E-01 1.41289E+02 -4.20904E-01 3.37341E-01 + 0.25646E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 1.73183E+01 8.35345E+01 1.95013E+00 1.72082E+01 + 0.25646E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 4.44985E-07 -7.97267E+01 7.93606E-08 -4.37851E-07 + 0.25646E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 7.86049E-07 -5.61843E+01 4.37455E-07 -6.53075E-07 + 0.25646E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 1.57430E-05 -1.10979E+02 -5.63635E-06 -1.46995E-05 + 0.25133E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 6.88986E+00 -1.31551E+02 -4.56997E+00 -5.15612E+00 + 0.25133E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 5.02235E-01 7.83561E+01 1.01366E-01 4.91900E-01 + 0.25133E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 1.70161E+01 4.39907E+01 1.22423E+01 1.18184E+01 + 0.25133E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 6.60592E-07 2.56614E+01 5.95438E-07 2.86071E-07 + 0.25133E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 2.37990E-06 7.42582E+00 2.35994E-06 3.07585E-07 + 0.25133E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 1.52362E-05 -1.69464E+02 -1.49793E-05 -2.78591E-06 + 0.24640E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 5.51440E+00 -1.52881E+02 -4.90815E+00 -2.51369E+00 + 0.24640E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 5.14540E-01 9.01635E+01 -1.46862E-03 5.14538E-01 + 0.24640E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 2.07131E+01 5.23112E+00 2.06269E+01 1.88849E+00 + 0.24640E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 7.77408E-08 1.03015E+02 -1.75076E-08 7.57437E-08 + 0.24640E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 4.61621E-07 7.81154E+01 9.50668E-08 4.51726E-07 + 0.24640E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 1.71678E-04 1.74381E+02 -1.70854E-04 1.68095E-05 + 0.24166E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 1.15150E+01 -1.44200E+02 -9.33942E+00 -6.73580E+00 + 0.24166E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 3.44478E-01 7.51591E+01 8.82332E-02 3.32987E-01 + 0.24166E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 3.03310E+01 1.11733E+01 2.97561E+01 5.87747E+00 + 0.24166E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 3.75597E-07 9.25557E+01 -1.67480E-08 3.75223E-07 + 0.24166E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 7.48261E-07 7.89041E+01 1.44004E-07 7.34273E-07 + 0.24166E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 3.54975E-05 -9.79793E+01 -4.92761E-06 -3.51539E-05 + 0.23710E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 1.16293E+01 -1.50502E+02 -1.01218E+01 -5.72615E+00 + 0.23710E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 2.91963E-01 2.22013E+01 2.70318E-01 1.10322E-01 + 0.23710E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 2.27040E+01 1.33133E+01 2.20938E+01 5.22816E+00 + 0.23710E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 6.53654E-07 -1.76359E+02 -6.52334E-07 -4.15137E-08 + 0.23710E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 2.81602E-07 3.36779E+01 2.34340E-07 1.56155E-07 + 0.23710E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 3.92513E-05 1.07270E+02 -1.16529E-05 3.74816E-05 + 0.23271E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 5.13044E+00 1.31362E+02 -3.39026E+00 3.85065E+00 + 0.23271E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 2.34935E-01 2.07465E+00 2.34781E-01 8.50501E-03 + 0.23271E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 1.97868E+01 -8.44184E+01 1.92452E+00 -1.96930E+01 + 0.23271E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 4.43798E-07 2.50579E+01 4.02028E-07 1.87963E-07 + 0.23271E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 6.66091E-07 9.56576E+01 -6.56650E-08 6.62846E-07 + 0.23271E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 1.15383E-04 9.12852E+01 -2.58800E-06 1.15353E-04 + 0.22848E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 5.62094E+00 8.61560E+01 3.76827E-01 5.60830E+00 + 0.22848E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 1.67338E-01 2.31760E-01 1.67337E-01 6.76877E-04 + 0.22848E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 2.04302E+01 -1.11150E+02 -7.37126E+00 -1.90540E+01 + 0.22848E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 4.16710E-07 5.58524E+01 2.33911E-07 3.44867E-07 + 0.22848E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 4.88291E-07 1.02815E+02 -1.08304E-07 4.76129E-07 + 0.22848E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 5.21574E-05 -6.40665E+00 5.18317E-05 -5.81994E-06 + 0.22440E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 4.26775E+00 1.43045E+01 4.13543E+00 1.05445E+00 + 0.22440E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 1.61054E-02 1.40505E+02 -1.24282E-02 1.02432E-02 + 0.22440E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 1.45837E+01 -1.62193E+02 -1.38850E+01 -4.45998E+00 + 0.22440E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 2.82410E-07 -3.33448E-01 2.82405E-07 -1.64355E-09 + 0.22440E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 4.75935E-07 7.50488E+00 4.71858E-07 6.21623E-08 + 0.22440E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 2.69716E-05 -1.34909E+01 2.62274E-05 -6.29224E-06 + 0.22046E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 7.80931E+00 -8.85347E+00 7.71626E+00 -1.20192E+00 + 0.22046E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 4.61776E-02 -1.56248E+02 -4.22663E-02 -1.85993E-02 + 0.22046E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 2.53128E+01 1.67600E+02 -2.47223E+01 5.43552E+00 + 0.22046E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 1.04445E-07 7.14916E+01 3.31554E-08 9.90428E-08 + 0.22046E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 3.29038E-07 -3.69389E+01 2.62992E-07 -1.97740E-07 + 0.22046E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 1.94934E-05 4.36945E+01 1.40944E-05 1.34663E-05 + 0.21666E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 1.50582E+01 -1.25258E+01 1.46998E+01 -3.26580E+00 + 0.21666E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 9.21526E-02 -1.19475E+02 -4.53437E-02 -8.02250E-02 + 0.21666E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 3.11958E+01 1.68087E+02 -3.05239E+01 6.43987E+00 + 0.21666E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 4.03912E-07 1.52721E+02 -3.58992E-07 1.85121E-07 + 0.21666E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 1.94638E-07 -6.31849E+01 8.78036E-08 -1.73708E-07 + 0.21666E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 1.29307E-05 -7.71451E+01 2.87685E-06 -1.26066E-05 + 0.21299E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 5.80602E+00 -2.03693E+01 5.44296E+00 -2.02090E+00 + 0.21299E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 9.65762E-02 1.98201E+01 9.08552E-02 3.27459E-02 + 0.21299E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 6.22677E+00 -1.78090E+02 -6.22331E+00 -2.07544E-01 + 0.21299E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 5.43718E-07 -6.79475E+01 2.04142E-07 -5.03939E-07 + 0.21299E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 2.92780E-07 -7.92958E+01 5.43807E-08 -2.87686E-07 + 0.21299E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 4.84152E-05 5.74836E+01 2.60252E-05 4.08255E-05 + 0.20944E+01 0.10472E+02 0.00000E+00 0.00000E+00 1 1.60013E+00 1.71164E+01 1.52926E+00 4.70942E-01 + 0.20944E+01 0.10472E+02 0.00000E+00 0.00000E+00 3 1.19448E-01 3.05969E+01 1.02818E-01 6.07986E-02 + 0.20944E+01 0.10472E+02 0.00000E+00 0.00000E+00 5 2.61786E+00 -3.51102E+01 2.14153E+00 -1.50566E+00 + 0.20944E+01 0.10472E+02 0.00000E+00 0.00000E+00 2 2.70515E-07 8.82125E+01 8.43824E-09 2.70384E-07 + 0.20944E+01 0.10472E+02 0.00000E+00 0.00000E+00 4 1.10205E-07 -1.33795E+02 -7.62706E-08 -7.95486E-08 + 0.20944E+01 0.10472E+02 0.00000E+00 0.00000E+00 6 5.50842E-05 -1.29232E+02 -3.48386E-05 -4.26679E-05 + 0.96664E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 1.20214E+00 0.00000E+00 1.20214E+00 0.00000E+00 + 0.96664E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 1.04144E+01 0.00000E+00 1.04144E+01 0.00000E+00 + 0.96664E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 3.77900E+01 1.80000E+02 -3.77900E+01 0.00000E+00 + 0.96664E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 1.59282E-05 0.00000E+00 1.59282E-05 0.00000E+00 + 0.96664E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 2.60978E-04 0.00000E+00 2.60978E-04 0.00000E+00 + 0.96664E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 7.13243E-04 1.80000E+02 -7.13243E-04 0.00000E+00 + 0.89760E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 1.29092E+00 -3.72692E+01 1.02731E+00 -7.81729E-01 + 0.89760E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 1.05702E+01 -2.70051E+00 1.05584E+01 -4.98017E-01 + 0.89760E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 5.64308E+01 1.25927E+02 -3.31107E+01 4.56959E+01 + 0.89760E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 4.30402E-06 1.58299E+02 -3.99897E-06 1.59149E-06 + 0.89760E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 1.19186E-04 3.92984E+00 1.18906E-04 8.16841E-06 + 0.89760E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 5.76732E-04 1.75266E+02 -5.74764E-04 4.75987E-05 + 0.83776E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 1.91061E+00 -7.07724E+01 6.29203E-01 -1.80403E+00 + 0.83776E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 1.17748E+01 -6.01576E+00 1.17099E+01 -1.23402E+00 + 0.83776E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 1.00612E+02 1.00962E+02 -1.91329E+01 9.87760E+01 + 0.83776E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 5.75641E-06 7.94500E+01 1.05396E-06 5.65910E-06 + 0.83776E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 4.02364E-04 -1.76989E+02 -4.01808E-04 -2.11353E-05 + 0.83776E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 1.83325E-04 -6.29411E+01 8.33957E-05 -1.63258E-04 + 0.78540E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 2.93941E+00 -8.63014E+01 1.89618E-01 -2.93329E+00 + 0.78540E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 1.30580E+01 -9.69962E+00 1.28714E+01 -2.20005E+00 + 0.78540E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 1.55938E+02 8.82578E+01 4.74078E+00 1.55865E+02 + 0.78540E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 1.52173E-05 -2.28974E+01 1.40182E-05 -5.92077E-06 + 0.78540E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 8.53726E-05 -3.18946E+01 7.24832E-05 -4.51073E-05 + 0.78540E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 4.92920E-05 1.67657E+02 -4.81526E-05 1.05370E-05 + 0.73920E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 4.02216E+00 -9.17187E+01 -1.20635E-01 -4.02035E+00 + 0.73920E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 1.38675E+01 -1.10855E+01 1.36087E+01 -2.66635E+00 + 0.73920E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 2.12139E+02 8.32043E+01 2.51024E+01 2.10649E+02 + 0.73920E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 9.12415E-06 5.19975E+01 5.61770E-06 7.18968E-06 + 0.73920E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 9.31688E-05 2.05032E+01 8.72668E-05 3.26333E-05 + 0.73920E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 5.66021E-05 -4.88230E+01 3.72661E-05 -4.26032E-05 + 0.69813E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 5.41086E+00 -9.38827E+01 -3.66390E-01 -5.39845E+00 + 0.69813E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 1.45945E+01 -9.22853E+00 1.44056E+01 -2.34056E+00 + 0.69813E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 2.70450E+02 8.47094E+01 2.49376E+01 2.69298E+02 + 0.69813E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 7.42591E-06 4.43398E+01 5.31107E-06 5.19006E-06 + 0.69813E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 4.66959E-05 1.61437E+02 -4.42664E-05 1.48658E-05 + 0.69813E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 8.71677E-05 7.76432E+01 1.86539E-05 8.51483E-05 + 0.66139E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 8.42040E+00 -1.05326E+02 -2.22566E+00 -8.12093E+00 + 0.66139E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 1.60477E+01 -1.03797E+01 1.57851E+01 -2.89131E+00 + 0.66139E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 3.54469E+02 8.71238E+01 1.77868E+01 3.54023E+02 + 0.66139E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 2.04482E-06 1.00213E+02 -3.62558E-07 2.01242E-06 + 0.66139E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 1.05721E-04 -7.52504E+00 1.04811E-04 -1.38452E-05 + 0.66139E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 3.33631E-04 5.14529E+01 2.07904E-04 2.60931E-04 + 0.62832E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 1.21912E+01 -1.33373E+02 -8.37224E+00 -8.86178E+00 + 0.62832E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 1.55173E+01 -2.16093E+01 1.44267E+01 -5.71465E+00 + 0.62832E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 4.10794E+02 8.05126E+01 6.77112E+01 4.05175E+02 + 0.62832E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 1.91173E-06 3.51859E+01 1.56244E-06 1.10160E-06 + 0.62832E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 4.02027E-05 -1.78613E+02 -4.01909E-05 -9.72971E-07 + 0.62832E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 3.95085E-04 1.53520E+02 -3.53638E-04 1.76160E-04 + 0.59840E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 1.53494E+01 -1.54219E+02 -1.38215E+01 -6.67593E+00 + 0.59840E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 1.29051E+01 -3.33766E+01 1.07767E+01 -7.09962E+00 + 0.59840E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 3.73909E+02 7.71498E+01 8.31582E+01 3.64544E+02 + 0.59840E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 2.02762E-06 1.61169E+02 -1.91909E-06 6.54462E-07 + 0.59840E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 6.37058E-05 -3.75732E+01 5.04916E-05 -3.88462E-05 + 0.59840E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 2.80933E-04 -1.65947E+02 -2.72525E-04 -6.82160E-05 + 0.57120E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 1.89843E+01 -1.65436E+02 -1.83743E+01 -4.77379E+00 + 0.57120E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 1.18302E+01 -4.67838E+01 8.10078E+00 -8.62156E+00 + 0.57120E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 3.26472E+02 8.13967E+01 4.88380E+01 3.22798E+02 + 0.57120E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 8.74698E-07 -3.99011E+01 6.71027E-07 -5.61087E-07 + 0.57120E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 6.40594E-05 -6.82879E+01 2.36984E-05 -5.95147E-05 + 0.57120E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 4.19675E-04 1.71494E+02 -4.15058E-04 6.20781E-05 + 0.54636E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 2.12485E+01 -1.73579E+02 -2.11151E+01 -2.37641E+00 + 0.54636E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 1.34302E+01 -6.97626E+01 4.64566E+00 -1.26011E+01 + 0.54636E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 3.10812E+02 8.01148E+01 5.33585E+01 3.06198E+02 + 0.54636E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 5.80992E-06 -1.39968E+02 -4.44855E-06 -3.73705E-06 + 0.54636E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 1.44054E-04 9.46312E+01 -1.16312E-05 1.43584E-04 + 0.54636E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 8.34456E-05 4.88440E+01 5.49165E-05 6.28279E-05 + 0.52360E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 1.93284E+01 -1.79284E+02 -1.93269E+01 -2.41685E-01 + 0.52360E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 1.50416E+01 -9.24112E+01 -6.32820E-01 -1.50283E+01 + 0.52360E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 2.60750E+02 6.72488E+01 1.00840E+02 2.40462E+02 + 0.52360E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 4.84936E-06 -1.84293E+01 4.60065E-06 -1.53305E-06 + 0.52360E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 1.31467E-04 7.93288E+01 2.43441E-05 1.29194E-04 + 0.52360E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 2.31485E-05 -3.32061E+01 1.93685E-05 -1.26773E-05 + 0.50265E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 1.34256E+01 1.77986E+02 -1.34173E+01 4.71720E-01 + 0.50265E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 1.55906E+01 -1.03946E+02 -3.75756E+00 -1.51310E+01 + 0.50265E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 1.91039E+02 4.98563E+01 1.23164E+02 1.46036E+02 + 0.50265E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 1.27813E-06 1.70511E+02 -1.26064E-06 2.10708E-07 + 0.50265E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 5.84120E-05 -3.48998E+01 4.79068E-05 -3.34200E-05 + 0.50265E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 8.37186E-05 6.12077E+01 4.03218E-05 7.33686E-05 + 0.48332E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 9.45972E+00 1.50610E+02 -8.24224E+00 4.64238E+00 + 0.48332E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 1.58048E+01 -1.12679E+02 -6.09390E+00 -1.45827E+01 + 0.48332E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 1.70273E+02 3.91201E+01 1.32102E+02 1.07433E+02 + 0.48332E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 3.23404E-06 1.57231E+02 -2.98203E-06 1.25160E-06 + 0.48332E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 5.79372E-05 -3.30913E+01 4.85399E-05 -3.16322E-05 + 0.48332E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 2.06723E-04 -6.31915E+01 9.32339E-05 -1.84504E-04 + 0.46542E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 1.50769E+01 7.26727E+01 4.49036E+00 1.43927E+01 + 0.46542E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 1.31370E+01 -1.17916E+02 -6.15035E+00 -1.16083E+01 + 0.46542E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 2.14953E+02 1.45394E+01 2.08069E+02 5.39631E+01 + 0.46542E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 2.80043E-06 -7.73317E+01 6.14153E-07 -2.73226E-06 + 0.46542E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 1.21723E-05 -4.31188E+00 1.21378E-05 -9.15179E-07 + 0.46542E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 5.11332E-04 -1.13692E+02 -2.05463E-04 -4.68237E-04 + 0.44880E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 2.94691E+01 4.06915E+01 2.23444E+01 1.92134E+01 + 0.44880E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 9.98161E+00 -1.20198E+02 -5.02069E+00 -8.62700E+00 + 0.44880E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 2.76016E+02 -1.18152E+01 2.70168E+02 -5.65161E+01 + 0.44880E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 2.50838E-06 4.75262E+01 1.69379E-06 1.85014E-06 + 0.44880E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 3.66048E-06 -1.67697E+02 -3.57641E-06 -7.80002E-07 + 0.44880E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 3.86390E-04 -7.48100E+01 1.01242E-04 -3.72890E-04 + 0.43332E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 3.19813E+01 1.34418E+01 3.11052E+01 7.43430E+00 + 0.43332E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 7.76175E+00 -1.24668E+02 -4.41504E+00 -6.38374E+00 + 0.43332E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 2.56864E+02 -3.25263E+01 2.16574E+02 -1.38113E+02 + 0.43332E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 6.55013E-07 -1.34071E+02 -4.55594E-07 -4.70613E-07 + 0.43332E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 5.67013E-06 -6.58105E+01 2.32337E-06 -5.17226E-06 + 0.43332E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 1.87282E-04 -1.57540E+02 -1.73076E-04 -7.15491E-05 + 0.41888E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 1.74954E+01 -1.95535E+01 1.64864E+01 -5.85550E+00 + 0.41888E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 6.42142E+00 -1.40570E+02 -4.95989E+00 -4.07850E+00 + 0.41888E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 1.78753E+02 -2.31303E+01 1.64384E+02 -7.02186E+01 + 0.41888E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 1.21242E-06 5.02809E+01 7.74766E-07 9.32577E-07 + 0.41888E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 1.93407E-05 -1.49406E+02 -1.66483E-05 -9.84360E-06 + 0.41888E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 1.18917E-04 1.60425E+01 1.14286E-04 3.28627E-05 + 0.40537E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 9.43389E+00 -6.28006E+01 4.31212E+00 -8.39071E+00 + 0.40537E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 8.94914E+00 -1.61282E+02 -8.47583E+00 -2.87185E+00 + 0.40537E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 1.26676E+02 3.17420E+00 1.26482E+02 7.01431E+00 + 0.40537E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 1.40150E-06 -1.30662E+02 -9.13215E-07 -1.06313E-06 + 0.40537E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 6.27793E-06 -1.04389E+02 -1.56011E-06 -6.08099E-06 + 0.40537E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 1.89015E-04 -2.71199E+01 1.68234E-04 -8.61632E-05 + 0.39270E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 2.70671E+01 -9.76129E+01 -3.58585E+00 -2.68286E+01 + 0.39270E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 1.12435E+01 1.52738E+02 -9.99457E+00 5.15027E+00 + 0.39270E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 1.89526E+02 5.79622E+01 1.00539E+02 1.60661E+02 + 0.39270E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 3.97337E-06 -6.82120E+01 1.47481E-06 -3.68953E-06 + 0.39270E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 2.07109E-05 1.22121E+02 -1.10123E-05 1.75405E-05 + 0.39270E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 1.87261E-04 1.71048E+02 -1.84980E-04 2.91376E-05 + 0.38080E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 3.71930E+01 -1.10037E+02 -1.27433E+01 -3.49418E+01 + 0.38080E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 5.59056E+00 1.15124E+02 -2.37359E+00 5.06166E+00 + 0.38080E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 2.10140E+02 6.06925E+01 1.02863E+02 1.83243E+02 + 0.38080E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 2.17900E-06 -1.65703E+00 2.17809E-06 -6.30092E-08 + 0.38080E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 8.52970E-06 1.68317E+02 -8.35300E-06 1.72717E-06 + 0.38080E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 2.69160E-04 -6.99572E+01 9.22471E-05 -2.52859E-04 + 0.36960E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 3.78362E+01 -1.12649E+02 -1.45700E+01 -3.49183E+01 + 0.36960E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 1.76104E+00 -1.75691E+02 -1.75606E+00 -1.32303E-01 + 0.36960E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 1.51087E+02 6.14313E+01 7.22514E+01 1.32691E+02 + 0.36960E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 1.11007E-06 -1.74152E+02 -1.10429E-06 -1.13113E-07 + 0.36960E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 7.82806E-06 1.77230E+02 -7.81891E-06 3.78323E-07 + 0.36960E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 6.21805E-05 1.14586E+02 -2.58708E-05 5.65431E-05 + 0.35904E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 2.79538E+01 -1.20966E+02 -1.43831E+01 -2.39695E+01 + 0.35904E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 2.62483E+00 -1.31909E+02 -1.75324E+00 -1.95343E+00 + 0.35904E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 5.67591E+01 4.41819E+01 4.07037E+01 3.95576E+01 + 0.35904E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 7.23654E-07 2.93355E+01 6.30857E-07 3.54534E-07 + 0.35904E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 1.41447E-05 -1.50392E+02 -1.22978E-05 -6.98834E-06 + 0.35904E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 1.14226E-04 -1.63614E+02 -1.09586E-04 -3.22234E-05 + 0.34907E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 2.21461E+01 -1.57473E+02 -2.04563E+01 -8.48452E+00 + 0.34907E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 3.60377E+00 -1.15083E+02 -1.52776E+00 -3.26391E+00 + 0.34907E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 8.73519E+01 -2.01997E+01 8.19793E+01 -3.01620E+01 + 0.34907E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 2.30644E-06 -1.40309E+02 -1.77481E-06 -1.47299E-06 + 0.34907E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 5.99831E-06 -2.52319E+01 5.42601E-06 -2.55697E-06 + 0.34907E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 6.96180E-05 4.06625E+01 5.28096E-05 4.53632E-05 + 0.33963E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 1.70551E+01 1.60878E+02 -1.61140E+01 5.58703E+00 + 0.33963E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 2.14269E+00 -1.17280E+02 -9.82086E-01 -1.90437E+00 + 0.33963E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 1.39544E+02 -2.37624E+01 1.27714E+02 -5.62286E+01 + 0.33963E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 2.11594E-07 -2.20745E+01 1.96083E-07 -7.95194E-08 + 0.33963E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 1.00640E-06 8.00265E+01 1.74302E-07 9.91191E-07 + 0.33963E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 2.07133E-04 -7.09801E+00 2.05545E-04 -2.55948E-05 + 0.33069E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 1.55534E+01 1.60755E+02 -1.46842E+01 5.12651E+00 + 0.33069E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 2.78142E-01 -7.09270E+01 9.08892E-02 -2.62873E-01 + 0.33069E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 1.50797E+02 -6.30459E+00 1.49885E+02 -1.65596E+01 + 0.33069E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 1.69687E-06 -8.85331E+01 4.34382E-08 -1.69631E-06 + 0.33069E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 4.45388E-06 1.13433E+01 4.36688E-06 8.76021E-07 + 0.33069E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 1.22536E-04 -1.74392E+02 -1.21950E-04 -1.19743E-05 + 0.32221E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 1.34773E+01 1.78033E+02 -1.34694E+01 4.62499E-01 + 0.32221E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 8.37678E-01 6.45376E+01 3.60133E-01 7.56312E-01 + 0.32221E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 1.37846E+02 3.71515E+00 1.37557E+02 8.93192E+00 + 0.32221E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 1.39901E-06 -1.26344E+01 1.36513E-06 -3.06005E-07 + 0.32221E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 2.23985E-06 1.61067E+02 -2.11867E-06 7.26736E-07 + 0.32221E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 5.11400E-05 1.18337E+02 -2.42740E-05 4.50118E-05 + 0.31416E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 6.69874E+00 7.81506E+01 1.37551E+00 6.55599E+00 + 0.31416E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 1.63693E+00 1.03614E+02 -3.85293E-01 1.59093E+00 + 0.31416E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 1.96547E+01 -9.96322E+01 -3.28870E+00 -1.93776E+01 + 0.31416E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 3.11324E-06 2.26957E+01 2.87217E-06 1.20120E-06 + 0.31416E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 2.50070E-06 1.72165E+02 -2.47735E-06 3.40884E-07 + 0.31416E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 1.20306E-04 -8.68409E+01 6.62999E-06 -1.20123E-04 + 0.30650E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 9.75388E+00 1.38962E+01 9.46840E+00 2.34253E+00 + 0.30650E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 1.62987E+00 1.00520E+02 -2.97569E-01 1.60247E+00 + 0.30650E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 8.56892E+01 -1.72055E+02 -8.48666E+01 -1.18447E+01 + 0.30650E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 1.62095E-06 1.25363E+02 -9.38144E-07 1.32188E-06 + 0.30650E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 8.89036E-07 -1.42106E+02 -7.01583E-07 -5.46047E-07 + 0.30650E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 9.13967E-06 4.92266E+01 5.96884E-06 6.92145E-06 + 0.29920E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 1.78423E+01 3.31281E+01 1.49420E+01 9.75102E+00 + 0.29920E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 8.24730E-01 9.99386E+01 -1.42343E-01 8.12354E-01 + 0.29920E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 1.16632E+02 -1.61264E+02 -1.10451E+02 -3.74639E+01 + 0.29920E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 9.83489E-07 7.90792E+01 1.86324E-07 9.65678E-07 + 0.29920E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 1.15779E-06 -1.14934E+02 -4.88089E-07 -1.04988E-06 + 0.29920E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 1.83798E-05 4.39408E+01 1.32345E-05 1.27540E-05 + 0.29224E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 1.55452E+01 -1.16546E+01 1.52247E+01 -3.14033E+00 + 0.29224E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 1.72226E-01 -4.38691E+01 1.24162E-01 -1.19355E-01 + 0.29224E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 5.97598E+01 -1.75473E+02 -5.95733E+01 -4.71682E+00 + 0.29224E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 1.60548E-06 9.35655E+01 -9.98432E-08 1.60237E-06 + 0.29224E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 8.29160E-06 -9.91040E+01 -1.31195E-06 -8.18715E-06 + 0.29224E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 3.56344E-06 -1.09914E+02 -1.21374E-06 -3.35037E-06 + 0.28560E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 1.00852E+01 -7.53926E+01 2.54342E+00 -9.75920E+00 + 0.28560E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 1.74923E-01 9.29464E+01 -8.99122E-03 1.74691E-01 + 0.28560E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 7.88047E+00 1.30093E+02 -5.07527E+00 6.02855E+00 + 0.28560E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 6.60208E-07 2.45060E+01 6.00735E-07 2.73846E-07 + 0.28560E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 4.27583E-06 3.83580E+01 3.35289E-06 2.65347E-06 + 0.28560E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 8.11092E-05 1.48964E+02 -6.94982E-05 4.18176E-05 + 0.27925E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 7.35156E+00 -8.36351E+01 8.14999E-01 -7.30624E+00 + 0.27925E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 5.95207E-01 -9.51904E+00 5.87012E-01 -9.84326E-02 + 0.27925E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 2.47026E+01 9.10290E+01 -4.43608E-01 2.46987E+01 + 0.27925E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 6.25911E-07 -1.71050E+01 5.98226E-07 -1.84095E-07 + 0.27925E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 6.91413E-07 7.91461E+01 1.30196E-07 6.79044E-07 + 0.27925E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 1.77055E-04 -1.66706E+01 1.69613E-04 -5.07917E-05 + 0.27318E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 8.64705E+00 -6.04878E+01 4.25961E+00 -7.52511E+00 + 0.27318E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 3.40998E-01 1.20121E+02 -1.71123E-01 2.94952E-01 + 0.27318E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 3.37067E+01 1.12880E+02 -1.31051E+01 3.10547E+01 + 0.27318E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 8.79282E-07 1.43789E+01 8.51738E-07 2.18355E-07 + 0.27318E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 9.16858E-07 1.58553E+01 8.81976E-07 2.50493E-07 + 0.27318E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 2.65938E-05 -8.20273E+01 3.68859E-06 -2.63368E-05 + 0.26737E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 6.20361E+00 -1.48409E+02 -5.28430E+00 -3.24976E+00 + 0.26737E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 6.46901E-01 1.54629E+02 -5.84508E-01 2.77185E-01 + 0.26737E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 1.30659E+01 4.17076E+01 9.75436E+00 8.69312E+00 + 0.26737E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 5.47770E-07 1.42117E+02 -4.32337E-07 3.36359E-07 + 0.26737E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 4.90225E-07 -6.27012E+01 2.24832E-07 -4.35627E-07 + 0.26737E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 5.50606E-05 -1.71337E+02 -5.44325E-05 -8.29351E-06 + 0.26180E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 3.98229E+00 -1.67664E+02 -3.89034E+00 -8.50785E-01 + 0.26180E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 8.19447E-01 1.53523E+02 -7.33496E-01 3.65344E-01 + 0.26180E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 4.37979E+00 3.74852E+01 3.47541E+00 2.66535E+00 + 0.26180E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 4.11685E-07 -4.48830E+01 2.91699E-07 -2.90510E-07 + 0.26180E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 1.77895E-06 5.36712E+00 1.77115E-06 1.66398E-07 + 0.26180E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 1.59319E-04 4.68960E+01 1.08867E-04 1.16321E-04 + 0.25646E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 6.59770E+00 -1.16959E+02 -2.99108E+00 -5.88074E+00 + 0.25646E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 6.28319E-01 1.38362E+02 -4.69582E-01 4.17465E-01 + 0.25646E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 1.57743E+01 5.26648E+01 9.56678E+00 1.25422E+01 + 0.25646E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 1.72850E-07 1.24583E+02 -9.81097E-08 1.42309E-07 + 0.25646E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 1.82583E-06 -1.47894E+02 -1.54659E-06 -9.70418E-07 + 0.25646E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 3.15558E-05 -1.67097E+02 -3.07590E-05 -7.04670E-06 + 0.25133E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 7.21421E+00 -1.17857E+02 -3.37093E+00 -6.37822E+00 + 0.25133E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 3.84597E-01 1.05274E+02 -1.01318E-01 3.71012E-01 + 0.25133E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 2.04019E+01 5.84946E+01 1.06616E+01 1.73945E+01 + 0.25133E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 3.13670E-07 -1.52551E+01 3.02618E-07 -8.25322E-08 + 0.25133E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 1.92766E-06 -1.33061E+02 -1.31617E-06 -1.40840E-06 + 0.25133E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 1.18270E-05 -7.66655E+01 2.72774E-06 -1.15081E-05 + 0.24640E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 3.34859E+00 -6.71854E+01 1.29842E+00 -3.08661E+00 + 0.24640E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 4.80561E-01 9.04814E+01 -4.03742E-03 4.80544E-01 + 0.24640E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 7.06856E+00 3.89556E+01 5.49675E+00 4.44413E+00 + 0.24640E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 5.47498E-07 6.72611E+01 2.11626E-07 5.04944E-07 + 0.24640E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 6.27041E-07 -1.29035E+01 6.11207E-07 -1.40025E-07 + 0.24640E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 1.15247E-04 -1.70534E+00 1.15196E-04 -3.42966E-06 + 0.24166E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 7.52808E+00 -1.14695E+02 -3.14517E+00 -6.83958E+00 + 0.24166E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 4.25099E-01 9.37186E+01 -2.75705E-02 4.24204E-01 + 0.24166E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 1.79953E+01 2.32896E+01 1.65290E+01 7.11495E+00 + 0.24166E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 4.64890E-07 -3.70438E+01 3.71064E-07 -2.80062E-07 + 0.24166E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 9.59311E-07 -6.64211E+01 3.83735E-07 -8.79218E-07 + 0.24166E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 1.41540E-05 1.03618E+02 -3.33250E-06 1.37561E-05 + 0.23710E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 9.85546E+00 -1.08498E+02 -3.12682E+00 -9.34628E+00 + 0.23710E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 2.41844E-01 5.92243E+01 1.23747E-01 2.07787E-01 + 0.23710E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 1.73907E+01 5.76063E+01 9.31676E+00 1.46845E+01 + 0.23710E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 3.22364E-07 8.50873E+01 2.76067E-08 3.21180E-07 + 0.23710E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 2.25784E-06 -2.14176E+01 2.10192E-06 -8.24480E-07 + 0.23710E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 1.58985E-05 1.76013E+02 -1.58601E-05 1.10535E-06 + 0.23271E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 3.59419E+00 -1.03648E+02 -8.48091E-01 -3.49270E+00 + 0.23271E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 2.26558E-01 4.76723E-01 2.26550E-01 1.88503E-03 + 0.23271E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 5.35629E+00 -1.35990E+02 -3.85234E+00 -3.72148E+00 + 0.23271E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 2.08837E-07 1.48961E+02 -1.78935E-07 1.07681E-07 + 0.23271E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 5.88714E-07 -8.45409E+00 5.82317E-07 -8.65509E-08 + 0.23271E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 7.03035E-05 -8.85305E+01 1.80286E-06 -7.02804E-05 + 0.22848E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 5.01264E+00 6.29196E+01 2.28196E+00 4.46310E+00 + 0.22848E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 1.73311E-01 3.03474E+00 1.73068E-01 9.17534E-03 + 0.22848E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 2.21255E+01 -1.23018E+02 -1.20564E+01 -1.85521E+01 + 0.22848E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 2.72104E-07 9.48447E+01 -2.29804E-08 2.71132E-07 + 0.22848E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 4.76452E-07 -7.73704E+01 1.04175E-07 -4.64924E-07 + 0.22848E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 6.10067E-05 1.18247E+02 -2.88733E-05 5.37415E-05 + 0.22440E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 5.60763E+00 3.52119E+01 4.58157E+00 3.23337E+00 + 0.22440E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 5.39316E-02 5.68584E+01 2.94849E-02 4.51581E-02 + 0.22440E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 1.96585E+01 -1.41625E+02 -1.54115E+01 -1.22041E+01 + 0.22440E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 2.65352E-07 -1.78827E+02 -2.65296E-07 -5.43428E-09 + 0.22440E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 5.21953E-07 6.75214E+01 1.99563E-07 4.82296E-07 + 0.22440E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 5.30087E-05 1.72580E+02 -5.25648E-05 6.84584E-06 + 0.22046E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 5.61040E+00 -1.43325E+01 5.43578E+00 -1.38885E+00 + 0.22046E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 5.20488E-02 -1.68800E+02 -5.10574E-02 -1.01100E-02 + 0.22046E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 2.18351E+01 1.62755E+02 -2.08535E+01 6.47335E+00 + 0.22046E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 1.69264E-07 -9.04918E+01 -1.45277E-09 -1.69258E-07 + 0.22046E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 9.12500E-08 1.12965E+02 -3.56033E-08 8.40177E-08 + 0.22046E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 9.16975E-05 1.79213E+02 -9.16888E-05 1.26003E-06 + 0.21666E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 1.11314E+01 1.19115E+01 1.08917E+01 2.29752E+00 + 0.21666E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 1.14354E-01 -1.16549E+02 -5.11121E-02 -1.02295E-01 + 0.21666E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 2.50748E+01 -1.72413E+02 -2.48553E+01 -3.31081E+00 + 0.21666E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 2.31431E-07 -1.09424E+02 -7.69618E-08 -2.18259E-07 + 0.21666E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 8.84397E-08 7.14733E+01 2.81014E-08 8.38564E-08 + 0.21666E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 1.15948E-05 1.51388E+02 -1.01788E-05 5.55250E-06 + 0.21299E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 1.96089E+00 -3.84402E+01 1.53588E+00 -1.21908E+00 + 0.21299E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 7.89639E-02 4.82431E+00 7.86841E-02 6.64091E-03 + 0.21299E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 2.32777E+00 -8.85053E+01 6.07206E-02 -2.32698E+00 + 0.21299E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 5.84046E-08 1.40064E+02 -4.47827E-08 3.74915E-08 + 0.21299E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 8.78369E-07 -1.49581E+02 -7.57460E-07 -4.44732E-07 + 0.21299E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 3.05803E-05 5.61162E+01 1.70488E-05 2.53868E-05 + 0.20944E+01 0.96664E+01 0.00000E+00 0.00000E+00 1 3.88109E+00 1.36851E+02 -2.83156E+00 2.65426E+00 + 0.20944E+01 0.96664E+01 0.00000E+00 0.00000E+00 3 2.03333E-01 2.45081E+01 1.85013E-01 8.43469E-02 + 0.20944E+01 0.96664E+01 0.00000E+00 0.00000E+00 5 1.34107E+01 -2.90509E+01 1.17235E+01 -6.51203E+00 + 0.20944E+01 0.96664E+01 0.00000E+00 0.00000E+00 2 8.02776E-08 1.39740E+01 7.79018E-08 1.93855E-08 + 0.20944E+01 0.96664E+01 0.00000E+00 0.00000E+00 4 1.35188E-07 -6.16404E+01 6.42149E-08 -1.18963E-07 + 0.20944E+01 0.96664E+01 0.00000E+00 0.00000E+00 6 4.03421E-05 1.25234E+02 -2.32739E-05 3.29516E-05 + 0.89760E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 1.02552E+00 0.00000E+00 1.02552E+00 0.00000E+00 + 0.89760E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 1.14644E+01 0.00000E+00 1.14644E+01 0.00000E+00 + 0.89760E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 3.15071E+01 1.80000E+02 -3.15071E+01 0.00000E+00 + 0.89760E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 1.11170E-05 0.00000E+00 1.11170E-05 0.00000E+00 + 0.89760E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 2.65106E-04 0.00000E+00 2.65106E-04 0.00000E+00 + 0.89760E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 5.30782E-04 1.80000E+02 -5.30782E-04 0.00000E+00 + 0.83776E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 1.12998E+00 -2.42271E+01 1.03046E+00 -4.63693E-01 + 0.83776E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 1.15089E+01 -3.68822E+00 1.14851E+01 -7.40336E-01 + 0.83776E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 5.26690E+01 1.15379E+02 -2.25739E+01 4.75861E+01 + 0.83776E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 3.70655E-06 -1.69763E+02 -3.64755E-06 -6.58730E-07 + 0.83776E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 3.69135E-05 -1.58176E+02 -3.42678E-05 -1.37230E-05 + 0.83776E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 4.60159E-04 1.79019E+02 -4.60092E-04 7.87500E-06 + 0.78540E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 1.88386E+00 -4.79809E+01 1.26102E+00 -1.39956E+00 + 0.78540E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 1.22017E+01 -7.94667E+00 1.20845E+01 -1.68690E+00 + 0.78540E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 9.70163E+01 9.36082E+01 -6.10556E+00 9.68239E+01 + 0.78540E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 7.77711E-06 1.00577E+02 -1.42755E-06 7.64497E-06 + 0.78540E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 2.49945E-04 1.08395E+01 2.45485E-04 4.70043E-05 + 0.78540E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 1.32002E-04 -4.31990E+01 9.62268E-05 -9.03597E-05 + 0.73920E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 3.38827E+00 -6.15988E+01 1.61160E+00 -2.98046E+00 + 0.73920E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 1.28132E+01 -9.60921E+00 1.26334E+01 -2.13887E+00 + 0.73920E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 1.47288E+02 8.62917E+01 9.52602E+00 1.46980E+02 + 0.73920E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 5.38734E-06 -8.24157E+01 7.11045E-07 -5.34021E-06 + 0.73920E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 2.43538E-04 1.78901E+02 -2.43494E-04 4.67036E-06 + 0.73920E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 2.60215E-04 -1.12966E+02 -1.01533E-04 -2.39589E-04 + 0.69813E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 5.55802E+00 -7.04467E+01 1.86018E+00 -5.23749E+00 + 0.69813E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 1.37088E+01 -7.45571E+00 1.35929E+01 -1.77885E+00 + 0.69813E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 2.05437E+02 8.72161E+01 9.97771E+00 2.05194E+02 + 0.69813E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 1.62903E-05 1.76141E+02 -1.62533E-05 1.09627E-06 + 0.69813E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 1.43380E-04 1.68981E+02 -1.40737E-04 2.74057E-05 + 0.69813E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 2.06708E-04 1.65126E+02 -1.99781E-04 5.30620E-05 + 0.66139E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 8.89350E+00 -8.82085E+01 2.78035E-01 -8.88915E+00 + 0.66139E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 1.55176E+01 -7.36981E+00 1.53894E+01 -1.99049E+00 + 0.66139E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 2.93669E+02 8.97558E+01 1.25141E+00 2.93667E+02 + 0.66139E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 5.77778E-06 9.66241E+01 -6.66497E-07 5.73921E-06 + 0.66139E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 1.15953E-04 2.30029E-02 1.15953E-04 4.65522E-08 + 0.66139E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 6.30883E-04 1.29356E+02 -4.00062E-04 4.87815E-04 + 0.62832E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 1.15334E+01 -1.20584E+02 -5.86814E+00 -9.92896E+00 + 0.62832E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 1.54793E+01 -1.60059E+01 1.48792E+01 -4.26821E+00 + 0.62832E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 3.67717E+02 8.30101E+01 4.47488E+01 3.64984E+02 + 0.62832E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 5.20384E-06 -6.00166E+01 2.60062E-06 -4.50741E-06 + 0.62832E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 3.98500E-05 8.21216E+01 5.46232E-06 3.94739E-05 + 0.62832E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 1.55362E-04 -2.46370E+01 1.41219E-04 -6.47654E-05 + 0.59840E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 1.33244E+01 -1.46344E+02 -1.10910E+01 -7.38454E+00 + 0.59840E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 1.30505E+01 -2.31810E+01 1.19969E+01 -5.13717E+00 + 0.59840E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 3.55836E+02 8.03516E+01 5.96389E+01 3.50803E+02 + 0.59840E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 7.00101E-07 -6.41700E+01 3.05035E-07 -6.30155E-07 + 0.59840E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 5.59663E-06 1.19951E+02 -2.79418E-06 4.84921E-06 + 0.59840E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 1.67261E-04 6.25517E+01 7.70984E-05 1.48432E-04 + 0.57120E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 1.64187E+01 -1.61510E+02 -1.55712E+01 -5.20691E+00 + 0.57120E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 1.15719E+01 -3.09350E+01 9.92580E+00 -5.94870E+00 + 0.57120E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 3.31414E+02 8.58487E+01 2.39913E+01 3.30545E+02 + 0.57120E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 4.36235E-06 -1.74062E+02 -4.33895E-06 -4.51301E-07 + 0.57120E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 1.08982E-04 5.39108E+01 6.41954E-05 8.80687E-05 + 0.57120E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 3.29301E-04 -1.77909E+02 -3.29082E-04 -1.20133E-05 + 0.54636E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 1.95609E+01 -1.70990E+02 -1.93195E+01 -3.06343E+00 + 0.54636E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 1.22157E+01 -5.19415E+01 7.53058E+00 -9.61844E+00 + 0.54636E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 3.30060E+02 8.59327E+01 2.34107E+01 3.29229E+02 + 0.54636E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 2.17363E-06 -1.04180E+01 2.13780E-06 -3.93052E-07 + 0.54636E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 6.43306E-05 1.68067E+02 -6.29404E-05 1.33019E-05 + 0.54636E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 6.81840E-05 6.77331E+01 2.58363E-05 6.30994E-05 + 0.52360E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 1.98622E+01 -1.76111E+02 -1.98165E+01 -1.34709E+00 + 0.52360E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 1.35662E+01 -7.83799E+01 2.73253E+00 -1.32882E+01 + 0.52360E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 2.82045E+02 7.58568E+01 6.89167E+01 2.73496E+02 + 0.52360E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 5.13704E-06 6.00244E+01 2.56662E-06 4.44991E-06 + 0.52360E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 1.30955E-04 1.04923E+02 -3.37242E-05 1.26538E-04 + 0.52360E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 1.82659E-04 7.31761E+01 5.28671E-05 1.74841E-04 + 0.50265E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 1.65307E+01 -1.75504E+02 -1.64798E+01 -1.29584E+00 + 0.50265E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 1.49605E+01 -9.47380E+01 -1.23574E+00 -1.49094E+01 + 0.50265E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 1.99246E+02 6.30734E+01 9.02285E+01 1.77646E+02 + 0.50265E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 4.90487E-06 -1.49795E+02 -4.23896E-06 -2.46759E-06 + 0.50265E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 8.33826E-06 7.68710E+01 1.89399E-06 8.12031E-06 + 0.50265E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 8.39787E-05 9.31698E+00 8.28708E-05 1.35958E-05 + 0.48332E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 1.29947E+01 1.70845E+02 -1.28292E+01 2.06750E+00 + 0.48332E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 1.63337E+01 -1.06544E+02 -4.65106E+00 -1.56575E+01 + 0.48332E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 1.68232E+02 5.60229E+01 9.40181E+01 1.39508E+02 + 0.48332E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 6.65316E-06 1.87227E+01 6.30109E-06 2.13559E-06 + 0.48332E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 4.31471E-05 1.03907E+02 -1.03701E-05 4.18823E-05 + 0.48332E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 8.63591E-04 4.71171E+00 8.60672E-04 7.09372E-05 + 0.46542E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 9.78268E+00 9.46941E+01 -8.00571E-01 9.74986E+00 + 0.46542E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 1.47387E+01 -1.13380E+02 -5.84882E+00 -1.35285E+01 + 0.46542E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 1.76580E+02 3.10352E+01 1.51302E+02 9.10382E+01 + 0.46542E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 1.73651E-06 -1.55005E+02 -1.57388E-06 -7.33745E-07 + 0.46542E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 3.11399E-05 -1.53427E+02 -2.78505E-05 -1.39299E-05 + 0.46542E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 1.06330E-04 -1.26671E+02 -6.35018E-05 -8.52856E-05 + 0.44880E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 2.20245E+01 4.59495E+01 1.53134E+01 1.58296E+01 + 0.44880E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 1.18726E+01 -1.18701E+02 -5.70167E+00 -1.04139E+01 + 0.44880E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 2.23852E+02 8.80283E+00 2.21215E+02 3.42571E+01 + 0.44880E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 8.24038E-07 -2.51897E+01 7.45675E-07 -3.50725E-07 + 0.44880E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 7.48101E-06 -6.83127E+01 2.76453E-06 -6.95147E-06 + 0.44880E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 1.37117E-04 -1.30828E+01 1.33558E-04 -3.10375E-05 + 0.43332E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 2.98206E+01 2.18320E+01 2.76818E+01 1.10899E+01 + 0.43332E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 8.56368E+00 -1.21460E+02 -4.46936E+00 -7.30489E+00 + 0.43332E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 2.67961E+02 -1.20238E+01 2.62082E+02 -5.58213E+01 + 0.43332E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 2.27866E-06 1.70378E+02 -2.24661E-06 3.80855E-07 + 0.43332E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 3.02321E-05 -5.74102E+00 3.00805E-05 -3.02418E-06 + 0.43332E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 2.09849E-04 8.53425E+01 1.70396E-05 2.09156E-04 + 0.41888E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 2.02945E+01 2.20745E+00 2.02795E+01 7.81699E-01 + 0.41888E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 6.23780E+00 -1.30877E+02 -4.08225E+00 -4.71651E+00 + 0.41888E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 2.42660E+02 -1.88606E+01 2.29632E+02 -7.84439E+01 + 0.41888E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 1.11213E-06 1.22078E+02 -5.90618E-07 9.42344E-07 + 0.41888E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 7.26435E-06 3.20781E+01 6.15527E-06 3.85792E-06 + 0.41888E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 1.87718E-05 9.93193E+01 -3.03984E-06 1.85240E-05 + 0.40537E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 1.08453E+01 -4.13971E+00 1.08170E+01 -7.82910E-01 + 0.40537E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 6.12036E+00 -1.44907E+02 -5.00780E+00 -3.51864E+00 + 0.40537E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 1.83918E+02 -1.53753E+01 1.77336E+02 -4.87642E+01 + 0.40537E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 1.19595E-06 1.70938E+02 -1.18103E-06 1.88365E-07 + 0.40537E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 1.65233E-05 3.52298E+01 1.34970E-05 9.53160E-06 + 0.40537E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 2.48022E-04 -8.96857E+01 1.36071E-06 -2.48018E-04 + 0.39270E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 2.14102E+01 -8.38503E+01 2.29362E+00 -2.12870E+01 + 0.39270E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 8.42243E+00 -1.73831E+02 -8.37366E+00 -9.05066E-01 + 0.39270E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 1.46029E+02 4.95004E+01 9.48373E+01 1.11042E+02 + 0.39270E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 2.36938E-06 -1.00742E+01 2.33285E-06 -4.14462E-07 + 0.39270E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 1.22460E-05 8.24528E+01 1.60843E-06 1.21399E-05 + 0.39270E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 2.49252E-04 9.89182E+01 -3.86402E-05 2.46238E-04 + 0.38080E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 3.38921E+01 -1.07390E+02 -1.01297E+01 -3.23429E+01 + 0.38080E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 8.95420E+00 1.46801E+02 -7.49262E+00 4.90289E+00 + 0.38080E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 2.19770E+02 6.35328E+01 9.79481E+01 1.96735E+02 + 0.38080E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 2.48359E-06 1.77723E+02 -2.48163E-06 9.86741E-08 + 0.38080E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 4.55721E-06 1.64633E+02 -4.39427E-06 1.20769E-06 + 0.38080E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 3.67951E-04 9.22626E+01 -1.45267E-05 3.67664E-04 + 0.36960E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 3.70947E+01 -1.08839E+02 -1.19782E+01 -3.51076E+01 + 0.36960E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 2.76490E+00 1.20187E+02 -1.39025E+00 2.38995E+00 + 0.36960E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 1.99918E+02 6.76126E+01 7.61419E+01 1.84850E+02 + 0.36960E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 1.48964E-06 -5.60816E+00 1.48251E-06 -1.45574E-07 + 0.36960E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 1.01331E-05 1.25856E+01 9.88958E-06 2.20797E-06 + 0.36960E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 2.91678E-05 3.61812E+01 2.35429E-05 1.72189E-05 + 0.35904E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 3.30039E+01 -1.07066E+02 -9.68559E+00 -3.15507E+01 + 0.35904E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 1.89172E+00 -1.18274E+02 -8.96101E-01 -1.66602E+00 + 0.35904E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 1.06046E+02 6.03673E+01 5.24330E+01 9.21763E+01 + 0.35904E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 5.92259E-06 -1.75074E+02 -5.90071E-06 -5.08610E-07 + 0.35904E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 5.20045E-06 -6.66310E+01 2.06276E-06 -4.77385E-06 + 0.35904E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 1.02279E-05 6.98291E+01 3.52680E-06 9.60062E-06 + 0.34907E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 2.92487E+01 -1.35492E+02 -2.08589E+01 -2.05035E+01 + 0.34907E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 4.19301E+00 -1.04006E+02 -1.01477E+00 -4.06836E+00 + 0.34907E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 7.88394E+01 -9.28880E+00 7.78056E+01 -1.27255E+01 + 0.34907E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 1.68255E-06 7.88873E+01 3.24295E-07 1.65101E-06 + 0.34907E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 1.28551E-05 -3.95288E+01 9.91522E-06 -8.18186E-06 + 0.34907E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 4.23083E-05 5.30138E+00 4.21273E-05 3.90905E-06 + 0.33963E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 1.84469E+01 1.67672E+02 -1.80215E+01 3.93847E+00 + 0.33963E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 3.08480E+00 -1.09450E+02 -1.02721E+00 -2.90875E+00 + 0.33963E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 1.18225E+02 -2.75519E+01 1.04817E+02 -5.46851E+01 + 0.33963E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 3.04137E-06 -1.75268E+02 -3.03100E-06 -2.50914E-07 + 0.33963E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 3.21850E-06 1.54084E+02 -2.89483E-06 1.40665E-06 + 0.33963E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 3.01455E-04 -1.77062E+02 -3.01058E-04 -1.54512E-05 + 0.33069E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 1.60051E+01 1.51167E+02 -1.40209E+01 7.71855E+00 + 0.33069E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 1.17663E+00 -8.42155E+01 1.18588E-01 -1.17063E+00 + 0.33069E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 1.47446E+02 -1.44395E+01 1.42789E+02 -3.67668E+01 + 0.33069E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 8.04426E-07 -1.06876E+02 -2.33529E-07 -7.69783E-07 + 0.33069E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 6.15143E-06 -7.82408E+01 1.25365E-06 -6.02233E-06 + 0.33069E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 1.06864E-04 -1.52783E+02 -9.50323E-05 -4.88753E-05 + 0.32221E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 1.48869E+01 1.74857E+02 -1.48270E+01 1.33442E+00 + 0.32221E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 5.47999E-01 9.08060E+01 -7.70838E-03 5.47944E-01 + 0.32221E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 1.48542E+02 3.14339E+00 1.48319E+02 8.14530E+00 + 0.32221E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 6.35393E-07 1.66937E+02 -6.18952E-07 1.43608E-07 + 0.32221E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 6.01892E-06 -1.68288E+02 -5.89360E-06 -1.22183E-06 + 0.32221E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 8.13790E-05 -1.66518E+02 -7.91365E-05 -1.89725E-05 + 0.31416E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 1.05501E+01 1.21919E+02 -5.57812E+00 8.95486E+00 + 0.31416E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 1.45794E+00 9.58304E+01 -1.48105E-01 1.45040E+00 + 0.31416E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 4.24499E+01 -2.55859E+01 3.82872E+01 -1.83325E+01 + 0.31416E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 3.44190E-06 7.40960E+00 3.41316E-06 4.43873E-07 + 0.31416E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 4.35897E-06 1.77654E+02 -4.35532E-06 1.78455E-07 + 0.31416E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 2.78032E-04 -8.31026E+01 3.33894E-05 -2.76020E-04 + 0.30650E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 1.01944E+01 2.25856E+01 9.41253E+00 3.91529E+00 + 0.30650E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 2.10286E+00 1.07118E+02 -6.18965E-01 2.00971E+00 + 0.30650E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 6.93633E+01 -1.71026E+02 -6.85143E+01 -1.08197E+01 + 0.30650E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 2.60910E-06 -2.31618E+01 2.39880E-06 -1.02623E-06 + 0.30650E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 1.32249E-05 1.46973E+02 -1.10880E-05 7.20803E-06 + 0.30650E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 2.65987E-04 8.13675E+01 3.99235E-05 2.62974E-04 + 0.29920E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 1.28245E+01 4.42971E+01 9.17889E+00 8.95638E+00 + 0.29920E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 1.36115E+00 1.08037E+02 -4.21460E-01 1.29426E+00 + 0.29920E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 1.09945E+02 -1.51740E+02 -9.68408E+01 -5.20561E+01 + 0.29920E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 1.67614E-06 1.75300E+02 -1.67051E-06 1.37335E-07 + 0.29920E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 9.93822E-07 2.34974E+01 9.11412E-07 3.96245E-07 + 0.29920E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 2.10974E-04 1.36270E+02 -1.52450E-04 1.45839E-04 + 0.29224E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 1.97856E+01 2.25146E+01 1.82776E+01 7.57628E+00 + 0.29224E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 2.41343E-01 1.06187E+02 -6.72790E-02 2.31776E-01 + 0.29224E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 1.03799E+02 -1.56684E+02 -9.53220E+01 -4.10833E+01 + 0.29224E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 1.98158E-07 1.42843E+02 -1.57928E-07 1.19687E-07 + 0.29224E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 5.69177E-06 -8.81143E+01 1.87291E-07 -5.68869E-06 + 0.29224E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 5.76813E-05 -1.79741E+02 -5.76807E-05 -2.60360E-07 + 0.28560E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 1.07052E+01 -5.59676E+01 5.99130E+00 -8.87162E+00 + 0.28560E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 4.89316E-01 -7.67062E+01 1.12515E-01 -4.76204E-01 + 0.28560E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 1.08440E+01 -1.76996E+02 -1.08291E+01 -5.68282E-01 + 0.28560E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 4.40423E-07 -6.09031E+01 2.14172E-07 -3.84841E-07 + 0.28560E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 6.96058E-06 -1.28117E+02 -4.29658E-06 -5.47623E-06 + 0.28560E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 9.18763E-05 -1.58600E+02 -8.55421E-05 -3.35233E-05 + 0.27925E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 7.75675E+00 -8.66832E+01 4.48776E-01 -7.74375E+00 + 0.27925E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 3.22970E-01 5.41618E+01 1.89098E-01 2.61823E-01 + 0.27925E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 1.44018E+01 7.38129E+01 4.01487E+00 1.38308E+01 + 0.27925E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 1.85964E-06 -8.81031E+00 1.83770E-06 -2.84829E-07 + 0.27925E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 1.17773E-06 3.26682E+01 9.91425E-07 6.35707E-07 + 0.27925E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 1.12296E-04 -9.59766E+01 -1.16925E-05 -1.11686E-04 + 0.27318E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 7.05701E+00 -7.30358E+01 2.05905E+00 -6.74994E+00 + 0.27318E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 3.93358E-01 1.26598E+02 -2.34517E-01 3.15804E-01 + 0.27318E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 3.28616E+01 1.00882E+02 -6.20385E+00 3.22706E+01 + 0.27318E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 1.16233E-06 9.52876E+01 -1.07114E-07 1.15738E-06 + 0.27318E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 2.67438E-06 -1.07960E+01 2.62704E-06 -5.00943E-07 + 0.27318E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 4.49284E-05 3.37994E+01 3.73351E-05 2.49931E-05 + 0.26737E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 9.21718E+00 -8.32949E+01 1.07619E+00 -9.15413E+00 + 0.26737E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 5.42877E-01 1.46915E+02 -4.54856E-01 2.96347E-01 + 0.26737E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 3.19621E+01 9.37437E+01 -2.08690E+00 3.18939E+01 + 0.26737E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 2.03245E-07 1.15622E+02 -8.78909E-08 1.83259E-07 + 0.26737E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 7.81812E-07 5.38366E+01 4.61339E-07 6.31186E-07 + 0.26737E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 8.73131E-05 -1.21332E+02 -4.54021E-05 -7.45803E-05 + 0.26180E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 9.70949E+00 -1.71418E+02 -9.60076E+00 -1.44895E+00 + 0.26180E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 1.04201E+00 1.61622E+02 -9.88867E-01 3.28532E-01 + 0.26180E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 2.11803E+01 -8.64679E+00 2.09396E+01 -3.18431E+00 + 0.26180E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 1.32364E-07 1.78033E+02 -1.32286E-07 4.54255E-09 + 0.26180E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 3.63634E-07 -5.73499E+01 1.96183E-07 -3.06173E-07 + 0.26180E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 1.16739E-04 -3.78866E+01 9.21335E-05 -7.16894E-05 + 0.25646E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 7.47266E+00 -1.22808E+02 -4.04884E+00 -6.28073E+00 + 0.25646E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 9.91862E-01 1.61546E+02 -9.40860E-01 3.13961E-01 + 0.25646E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 1.81448E+01 5.19297E+01 1.11886E+01 1.42846E+01 + 0.25646E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 4.63732E-07 -8.33099E+00 4.58838E-07 -6.71907E-08 + 0.25646E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 8.21092E-07 -1.50257E+02 -7.12919E-07 -4.07356E-07 + 0.25646E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 6.28604E-05 -1.42412E+02 -4.98118E-05 -3.83434E-05 + 0.25133E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 6.80443E+00 -1.19930E+02 -3.39497E+00 -5.89698E+00 + 0.25133E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 3.47744E-01 8.57684E+01 2.56595E-02 3.46796E-01 + 0.25133E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 1.60634E+01 5.46111E+01 9.30270E+00 1.30956E+01 + 0.25133E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 4.16408E-07 -3.09324E+01 3.57184E-07 -2.14045E-07 + 0.25133E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 3.80491E-07 -5.77632E+01 2.02962E-07 -3.21839E-07 + 0.25133E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 4.44242E-05 -1.50067E+02 -3.84985E-05 -2.21669E-05 + 0.24640E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 2.02092E+00 -1.07166E+02 -5.96441E-01 -1.93090E+00 + 0.24640E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 5.87198E-01 1.04010E+02 -1.42158E-01 5.69731E-01 + 0.24640E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 1.21144E+01 1.21219E+01 1.18443E+01 2.54393E+00 + 0.24640E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 2.52204E-07 1.50884E+01 2.43510E-07 6.56511E-08 + 0.24640E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 1.81501E-06 5.46350E+01 1.05050E-06 1.48011E-06 + 0.24640E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 1.16120E-04 -1.61866E+02 -1.10352E-04 -3.61421E-05 + 0.24166E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 3.60288E+00 -7.44685E+01 9.64740E-01 -3.47132E+00 + 0.24166E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 3.42232E-01 1.11560E+02 -1.25761E-01 3.18287E-01 + 0.24166E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 7.41981E+00 1.12791E+01 7.27651E+00 1.45123E+00 + 0.24166E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 4.14525E-07 -3.27004E+01 3.48825E-07 -2.23946E-07 + 0.24166E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 1.81367E-07 4.20195E+01 1.34741E-07 1.21404E-07 + 0.24166E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 9.98604E-05 -1.29604E+01 9.73165E-05 -2.23964E-05 + 0.23710E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 5.90041E+00 -7.16265E+01 1.85987E+00 -5.59962E+00 + 0.23710E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 2.89807E-01 6.24246E+01 1.34156E-01 2.56885E-01 + 0.23710E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 6.59655E+00 1.12988E+02 -2.57621E+00 6.07270E+00 + 0.23710E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 8.30732E-07 -1.79888E+02 -8.30730E-07 -1.61747E-09 + 0.23710E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 4.75389E-07 -1.02092E+02 -9.95851E-08 -4.64842E-07 + 0.23710E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 2.41882E-05 5.38294E+01 1.42757E-05 1.95262E-05 + 0.23271E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 6.15992E+00 -4.68252E+01 4.21478E+00 -4.49224E+00 + 0.23271E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 2.26066E-01 2.23217E+01 2.09126E-01 8.58610E-02 + 0.23271E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 1.32121E+01 -1.74300E+02 -1.31468E+01 -1.31223E+00 + 0.23271E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 5.06922E-07 -9.20091E+01 -1.77719E-08 -5.06611E-07 + 0.23271E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 1.16645E-06 -9.04759E+01 -9.68866E-09 -1.16641E-06 + 0.23271E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 5.85273E-05 1.61901E+02 -5.56315E-05 1.81819E-05 + 0.22848E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 4.73784E+00 2.96208E+01 4.11868E+00 2.34172E+00 + 0.22848E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 1.64005E-01 -2.10593E+01 1.53051E-01 -5.89325E-02 + 0.22848E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 2.21661E+01 -1.34777E+02 -1.56126E+01 -1.57348E+01 + 0.22848E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 7.01387E-09 -9.91274E+00 6.90916E-09 -1.20743E-09 + 0.22848E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 2.59927E-07 -4.75571E+01 1.75413E-07 -1.91813E-07 + 0.22848E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 9.94511E-07 1.58819E+02 -9.27324E-07 3.59335E-07 + 0.22440E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 7.51088E+00 3.11252E+01 6.42962E+00 3.88244E+00 + 0.22440E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 1.27339E-01 4.05865E-01 1.27336E-01 9.02020E-04 + 0.22440E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 2.48133E+01 -1.40365E+02 -1.91092E+01 -1.58284E+01 + 0.22440E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 1.61185E-07 1.77034E+02 -1.60970E-07 8.33966E-09 + 0.22440E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 5.18077E-07 1.10311E+02 -1.79834E-07 4.85864E-07 + 0.22440E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 3.08696E-05 9.30099E-01 3.08656E-05 5.01093E-07 + 0.22046E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 5.22966E+00 1.04660E+01 5.14266E+00 9.49981E-01 + 0.22046E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 7.57821E-02 -1.48328E+02 -6.44958E-02 -3.97897E-02 + 0.22046E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 1.97144E+01 -1.78416E+02 -1.97068E+01 -5.44831E-01 + 0.22046E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 1.68117E-07 1.29473E+02 -1.06876E-07 1.29773E-07 + 0.22046E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 9.11271E-07 9.25083E+01 -3.98816E-08 9.10397E-07 + 0.22046E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 1.53728E-04 -1.67765E+02 -1.50236E-04 -3.25781E-05 + 0.21666E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 7.97626E+00 -2.13099E+00 7.97074E+00 -2.96591E-01 + 0.21666E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 1.12486E-01 -1.32356E+02 -7.57864E-02 -8.31234E-02 + 0.21666E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 2.14830E+01 1.72871E+02 -2.13169E+01 2.66627E+00 + 0.21666E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 1.97649E-07 1.76708E+02 -1.97323E-07 1.13491E-08 + 0.21666E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 3.13445E-07 -1.53633E+02 -2.80837E-07 -1.39206E-07 + 0.21666E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 2.18781E-05 1.58066E+02 -2.02944E-05 8.17246E-06 + 0.21299E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 7.91255E+00 -1.36757E+01 7.68823E+00 -1.87073E+00 + 0.21299E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 6.87039E-02 -1.06949E+01 6.75105E-02 -1.27501E-02 + 0.21299E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 1.15202E+01 -1.74700E+02 -1.14709E+01 -1.06405E+00 + 0.21299E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 6.36190E-07 1.50295E+02 -5.52588E-07 3.15254E-07 + 0.21299E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 5.91377E-07 -4.50178E+01 4.18037E-07 -4.18297E-07 + 0.21299E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 2.58730E-05 7.48368E+01 6.76760E-06 2.49722E-05 + 0.20944E+01 0.89760E+01 0.00000E+00 0.00000E+00 1 4.96563E+00 -1.60802E+02 -4.68947E+00 -1.63289E+00 + 0.20944E+01 0.89760E+01 0.00000E+00 0.00000E+00 3 2.13733E-01 2.82896E+01 1.88205E-01 1.01294E-01 + 0.20944E+01 0.89760E+01 0.00000E+00 0.00000E+00 5 1.62405E+01 -1.44847E+00 1.62353E+01 -4.10526E-01 + 0.20944E+01 0.89760E+01 0.00000E+00 0.00000E+00 2 5.65403E-07 3.69764E+01 4.51691E-07 3.40082E-07 + 0.20944E+01 0.89760E+01 0.00000E+00 0.00000E+00 4 2.52164E-07 3.55747E+01 2.05100E-07 1.46700E-07 + 0.20944E+01 0.89760E+01 0.00000E+00 0.00000E+00 6 5.73534E-05 -5.96441E+00 5.70430E-05 -5.95963E-06 + 0.83776E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 1.56757E+00 0.00000E+00 1.56757E+00 0.00000E+00 + 0.83776E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 1.22209E+01 0.00000E+00 1.22209E+01 0.00000E+00 + 0.83776E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 1.69875E+01 1.80000E+02 -1.69875E+01 0.00000E+00 + 0.83776E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 2.20931E-05 1.80000E+02 -2.20931E-05 0.00000E+00 + 0.83776E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 2.57068E-04 0.00000E+00 2.57068E-04 0.00000E+00 + 0.83776E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 7.27373E-05 0.00000E+00 7.27373E-05 0.00000E+00 + 0.78540E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 2.53451E+00 -9.95092E+00 2.49638E+00 -4.37975E-01 + 0.78540E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 1.16745E+01 -4.61927E+00 1.16365E+01 -9.40194E-01 + 0.78540E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 4.44955E+01 9.79427E+01 -6.14853E+00 4.40686E+01 + 0.78540E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 1.15202E-06 1.57905E+02 -1.06742E-06 4.33323E-07 + 0.78540E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 2.46759E-04 4.54730E+00 2.45982E-04 1.95636E-05 + 0.78540E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 1.48000E-04 -3.11634E+01 1.26643E-04 -7.65873E-05 + 0.73920E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 3.97567E+00 -2.89072E+01 3.48032E+00 -1.92181E+00 + 0.73920E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 1.17305E+01 -6.81067E+00 1.16477E+01 -1.39110E+00 + 0.73920E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 8.71615E+01 8.75160E+01 3.77755E+00 8.70796E+01 + 0.73920E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 3.98267E-06 1.72937E+02 -3.95246E-06 4.89681E-07 + 0.73920E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 1.85471E-04 1.75975E+02 -1.85014E-04 1.30170E-05 + 0.73920E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 2.53625E-04 1.06235E+02 -7.09075E-05 2.43511E-04 + 0.69813E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 6.09297E+00 -4.75682E+01 4.11100E+00 -4.49710E+00 + 0.69813E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 1.25161E+01 -4.86558E+00 1.24710E+01 -1.06160E+00 + 0.69813E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 1.38522E+02 8.88042E+01 2.89095E+00 1.38492E+02 + 0.69813E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 3.98658E-06 -4.40729E+01 2.86418E-06 -2.77295E-06 + 0.69813E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 1.03863E-04 1.69307E+01 9.93618E-05 3.02465E-05 + 0.69813E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 2.56877E-04 -7.43062E+01 6.94842E-05 -2.47301E-04 + 0.66139E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 8.94730E+00 -7.21817E+01 2.73786E+00 -8.51811E+00 + 0.66139E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 1.45475E+01 -4.49046E+00 1.45028E+01 -1.13897E+00 + 0.66139E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 2.21214E+02 9.25103E+01 -9.68892E+00 2.21002E+02 + 0.66139E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 6.62032E-06 -2.42823E+01 6.03462E-06 -2.72249E-06 + 0.66139E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 8.23007E-05 1.03505E+01 8.09614E-05 1.47870E-05 + 0.66139E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 2.14352E-04 -1.11785E+02 -7.95511E-05 -1.99044E-04 + 0.62832E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 1.02705E+01 -1.07688E+02 -3.12049E+00 -9.78495E+00 + 0.62832E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 1.50288E+01 -1.18407E+01 1.47090E+01 -3.08377E+00 + 0.62832E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 3.07584E+02 8.60083E+01 2.14114E+01 3.06838E+02 + 0.62832E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 9.43630E-06 -1.22237E+02 -5.03352E-06 -7.98169E-06 + 0.62832E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 3.45838E-05 -9.27489E+00 3.41317E-05 -5.57392E-06 + 0.62832E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 1.81546E-04 1.39138E+02 -1.37300E-04 1.18775E-04 + 0.59840E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 1.07492E+01 -1.37613E+02 -7.93940E+00 -7.24650E+00 + 0.59840E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 1.29915E+01 -1.58237E+01 1.24992E+01 -3.54252E+00 + 0.59840E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 3.21894E+02 8.39091E+01 3.41551E+01 3.20077E+02 + 0.59840E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 2.80419E-06 -1.35091E+02 -1.98602E-06 -1.97969E-06 + 0.59840E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 8.23413E-05 1.44711E+02 -6.72106E-05 4.75692E-05 + 0.59840E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 4.90984E-04 -1.68780E+02 -4.81600E-04 -9.55338E-05 + 0.57120E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 1.31623E+01 -1.56136E+02 -1.20370E+01 -5.32514E+00 + 0.57120E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 1.15364E+01 -1.77088E+01 1.09898E+01 -3.50916E+00 + 0.57120E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 3.23488E+02 9.05032E+01 -2.84116E+00 3.23476E+02 + 0.57120E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 1.94245E-06 -5.45319E+01 1.12710E-06 -1.58200E-06 + 0.57120E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 5.93302E-05 -1.00088E+02 -1.03923E-05 -5.84129E-05 + 0.57120E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 1.69909E-04 3.28515E+01 1.42737E-04 9.21696E-05 + 0.54636E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 1.69922E+01 -1.66433E+02 -1.65181E+01 -3.98610E+00 + 0.54636E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 1.15081E+01 -3.34722E+01 9.59955E+00 -6.34711E+00 + 0.54636E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 3.39489E+02 9.16654E+01 -9.86630E+00 3.39346E+02 + 0.54636E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 2.68258E-06 1.57245E+02 -2.47379E-06 1.03758E-06 + 0.54636E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 5.96665E-05 -6.72198E+01 2.31027E-05 -5.50124E-05 + 0.54636E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 2.62325E-04 -9.87403E+00 2.58439E-04 -4.49841E-05 + 0.52360E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 1.93831E+01 -1.71184E+02 -1.91541E+01 -2.97064E+00 + 0.52360E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 1.19499E+01 -6.11685E+01 5.76268E+00 -1.04686E+01 + 0.52360E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 2.98234E+02 8.41721E+01 3.02831E+01 2.96692E+02 + 0.52360E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 7.56025E-06 1.10305E+02 -2.62349E-06 7.09047E-06 + 0.52360E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 3.40088E-05 1.44573E+02 -2.77121E-05 1.97140E-05 + 0.52360E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 2.10044E-04 2.31311E+01 1.93158E-04 8.25129E-05 + 0.50265E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 1.87405E+01 -1.69541E+02 -1.84291E+01 -3.40211E+00 + 0.50265E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 1.35178E+01 -8.26787E+01 1.72263E+00 -1.34076E+01 + 0.50265E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 2.08959E+02 7.55656E+01 5.20875E+01 2.02362E+02 + 0.50265E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 2.67221E-06 1.58704E+02 -2.48974E-06 9.70517E-07 + 0.50265E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 8.47254E-05 -8.24591E+01 1.11188E-05 -8.39926E-05 + 0.50265E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 3.33071E-05 4.88295E+01 2.19261E-05 2.50720E-05 + 0.48332E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 1.62348E+01 -1.77278E+02 -1.62165E+01 -7.70939E-01 + 0.48332E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 1.58559E+01 -9.77027E+01 -2.12522E+00 -1.57128E+01 + 0.48332E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 1.75968E+02 7.14768E+01 5.59030E+01 1.66852E+02 + 0.48332E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 1.09874E-05 1.85317E+01 1.04177E-05 3.49213E-06 + 0.48332E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 3.35578E-05 7.47625E+01 8.81966E-06 3.23780E-05 + 0.48332E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 1.69541E-04 -1.75063E+02 -1.68912E-04 -1.45905E-05 + 0.46542E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 7.07822E+00 1.35910E+02 -5.08395E+00 4.92490E+00 + 0.46542E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 1.58354E+01 -1.05251E+02 -4.16537E+00 -1.52778E+01 + 0.46542E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 1.57060E+02 4.36989E+01 1.13551E+02 1.08508E+02 + 0.46542E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 4.73904E-06 1.00284E+01 4.66664E-06 8.25240E-07 + 0.46542E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 3.09567E-05 -9.95037E+01 -5.11132E-06 -3.05318E-05 + 0.46542E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 2.44246E-04 2.27428E+01 2.25256E-04 9.44242E-05 + 0.44880E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 1.41786E+01 4.75159E+01 9.57602E+00 1.04562E+01 + 0.44880E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 1.44120E+01 -1.12760E+02 -5.57550E+00 -1.32899E+01 + 0.44880E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 1.74529E+02 2.37745E+01 1.59719E+02 7.03594E+01 + 0.44880E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 6.05833E-06 -5.28453E+01 3.65905E-06 -4.82853E-06 + 0.44880E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 1.85735E-05 -1.43602E+02 -1.49502E-05 -1.10212E-05 + 0.44880E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 1.16040E-04 1.39960E+01 1.12595E-04 2.80648E-05 + 0.43332E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 2.41749E+01 2.58757E+01 2.17512E+01 1.05504E+01 + 0.43332E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 1.05127E+01 -1.18698E+02 -5.04808E+00 -9.22139E+00 + 0.43332E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 2.32602E+02 8.97748E+00 2.29753E+02 3.62967E+01 + 0.43332E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 2.50950E-06 -3.56102E+01 2.04021E-06 -1.46120E-06 + 0.43332E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 5.55241E-06 3.18877E+01 4.71447E-06 2.93309E-06 + 0.43332E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 3.09205E-04 7.48941E+01 8.05804E-05 2.98521E-04 + 0.41888E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 2.05633E+01 1.99622E+01 1.93278E+01 7.02033E+00 + 0.41888E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 6.96187E+00 -1.24608E+02 -3.95410E+00 -5.72998E+00 + 0.41888E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 2.76688E+02 -5.12893E-01 2.76677E+02 -2.47678E+00 + 0.41888E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 6.83772E-06 8.59008E+01 4.88784E-07 6.82022E-06 + 0.41888E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 1.36940E-05 1.67258E+02 -1.33568E-05 3.02032E-06 + 0.41888E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 1.63895E-04 1.54491E+02 -1.47918E-04 7.05820E-05 + 0.40537E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 1.74968E+01 3.18084E+01 1.48691E+01 9.22222E+00 + 0.40537E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 4.82096E+00 -1.34130E+02 -3.35676E+00 -3.46031E+00 + 0.40537E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 2.73423E+02 -9.27789E+00 2.69846E+02 -4.40821E+01 + 0.40537E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 2.07229E-06 1.47109E+02 -1.74012E-06 1.12533E-06 + 0.40537E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 3.91547E-06 6.67332E+01 1.54667E-06 3.59705E-06 + 0.40537E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 1.18544E-04 7.71712E+01 2.63214E-05 1.15585E-04 + 0.39270E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 1.59944E+01 -5.49107E+01 9.19442E+00 -1.30875E+01 + 0.39270E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 5.33086E+00 -1.53521E+02 -4.77163E+00 -2.37691E+00 + 0.39270E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 1.38055E+02 2.13921E+01 1.28543E+02 5.03552E+01 + 0.39270E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 5.52361E-06 8.63414E+01 3.52465E-07 5.51235E-06 + 0.39270E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 1.67400E-05 -1.16884E+01 1.63929E-05 -3.39134E-06 + 0.39270E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 2.48267E-04 6.02871E+01 1.23054E-04 2.15625E-04 + 0.38080E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 2.91290E+01 -1.02696E+02 -6.40200E+00 -2.84167E+01 + 0.38080E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 7.44847E+00 -1.79462E+02 -7.44814E+00 -6.99605E-02 + 0.38080E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 2.08189E+02 6.48340E+01 8.85308E+01 1.88428E+02 + 0.38080E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 1.03439E-06 -1.36301E+02 -7.47845E-07 -7.14620E-07 + 0.38080E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 1.07088E-05 -1.27409E+02 -6.50555E-06 -8.50622E-06 + 0.38080E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 3.11075E-04 -5.21296E+01 1.90962E-04 -2.45563E-04 + 0.36960E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 3.53225E+01 -1.06819E+02 -1.02207E+01 -3.38114E+01 + 0.36960E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 6.42401E+00 1.44582E+02 -5.23519E+00 3.72299E+00 + 0.36960E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 2.37570E+02 7.29799E+01 6.95385E+01 2.27165E+02 + 0.36960E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 5.63254E-06 -6.54047E+00 5.59589E-06 -6.41575E-07 + 0.36960E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 6.61549E-06 1.65531E+02 -6.40567E-06 1.65291E-06 + 0.36960E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 1.91215E-04 1.09303E+02 -6.32079E-05 1.80466E-04 + 0.35904E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 3.59258E+01 -9.79591E+01 -4.97453E+00 -3.55797E+01 + 0.35904E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 6.67372E-02 1.10882E+02 -2.37883E-02 6.23535E-02 + 0.35904E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 1.56405E+02 7.15485E+01 4.95025E+01 1.48365E+02 + 0.35904E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 9.63188E-07 1.68494E+02 -9.43830E-07 1.92134E-07 + 0.35904E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 1.48053E-05 -1.61074E+02 -1.40049E-05 -4.80217E-06 + 0.35904E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 3.67786E-05 -5.87092E+01 1.91021E-05 -3.14289E-05 + 0.34907E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 3.56752E+01 -1.14364E+02 -1.47173E+01 -3.24980E+01 + 0.34907E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 4.69986E+00 -8.61332E+01 3.16947E-01 -4.68916E+00 + 0.34907E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 8.39138E+01 2.95558E+01 7.29945E+01 4.13922E+01 + 0.34907E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 1.52077E-06 -2.92401E+01 1.32699E-06 -7.42850E-07 + 0.34907E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 8.38391E-06 -1.64463E+02 -8.07755E-06 -2.24568E-06 + 0.34907E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 6.52088E-05 1.78155E+02 -6.51750E-05 2.09910E-06 + 0.33963E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 2.02836E+01 -1.67405E+02 -1.97955E+01 -4.42289E+00 + 0.33963E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 4.32723E+00 -9.76929E+01 -5.79259E-01 -4.28828E+00 + 0.33963E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 1.00634E+02 -3.03445E+01 8.68475E+01 -5.08400E+01 + 0.33963E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 8.43396E-07 -8.24686E+01 1.10543E-07 -8.36121E-07 + 0.33963E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 1.01507E-05 -8.80387E+01 3.47411E-07 -1.01448E-05 + 0.33963E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 5.78890E-05 1.78606E+01 5.50990E-05 1.77547E-05 + 0.33069E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 1.68790E+01 1.48179E+02 -1.43420E+01 8.89980E+00 + 0.33069E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 2.25875E+00 -8.05902E+01 3.69292E-01 -2.22835E+00 + 0.33069E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 1.45768E+02 -1.93284E+01 1.37552E+02 -4.82467E+01 + 0.33069E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 2.27239E-06 6.96769E+01 7.89231E-07 2.13093E-06 + 0.33069E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 1.57182E-06 1.26337E+02 -9.31360E-07 1.26617E-06 + 0.33069E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 6.97459E-05 2.03427E+01 6.53959E-05 2.42461E-05 + 0.32221E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 1.72239E+01 1.69712E+02 -1.69470E+01 3.07611E+00 + 0.32221E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 3.54069E-01 -8.75468E+01 1.51552E-02 -3.53745E-01 + 0.32221E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 1.56677E+02 -3.54844E+00 1.56376E+02 -9.69709E+00 + 0.32221E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 7.41240E-07 -1.46078E+02 -6.15077E-07 -4.13663E-07 + 0.32221E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 9.56641E-06 5.13441E+00 9.52803E-06 8.56122E-07 + 0.32221E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 4.99416E-05 1.37059E+02 -3.65603E-05 3.40222E-05 + 0.31416E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 1.59181E+01 1.36403E+02 -1.15279E+01 1.09769E+01 + 0.31416E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 2.15600E+00 9.30836E+01 -1.15977E-01 2.15288E+00 + 0.31416E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 7.16458E+01 -9.57668E+00 7.06473E+01 -1.19195E+01 + 0.31416E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 2.03447E-06 1.45799E+02 -1.68265E-06 1.14358E-06 + 0.31416E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 3.75999E-06 -1.95778E+00 3.75780E-06 -1.28453E-07 + 0.31416E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 2.24777E-05 5.21608E+01 1.37889E-05 1.77514E-05 + 0.30650E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 8.15484E+00 5.14158E+01 5.08587E+00 6.37458E+00 + 0.30650E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 2.26249E+00 1.07092E+02 -6.64943E-01 2.16257E+00 + 0.30650E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 3.95132E+01 -1.76955E+02 -3.94574E+01 -2.09903E+00 + 0.30650E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 3.84253E-06 1.28654E+01 3.74606E-06 8.55583E-07 + 0.30650E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 4.56255E-06 1.24421E+02 -2.57909E-06 3.76367E-06 + 0.30650E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 3.65381E-04 1.18167E+02 -1.72475E-04 3.22111E-04 + 0.29920E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 1.22355E+01 3.45743E+01 1.00746E+01 6.94335E+00 + 0.29920E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 1.94339E+00 1.15857E+02 -8.47550E-01 1.74883E+00 + 0.29920E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 1.02979E+02 -1.51335E+02 -9.03573E+01 -4.93983E+01 + 0.29920E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 6.55026E-07 1.00226E+02 -1.16288E-07 6.44621E-07 + 0.29920E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 6.33302E-06 -1.51222E+02 -5.55085E-06 -3.04880E-06 + 0.29920E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 1.28067E-04 -3.17305E+01 1.08925E-04 -6.73539E-05 + 0.29224E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 1.54712E+01 4.93560E+01 1.00773E+01 1.17391E+01 + 0.29224E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 7.36596E-01 1.39651E+02 -5.61368E-01 4.76907E-01 + 0.29224E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 1.18387E+02 -1.37441E+02 -8.72023E+01 -8.00703E+01 + 0.29224E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 3.75762E-07 1.19205E+02 -1.83348E-07 3.27994E-07 + 0.29224E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 4.20344E-07 -8.61019E+01 2.85761E-08 -4.19371E-07 + 0.29224E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 9.29732E-05 -8.35260E+01 1.04829E-05 -9.23803E-05 + 0.28560E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 1.03706E+01 1.50148E+00 1.03670E+01 2.71739E-01 + 0.28560E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 4.01751E-01 -5.71542E+01 2.17902E-01 -3.37525E-01 + 0.28560E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 5.23805E+01 -1.36744E+02 -3.81484E+01 -3.58945E+01 + 0.28560E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 5.90183E-07 -4.42208E+01 4.22959E-07 -4.11608E-07 + 0.28560E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 2.90683E-06 8.79451E+01 1.04231E-07 2.90496E-06 + 0.28560E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 2.40141E-04 -1.69505E+02 -2.36124E-04 -4.37430E-05 + 0.27925E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 7.42464E+00 -9.78783E+01 -1.01769E+00 -7.35456E+00 + 0.27925E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 4.93948E-01 -8.18352E+01 7.01507E-02 -4.88941E-01 + 0.27925E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 2.03483E+01 3.58023E+00 2.03085E+01 1.27067E+00 + 0.27925E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 1.75680E-06 -1.36632E+02 -1.27711E-06 -1.20637E-06 + 0.27925E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 5.34595E-06 -3.53975E+01 4.35777E-06 -3.09662E-06 + 0.27925E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 1.22607E-04 7.54987E+01 3.07012E-05 1.18701E-04 + 0.27318E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 7.59259E+00 -8.78867E+01 2.79976E-01 -7.58743E+00 + 0.27318E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 4.15340E-01 -1.77728E+02 -4.15013E-01 -1.64643E-02 + 0.27318E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 3.11530E+01 8.58701E+01 2.24358E+00 3.10721E+01 + 0.27318E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 2.32717E-06 -8.90662E+01 3.79268E-08 -2.32686E-06 + 0.27318E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 3.06886E-06 4.93448E+01 1.99938E-06 2.32817E-06 + 0.27318E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 1.13457E-04 1.73036E+02 -1.12620E-04 1.37553E-05 + 0.26737E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 8.22320E+00 -6.95080E+01 2.87875E+00 -7.70285E+00 + 0.26737E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 8.00882E-01 1.43020E+02 -6.39779E-01 4.81762E-01 + 0.26737E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 3.79568E+01 9.48204E+01 -3.18964E+00 3.78225E+01 + 0.26737E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 1.63015E-06 -1.74260E+02 -1.62197E-06 -1.63051E-07 + 0.26737E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 1.79826E-06 -4.02970E+01 1.37154E-06 -1.16303E-06 + 0.26737E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 4.20541E-05 1.03185E+02 -9.59234E-06 4.09455E-05 + 0.26180E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 1.07125E+01 -1.28292E+02 -6.63825E+00 -8.40787E+00 + 0.26180E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 1.15971E+00 1.75160E+02 -1.15557E+00 9.78563E-02 + 0.26180E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 2.73860E+01 4.70743E+01 1.86512E+01 2.00531E+01 + 0.26180E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 4.32761E-07 5.79389E+01 2.29720E-07 3.66757E-07 + 0.26180E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 4.49138E-07 7.14478E+01 1.42901E-07 4.25798E-07 + 0.26180E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 1.49056E-04 1.19332E+02 -7.30182E-05 1.29946E-04 + 0.25646E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 1.05013E+01 -1.42266E+02 -8.30506E+00 -6.42674E+00 + 0.25646E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 1.00129E+00 1.78864E+02 -1.00109E+00 1.98498E-02 + 0.25646E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 2.31720E+01 2.23772E+01 2.14271E+01 8.82162E+00 + 0.25646E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 3.02218E-07 -1.21200E+02 -1.56555E-07 -2.58508E-07 + 0.25646E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 1.29771E-07 1.08283E+02 -4.07102E-08 1.23221E-07 + 0.25646E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 7.15596E-05 3.02266E+01 6.18304E-05 3.60247E-05 + 0.25133E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 8.44915E+00 -1.20894E+02 -4.33817E+00 -7.25040E+00 + 0.25133E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 4.89669E-01 1.47443E+02 -4.12721E-01 2.63509E-01 + 0.25133E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 2.12932E+01 4.62772E+01 1.47172E+01 1.53884E+01 + 0.25133E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 4.62772E-07 -1.20387E+01 4.52594E-07 -9.65214E-08 + 0.25133E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 1.44346E-06 -2.18920E-01 1.44345E-06 -5.51525E-09 + 0.25133E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 6.11334E-05 -3.19314E+00 6.10385E-05 -3.40525E-06 + 0.24640E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 3.86142E+00 -8.40986E+01 3.97016E-01 -3.84095E+00 + 0.24640E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 4.66132E-01 1.15214E+02 -1.98571E-01 4.21721E-01 + 0.24640E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 1.30992E+01 4.58180E+01 9.12936E+00 9.39384E+00 + 0.24640E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 1.32584E-06 1.03706E+02 -3.14145E-07 1.28808E-06 + 0.24640E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 6.50941E-07 3.73210E+00 6.49561E-07 4.23707E-08 + 0.24640E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 4.54593E-05 -5.69225E+01 2.48105E-05 -3.80919E-05 + 0.24166E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 1.40216E+00 -6.71764E+01 5.43892E-01 -1.29238E+00 + 0.24166E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 3.74481E-01 9.13608E+01 -8.89341E-03 3.74375E-01 + 0.24166E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 9.75445E+00 -1.42642E+01 9.45372E+00 -2.40343E+00 + 0.24166E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 9.54200E-07 -1.00764E+01 9.39482E-07 -1.66948E-07 + 0.24166E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 3.82657E-07 2.84576E+01 3.36421E-07 1.82340E-07 + 0.24166E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 1.22314E-04 4.54696E+00 1.21929E-04 9.69656E-06 + 0.23710E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 1.63033E+00 1.31624E+01 1.58750E+00 3.71246E-01 + 0.23710E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 4.03943E-01 8.33588E+01 4.67164E-02 4.01233E-01 + 0.23710E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 8.60074E+00 -1.00011E+02 -1.49515E+00 -8.46979E+00 + 0.23710E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 3.56019E-07 -1.53457E+02 -3.18496E-07 -1.59092E-07 + 0.23710E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 6.88617E-07 4.88192E+01 4.53411E-07 5.18278E-07 + 0.23710E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 5.30090E-05 8.18265E+01 7.53634E-06 5.24705E-05 + 0.23271E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 7.18517E+00 6.41166E+00 7.14023E+00 8.02376E-01 + 0.23271E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 2.09577E-01 3.48450E+01 1.72000E-01 1.19744E-01 + 0.23271E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 2.32867E+01 -1.49279E+02 -2.00187E+01 -1.18964E+01 + 0.23271E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 1.10132E-06 -5.63508E+00 1.09600E-06 -1.08141E-07 + 0.23271E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 2.12949E-06 -5.90300E+00 2.11820E-06 -2.19007E-07 + 0.23271E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 8.15248E-05 3.68511E+01 6.52359E-05 4.88934E-05 + 0.22848E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 6.81419E+00 2.56005E+01 6.14523E+00 2.94437E+00 + 0.22848E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 2.52962E-01 -2.55731E+01 2.28181E-01 -1.09194E-01 + 0.22848E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 2.69366E+01 -1.35492E+02 -1.92099E+01 -1.88829E+01 + 0.22848E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 1.05896E-06 1.24001E+02 -5.92175E-07 8.77913E-07 + 0.22848E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 4.71315E-07 -7.56439E+01 1.16861E-07 -4.56597E-07 + 0.22848E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 6.23694E-05 7.88625E+01 1.20476E-05 6.11948E-05 + 0.22440E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 7.94945E+00 6.14286E+01 3.80185E+00 6.98138E+00 + 0.22440E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 2.27207E-01 1.06349E+01 2.23304E-01 4.19311E-02 + 0.22440E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 2.96360E+01 -1.18773E+02 -1.42652E+01 -2.59769E+01 + 0.22440E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 5.51092E-07 7.73213E+01 1.20955E-07 5.37654E-07 + 0.22440E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 7.38370E-07 1.02909E+02 -1.64956E-07 7.19708E-07 + 0.22440E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 6.68191E-05 -1.79681E+02 -6.68181E-05 -3.71655E-07 + 0.22046E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 5.58546E+00 4.73987E+01 3.78076E+00 4.11135E+00 + 0.22046E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 8.46638E-02 -7.97510E+01 1.50639E-02 -8.33129E-02 + 0.22046E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 1.75038E+01 -1.51211E+02 -1.53402E+01 -8.42960E+00 + 0.22046E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 2.32337E-07 1.58548E+02 -2.16242E-07 8.49701E-08 + 0.22046E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 8.34067E-07 1.12200E+02 -3.15141E-07 7.72240E-07 + 0.22046E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 1.15725E-04 -1.66915E+02 -1.12720E-04 -2.62006E-05 + 0.21666E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 7.05919E+00 8.63242E+00 6.97922E+00 1.05955E+00 + 0.21666E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 1.48330E-01 -1.25154E+02 -8.54051E-02 -1.21275E-01 + 0.21666E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 2.03933E+01 1.78899E+02 -2.03895E+01 3.91901E-01 + 0.21666E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 2.57948E-07 1.35934E+01 2.50722E-07 6.06255E-08 + 0.21666E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 2.05218E-07 -6.40888E+01 8.96753E-08 -1.84588E-07 + 0.21666E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 5.96507E-05 7.22981E+01 1.81376E-05 5.68263E-05 + 0.21299E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 5.69834E+00 -9.07301E-01 5.69763E+00 -9.02317E-02 + 0.21299E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 7.01477E-02 -8.51950E+01 5.87587E-03 -6.99011E-02 + 0.21299E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 9.48491E+00 -1.66674E+02 -9.22951E+00 -2.18622E+00 + 0.21299E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 4.47898E-07 4.32896E+01 3.26024E-07 3.07118E-07 + 0.21299E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 1.01161E-06 -1.40317E+02 -7.78522E-07 -6.45960E-07 + 0.21299E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 2.98298E-05 -9.48144E+01 -2.50356E-06 -2.97246E-05 + 0.20944E+01 0.83776E+01 0.00000E+00 0.00000E+00 1 2.80489E+00 -9.83647E+01 -4.08038E-01 -2.77505E+00 + 0.20944E+01 0.83776E+01 0.00000E+00 0.00000E+00 3 1.88894E-01 3.84326E+01 1.47968E-01 1.17416E-01 + 0.20944E+01 0.83776E+01 0.00000E+00 0.00000E+00 5 8.90577E+00 1.66650E+00 8.90201E+00 2.58996E-01 + 0.20944E+01 0.83776E+01 0.00000E+00 0.00000E+00 2 1.04924E-07 3.61737E+01 8.46976E-08 6.19296E-08 + 0.20944E+01 0.83776E+01 0.00000E+00 0.00000E+00 4 9.52807E-07 1.03685E+02 -2.25426E-07 9.25756E-07 + 0.20944E+01 0.83776E+01 0.00000E+00 0.00000E+00 6 5.93759E-05 -1.55470E+02 -5.40170E-05 -2.46509E-05 + 0.78540E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 4.01229E+00 0.00000E+00 4.01229E+00 0.00000E+00 + 0.78540E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 1.17449E+01 0.00000E+00 1.17449E+01 0.00000E+00 + 0.78540E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 1.23791E+00 0.00000E+00 1.23791E+00 0.00000E+00 + 0.78540E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 1.10257E-05 0.00000E+00 1.10257E-05 0.00000E+00 + 0.78540E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 2.46645E-04 0.00000E+00 2.46645E-04 0.00000E+00 + 0.78540E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 7.25818E-05 0.00000E+00 7.25818E-05 0.00000E+00 + 0.73920E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 5.39237E+00 -8.94182E+00 5.32683E+00 -8.38144E-01 + 0.73920E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 1.05857E+01 -2.56733E+00 1.05751E+01 -4.74171E-01 + 0.73920E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 3.80517E+01 7.89479E+01 7.29455E+00 3.73460E+01 + 0.73920E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 2.82974E-05 -1.75256E+02 -2.82004E-05 -2.34023E-06 + 0.73920E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 2.98490E-04 -1.78863E+02 -2.98431E-04 -5.92170E-06 + 0.73920E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 6.51599E-05 1.21714E+02 -3.42527E-05 5.54307E-05 + 0.69813E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 6.62219E+00 -2.63569E+01 5.93379E+00 -2.93999E+00 + 0.69813E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 1.08929E+01 -1.27052E+00 1.08902E+01 -2.41526E-01 + 0.69813E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 7.76520E+01 8.61929E+01 5.15595E+00 7.74806E+01 + 0.69813E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 9.41347E-06 -1.56433E+01 9.06479E-06 -2.53833E-06 + 0.69813E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 1.82501E-04 -2.26193E+00 1.82359E-04 -7.20293E-06 + 0.69813E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 1.60366E-04 -1.27660E+02 -9.79791E-05 -1.26954E-04 + 0.66139E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 7.86426E+00 -5.54646E+01 4.45838E+00 -6.47839E+00 + 0.66139E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 1.28164E+01 -1.65527E+00 1.28110E+01 -3.70212E-01 + 0.66139E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 1.42200E+02 9.38156E+01 -9.46291E+00 1.41885E+02 + 0.66139E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 3.72826E-06 1.51898E+02 -3.28873E-06 1.75618E-06 + 0.66139E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 1.15020E-04 1.61266E+02 -1.08926E-04 3.69424E-05 + 0.66139E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 5.53370E-04 -9.75707E+01 -7.29063E-05 -5.48547E-04 + 0.62832E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 7.76814E+00 -9.50350E+01 -6.81758E-01 -7.73816E+00 + 0.62832E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 1.36765E+01 -9.02736E+00 1.35071E+01 -2.14592E+00 + 0.62832E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 2.25965E+02 8.86770E+01 5.21708E+00 2.25905E+02 + 0.62832E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 8.19717E-06 -1.10845E+02 -2.91684E-06 -7.66066E-06 + 0.62832E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 6.41761E-05 1.65957E+02 -6.22582E-05 1.55719E-05 + 0.62832E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 1.41287E-04 1.39184E+02 -1.06928E-04 9.23505E-05 + 0.59840E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 7.61577E+00 -1.28907E+02 -4.78318E+00 -5.92631E+00 + 0.59840E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 1.22398E+01 -1.14233E+01 1.19974E+01 -2.42418E+00 + 0.59840E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 2.60491E+02 8.72384E+01 1.25505E+01 2.60188E+02 + 0.59840E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 2.45520E-06 -1.48205E+02 -2.08678E-06 -1.29359E-06 + 0.59840E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 7.81727E-05 1.81566E+01 7.42803E-05 2.43598E-05 + 0.59840E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 1.40593E-05 -7.12953E+01 4.50868E-06 -1.33167E-05 + 0.57120E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 9.53975E+00 -1.48115E+02 -8.10030E+00 -5.03904E+00 + 0.57120E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 1.11579E+01 -8.60949E+00 1.10322E+01 -1.67033E+00 + 0.57120E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 2.86812E+02 9.48867E+01 -2.44321E+01 2.85769E+02 + 0.57120E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 2.65253E-06 -1.24918E+02 -1.51830E-06 -2.17501E-06 + 0.57120E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 6.53729E-05 5.37742E+01 3.86334E-05 5.27360E-05 + 0.57120E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 3.38150E-04 -5.40531E+01 1.98506E-04 -2.73753E-04 + 0.54636E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 1.36661E+01 -1.58069E+02 -1.26771E+01 -5.10423E+00 + 0.54636E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 1.11111E+01 -1.77778E+01 1.05805E+01 -3.39252E+00 + 0.54636E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 3.22135E+02 9.64949E+01 -3.64384E+01 3.20067E+02 + 0.54636E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 1.32718E-06 1.55000E+02 -1.20283E-06 5.60894E-07 + 0.54636E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 4.99812E-05 1.19719E+02 -2.47780E-05 4.34070E-05 + 0.54636E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 4.53274E-04 1.74865E+02 -4.51455E-04 4.05669E-05 + 0.52360E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 1.74052E+01 -1.63520E+02 -1.66902E+01 -4.93750E+00 + 0.52360E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 1.06718E+01 -4.20474E+01 7.92477E+00 -7.14738E+00 + 0.52360E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 2.94644E+02 9.07659E+01 -3.93843E+00 2.94618E+02 + 0.52360E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 4.73917E-06 -9.51928E+01 -4.28927E-07 -4.71972E-06 + 0.52360E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 1.16415E-04 1.08252E+02 -3.64613E-05 1.10558E-04 + 0.52360E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 1.14916E-04 1.43455E+02 -9.23219E-05 6.84271E-05 + 0.50265E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 1.88517E+01 -1.63185E+02 -1.80457E+01 -5.45333E+00 + 0.50265E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 1.15578E+01 -6.73134E+01 4.45772E+00 -1.06635E+01 + 0.50265E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 2.10884E+02 8.53318E+01 1.71630E+01 2.10184E+02 + 0.50265E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 3.20678E-06 -4.53011E+01 2.25559E-06 -2.27942E-06 + 0.50265E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 1.18844E-04 8.15175E+01 1.75303E-05 1.17544E-04 + 0.50265E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 4.69516E-05 -5.83809E+01 2.46153E-05 -3.99817E-05 + 0.48332E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 1.74378E+01 -1.68745E+02 -1.71025E+01 -3.40334E+00 + 0.48332E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 1.40971E+01 -8.64784E+01 8.65902E-01 -1.40705E+01 + 0.48332E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 1.82174E+02 8.42424E+01 1.82755E+01 1.81255E+02 + 0.48332E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 1.83893E-05 -1.68574E+00 1.83814E-05 -5.40966E-07 + 0.48332E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 7.68924E-05 6.95989E+01 2.68040E-05 7.20693E-05 + 0.48332E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 8.74784E-06 -8.56344E+01 6.65888E-07 -8.72246E-06 + 0.46542E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 8.15596E+00 1.75203E+02 -8.12739E+00 6.82012E-01 + 0.46542E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 1.53081E+01 -9.46308E+01 -1.23591E+00 -1.52582E+01 + 0.46542E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 1.49159E+02 5.60779E+01 8.32402E+01 1.23771E+02 + 0.46542E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 1.12965E-05 1.73812E+02 -1.12307E-05 1.21759E-06 + 0.46542E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 2.59620E-05 -1.54407E+02 -2.34147E-05 -1.12150E-05 + 0.46542E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 4.26565E-04 -1.79050E+00 4.26357E-04 -1.33281E-05 + 0.44880E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 7.09183E+00 5.13544E+01 4.42886E+00 5.53888E+00 + 0.44880E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 1.59486E+01 -1.02546E+02 -3.46445E+00 -1.55678E+01 + 0.44880E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 1.41975E+02 3.72139E+01 1.13067E+02 8.58653E+01 + 0.44880E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 7.05704E-06 2.22513E+00 7.05172E-06 2.73997E-07 + 0.44880E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 3.84783E-06 -1.67124E+02 -3.75108E-06 -8.57431E-07 + 0.44880E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 2.36053E-04 -4.34204E+01 1.71452E-04 -1.62250E-04 + 0.43332E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 1.74560E+01 2.62114E+01 1.56610E+01 7.71002E+00 + 0.43332E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 1.27001E+01 -1.12280E+02 -4.81493E+00 -1.17520E+01 + 0.43332E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 1.81811E+02 2.89276E+01 1.59127E+02 8.79429E+01 + 0.43332E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 3.48368E-06 -1.39826E+02 -2.66184E-06 -2.24736E-06 + 0.43332E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 9.41053E-06 -3.06560E+01 8.09535E-06 -4.79827E-06 + 0.43332E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 1.34950E-04 -5.72000E+01 7.31037E-05 -1.13435E-04 + 0.41888E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 1.75268E+01 2.95976E+01 1.52398E+01 8.65659E+00 + 0.41888E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 8.16856E+00 -1.18770E+02 -3.93148E+00 -7.16023E+00 + 0.41888E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 2.49412E+02 2.28897E+01 2.29772E+02 9.70110E+01 + 0.41888E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 1.75280E-06 -1.25611E+02 -1.02063E-06 -1.42500E-06 + 0.41888E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 9.91313E-06 4.80820E+00 9.87824E-06 8.30922E-07 + 0.41888E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 1.77936E-04 -9.77748E+01 -2.40713E-05 -1.76300E-04 + 0.40537E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 2.06928E+01 5.03663E+01 1.31994E+01 1.59363E+01 + 0.40537E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 4.46817E+00 -1.26841E+02 -2.67909E+00 -3.57589E+00 + 0.40537E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 3.06376E+02 1.05245E+01 3.01222E+02 5.59616E+01 + 0.40537E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 8.84504E-07 3.47016E+01 7.27175E-07 5.03550E-07 + 0.40537E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 8.21162E-06 -1.11201E+02 -2.96965E-06 -7.65584E-06 + 0.40537E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 4.00282E-05 -5.72173E+01 2.16734E-05 -3.36529E-05 + 0.39270E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 1.41377E+01 -1.12908E+01 1.38640E+01 -2.76799E+00 + 0.39270E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 3.13152E+00 -1.42693E+02 -2.49082E+00 -1.89796E+00 + 0.39270E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 1.93246E+02 1.10980E+01 1.89632E+02 3.71974E+01 + 0.39270E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 5.20052E-07 1.41270E+01 5.04324E-07 1.26931E-07 + 0.39270E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 2.95105E-06 7.56940E+01 7.29207E-07 2.85954E-06 + 0.39270E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 7.00429E-05 -1.68973E+02 -6.87497E-05 -1.33972E-05 + 0.38080E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 2.23609E+01 -9.27604E+01 -1.07688E+00 -2.23350E+01 + 0.38080E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 4.51643E+00 -1.62534E+02 -4.30820E+00 -1.35558E+00 + 0.38080E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 1.75489E+02 6.21689E+01 8.19299E+01 1.55190E+02 + 0.38080E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 2.41292E-06 7.52354E+01 6.14926E-07 2.33324E-06 + 0.38080E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 9.60835E-06 -1.56504E+01 9.25213E-06 -2.59202E-06 + 0.38080E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 3.19325E-04 9.19132E+01 -1.06610E-05 3.19147E-04 + 0.36960E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 3.15482E+01 -1.03830E+02 -7.54113E+00 -3.06336E+01 + 0.36960E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 5.85608E+00 1.74655E+02 -5.83062E+00 5.45472E-01 + 0.36960E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 2.48340E+02 7.89546E+01 4.75786E+01 2.43740E+02 + 0.36960E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 2.07492E-06 -2.66054E+01 1.85521E-06 -9.29237E-07 + 0.36960E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 4.37715E-06 -2.66964E+01 3.91054E-06 -1.96649E-06 + 0.36960E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 1.80771E-04 -1.10252E+02 -6.25742E-05 -1.69595E-04 + 0.35904E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 3.60156E+01 -9.20228E+01 -1.27127E+00 -3.59931E+01 + 0.35904E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 3.21924E+00 1.28486E+02 -2.00342E+00 2.51989E+00 + 0.35904E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 1.89307E+02 7.84053E+01 3.80483E+01 1.85444E+02 + 0.35904E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 5.64004E-06 -7.07175E+00 5.59714E-06 -6.94358E-07 + 0.35904E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 1.33606E-05 -1.22152E+01 1.30581E-05 -2.82688E-06 + 0.35904E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 3.72796E-05 -4.03740E+01 2.84008E-05 -2.41487E-05 + 0.34907E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 3.92966E+01 -1.00720E+02 -7.30973E+00 -3.86107E+01 + 0.34907E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 4.35532E+00 -4.51609E+01 3.07102E+00 -3.08832E+00 + 0.34907E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 1.07302E+02 6.87789E+01 3.88398E+01 1.00026E+02 + 0.34907E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 4.31257E-07 7.80036E+01 8.96365E-08 4.21838E-07 + 0.34907E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 4.52445E-06 1.15998E+02 -1.98323E-06 4.06662E-06 + 0.34907E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 9.49427E-06 -1.00432E+02 -1.71914E-06 -9.33733E-06 + 0.33963E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 2.13097E+01 -1.36693E+02 -1.55068E+01 -1.46165E+01 + 0.33963E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 5.51639E+00 -7.70975E+01 1.23177E+00 -5.37711E+00 + 0.33963E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 7.92745E+01 -1.86517E+01 7.51111E+01 -2.53531E+01 + 0.33963E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 1.62709E-06 -5.30587E+01 9.77874E-07 -1.30045E-06 + 0.33963E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 9.75269E-06 -3.52880E+00 9.73420E-06 -6.00281E-07 + 0.33963E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 1.15597E-04 5.40731E+00 1.15082E-04 1.08933E-05 + 0.33069E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 1.62027E+01 1.57507E+02 -1.49701E+01 6.19858E+00 + 0.33069E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 3.45737E+00 -7.20414E+01 1.06601E+00 -3.28893E+00 + 0.33069E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 1.31417E+02 -2.38499E+01 1.20195E+02 -5.31375E+01 + 0.33069E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 9.65345E-07 -6.50442E+01 4.07297E-07 -8.75214E-07 + 0.33069E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 2.41019E-05 1.79454E+02 -2.41008E-05 2.29885E-07 + 0.33069E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 6.31673E-04 9.90580E-01 6.31578E-04 1.09204E-05 + 0.32221E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 1.91364E+01 1.73056E+02 -1.89961E+01 2.31344E+00 + 0.32221E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 1.18715E+00 -7.06503E+01 3.93344E-01 -1.12010E+00 + 0.32221E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 1.70362E+02 -9.55059E+00 1.68000E+02 -2.82662E+01 + 0.32221E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 4.99809E-07 -1.06494E+02 -1.41904E-07 -4.79241E-07 + 0.32221E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 1.68370E-06 -8.56473E+01 1.27786E-07 -1.67884E-06 + 0.32221E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 9.87225E-05 4.91979E+01 6.45101E-05 7.47301E-05 + 0.31416E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 2.37787E+01 1.42285E+02 -1.88105E+01 1.45462E+01 + 0.31416E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 2.07466E+00 1.12155E+02 -7.82376E-01 1.92148E+00 + 0.31416E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 9.75571E+01 -1.46784E+01 9.43731E+01 -2.47203E+01 + 0.31416E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 8.48344E-07 1.23074E+02 -4.62963E-07 7.10882E-07 + 0.31416E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 5.66718E-06 4.86740E+01 3.74228E-06 4.25585E-06 + 0.31416E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 8.04143E-05 -4.96860E+01 5.20261E-05 -6.13168E-05 + 0.30650E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 7.38148E+00 9.15157E+01 -1.95245E-01 7.37890E+00 + 0.30650E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 3.29637E+00 1.05942E+02 -9.05389E-01 3.16959E+00 + 0.30650E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 1.59239E+01 1.45150E+02 -1.30680E+01 9.09931E+00 + 0.30650E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 9.20878E-07 1.26858E+02 -5.52372E-07 7.36819E-07 + 0.30650E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 6.44469E-06 -1.37463E+02 -4.74868E-06 -4.35707E-06 + 0.30650E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 1.84963E-04 -7.90896E+01 3.50087E-05 -1.81620E-04 + 0.29920E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 9.55475E+00 4.60205E+01 6.63483E+00 6.87548E+00 + 0.29920E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 2.25190E+00 1.22800E+02 -1.21987E+00 1.89288E+00 + 0.29920E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 7.65632E+01 -1.46232E+02 -6.36467E+01 -4.25562E+01 + 0.29920E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 3.30459E-06 -5.16834E+01 2.04887E-06 -2.59277E-06 + 0.29920E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 4.57500E-06 8.31448E+01 5.46072E-07 4.54229E-06 + 0.29920E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 2.66066E-04 -9.27114E+01 -1.25865E-05 -2.65768E-04 + 0.29224E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 1.19686E+01 4.42002E+01 8.58041E+00 8.34415E+00 + 0.29224E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 1.19250E+00 1.52703E+02 -1.05970E+00 5.46892E-01 + 0.29224E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 1.17615E+02 -1.30791E+02 -7.68383E+01 -8.90454E+01 + 0.29224E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 7.20957E-07 -9.99238E+01 -1.24248E-07 -7.10170E-07 + 0.29224E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 8.21586E-07 -4.71313E+01 5.58942E-07 -6.02152E-07 + 0.29224E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 7.26383E-05 -1.55925E+02 -6.63196E-05 -2.96316E-05 + 0.28560E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 6.21358E+00 5.34831E+01 3.69745E+00 4.99373E+00 + 0.28560E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 2.01628E-01 -1.24667E+02 -1.14688E-01 -1.65833E-01 + 0.28560E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 7.95180E+01 -1.05426E+02 -2.11515E+01 -7.66533E+01 + 0.28560E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 1.00508E-06 1.68123E+02 -9.83563E-07 2.06862E-07 + 0.28560E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 3.01039E-06 -1.14123E+02 -1.23032E-06 -2.74749E-06 + 0.28560E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 3.33973E-05 1.09122E+01 3.27935E-05 6.32228E-06 + 0.27925E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 4.53157E+00 -9.58500E+01 -4.61878E-01 -4.50797E+00 + 0.27925E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 8.20870E-01 -6.42411E+01 3.56738E-01 -7.39301E-01 + 0.27925E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 2.60546E+01 -3.16441E+01 2.21809E+01 -1.36693E+01 + 0.27925E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 8.01297E-07 -2.70635E+01 7.13557E-07 -3.64572E-07 + 0.27925E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 1.75341E-06 1.08504E+01 1.72206E-06 3.30070E-07 + 0.27925E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 2.18610E-04 1.73304E+02 -2.17119E-04 2.54892E-05 + 0.27318E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 9.99244E+00 -1.09744E+02 -3.37567E+00 -9.40499E+00 + 0.27318E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 3.86871E-01 -6.98134E+01 1.33501E-01 -3.63107E-01 + 0.27318E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 4.31246E+01 5.51009E+01 2.46730E+01 3.53691E+01 + 0.27318E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 6.35974E-07 -1.01931E+02 -1.31474E-07 -6.22236E-07 + 0.27318E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 5.17706E-06 -1.64027E+02 -4.97717E-06 -1.42468E-06 + 0.27318E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 8.75692E-06 1.81192E+01 8.32268E-06 2.72336E-06 + 0.26737E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 9.92818E+00 -7.02271E+01 3.35862E+00 -9.34282E+00 + 0.26737E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 7.72400E-01 -1.69520E+02 -7.59515E-01 -1.40495E-01 + 0.26737E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 5.14800E+01 9.40198E+01 -3.60884E+00 5.13534E+01 + 0.26737E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 5.86267E-07 4.03448E+01 4.46831E-07 3.79541E-07 + 0.26737E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 2.76105E-06 -5.40329E+01 1.62162E-06 -2.23467E-06 + 0.26737E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 6.40460E-05 -3.07998E+01 5.50131E-05 -3.27941E-05 + 0.26180E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 9.54311E+00 -1.01460E+02 -1.89611E+00 -9.35285E+00 + 0.26180E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 1.12943E+00 -1.70595E+02 -1.11425E+00 -1.84557E-01 + 0.26180E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 3.33879E+01 8.20476E+01 4.61924E+00 3.30668E+01 + 0.26180E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 1.20858E-07 1.63797E+02 -1.16058E-07 3.37247E-08 + 0.26180E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 2.23524E-06 -1.78111E+02 -2.23402E-06 -7.36998E-08 + 0.26180E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 7.79042E-05 -1.52179E+02 -6.88995E-05 -3.63583E-05 + 0.25646E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 1.14073E+01 -1.17248E+02 -5.22267E+00 -1.01415E+01 + 0.25646E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 1.09117E+00 -1.74797E+02 -1.08667E+00 -9.89587E-02 + 0.25646E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 2.85546E+01 4.63585E+01 1.97068E+01 2.06642E+01 + 0.25646E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 1.16445E-06 4.14907E+01 8.72245E-07 7.71446E-07 + 0.25646E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 3.18423E-06 1.53586E+01 3.07051E-06 8.43373E-07 + 0.25646E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 4.78611E-05 -8.79781E+01 1.68859E-06 -4.78313E-05 + 0.25133E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 1.07763E+01 -1.24789E+02 -6.14852E+00 -8.85014E+00 + 0.25133E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 4.90281E-01 -1.60958E+02 -4.63453E-01 -1.59958E-01 + 0.25133E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 2.72118E+01 3.81946E+01 2.13862E+01 1.68260E+01 + 0.25133E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 1.90479E-07 -1.57847E+02 -1.76418E-07 -7.18258E-08 + 0.25133E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 1.30417E-06 -1.28559E+02 -8.12917E-07 -1.01982E-06 + 0.25133E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 3.97396E-05 -1.50014E+02 -3.44205E-05 -1.98611E-05 + 0.24640E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 3.08229E+00 -7.93782E+01 5.68145E-01 -3.02948E+00 + 0.24640E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 4.57329E-01 1.33975E+02 -3.17543E-01 3.29114E-01 + 0.24640E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 1.11366E+01 4.77987E+01 7.48088E+00 8.24989E+00 + 0.24640E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 1.44473E-06 1.03893E+02 -3.46901E-07 1.40246E-06 + 0.24640E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 1.29121E-06 -1.59332E+02 -1.20811E-06 -4.55739E-07 + 0.24640E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 3.06751E-05 1.48343E+02 -2.61106E-05 1.60995E-05 + 0.24166E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 1.92859E+00 -4.59529E+01 1.34085E+00 -1.38621E+00 + 0.24166E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 5.64025E-01 9.25139E+01 -2.47394E-02 5.63482E-01 + 0.24166E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 8.47245E+00 4.77957E+00 8.44299E+00 7.05946E-01 + 0.24166E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 9.31530E-07 -3.05163E+01 8.02499E-07 -4.73015E-07 + 0.24166E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 1.82182E-06 -1.26825E+00 1.82138E-06 -4.03231E-08 + 0.24166E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 7.36433E-05 -2.41484E+01 6.71987E-05 -3.01276E-05 + 0.23710E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 1.52807E+00 1.20738E+02 -7.81021E-01 1.31340E+00 + 0.23710E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 4.73512E-01 1.00441E+02 -8.58137E-02 4.65672E-01 + 0.23710E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 1.14824E+01 -6.25570E+01 5.29185E+00 -1.01903E+01 + 0.23710E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 1.61878E-07 1.32839E+00 1.61835E-07 3.75278E-09 + 0.23710E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 9.90933E-07 9.47958E+01 -8.28466E-08 9.87463E-07 + 0.23710E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 2.76732E-05 1.41440E+02 -2.16394E-05 1.72495E-05 + 0.23271E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 5.67105E+00 7.80786E+01 1.17147E+00 5.54874E+00 + 0.23271E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 2.57222E-01 5.13273E+01 1.60730E-01 2.00820E-01 + 0.23271E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 2.40381E+01 -1.04117E+02 -5.86303E+00 -2.33121E+01 + 0.23271E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 2.47096E-07 1.58977E+02 -2.30649E-07 8.86433E-08 + 0.23271E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 2.40007E-06 -4.35518E+01 1.73946E-06 -1.65367E-06 + 0.23271E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 8.06908E-05 -6.79064E+01 3.03495E-05 -7.47657E-05 + 0.22848E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 8.26328E+00 4.46699E+01 5.87659E+00 5.80926E+00 + 0.22848E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 2.96631E-01 -2.39599E+00 2.96371E-01 -1.24009E-02 + 0.22848E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 3.20198E+01 -1.23768E+02 -1.77974E+01 -2.66180E+01 + 0.22848E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 2.35459E-07 1.37994E+02 -1.74965E-07 1.57570E-07 + 0.22848E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 1.12507E-06 -8.10274E+01 1.75468E-07 -1.11130E-06 + 0.22848E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 9.84272E-05 -3.78231E+00 9.82128E-05 -6.49283E-06 + 0.22440E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 6.02941E+00 8.48031E+01 5.46131E-01 6.00462E+00 + 0.22440E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 3.02545E-01 3.58609E+01 2.45195E-01 1.77237E-01 + 0.22440E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 2.78648E+01 -1.00507E+02 -5.08110E+00 -2.73977E+01 + 0.22440E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 2.17131E-07 6.37748E+01 9.59506E-08 1.94781E-07 + 0.22440E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 2.59279E-07 1.39256E+02 -1.96437E-07 1.69228E-07 + 0.22440E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 4.36040E-05 -8.75006E+01 1.90151E-06 -4.35626E-05 + 0.22046E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 5.52913E+00 9.82202E+01 -7.90545E-01 5.47232E+00 + 0.22046E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 1.36294E-01 -2.77470E+01 1.20622E-01 -6.34540E-02 + 0.22046E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 1.41357E+01 -1.06923E+02 -4.11468E+00 -1.35236E+01 + 0.22046E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 1.21769E-06 -9.07473E+01 -1.58814E-08 -1.21759E-06 + 0.22046E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 5.02355E-07 -8.69660E+01 2.65892E-08 -5.01651E-07 + 0.22046E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 5.54435E-05 7.03179E+00 5.50265E-05 6.78740E-06 + 0.21666E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 3.12820E+00 5.80303E+01 1.65629E+00 2.65374E+00 + 0.21666E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 8.36535E-02 -1.10342E+02 -2.90802E-02 -7.84364E-02 + 0.21666E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 9.64737E+00 -1.70090E+02 -9.50342E+00 -1.66035E+00 + 0.21666E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 7.67812E-07 -1.65309E+02 -7.42712E-07 -1.94715E-07 + 0.21666E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 1.16532E-06 -2.52269E+01 1.05418E-06 -4.96664E-07 + 0.21666E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 6.74904E-05 -1.55165E+02 -6.12492E-05 -2.83460E-05 + 0.21299E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 3.62046E+00 2.20889E+00 3.61777E+00 1.39543E-01 + 0.21299E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 1.50130E-01 -2.86728E+01 1.31720E-01 -7.20332E-02 + 0.21299E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 7.66919E+00 -1.76090E+02 -7.65134E+00 -5.22973E-01 + 0.21299E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 4.75441E-07 1.10646E+02 -1.67641E-07 4.44906E-07 + 0.21299E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 6.12044E-07 -1.15532E+02 -2.63805E-07 -5.52272E-07 + 0.21299E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 2.86059E-05 -9.89250E+01 -4.43794E-06 -2.82595E-05 + 0.20944E+01 0.78540E+01 0.00000E+00 0.00000E+00 1 9.92468E-01 -8.24390E+01 1.30591E-01 -9.83839E-01 + 0.20944E+01 0.78540E+01 0.00000E+00 0.00000E+00 3 7.54635E-02 4.01093E+01 5.77157E-02 4.86172E-02 + 0.20944E+01 0.78540E+01 0.00000E+00 0.00000E+00 5 8.00348E+00 -1.78153E+01 7.61970E+00 -2.44866E+00 + 0.20944E+01 0.78540E+01 0.00000E+00 0.00000E+00 2 7.31441E-07 -4.53530E+01 5.14011E-07 -5.20384E-07 + 0.20944E+01 0.78540E+01 0.00000E+00 0.00000E+00 4 2.74224E-07 -1.37400E+02 -2.01856E-07 -1.85615E-07 + 0.20944E+01 0.78540E+01 0.00000E+00 0.00000E+00 6 4.53117E-05 -1.59402E+02 -4.24151E-05 -1.59407E-05 + 0.73920E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 6.54882E+00 0.00000E+00 6.54882E+00 0.00000E+00 + 0.73920E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 1.01616E+01 0.00000E+00 1.01616E+01 0.00000E+00 + 0.73920E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 1.37458E+01 0.00000E+00 1.37458E+01 0.00000E+00 + 0.73920E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 7.30021E-07 0.00000E+00 7.30021E-07 0.00000E+00 + 0.73920E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 7.64282E-05 1.80000E+02 -7.64282E-05 0.00000E+00 + 0.73920E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 7.42876E-05 0.00000E+00 7.42876E-05 0.00000E+00 + 0.69813E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 6.80818E+00 -1.02327E+01 6.69989E+00 -1.20945E+00 + 0.69813E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 9.35252E+00 7.46094E-01 9.35172E+00 1.21783E-01 + 0.69813E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 3.45340E+01 6.57351E+01 1.41919E+01 3.14831E+01 + 0.69813E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 1.32660E-05 1.73460E+00 1.32599E-05 4.01561E-07 + 0.69813E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 4.30184E-05 1.38200E+02 -3.20690E-05 2.86734E-05 + 0.69813E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 1.25372E-04 -4.63166E+01 8.65913E-05 -9.06652E-05 + 0.66139E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 6.02927E+00 -3.71702E+01 4.80439E+00 -3.64279E+00 + 0.66139E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 1.07700E+01 -1.20733E+00 1.07677E+01 -2.26928E-01 + 0.66139E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 7.36641E+01 8.71190E+01 3.70250E+00 7.35710E+01 + 0.66139E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 9.75973E-06 -1.45757E+02 -8.06801E-06 -5.49178E-06 + 0.66139E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 9.44849E-05 -1.68292E+02 -9.25190E-05 -1.91736E-05 + 0.66139E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 1.44553E-04 -1.48369E+02 -1.23080E-04 -7.58096E-05 + 0.62832E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 4.61932E+00 -8.13836E+01 6.92056E-01 -4.56719E+00 + 0.62832E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 1.16639E+01 -9.85943E+00 1.14917E+01 -1.99723E+00 + 0.62832E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 1.39282E+02 8.67924E+01 7.79330E+00 1.39064E+02 + 0.62832E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 1.61041E-05 -6.87902E+01 5.82619E-06 -1.50132E-05 + 0.62832E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 1.72740E-04 -7.14241E+00 1.71400E-04 -2.14778E-05 + 0.62832E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 5.35390E-04 -8.87113E+01 1.20411E-05 -5.35255E-04 + 0.59840E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 4.56950E+00 -1.18916E+02 -2.20946E+00 -3.99982E+00 + 0.59840E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 1.08465E+01 -1.18833E+01 1.06141E+01 -2.23351E+00 + 0.59840E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 1.81603E+02 8.65533E+01 1.09181E+01 1.81274E+02 + 0.59840E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 1.44194E-05 -9.09197E+01 -2.31459E-07 -1.44175E-05 + 0.59840E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 4.57896E-05 -1.27376E+01 4.46627E-05 -1.00960E-05 + 0.59840E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 5.12833E-04 -1.11754E+02 -1.90067E-04 -4.76311E-04 + 0.57120E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 6.40307E+00 -1.32816E+02 -4.35184E+00 -4.69690E+00 + 0.57120E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 1.02841E+01 -5.87096E+00 1.02302E+01 -1.05195E+00 + 0.57120E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 2.24517E+02 9.54897E+01 -2.14787E+01 2.23487E+02 + 0.57120E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 2.61492E-06 1.41458E+02 -2.04527E-06 1.62932E-06 + 0.57120E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 6.49176E-05 5.91737E+00 6.45717E-05 6.69262E-06 + 0.57120E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 1.69577E-04 -1.49086E+02 -1.45487E-04 -8.71207E-05 + 0.54636E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 1.04842E+01 -1.43092E+02 -8.38316E+00 -6.29619E+00 + 0.54636E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 1.07398E+01 -8.87057E+00 1.06113E+01 -1.65611E+00 + 0.54636E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 2.78373E+02 9.69437E+01 -3.36534E+01 2.76331E+02 + 0.54636E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 2.43944E-06 -5.95050E+00 2.42629E-06 -2.52895E-07 + 0.54636E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 4.14712E-05 -1.00564E+02 -7.60309E-06 -4.07683E-05 + 0.54636E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 3.82742E-04 3.50456E+00 3.82026E-04 2.33963E-05 + 0.52360E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 1.44833E+01 -1.53050E+02 -1.29104E+01 -6.56414E+00 + 0.52360E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 1.00705E+01 -2.61530E+01 9.03949E+00 -4.43878E+00 + 0.52360E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 2.72019E+02 9.18352E+01 -8.71116E+00 2.71879E+02 + 0.52360E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 3.39565E-06 -1.11879E+02 -1.26540E-06 -3.15106E-06 + 0.52360E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 1.02942E-04 -8.08049E+00 1.01920E-04 -1.44699E-05 + 0.52360E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 1.42607E-04 -1.59530E+02 -1.33602E-04 -4.98709E-05 + 0.50265E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 1.68853E+01 -1.57958E+02 -1.56511E+01 -6.33679E+00 + 0.50265E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 9.87532E+00 -5.01977E+01 6.32159E+00 -7.58679E+00 + 0.50265E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 2.06081E+02 8.82142E+01 6.42222E+00 2.05981E+02 + 0.50265E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 5.64478E-06 -7.63171E+00 5.59478E-06 -7.49654E-07 + 0.50265E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 2.29385E-06 -1.34545E+02 -1.60906E-06 -1.63484E-06 + 0.50265E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 8.33215E-05 5.60230E+01 4.65651E-05 6.90953E-05 + 0.48332E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 1.64281E+01 -1.64143E+02 -1.58030E+01 -4.48870E+00 + 0.48332E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 1.16766E+01 -7.43094E+01 3.15785E+00 -1.12415E+01 + 0.48332E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 1.84204E+02 9.01861E+01 -5.98404E-01 1.84203E+02 + 0.48332E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 3.88626E-06 -6.22584E+01 1.80900E-06 -3.43956E-06 + 0.48332E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 5.73026E-05 -9.08940E+01 -8.94030E-07 -5.72956E-05 + 0.48332E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 1.71563E-04 -2.18490E+01 1.59240E-04 -6.38492E-05 + 0.46542E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 1.05038E+01 -1.71171E+02 -1.03793E+01 -1.61221E+00 + 0.46542E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 1.31571E+01 -8.50784E+01 1.12877E+00 -1.31086E+01 + 0.46542E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 1.44742E+02 6.60581E+01 5.87377E+01 1.32288E+02 + 0.46542E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 3.43014E-06 1.23167E+01 3.35119E-06 7.31703E-07 + 0.46542E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 2.03451E-06 -1.35739E+01 1.97768E-06 -4.77500E-07 + 0.46542E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 2.29462E-04 2.66812E+00 2.29213E-04 1.06816E-05 + 0.44880E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 2.72348E+00 1.10840E+02 -9.68906E-01 2.54530E+00 + 0.44880E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 1.53937E+01 -9.27405E+01 -7.36012E-01 -1.53761E+01 + 0.44880E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 1.17833E+02 5.12760E+01 7.37125E+01 9.19293E+01 + 0.44880E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 1.77896E-06 1.79307E+02 -1.77882E-06 2.15210E-08 + 0.44880E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 1.23757E-05 -1.37418E+02 -9.11238E-06 -8.37389E-06 + 0.44880E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 3.70800E-04 -1.44642E+02 -3.02406E-04 -2.14576E-04 + 0.43332E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 1.07484E+01 2.83231E+01 9.46163E+00 5.09949E+00 + 0.43332E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 1.40063E+01 -1.05472E+02 -3.73640E+00 -1.34987E+01 + 0.43332E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 1.35084E+02 4.84349E+01 8.96240E+01 1.01070E+02 + 0.43332E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 4.48308E-06 -1.42616E+02 -3.56218E-06 -2.72192E-06 + 0.43332E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 2.21852E-05 1.50643E+01 2.14228E-05 5.76598E-06 + 0.43332E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 2.00252E-04 1.19209E+02 -9.77216E-05 1.74789E-04 + 0.41888E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 1.36962E+01 3.05339E+01 1.17969E+01 6.95835E+00 + 0.41888E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 9.61783E+00 -1.15234E+02 -4.10021E+00 -8.70006E+00 + 0.41888E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 1.91163E+02 4.45816E+01 1.36156E+02 1.34182E+02 + 0.41888E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 1.96576E-06 -8.46595E+01 1.82963E-07 -1.95723E-06 + 0.41888E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 1.34679E-05 -9.27422E+01 -6.44321E-07 -1.34524E-05 + 0.41888E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 1.46885E-04 -1.53987E+01 1.41612E-04 -3.90030E-05 + 0.40537E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 1.87666E+01 5.35935E+01 1.11382E+01 1.51039E+01 + 0.40537E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 5.18410E+00 -1.27663E+02 -3.16754E+00 -4.10385E+00 + 0.40537E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 2.56869E+02 2.96753E+01 2.23180E+02 1.27172E+02 + 0.40537E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 1.51349E-06 -1.46536E+02 -1.26260E-06 -8.34561E-07 + 0.40537E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 1.04376E-05 1.79560E+01 9.92924E-06 3.21777E-06 + 0.40537E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 1.47729E-04 9.51713E+01 -1.33153E-05 1.47127E-04 + 0.39270E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 1.59941E+01 1.68381E+01 1.53084E+01 4.63298E+00 + 0.39270E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 2.32370E+00 -1.54321E+02 -2.09421E+00 -1.00691E+00 + 0.39270E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 2.16853E+02 2.04104E+01 2.03238E+02 7.56258E+01 + 0.39270E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 1.22999E-06 -1.18687E+02 -5.90428E-07 -1.07901E-06 + 0.39270E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 1.91247E-05 -1.48006E+02 -1.62197E-05 -1.01329E-05 + 0.39270E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 7.81332E-05 -5.94455E+01 3.97195E-05 -6.72841E-05 + 0.38080E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 1.53027E+01 -7.05804E+01 5.08790E+00 -1.44321E+01 + 0.38080E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 2.41913E+00 -1.67887E+02 -2.36527E+00 -5.07623E-01 + 0.38080E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 1.42395E+02 4.77640E+01 9.57158E+01 1.05427E+02 + 0.38080E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 4.18654E-06 -1.18724E+02 -2.01201E-06 -3.67137E-06 + 0.38080E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 1.03635E-05 6.20388E+01 4.85917E-06 9.15373E-06 + 0.38080E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 2.38076E-04 -5.31278E+01 1.42853E-04 -1.90455E-04 + 0.36960E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 2.55914E+01 -9.79411E+01 -3.53558E+00 -2.53460E+01 + 0.36960E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 3.92690E+00 -1.76509E+02 -3.91961E+00 -2.39131E-01 + 0.36960E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 2.15418E+02 8.19634E+01 3.01168E+01 2.13303E+02 + 0.36960E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 2.93690E-06 2.07131E+01 2.74706E-06 1.03875E-06 + 0.36960E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 5.80926E-06 -1.21668E+01 5.67878E-06 -1.22435E-06 + 0.36960E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 1.55670E-04 -1.32424E+02 -1.05017E-04 -1.14911E-04 + 0.35904E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 3.32828E+01 -8.96588E+01 1.98203E-01 -3.32822E+01 + 0.35904E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 4.29372E+00 1.61499E+02 -4.07180E+00 1.36250E+00 + 0.35904E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 1.95691E+02 7.90721E+01 3.70977E+01 1.92142E+02 + 0.35904E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 7.66667E-07 1.41172E+02 -5.97261E-07 4.80685E-07 + 0.35904E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 2.79899E-05 6.33468E+00 2.78190E-05 3.08829E-06 + 0.35904E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 2.64703E-05 1.13405E+02 -1.05149E-05 2.42922E-05 + 0.34907E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 4.01499E+01 -9.49409E+01 -3.45803E+00 -4.00007E+01 + 0.34907E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 2.93435E+00 5.90882E+01 1.50743E+00 2.51755E+00 + 0.34907E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 1.32213E+02 8.79321E+01 4.77082E+00 1.32127E+02 + 0.34907E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 1.73162E-06 3.48632E+00 1.72841E-06 1.05300E-07 + 0.34907E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 1.21603E-05 2.39957E+00 1.21496E-05 5.09128E-07 + 0.34907E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 2.82496E-05 -1.02564E+02 -6.14536E-06 -2.75731E-05 + 0.33963E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 2.37871E+01 -1.17025E+02 -1.08083E+01 -2.11897E+01 + 0.33963E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 5.90261E+00 -3.82535E+01 4.63520E+00 -3.65455E+00 + 0.33963E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 6.20323E+01 1.62030E+01 5.95684E+01 1.73096E+01 + 0.33963E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 3.15925E-06 -8.79087E+01 1.15289E-07 -3.15715E-06 + 0.33963E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 2.38212E-06 8.23168E+01 3.18481E-07 2.36074E-06 + 0.33963E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 2.14721E-04 1.76955E+02 -2.14418E-04 1.14078E-05 + 0.33069E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 1.34862E+01 1.79486E+02 -1.34857E+01 1.20980E-01 + 0.33069E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 4.76130E+00 -6.00704E+01 2.37558E+00 -4.12633E+00 + 0.33069E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 1.13976E+02 -2.51399E+01 1.03180E+02 -4.84206E+01 + 0.33069E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 2.00436E-06 1.01438E+00 2.00404E-06 3.54837E-08 + 0.33069E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 1.17430E-06 -3.91293E+01 9.10933E-07 -7.41068E-07 + 0.33069E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 1.08744E-04 -1.48242E+00 1.08708E-04 -2.81323E-06 + 0.32221E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 1.73347E+01 -1.77615E+02 -1.73197E+01 -7.21305E-01 + 0.32221E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 2.14984E+00 -7.01460E+01 7.30138E-01 -2.02205E+00 + 0.32221E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 1.76297E+02 -1.13368E+01 1.72858E+02 -3.46559E+01 + 0.32221E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 2.56960E-06 -4.78183E+01 1.72545E-06 -1.90412E-06 + 0.32221E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 2.30994E-06 9.20031E+01 -8.07395E-08 2.30853E-06 + 0.32221E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 2.34038E-04 4.63930E+01 1.61418E-04 1.69464E-04 + 0.31416E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 3.14440E+01 1.52019E+02 -2.77681E+01 1.47531E+01 + 0.31416E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 1.45046E+00 1.43939E+02 -1.17254E+00 8.53811E-01 + 0.31416E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 1.35888E+02 -2.28706E+01 1.25205E+02 -5.28128E+01 + 0.31416E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 2.44644E-06 -2.89556E+01 2.14062E-06 -1.18440E-06 + 0.31416E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 4.60236E-06 -1.64573E+02 -4.43653E-06 -1.22431E-06 + 0.31416E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 9.09160E-05 -6.79179E+00 9.02780E-05 -1.07519E-05 + 0.30650E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 1.13556E+01 1.20080E+02 -5.69142E+00 9.82631E+00 + 0.30650E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 3.40783E+00 1.24089E+02 -1.91003E+00 2.82225E+00 + 0.30650E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 1.85040E+01 8.14085E+00 1.83175E+01 2.62030E+00 + 0.30650E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 1.16181E-06 -1.76771E+02 -1.15996E-06 -6.54363E-08 + 0.30650E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 3.62746E-06 6.24449E+00 3.60593E-06 3.94563E-07 + 0.30650E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 6.11172E-05 1.20697E+02 -3.12005E-05 5.25533E-05 + 0.29920E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 5.29684E+00 5.38311E+01 3.12603E+00 4.27604E+00 + 0.29920E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 2.92645E+00 1.23284E+02 -1.60601E+00 2.44639E+00 + 0.29920E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 4.00260E+01 -1.54314E+02 -3.60708E+01 -1.73487E+01 + 0.29920E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 3.44654E-06 1.47139E+02 -2.89507E-06 1.87008E-06 + 0.29920E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 6.41242E-06 -7.89634E+01 1.22757E-06 -6.29382E-06 + 0.29920E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 6.03807E-05 -8.44654E+01 5.82353E-06 -6.00992E-05 + 0.29224E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 9.87798E+00 3.82130E+01 7.76129E+00 6.11040E+00 + 0.29224E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 1.42142E+00 1.60231E+02 -1.33765E+00 4.80754E-01 + 0.29224E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 9.55058E+01 -1.25793E+02 -5.58572E+01 -7.74683E+01 + 0.29224E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 1.57739E-06 -1.75513E+01 1.50396E-06 -4.75678E-07 + 0.29224E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 2.68431E-06 -1.04249E+02 -6.60716E-07 -2.60173E-06 + 0.29224E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 3.22508E-05 1.32677E+02 -2.18617E-05 2.37104E-05 + 0.28560E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 4.88635E+00 2.88344E+01 4.28053E+00 2.35659E+00 + 0.28560E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 5.10666E-01 -1.68926E+02 -5.01158E-01 -9.80857E-02 + 0.28560E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 8.00163E+01 -1.01080E+02 -1.53774E+01 -7.85248E+01 + 0.28560E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 1.67059E-06 -1.74905E+02 -1.66399E-06 -1.48351E-07 + 0.28560E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 3.19312E-06 -9.68738E+01 -3.82164E-07 -3.17016E-06 + 0.28560E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 5.12141E-05 -1.46913E+02 -4.29093E-05 -2.79585E-05 + 0.27925E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 4.54544E+00 -1.31095E+02 -2.98774E+00 -3.42555E+00 + 0.27925E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 7.81733E-01 -5.40593E+01 4.58836E-01 -6.32911E-01 + 0.27925E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 4.35325E+01 -4.65896E+01 2.99164E+01 -3.16241E+01 + 0.27925E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 1.50042E-06 6.96061E+01 5.22856E-07 1.40638E-06 + 0.27925E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 3.77850E-06 -1.78094E+02 -3.77641E-06 -1.25643E-07 + 0.27925E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 1.37068E-04 -5.35677E+01 8.14010E-05 -1.10279E-04 + 0.27318E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 1.18969E+01 -1.06480E+02 -3.37499E+00 -1.14081E+01 + 0.27318E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 6.05892E-01 -3.62958E+01 4.88332E-01 -3.58661E-01 + 0.27318E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 5.61946E+01 5.78796E+01 2.98787E+01 4.75931E+01 + 0.27318E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 4.73367E-07 -8.42169E+01 4.76974E-08 -4.70958E-07 + 0.27318E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 3.08179E-06 2.11966E+01 2.87329E-06 1.11428E-06 + 0.27318E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 1.07084E-04 1.29473E+01 1.04362E-04 2.39928E-05 + 0.26737E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 1.08684E+01 -7.06053E+01 3.60911E+00 -1.02516E+01 + 0.26737E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 2.21241E-01 -1.03856E+02 -5.29842E-02 -2.14802E-01 + 0.26737E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 5.91666E+01 9.21609E+01 -2.23098E+00 5.91245E+01 + 0.26737E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 7.20412E-07 -2.55565E+01 6.49927E-07 -3.10787E-07 + 0.26737E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 1.54827E-06 8.46301E+01 1.44894E-07 1.54147E-06 + 0.26737E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 5.73974E-05 -9.83355E+01 -8.32081E-06 -5.67911E-05 + 0.26180E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 1.05494E+01 -8.81869E+01 3.33783E-01 -1.05441E+01 + 0.26180E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 7.93492E-01 -1.49503E+02 -6.83716E-01 -4.02694E-01 + 0.26180E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 4.35704E+01 9.60836E+01 -4.61753E+00 4.33250E+01 + 0.26180E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 5.02338E-07 -1.25045E+02 -2.88451E-07 -4.11266E-07 + 0.26180E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 1.10347E-06 -8.95079E+01 9.47720E-09 -1.10343E-06 + 0.26180E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 1.56780E-04 -1.15369E+02 -6.71723E-05 -1.41661E-04 + 0.25646E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 9.11276E+00 -1.03442E+02 -2.11843E+00 -8.86311E+00 + 0.25646E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 1.18300E+00 -1.62225E+02 -1.12653E+00 -3.61153E-01 + 0.25646E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 2.78214E+01 7.34009E+01 7.94784E+00 2.66620E+01 + 0.25646E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 6.40846E-07 -2.82207E+01 5.64670E-07 -3.03037E-07 + 0.25646E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 1.37865E-06 1.08129E+02 -4.28980E-07 1.31021E-06 + 0.25646E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 4.85625E-05 1.28480E+02 -3.02174E-05 3.80161E-05 + 0.25133E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 1.00579E+01 -1.08256E+02 -3.15076E+00 -9.55164E+00 + 0.25133E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 4.08443E-01 -1.41231E+02 -3.18453E-01 -2.55760E-01 + 0.25133E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 2.41033E+01 4.59719E+01 1.67521E+01 1.73303E+01 + 0.25133E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 3.52868E-07 1.25367E+02 -2.04245E-07 2.87749E-07 + 0.25133E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 1.53946E-06 1.41161E+02 -1.19909E-06 9.65452E-07 + 0.25133E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 8.62420E-05 -7.73618E+01 1.88693E-05 -8.41525E-05 + 0.24640E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 5.54873E+00 -1.29257E+02 -3.51126E+00 -4.29645E+00 + 0.24640E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 4.53060E-01 1.68020E+02 -4.43192E-01 9.40442E-02 + 0.24640E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 2.07344E+01 2.85975E+01 1.82049E+01 9.92457E+00 + 0.24640E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 1.30829E-06 1.23051E+02 -7.13518E-07 1.09659E-06 + 0.24640E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 1.27687E-06 -1.60302E+02 -1.20215E-06 -4.30387E-07 + 0.24640E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 2.13509E-05 4.37640E+01 1.54195E-05 1.47682E-05 + 0.24166E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 2.18447E+00 -6.60167E+00 2.16999E+00 -2.51140E-01 + 0.24166E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 5.78196E-01 1.04154E+02 -1.41390E-01 5.60642E-01 + 0.24166E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 4.68767E+00 1.08552E+01 4.60379E+00 8.82816E-01 + 0.24166E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 8.61184E-07 7.33029E+01 2.47428E-07 8.24874E-07 + 0.24166E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 3.50772E-06 2.60089E+01 3.15248E-06 1.53817E-06 + 0.24166E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 6.13491E-05 5.83345E+01 3.22058E-05 5.22159E-05 + 0.23710E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 2.58034E+00 1.14273E+02 -1.06074E+00 2.35223E+00 + 0.23710E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 4.89615E-01 9.34239E+01 -2.92413E-02 4.88741E-01 + 0.23710E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 1.46515E+01 -6.76338E+01 5.57527E+00 -1.35493E+01 + 0.23710E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 4.71210E-07 -1.32367E+02 -3.17538E-07 -3.48150E-07 + 0.23710E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 1.19757E-06 -9.68716E+01 -1.43284E-07 -1.18897E-06 + 0.23710E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 5.17421E-05 -1.76026E+02 -5.16177E-05 -3.58579E-06 + 0.23271E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 5.06392E+00 1.32058E+02 -3.39224E+00 3.75978E+00 + 0.23271E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 3.85525E-01 8.97930E+01 1.39252E-03 3.85523E-01 + 0.23271E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 2.06272E+01 -6.73902E+01 7.93018E+00 -1.90419E+01 + 0.23271E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 1.04029E-06 1.78669E+02 -1.04001E-06 2.41632E-08 + 0.23271E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 1.65028E-06 1.51793E+02 -1.45430E-06 7.80010E-07 + 0.23271E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 1.66421E-05 -6.44472E+01 7.17846E-06 -1.50143E-05 + 0.22848E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 5.18826E+00 7.65574E+01 1.20612E+00 5.04612E+00 + 0.22848E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 1.82352E-01 2.10585E-01 1.82351E-01 6.70215E-04 + 0.22848E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 2.62619E+01 -1.03280E+02 -6.03277E+00 -2.55596E+01 + 0.22848E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 6.12324E-07 1.17468E+02 -2.82435E-07 5.43296E-07 + 0.22848E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 7.15908E-07 -1.33456E+02 -4.92402E-07 -5.19677E-07 + 0.22848E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 7.84023E-05 9.82488E+01 -1.12486E-05 7.75912E-05 + 0.22440E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 2.08940E+00 2.80964E+01 1.84318E+00 9.84016E-01 + 0.22440E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 2.00695E-01 5.00189E+01 1.28954E-01 1.53784E-01 + 0.22440E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 1.83330E+01 -1.13129E+02 -7.20123E+00 -1.68595E+01 + 0.22440E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 1.00823E-06 6.58273E+01 4.12860E-07 9.19827E-07 + 0.22440E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 1.41710E-07 -4.40938E+01 1.01777E-07 -9.86071E-08 + 0.22440E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 3.65527E-05 5.71523E+01 1.98265E-05 3.07084E-05 + 0.22046E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 3.15951E+00 1.35033E+02 -2.23538E+00 2.23284E+00 + 0.22046E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 2.32600E-01 1.54889E+01 2.24152E-01 6.21161E-02 + 0.22046E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 9.80578E+00 -8.41073E+01 1.00671E+00 -9.75396E+00 + 0.22046E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 3.84943E-07 -1.22872E+02 -2.08932E-07 -3.23308E-07 + 0.22046E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 1.19387E-06 4.15167E+01 8.93927E-07 7.91343E-07 + 0.22046E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 2.90296E-05 -3.60358E+01 2.34747E-05 -1.70778E-05 + 0.21666E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 3.34983E+00 -1.27755E+02 -2.05106E+00 -2.64849E+00 + 0.21666E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 6.47427E-02 1.70410E+02 -6.38379E-02 1.07860E-02 + 0.21666E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 1.13108E+01 9.80591E+01 -1.58572E+00 1.11991E+01 + 0.21666E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 6.88218E-07 3.51470E+01 5.62741E-07 3.96191E-07 + 0.21666E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 5.30155E-07 1.70408E+01 5.06879E-07 1.55364E-07 + 0.21666E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 1.27882E-04 -1.76203E+02 -1.27601E-04 -8.46923E-06 + 0.21299E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 4.91205E+00 -7.45187E+01 1.31114E+00 -4.73383E+00 + 0.21299E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 8.64386E-02 4.04477E+01 6.57796E-02 5.60774E-02 + 0.21299E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 1.23319E+01 1.14687E+02 -5.15063E+00 1.12048E+01 + 0.21299E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 2.01863E-07 -1.54621E+02 -1.82381E-07 -8.65200E-08 + 0.21299E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 2.57001E-07 -2.69046E+01 2.29184E-07 -1.16295E-07 + 0.21299E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 4.22502E-05 2.29771E+01 3.88981E-05 1.64929E-05 + 0.20944E+01 0.73920E+01 0.00000E+00 0.00000E+00 1 2.36260E+00 -5.60751E+01 1.31858E+00 -1.96042E+00 + 0.20944E+01 0.73920E+01 0.00000E+00 0.00000E+00 3 1.11192E-01 -1.28668E+00 1.11164E-01 -2.49682E-03 + 0.20944E+01 0.73920E+01 0.00000E+00 0.00000E+00 5 1.87061E+00 -3.16804E+01 1.59187E+00 -9.82408E-01 + 0.20944E+01 0.73920E+01 0.00000E+00 0.00000E+00 2 2.34968E-07 6.76886E+01 8.92033E-08 2.17377E-07 + 0.20944E+01 0.73920E+01 0.00000E+00 0.00000E+00 4 9.50923E-07 1.79291E+02 -9.50850E-07 1.17709E-08 + 0.20944E+01 0.73920E+01 0.00000E+00 0.00000E+00 6 1.00742E-04 -1.49576E+01 9.73284E-05 -2.60018E-05 + 0.69813E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 6.31999E+00 0.00000E+00 6.31999E+00 0.00000E+00 + 0.69813E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 9.41841E+00 0.00000E+00 9.41841E+00 0.00000E+00 + 0.69813E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 2.29647E+01 0.00000E+00 2.29647E+01 0.00000E+00 + 0.69813E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 4.52596E-06 0.00000E+00 4.52596E-06 0.00000E+00 + 0.69813E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 1.27063E-04 0.00000E+00 1.27063E-04 0.00000E+00 + 0.69813E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 3.57623E-04 0.00000E+00 3.57623E-04 0.00000E+00 + 0.66139E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 4.44913E+00 -1.52558E+01 4.29235E+00 -1.17070E+00 + 0.66139E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 9.77057E+00 -3.67811E+00 9.75044E+00 -6.26793E-01 + 0.66139E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 3.44857E+01 4.95275E+01 2.23840E+01 2.62339E+01 + 0.66139E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 1.08097E-05 4.69666E+00 1.07734E-05 8.85102E-07 + 0.66139E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 9.18341E-05 4.07090E+00 9.16024E-05 6.51939E-06 + 0.66139E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 2.06268E-04 -1.15463E+02 -8.86787E-05 -1.86232E-04 + 0.62832E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 2.36747E+00 -4.64702E+01 1.63055E+00 -1.71645E+00 + 0.62832E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 1.02414E+01 -1.48030E+01 9.90153E+00 -2.61666E+00 + 0.62832E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 7.15267E+01 7.14694E+01 2.27319E+01 6.78183E+01 + 0.62832E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 1.81470E-05 1.58304E+02 -1.68614E-05 6.70852E-06 + 0.62832E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 4.88417E-05 -1.61409E+02 -4.62930E-05 -1.55714E-05 + 0.62832E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 1.14110E-04 8.29573E+01 1.39908E-05 1.13249E-04 + 0.59840E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 2.62762E+00 -8.26770E+01 3.34922E-01 -2.60619E+00 + 0.59840E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 9.69196E+00 -1.73700E+01 9.24997E+00 -2.89345E+00 + 0.59840E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 1.10313E+02 7.73724E+01 2.41158E+01 1.07644E+02 + 0.59840E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 9.64818E-06 -1.78409E+02 -9.64446E-06 -2.67900E-07 + 0.59840E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 9.12775E-05 1.60198E+02 -8.58802E-05 3.09221E-05 + 0.59840E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 8.57696E-05 -5.22267E+01 5.25372E-05 -6.77957E-05 + 0.57120E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 5.11514E+00 -9.49277E+01 -4.39379E-01 -5.09623E+00 + 0.57120E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 9.52137E+00 -9.54267E+00 9.38962E+00 -1.57847E+00 + 0.57120E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 1.61427E+02 8.97377E+01 7.38894E-01 1.61426E+02 + 0.57120E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 1.59798E-06 1.55819E+02 -1.45777E-06 6.54553E-07 + 0.57120E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 8.65052E-05 1.50988E+01 8.35189E-05 2.25332E-05 + 0.57120E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 3.36625E-04 -2.35385E+01 3.08616E-04 -1.34436E-04 + 0.54636E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 8.86053E+00 -1.14634E+02 -3.69320E+00 -8.05414E+00 + 0.54636E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 1.05943E+01 -7.15242E+00 1.05119E+01 -1.31909E+00 + 0.54636E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 2.33388E+02 9.11392E+01 -4.64004E+00 2.33342E+02 + 0.54636E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 4.26985E-06 2.71461E+01 3.79951E-06 1.94817E-06 + 0.54636E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 5.01101E-05 -3.82312E+01 3.93625E-05 -3.10099E-05 + 0.54636E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 2.75492E-04 -1.45153E+02 -2.26090E-04 -1.57414E-04 + 0.52360E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 1.17282E+01 -1.35489E+02 -8.36352E+00 -8.22210E+00 + 0.52360E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 1.03283E+01 -1.68820E+01 9.88323E+00 -2.99937E+00 + 0.52360E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 2.54092E+02 8.60403E+01 1.75461E+01 2.53486E+02 + 0.52360E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 4.20295E-06 1.63701E+02 -4.03403E-06 1.17957E-06 + 0.52360E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 1.13766E-04 1.48378E+02 -9.68754E-05 5.96484E-05 + 0.52360E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 1.36533E-04 4.39803E+01 9.82467E-05 9.48103E-05 + 0.50265E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 1.38181E+01 -1.51681E+02 -1.21644E+01 -6.55499E+00 + 0.50265E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 9.44165E+00 -3.36482E+01 7.85975E+00 -5.23155E+00 + 0.50265E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 2.13193E+02 8.34940E+01 2.41565E+01 2.11820E+02 + 0.50265E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 1.01976E-05 -1.78963E+02 -1.01959E-05 -1.84568E-07 + 0.50265E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 7.07360E-05 -8.14697E+01 1.04925E-05 -6.99534E-05 + 0.50265E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 3.51440E-04 1.74860E+02 -3.50027E-04 3.14839E-05 + 0.48332E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 1.44280E+01 -1.61207E+02 -1.36589E+01 -4.64800E+00 + 0.48332E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 1.00621E+01 -6.04099E+01 4.96858E+00 -8.74981E+00 + 0.48332E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 1.97974E+02 8.81936E+01 6.24052E+00 1.97876E+02 + 0.48332E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 1.09370E-05 -8.27458E+01 1.38104E-06 -1.08495E-05 + 0.48332E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 3.55105E-05 -1.04351E+02 -8.80147E-06 -3.44025E-05 + 0.48332E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 5.04519E-05 -4.42836E+01 3.61182E-05 -3.52260E-05 + 0.46542E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 1.34837E+01 -1.69471E+02 -1.32566E+01 -2.46400E+00 + 0.46542E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 1.08450E+01 -7.80843E+01 2.23920E+00 -1.06113E+01 + 0.46542E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 1.53820E+02 7.10303E+01 5.00018E+01 1.45466E+02 + 0.46542E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 8.33446E-06 -5.75445E+01 4.47264E-06 -7.03269E-06 + 0.46542E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 1.05027E-05 9.34935E+01 -6.39984E-07 1.04831E-05 + 0.46542E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 7.44788E-05 5.29428E+01 4.48818E-05 5.94366E-05 + 0.44880E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 8.26913E+00 1.69048E+02 -8.11853E+00 1.57098E+00 + 0.44880E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 1.35190E+01 -8.65657E+01 8.09841E-01 -1.34947E+01 + 0.44880E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 1.05159E+02 6.32329E+01 4.73597E+01 9.38903E+01 + 0.44880E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 3.21635E-06 -1.73101E+02 -3.19306E-06 -3.86338E-07 + 0.44880E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 1.24214E-05 1.92814E+01 1.17247E-05 4.10163E-06 + 0.44880E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 9.33100E-05 -5.43592E+00 9.28904E-05 -8.83948E-06 + 0.43332E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 4.52661E+00 6.67909E+01 1.78388E+00 4.16028E+00 + 0.43332E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 1.43800E+01 -1.00483E+02 -2.61629E+00 -1.41400E+01 + 0.43332E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 1.01119E+02 6.68484E+01 3.97563E+01 9.29753E+01 + 0.43332E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 4.25987E-06 -1.37669E+02 -3.14917E-06 -2.86866E-06 + 0.43332E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 1.17875E-05 -9.07703E+01 -1.58463E-07 -1.17865E-05 + 0.43332E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 1.88983E-04 1.11726E+02 -6.99541E-05 1.75559E-04 + 0.41888E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 9.94577E+00 3.17981E+01 8.45302E+00 5.24070E+00 + 0.41888E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 1.16285E+01 -1.11949E+02 -4.34648E+00 -1.07857E+01 + 0.41888E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 1.36505E+02 6.19706E+01 6.41470E+01 1.20494E+02 + 0.41888E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 6.51127E-06 9.73406E+01 -8.31926E-07 6.45790E-06 + 0.41888E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 9.18251E-06 -1.63301E+02 -8.79525E-06 -2.63859E-06 + 0.41888E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 3.07620E-04 1.35516E+02 -2.19469E-04 2.15553E-04 + 0.40537E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 1.61281E+01 4.47333E+01 1.14572E+01 1.13511E+01 + 0.40537E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 7.96251E+00 -1.26944E+02 -4.78573E+00 -6.36384E+00 + 0.40537E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 1.81663E+02 4.04537E+01 1.38233E+02 1.17869E+02 + 0.40537E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 2.08794E-06 -9.57222E+01 -2.08177E-07 -2.07753E-06 + 0.40537E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 9.63002E-06 -7.27938E+01 2.84866E-06 -9.19904E-06 + 0.40537E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 2.26807E-04 1.14773E+02 -9.50389E-05 2.05935E-04 + 0.39270E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 1.89577E+01 2.42976E+01 1.72784E+01 7.80063E+00 + 0.39270E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 4.01329E+00 -1.59063E+02 -3.74831E+00 -1.43411E+00 + 0.39270E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 1.86023E+02 3.09625E+01 1.59515E+02 9.57044E+01 + 0.39270E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 1.77688E-06 -9.60876E+01 -1.88436E-07 -1.76686E-06 + 0.39270E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 7.69169E-06 5.58233E+00 7.65522E-06 7.48217E-07 + 0.39270E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 1.46459E-04 -1.76415E+02 -1.46172E-04 -9.15913E-06 + 0.38080E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 1.28878E+01 -2.50742E+01 1.16732E+01 -5.46174E+00 + 0.38080E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 2.30045E+00 1.71711E+02 -2.27641E+00 3.31659E-01 + 0.38080E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 1.56919E+02 2.96665E+01 1.36350E+02 7.76671E+01 + 0.38080E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 1.59985E-06 2.19623E+01 1.48375E-06 5.98340E-07 + 0.38080E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 1.28114E-06 -7.03549E+01 4.30710E-07 -1.20657E-06 + 0.38080E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 6.56638E-05 2.05488E+01 6.14858E-05 2.30483E-05 + 0.36960E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 1.81662E+01 -8.08114E+01 2.90086E+00 -1.79331E+01 + 0.36960E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 2.55534E+00 1.77362E+02 -2.55263E+00 1.17626E-01 + 0.36960E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 1.62988E+02 6.86848E+01 5.92460E+01 1.51839E+02 + 0.36960E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 2.23198E-06 3.80240E+01 1.75825E-06 1.37488E-06 + 0.36960E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 1.24948E-05 -1.32857E+02 -8.49854E-06 -9.15937E-06 + 0.36960E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 3.48934E-04 -9.00712E+01 -4.33312E-07 -3.48933E-04 + 0.35904E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 2.90819E+01 -8.91080E+01 4.52739E-01 -2.90784E+01 + 0.35904E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 3.59283E+00 1.76940E+02 -3.58771E+00 1.91777E-01 + 0.35904E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 1.91079E+02 6.98902E+01 6.56968E+01 1.79429E+02 + 0.35904E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 9.48704E-06 1.77947E+02 -9.48095E-06 3.39817E-07 + 0.35904E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 7.54762E-06 -5.78757E+01 4.01350E-06 -6.39205E-06 + 0.35904E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 6.34640E-04 -9.38062E+01 -4.21287E-05 -6.33240E-04 + 0.34907E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 3.98702E+01 -9.44516E+01 -3.09459E+00 -3.97499E+01 + 0.34907E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 3.70999E+00 1.48788E+02 -3.17298E+00 1.92256E+00 + 0.34907E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 1.51812E+02 9.16560E+01 -4.38707E+00 1.51749E+02 + 0.34907E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 6.42696E-07 1.39659E+02 -4.89866E-07 4.16040E-07 + 0.34907E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 3.22988E-06 1.71347E+02 -3.19312E-06 4.85933E-07 + 0.34907E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 1.13068E-04 -1.57958E+02 -1.04804E-04 -4.24339E-05 + 0.33963E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 2.88505E+01 -1.09321E+02 -9.54564E+00 -2.72256E+01 + 0.33963E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 4.02325E+00 4.04374E+01 3.06215E+00 2.60955E+00 + 0.33963E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 9.22552E+01 5.86938E+01 4.79370E+01 7.88231E+01 + 0.33963E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 2.15636E-06 1.42153E+02 -1.70277E-06 1.32305E-06 + 0.33963E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 5.89676E-06 -1.61159E+02 -5.58079E-06 -1.90434E-06 + 0.33963E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 4.90298E-05 -1.58145E+02 -4.55060E-05 -1.82517E-05 + 0.33069E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 1.39240E+01 -1.46461E+02 -1.16058E+01 -7.69303E+00 + 0.33069E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 5.97353E+00 -3.35970E+01 4.97566E+00 -3.30545E+00 + 0.33069E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 8.73484E+01 -1.22637E+01 8.53551E+01 -1.85538E+01 + 0.33069E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 4.59589E-06 -1.77278E+02 -4.59070E-06 -2.18226E-07 + 0.33069E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 2.26758E-05 9.09548E+00 2.23907E-05 3.58460E-06 + 0.33069E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 1.86818E-04 -1.84755E+00 1.86721E-04 -6.02307E-06 + 0.32221E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 1.34781E+01 -1.64992E+02 -1.30183E+01 -3.49028E+00 + 0.32221E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 3.77372E+00 -6.06046E+01 1.85227E+00 -3.28787E+00 + 0.32221E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 1.58408E+02 -8.50890E+00 1.56665E+02 -2.34386E+01 + 0.32221E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 1.34531E-06 1.74360E+02 -1.33880E-06 1.32224E-07 + 0.32221E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 1.80668E-06 1.37706E+02 -1.33641E-06 1.21577E-06 + 0.32221E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 3.76484E-05 2.32550E+01 3.45897E-05 1.48645E-05 + 0.31416E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 3.36899E+01 1.64280E+02 -3.24298E+01 9.12763E+00 + 0.31416E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 1.37994E+00 -1.25220E+02 -7.95844E-01 -1.12733E+00 + 0.31416E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 1.85691E+02 -2.57900E+01 1.67195E+02 -8.07892E+01 + 0.31416E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 1.75295E-06 -1.77865E+02 -1.75173E-06 -6.53190E-08 + 0.31416E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 2.87323E-06 7.57064E+00 2.84819E-06 3.78544E-07 + 0.31416E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 2.08554E-05 1.72013E+02 -2.06530E-05 2.89794E-06 + 0.30650E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 1.86902E+01 1.33708E+02 -1.29145E+01 1.35107E+01 + 0.30650E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 2.61989E+00 1.41785E+02 -2.05843E+00 1.62071E+00 + 0.30650E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 6.18234E+01 -1.50271E+01 5.97093E+01 -1.60294E+01 + 0.30650E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 1.54330E-06 -5.74199E+00 1.53556E-06 -1.54406E-07 + 0.30650E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 2.18408E-06 -6.09877E+01 1.05927E-06 -1.91001E-06 + 0.30650E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 6.70798E-05 8.88627E+01 1.33144E-06 6.70666E-05 + 0.29920E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 4.80784E+00 9.12337E+01 -1.03518E-01 4.80672E+00 + 0.29920E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 3.13150E+00 1.30776E+02 -2.04521E+00 2.37138E+00 + 0.29920E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 1.27971E+01 -1.59970E+02 -1.20231E+01 -4.38326E+00 + 0.29920E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 1.75628E-06 5.43947E+01 1.02250E-06 1.42794E-06 + 0.29920E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 9.89335E-06 1.63934E+02 -9.50695E-06 2.73791E-06 + 0.29920E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 1.87186E-04 -7.29299E+01 5.49468E-05 -1.78940E-04 + 0.29224E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 7.82289E+00 2.30084E+01 7.20056E+00 3.05770E+00 + 0.29224E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 1.54922E+00 1.41672E+02 -1.21532E+00 9.60772E-01 + 0.29224E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 6.01345E+01 -1.40621E+02 -4.64822E+01 -3.81518E+01 + 0.29224E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 2.07413E-06 7.71122E+01 4.62618E-07 2.02188E-06 + 0.29224E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 4.32201E-06 1.52240E+01 4.17034E-06 1.13493E-06 + 0.29224E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 7.20341E-05 -9.49360E+01 -6.19805E-06 -7.17669E-05 + 0.28560E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 7.21335E+00 1.82205E+01 6.85167E+00 2.25543E+00 + 0.28560E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 1.02864E+00 1.75297E+02 -1.02518E+00 8.43337E-02 + 0.28560E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 7.63675E+01 -1.06710E+02 -2.19578E+01 -7.31427E+01 + 0.28560E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 7.23890E-07 7.77069E+01 1.54125E-07 7.07292E-07 + 0.28560E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 2.56135E-06 1.50790E+02 -2.23565E-06 1.24995E-06 + 0.28560E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 6.89189E-05 -1.47363E+02 -5.80369E-05 -3.71691E-05 + 0.27925E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 3.03876E+00 -8.60206E+01 2.10882E-01 -3.03143E+00 + 0.27925E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 4.95448E-01 -7.34052E+01 1.41500E-01 -4.74812E-01 + 0.27925E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 4.72037E+01 -6.76732E+01 1.79321E+01 -4.36649E+01 + 0.27925E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 3.65773E-07 -3.81810E+01 2.87520E-07 -2.26102E-07 + 0.27925E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 6.78455E-06 -1.01230E+02 -1.32123E-06 -6.65466E-06 + 0.27925E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 4.30097E-05 3.58556E+01 3.48591E-05 2.51927E-05 + 0.27318E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 1.07123E+01 -1.13056E+02 -4.19526E+00 -9.85661E+00 + 0.27318E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 7.57132E-01 -2.20128E+01 7.01938E-01 -2.83783E-01 + 0.27318E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 4.11525E+01 5.28633E+01 2.48445E+01 3.28066E+01 + 0.27318E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 1.69576E-06 1.57356E-01 1.69575E-06 4.65718E-09 + 0.27318E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 2.70915E-06 1.57695E+02 -2.50644E-06 1.02821E-06 + 0.27318E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 2.82613E-04 1.12487E+01 2.77184E-04 5.51288E-05 + 0.26737E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 1.02306E+01 -7.42964E+01 2.76904E+00 -9.84878E+00 + 0.26737E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 2.74212E-01 -4.92881E+01 1.78856E-01 -2.07853E-01 + 0.26737E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 6.05166E+01 8.49845E+01 5.29071E+00 6.02849E+01 + 0.26737E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 1.09375E-07 -1.60619E+02 -1.03177E-07 -3.62960E-08 + 0.26737E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 1.11814E-06 -1.17659E+01 1.09465E-06 -2.28004E-07 + 0.26737E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 1.16773E-04 -1.68672E+02 -1.14499E-04 -2.29364E-05 + 0.26180E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 1.29259E+01 -7.97514E+01 2.29977E+00 -1.27196E+01 + 0.26180E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 3.85675E-01 -1.42742E+02 -3.06964E-01 -2.33491E-01 + 0.26180E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 5.73229E+01 9.83398E+01 -8.31434E+00 5.67167E+01 + 0.26180E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 1.09730E-06 -1.70287E+02 -1.08157E-06 -1.85135E-07 + 0.26180E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 4.57068E-06 5.79817E+01 2.42333E-06 3.87538E-06 + 0.26180E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 4.66253E-05 -8.22349E+01 6.29961E-06 -4.61978E-05 + 0.25646E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 8.88569E+00 -9.34422E+01 -5.33505E-01 -8.86966E+00 + 0.25646E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 9.52770E-01 -1.54691E+02 -8.61319E-01 -4.07308E-01 + 0.25646E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 3.02990E+01 9.42591E+01 -2.25024E+00 3.02154E+01 + 0.25646E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 6.40665E-07 1.58283E+02 -5.95192E-07 2.37060E-07 + 0.25646E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 1.55422E-07 -1.62901E+02 -1.48552E-07 -4.56976E-08 + 0.25646E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 1.32504E-05 8.64850E+01 8.12371E-07 1.32255E-05 + 0.25133E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 6.88333E+00 -1.21638E+02 -3.61069E+00 -5.86031E+00 + 0.25133E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 4.94259E-01 -1.52621E+02 -4.38893E-01 -2.27301E-01 + 0.25133E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 2.02604E+01 3.73279E+01 1.61106E+01 1.22854E+01 + 0.25133E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 6.95520E-07 -7.25343E+01 2.08750E-07 -6.63455E-07 + 0.25133E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 2.19654E-06 9.24227E+01 -9.28497E-08 2.19458E-06 + 0.25133E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 4.66700E-05 -8.61452E+01 3.13752E-06 -4.65644E-05 + 0.24640E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 9.06986E+00 -1.10074E+02 -3.11305E+00 -8.51888E+00 + 0.24640E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 4.56989E-01 -1.46404E+02 -3.80655E-01 -2.52866E-01 + 0.24640E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 2.75109E+01 4.71742E+01 1.87011E+01 2.01771E+01 + 0.24640E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 8.24826E-07 4.47841E+01 5.85434E-07 5.81038E-07 + 0.24640E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 2.28950E-06 2.16930E+01 2.12735E-06 8.46278E-07 + 0.24640E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 4.18492E-05 1.45977E+02 -3.46851E-05 2.34158E-05 + 0.24166E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 1.91303E+00 -1.63930E+02 -1.83828E+00 -5.29534E-01 + 0.24166E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 5.96668E-01 1.11568E+02 -2.19342E-01 5.54889E-01 + 0.24166E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 1.56227E+01 -8.08485E+00 1.54674E+01 -2.19717E+00 + 0.24166E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 4.02184E-07 1.49442E+02 -3.46327E-07 2.04473E-07 + 0.24166E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 2.08416E-07 1.57051E+02 -1.91920E-07 8.12639E-08 + 0.24166E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 1.07404E-04 -9.51578E+00 1.05926E-04 -1.77559E-05 + 0.23710E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 3.03374E+00 1.22505E+02 -1.63025E+00 2.55849E+00 + 0.23710E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 7.40949E-01 9.47352E+01 -6.11655E-02 7.38420E-01 + 0.23710E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 1.66262E+01 -5.16879E+01 1.03073E+01 -1.30457E+01 + 0.23710E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 9.22608E-07 -8.35757E+01 1.03230E-07 -9.16815E-07 + 0.23710E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 5.68596E-07 8.29261E+01 7.00222E-08 5.64268E-07 + 0.23710E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 1.65640E-05 -7.87355E+01 3.23559E-06 -1.62449E-05 + 0.23271E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 4.37805E+00 1.46123E+02 -3.63483E+00 2.44036E+00 + 0.23271E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 3.20597E-01 1.10295E+02 -1.11202E-01 3.00694E-01 + 0.23271E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 1.66581E+01 -5.38563E+01 9.82515E+00 -1.34521E+01 + 0.23271E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 6.34031E-07 1.31243E+01 6.17470E-07 1.43966E-07 + 0.23271E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 3.04617E-07 1.12792E+02 -1.18003E-07 2.80832E-07 + 0.23271E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 5.13262E-05 -8.53782E+01 4.13580E-06 -5.11593E-05 + 0.22848E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 4.44237E+00 1.03355E+02 -1.02612E+00 4.32223E+00 + 0.22848E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 1.95355E-01 1.14580E+01 1.91461E-01 3.88070E-02 + 0.22848E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 2.61471E+01 -8.96472E+01 1.60999E-01 -2.61466E+01 + 0.22848E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 8.50094E-07 -5.53984E+01 4.82740E-07 -6.99730E-07 + 0.22848E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 6.00831E-08 -1.44295E+02 -4.87896E-08 -3.50649E-08 + 0.22848E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 2.41184E-05 4.96381E+01 1.56194E-05 1.83775E-05 + 0.22440E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 4.52609E+00 4.51475E+01 3.19218E+00 3.20866E+00 + 0.22440E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 1.19383E-01 6.14942E+01 5.69752E-02 1.04910E-01 + 0.22440E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 2.57460E+01 -1.12243E+02 -9.74583E+00 -2.38301E+01 + 0.22440E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 3.50109E-07 -9.42972E+01 -2.62335E-08 -3.49124E-07 + 0.22440E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 5.99836E-07 9.75788E+01 -7.91123E-08 5.94596E-07 + 0.22440E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 3.75815E-05 1.15861E+02 -1.63929E-05 3.38178E-05 + 0.22046E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 1.11287E+00 4.57774E+01 7.76167E-01 7.97521E-01 + 0.22046E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 1.75087E-01 3.33977E+01 1.46175E-01 9.63764E-02 + 0.22046E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 9.35156E+00 -1.17724E+02 -4.35042E+00 -8.27801E+00 + 0.22046E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 2.76740E-07 1.78553E+02 -2.76651E-07 6.98724E-09 + 0.22046E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 1.49556E-06 3.87643E+01 1.16613E-06 9.36400E-07 + 0.22046E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 5.83336E-05 1.76106E+02 -5.81990E-05 3.96129E-06 + 0.21666E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 4.89663E+00 -9.34546E+01 -2.95055E-01 -4.88773E+00 + 0.21666E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 8.00738E-02 -1.74289E+02 -7.96763E-02 -7.96883E-03 + 0.21666E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 1.79299E+01 1.12128E+02 -6.75392E+00 1.66093E+01 + 0.21666E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 4.64122E-07 1.24537E+02 -2.63129E-07 3.82325E-07 + 0.21666E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 2.18577E-06 -5.17743E+00 2.17685E-06 -1.97244E-07 + 0.21666E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 7.88850E-05 -1.77065E+02 -7.87815E-05 -4.03896E-06 + 0.21299E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 8.44482E+00 -7.43198E+01 2.28237E+00 -8.13055E+00 + 0.21299E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 1.27188E-01 1.01795E+02 -2.59978E-02 1.24502E-01 + 0.21299E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 2.23659E+01 1.15636E+02 -9.67656E+00 2.01643E+01 + 0.21299E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 4.77850E-07 1.11190E+02 -1.72721E-07 4.45543E-07 + 0.21299E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 7.96145E-07 1.31263E+02 -5.25069E-07 5.98455E-07 + 0.21299E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 5.94886E-05 -1.24115E+01 5.80983E-05 -1.27860E-05 + 0.20944E+01 0.69813E+01 0.00000E+00 0.00000E+00 1 5.76611E+00 -5.95416E+01 2.92292E+00 -4.97037E+00 + 0.20944E+01 0.69813E+01 0.00000E+00 0.00000E+00 3 4.34806E-02 1.34154E+01 4.22941E-02 1.00879E-02 + 0.20944E+01 0.69813E+01 0.00000E+00 0.00000E+00 5 6.95892E+00 1.33653E+02 -4.80368E+00 5.03501E+00 + 0.20944E+01 0.69813E+01 0.00000E+00 0.00000E+00 2 3.06118E-07 1.48643E+02 -2.61407E-07 1.59294E-07 + 0.20944E+01 0.69813E+01 0.00000E+00 0.00000E+00 4 7.36906E-07 1.32097E+01 7.17407E-07 1.68395E-07 + 0.20944E+01 0.69813E+01 0.00000E+00 0.00000E+00 6 2.94915E-05 8.77205E+01 1.17299E-06 2.94682E-05 + 0.66139E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 3.25775E+00 0.00000E+00 3.25775E+00 0.00000E+00 + 0.66139E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 1.12229E+01 0.00000E+00 1.12229E+01 0.00000E+00 + 0.66139E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 3.82380E+01 0.00000E+00 3.82380E+01 0.00000E+00 + 0.66139E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 3.25264E-06 0.00000E+00 3.25264E-06 0.00000E+00 + 0.66139E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 1.86618E-04 1.80000E+02 -1.86618E-04 0.00000E+00 + 0.66139E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 1.04591E-04 1.80000E+02 -1.04591E-04 0.00000E+00 + 0.62832E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 3.11536E+00 -3.52288E+00 3.10948E+00 -1.91430E-01 + 0.62832E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 1.04864E+01 -1.37579E+01 1.01855E+01 -2.49387E+00 + 0.62832E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 4.75905E+01 2.99282E+01 4.12444E+01 2.37436E+01 + 0.62832E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 1.03161E-05 1.67010E+02 -1.00521E-05 2.31887E-06 + 0.62832E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 1.88369E-04 1.79625E+02 -1.88365E-04 1.23230E-06 + 0.62832E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 1.04680E-04 1.41869E+02 -8.23415E-05 6.46356E-05 + 0.59840E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 4.58469E+00 -2.45008E+01 4.17187E+00 -1.90130E+00 + 0.59840E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 9.53144E+00 -1.82652E+01 9.05121E+00 -2.98731E+00 + 0.59840E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 6.67042E+01 5.49989E+01 3.82610E+01 5.46401E+01 + 0.59840E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 2.05078E-06 -6.90425E+01 7.33514E-07 -1.91512E-06 + 0.59840E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 1.86299E-04 -1.41902E+01 1.80615E-04 -4.56698E-05 + 0.59840E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 3.08354E-04 1.46642E+02 -2.57552E-04 1.69557E-04 + 0.57120E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 7.49411E+00 -4.52335E+01 5.27750E+00 -5.32069E+00 + 0.57120E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 9.50706E+00 -1.08820E+01 9.33611E+00 -1.79481E+00 + 0.57120E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 1.14562E+02 8.17469E+01 1.64451E+01 1.13376E+02 + 0.57120E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 5.34353E-06 -1.27109E+02 -3.22395E-06 -4.26139E-06 + 0.57120E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 3.69717E-05 1.64540E+02 -3.56339E-05 9.85540E-06 + 0.57120E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 3.26061E-05 -9.25725E+01 -1.46349E-06 -3.25732E-05 + 0.54636E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 9.51689E+00 -7.08534E+01 3.12142E+00 -8.99044E+00 + 0.54636E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 1.10373E+01 -5.40683E+00 1.09881E+01 -1.04001E+00 + 0.54636E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 2.07527E+02 8.63031E+01 1.33809E+01 2.07095E+02 + 0.54636E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 6.71958E-06 1.63741E+02 -6.45084E-06 1.88133E-06 + 0.54636E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 2.26255E-05 -1.99632E+01 2.12660E-05 -7.72471E-06 + 0.54636E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 9.77692E-05 -1.77216E+02 -9.76538E-05 -4.74911E-06 + 0.52360E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 9.07613E+00 -1.01826E+02 -1.85999E+00 -8.88350E+00 + 0.52360E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 1.13507E+01 -9.29792E+00 1.12015E+01 -1.83391E+00 + 0.52360E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 2.62207E+02 8.20099E+01 3.64472E+01 2.59662E+02 + 0.52360E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 1.59788E-06 5.64260E+01 8.83652E-07 1.33131E-06 + 0.52360E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 1.30405E-04 -3.14967E+01 1.11192E-04 -6.81299E-05 + 0.52360E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 1.91715E-04 5.52980E+01 1.09145E-04 1.57614E-04 + 0.50265E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 9.26487E+00 -1.39671E+02 -7.06295E+00 -5.99605E+00 + 0.50265E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 1.02610E+01 -1.65221E+01 9.83736E+00 -2.91809E+00 + 0.50265E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 2.50880E+02 8.13674E+01 3.76565E+01 2.48038E+02 + 0.50265E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 2.18711E-06 -6.24275E+01 1.01235E-06 -1.93871E-06 + 0.50265E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 3.23208E-05 1.48939E+02 -2.76865E-05 1.66761E-05 + 0.50265E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 1.56439E-04 2.59037E+01 1.40722E-04 6.83422E-05 + 0.48332E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 1.15941E+01 -1.55181E+02 -1.05232E+01 -4.86665E+00 + 0.48332E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 1.01190E+01 -3.86760E+01 7.89985E+00 -6.32354E+00 + 0.48332E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 2.43072E+02 8.77080E+01 9.72111E+00 2.42878E+02 + 0.48332E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 2.03650E-06 -5.07015E+01 1.28984E-06 -1.57596E-06 + 0.48332E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 3.78249E-05 -8.34214E+01 4.33345E-06 -3.75759E-05 + 0.48332E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 3.10486E-04 2.55877E+01 2.80035E-04 1.34097E-04 + 0.46542E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 1.68003E+01 -1.64465E+02 -1.61865E+01 -4.49954E+00 + 0.46542E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 9.71440E+00 -6.65864E+01 3.86017E+00 -8.91452E+00 + 0.46542E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 1.90422E+02 7.88905E+01 3.66915E+01 1.86854E+02 + 0.46542E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 5.23337E-06 1.46998E+02 -4.38898E-06 2.85046E-06 + 0.46542E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 4.54292E-05 -5.13970E+01 2.83442E-05 -3.55023E-05 + 0.46542E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 2.08672E-04 2.28697E+01 1.92269E-04 8.10977E-05 + 0.44880E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 1.70910E+01 -1.75837E+02 -1.70459E+01 -1.24071E+00 + 0.44880E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 1.19563E+01 -8.17717E+01 1.71115E+00 -1.18332E+01 + 0.44880E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 1.17961E+02 7.72188E+01 2.60963E+01 1.15038E+02 + 0.44880E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 3.34152E-06 8.68404E+01 1.84177E-07 3.33644E-06 + 0.44880E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 1.11255E-05 -3.82308E+01 8.73936E-06 -6.88480E-06 + 0.44880E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 3.98200E-04 8.54404E+01 3.16556E-05 3.96940E-04 + 0.43332E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 9.02433E+00 1.65663E+02 -8.74328E+00 2.23461E+00 + 0.43332E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 1.43854E+01 -9.57958E+01 -1.45268E+00 -1.43118E+01 + 0.43332E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 8.87929E+01 8.16143E+01 1.29492E+01 8.78436E+01 + 0.43332E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 1.78160E-06 -1.66148E+02 -1.72979E-06 -4.26539E-07 + 0.43332E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 4.82769E-05 1.09444E+02 -1.60706E-05 4.55235E-05 + 0.43332E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 3.10794E-04 4.15171E+01 2.32710E-04 2.06008E-04 + 0.41888E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 4.50048E+00 4.84260E+01 2.98646E+00 3.36680E+00 + 0.41888E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 1.36826E+01 -1.04209E+02 -3.35845E+00 -1.32640E+01 + 0.41888E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 1.00522E+02 6.89791E+01 3.60580E+01 9.38322E+01 + 0.41888E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 4.24003E-06 2.24777E+01 3.91791E-06 1.62106E-06 + 0.41888E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 3.06897E-05 1.75085E+02 -3.05769E-05 2.62932E-06 + 0.41888E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 6.04291E-04 5.58755E+01 3.39003E-04 5.00244E-04 + 0.40537E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 1.34436E+01 3.48034E+01 1.10387E+01 7.67307E+00 + 0.40537E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 1.23051E+01 -1.12255E+02 -4.66022E+00 -1.13885E+01 + 0.40537E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 1.34767E+02 3.54589E+01 1.09772E+02 7.81807E+01 + 0.40537E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 3.42538E-06 -8.24917E+01 4.47597E-07 -3.39601E-06 + 0.40537E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 7.07890E-06 3.85852E+01 5.53344E-06 4.41495E-06 + 0.40537E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 1.68307E-04 1.01626E+02 -3.39163E-05 1.64854E-04 + 0.39270E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 2.18639E+01 2.87377E+01 1.91709E+01 1.05121E+01 + 0.39270E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 7.54350E+00 -1.34722E+02 -5.30812E+00 -5.35987E+00 + 0.39270E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 1.42292E+02 3.21577E+01 1.20463E+02 7.57354E+01 + 0.39270E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 4.54717E-07 -1.60583E+01 4.36974E-07 -1.25782E-07 + 0.39270E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 2.99679E-05 -1.29801E+01 2.92021E-05 -6.73117E-06 + 0.39270E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 1.60921E-04 1.58917E+02 -1.50149E-04 5.78861E-05 + 0.38080E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 1.71118E+01 1.60623E+01 1.64438E+01 4.73454E+00 + 0.38080E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 3.28958E+00 -1.62190E+02 -3.13193E+00 -1.00616E+00 + 0.38080E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 1.86217E+02 3.33170E+01 1.55611E+02 1.02283E+02 + 0.38080E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 1.23205E-06 6.23163E+01 5.72399E-07 1.09101E-06 + 0.38080E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 1.47946E-05 -1.74923E+02 -1.47365E-05 -1.30914E-06 + 0.38080E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 2.16482E-04 8.30815E+01 2.60769E-05 2.14905E-04 + 0.36960E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 1.14301E+01 -3.12054E+01 9.77631E+00 -5.92200E+00 + 0.36960E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 1.77244E+00 1.75663E+02 -1.76737E+00 1.34023E-01 + 0.36960E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 2.01312E+02 4.85942E+01 1.33145E+02 1.50993E+02 + 0.36960E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 2.17176E-06 1.02487E+02 -4.69574E-07 2.12039E-06 + 0.36960E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 1.30031E-05 -2.57742E+01 1.17095E-05 -5.65408E-06 + 0.36960E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 1.97601E-04 -1.85688E+01 1.87314E-04 -6.29248E-05 + 0.35904E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 2.27619E+01 -8.61157E+01 1.54191E+00 -2.27096E+01 + 0.35904E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 2.38620E+00 1.74615E+02 -2.37567E+00 2.23937E-01 + 0.35904E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 2.25170E+02 5.83781E+01 1.18059E+02 1.91738E+02 + 0.35904E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 5.31544E-06 -6.82335E+01 1.97110E-06 -4.93647E-06 + 0.35904E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 4.52869E-06 -1.39046E+02 -3.42022E-06 -2.96836E-06 + 0.35904E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 9.47770E-05 -6.76913E+01 3.59771E-05 -8.76831E-05 + 0.34907E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 3.83449E+01 -9.33451E+01 -2.23743E+00 -3.82796E+01 + 0.34907E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 3.19466E+00 1.74356E+02 -3.17918E+00 3.14201E-01 + 0.34907E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 1.78353E+02 9.21022E+01 -6.54232E+00 1.78233E+02 + 0.34907E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 5.88239E-06 -2.91384E+01 5.13795E-06 -2.86426E-06 + 0.34907E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 7.89612E-06 -7.56863E+00 7.82733E-06 -1.04003E-06 + 0.34907E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 9.40473E-05 8.55872E+01 7.23622E-06 9.37685E-05 + 0.33963E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 3.63637E+01 -1.03201E+02 -8.30443E+00 -3.54027E+01 + 0.33963E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 2.91901E+00 1.31549E+02 -1.93605E+00 2.18456E+00 + 0.33963E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 1.66346E+02 8.72071E+01 8.10536E+00 1.66149E+02 + 0.33963E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 2.39864E-06 1.39213E+02 -1.81611E-06 1.56692E-06 + 0.33963E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 1.01631E-05 1.72255E+02 -1.00704E-05 1.36969E-06 + 0.33963E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 4.04676E-05 -7.92875E+01 7.52212E-06 -3.97623E-05 + 0.33069E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 2.09268E+01 -1.15078E+02 -8.86990E+00 -1.89540E+01 + 0.33069E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 4.76035E+00 2.00678E+01 4.47133E+00 1.63343E+00 + 0.33069E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 6.63547E+01 4.60020E+01 4.60922E+01 4.77332E+01 + 0.33069E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 6.66109E-07 6.72443E+01 2.57653E-07 6.14260E-07 + 0.33069E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 5.70234E-06 -8.70164E+01 2.96807E-07 -5.69461E-06 + 0.33069E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 4.94117E-04 2.49132E+00 4.93649E-04 2.14783E-05 + 0.32221E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 1.12112E+01 -1.35812E+02 -8.03903E+00 -7.81440E+00 + 0.32221E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 5.40430E+00 -3.09157E+01 4.63648E+00 -2.77660E+00 + 0.32221E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 1.15684E+02 -9.54451E-01 1.15668E+02 -1.92702E+00 + 0.32221E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 1.21887E-06 4.82621E+01 8.11434E-07 9.09522E-07 + 0.32221E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 1.04330E-05 -3.30765E+01 8.74223E-06 -5.69389E-06 + 0.32221E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 1.77630E-04 1.72233E+02 -1.76001E-04 2.40069E-05 + 0.31416E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 2.89779E+01 1.75577E+02 -2.88916E+01 2.23471E+00 + 0.31416E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 3.59429E+00 -6.19622E+01 1.68951E+00 -3.17245E+00 + 0.31416E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 2.19109E+02 -2.19251E+01 2.03262E+02 -8.18140E+01 + 0.31416E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 1.02964E-06 1.48371E+02 -8.76694E-07 5.39962E-07 + 0.31416E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 1.26887E-05 7.27667E+00 1.25865E-05 1.60716E-06 + 0.31416E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 2.66835E-04 -1.55580E+02 -2.42963E-04 -1.10317E-04 + 0.30650E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 2.63354E+01 1.47126E+02 -2.21184E+01 1.42945E+01 + 0.30650E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 1.23458E+00 1.64078E+02 -1.18721E+00 3.38687E-01 + 0.30650E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 1.19637E+02 -2.35618E+01 1.09663E+02 -4.78234E+01 + 0.30650E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 1.16491E-06 -5.70266E+01 6.34004E-07 -9.77274E-07 + 0.30650E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 2.47069E-06 1.31586E+02 -1.63990E-06 1.84798E-06 + 0.30650E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 4.63496E-05 1.17952E+02 -2.17253E-05 4.09426E-05 + 0.29920E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 1.10608E+01 1.37808E+02 -8.19498E+00 7.42858E+00 + 0.29920E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 3.18738E+00 1.31758E+02 -2.12275E+00 2.37767E+00 + 0.29920E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 3.33679E+01 -8.89281E+00 3.29668E+01 -5.15823E+00 + 0.29920E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 1.88922E-06 -3.05431E+01 1.62708E-06 -9.60077E-07 + 0.29920E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 5.66838E-06 1.69564E+02 -5.57461E-06 1.02676E-06 + 0.29920E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 1.50050E-04 -8.70990E+01 7.59407E-06 -1.49858E-04 + 0.29224E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 5.15088E+00 2.77406E+01 4.55886E+00 2.39758E+00 + 0.29224E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 2.53133E+00 1.30863E+02 -1.65613E+00 1.91439E+00 + 0.29224E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 4.83789E+01 -1.61614E+02 -4.59093E+01 -1.52595E+01 + 0.29224E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 2.18618E-06 -1.10947E+02 -7.81576E-07 -2.04170E-06 + 0.29224E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 5.81437E-06 -1.33227E+01 5.65789E-06 -1.33983E-06 + 0.29224E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 1.10113E-04 -7.76974E+01 2.34624E-05 -1.07585E-04 + 0.28560E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 7.83952E+00 9.18256E+00 7.73905E+00 1.25104E+00 + 0.28560E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 1.73521E+00 1.63886E+02 -1.66703E+00 4.81618E-01 + 0.28560E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 6.55630E+01 -1.23629E+02 -3.63095E+01 -5.45905E+01 + 0.28560E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 2.28684E-06 -7.94699E+00 2.26488E-06 -3.16171E-07 + 0.28560E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 1.53855E-06 -1.41892E+02 -1.21061E-06 -9.49500E-07 + 0.28560E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 8.49191E-05 -1.73096E+02 -8.43034E-05 -1.02074E-05 + 0.27925E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 2.26535E+00 -5.71695E+00 2.25408E+00 -2.25660E-01 + 0.27925E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 6.10243E-01 -1.40234E+02 -4.69068E-01 -3.90348E-01 + 0.27925E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 6.60887E+01 -8.65794E+01 3.94320E+00 -6.59709E+01 + 0.27925E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 8.26363E-07 -1.29426E+01 8.05369E-07 -1.85085E-07 + 0.27925E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 2.13721E-06 -4.27612E+01 1.56912E-06 -1.45104E-06 + 0.27925E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 1.02271E-04 -9.58877E+00 1.00842E-04 -1.70358E-05 + 0.27318E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 9.23076E+00 -1.08154E+02 -2.87600E+00 -8.77129E+00 + 0.27318E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 6.92713E-01 -2.73654E+01 6.15194E-01 -3.18415E-01 + 0.27318E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 2.73368E+01 7.65291E+00 2.70933E+01 3.64049E+00 + 0.27318E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 2.13949E-06 -5.35072E-01 2.13940E-06 -1.99800E-08 + 0.27318E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 4.65968E-06 -1.63117E+02 -4.45886E-06 -1.35322E-06 + 0.27318E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 1.50015E-04 -4.27256E+01 1.10203E-04 -1.01783E-04 + 0.26737E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 1.08301E+01 -1.01281E+02 -2.11856E+00 -1.06209E+01 + 0.26737E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 7.70855E-01 -4.10166E+01 5.81625E-01 -5.05895E-01 + 0.26737E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 6.34842E+01 6.38321E+01 2.79967E+01 5.69774E+01 + 0.26737E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 1.73640E-06 -3.23917E+01 1.46622E-06 -9.30194E-07 + 0.26737E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 2.64943E-06 2.88115E+01 2.32145E-06 1.27684E-06 + 0.26737E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 3.96985E-05 -1.61965E+02 -3.77480E-05 -1.22906E-05 + 0.26180E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 1.60558E+01 -7.56295E+01 3.98491E+00 -1.55534E+01 + 0.26180E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 9.35048E-02 -4.63394E+01 6.45543E-02 -6.76453E-02 + 0.26180E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 7.84825E+01 9.34333E+01 -4.70001E+00 7.83416E+01 + 0.26180E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 1.28233E-06 -3.22743E+00 1.28029E-06 -7.21945E-08 + 0.26180E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 1.95177E-06 1.45560E+02 -1.60966E-06 1.10380E-06 + 0.26180E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 5.43510E-05 -4.07434E+01 4.11785E-05 -3.54734E-05 + 0.25646E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 1.32509E+01 -7.87179E+01 2.59241E+00 -1.29949E+01 + 0.25646E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 9.31859E-01 -1.57384E+02 -8.60199E-01 -3.58357E-01 + 0.25646E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 5.21250E+01 1.01648E+02 -1.05236E+01 5.10516E+01 + 0.25646E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 3.22048E-07 -1.12124E+02 -1.21288E-07 -2.98336E-07 + 0.25646E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 7.69163E-07 2.78640E+01 6.79987E-07 3.59487E-07 + 0.25646E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 9.49406E-05 1.10520E+02 -3.32806E-05 8.89163E-05 + 0.25133E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 7.66112E+00 -1.15778E+02 -3.33166E+00 -6.89875E+00 + 0.25133E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 4.62745E-01 -1.52757E+02 -4.11414E-01 -2.11829E-01 + 0.25133E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 1.79649E+01 8.22190E+01 2.43222E+00 1.77995E+01 + 0.25133E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 4.55844E-07 8.40061E+01 4.76004E-08 4.53352E-07 + 0.25133E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 3.22762E-06 1.38255E+02 -2.40816E-06 2.14903E-06 + 0.25133E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 1.31446E-04 9.64984E+01 -1.48766E-05 1.30602E-04 + 0.24640E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 7.06515E+00 -1.00823E+02 -1.32665E+00 -6.93947E+00 + 0.24640E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 4.60081E-01 -1.28514E+02 -2.86497E-01 -3.59991E-01 + 0.24640E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 2.16947E+01 5.46325E+01 1.25573E+01 1.76910E+01 + 0.24640E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 5.78951E-07 -3.81364E+01 4.55370E-07 -3.57523E-07 + 0.24640E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 3.91868E-06 1.65691E+02 -3.79711E-06 9.68532E-07 + 0.24640E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 7.75693E-05 3.46156E+01 6.38381E-05 4.40646E-05 + 0.24166E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 7.16270E+00 -1.07736E+02 -2.18198E+00 -6.82226E+00 + 0.24166E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 5.03168E-01 1.37067E+02 -3.68393E-01 3.42731E-01 + 0.24166E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 2.84298E+01 3.18088E+01 2.41600E+01 1.49850E+01 + 0.24166E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 4.14034E-07 3.50535E+01 3.38935E-07 2.37796E-07 + 0.24166E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 1.04557E-06 9.33871E+01 -6.17740E-08 1.04375E-06 + 0.24166E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 1.46371E-04 -9.58929E+00 1.44325E-04 -2.43831E-05 + 0.23710E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 3.20270E+00 1.56914E+02 -2.94622E+00 1.25583E+00 + 0.23710E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 8.30001E-01 9.03473E+01 -5.03079E-03 8.29985E-01 + 0.23710E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 1.50646E+01 -2.94667E+01 1.31158E+01 -7.41053E+00 + 0.23710E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 3.19964E-07 1.52964E+02 -2.84998E-07 1.45441E-07 + 0.23710E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 8.23903E-07 -2.51591E+01 7.45740E-07 -3.50268E-07 + 0.23710E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 1.81807E-04 5.89889E+00 1.80844E-04 1.86849E-05 + 0.23271E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 4.90031E+00 1.41146E+02 -3.81612E+00 3.07413E+00 + 0.23271E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 6.10018E-01 9.75147E+01 -7.97784E-02 6.04779E-01 + 0.23271E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 1.88603E+01 -5.34785E+01 1.12242E+01 -1.51568E+01 + 0.23271E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 1.18312E-07 6.74206E+01 4.54275E-08 1.09243E-07 + 0.23271E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 1.43863E-06 1.73140E+02 -1.42833E-06 1.71846E-07 + 0.23271E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 5.94000E-05 -1.25041E+02 -3.41053E-05 -4.86332E-05 + 0.22848E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 4.87149E+00 1.49154E+02 -4.18242E+00 2.49777E+00 + 0.22848E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 1.48615E-01 6.57536E+01 6.10306E-02 1.35505E-01 + 0.22848E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 2.48290E+01 -6.38808E+01 1.09307E+01 -2.22935E+01 + 0.22848E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 8.23897E-07 7.17216E+01 2.58403E-07 7.82326E-07 + 0.22848E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 2.25580E-07 -1.88693E+01 2.13457E-07 -7.29551E-08 + 0.22848E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 1.39824E-04 1.01131E+02 -2.69941E-05 1.37194E-04 + 0.22440E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 1.26710E+00 5.07203E+01 8.02211E-01 9.80821E-01 + 0.22440E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 1.10572E-01 -4.70006E+01 7.54090E-02 -8.08681E-02 + 0.22440E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 1.85393E+01 -9.84880E+01 -2.73645E+00 -1.83362E+01 + 0.22440E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 6.55396E-07 1.30862E+02 -4.28787E-07 4.95668E-07 + 0.22440E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 2.39495E-06 -4.34626E+01 1.73831E-06 -1.64744E-06 + 0.22440E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 6.25665E-05 5.02073E+01 4.00433E-05 4.80739E-05 + 0.22046E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 4.11734E+00 3.75256E+01 3.26539E+00 2.50794E+00 + 0.22046E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 2.00160E-01 1.65234E+01 1.91894E-01 5.69269E-02 + 0.22046E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 1.90218E+01 -1.24189E+02 -1.06889E+01 -1.57345E+01 + 0.22046E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 1.25966E-06 1.73249E+02 -1.25093E-06 1.48077E-07 + 0.22046E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 2.08564E-06 -2.73340E+00 2.08327E-06 -9.94616E-08 + 0.22046E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 2.75384E-05 1.60618E+02 -2.59777E-05 9.13911E-06 + 0.21666E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 6.02839E+00 -5.13446E+01 3.76555E+00 -4.70767E+00 + 0.21666E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 5.14692E-02 -1.76332E+02 -5.13638E-02 -3.29276E-03 + 0.21666E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 2.14467E+01 1.37658E+02 -1.58522E+01 1.44455E+01 + 0.21666E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 7.11300E-07 1.71471E+02 -7.03435E-07 1.05487E-07 + 0.21666E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 1.11528E-06 2.05363E+01 1.04440E-06 3.91240E-07 + 0.21666E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 1.76800E-04 -1.72431E+02 -1.75260E-04 -2.32876E-05 + 0.21299E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 1.15981E+01 -6.33484E+01 5.20251E+00 -1.03658E+01 + 0.21299E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 2.32739E-01 1.46235E+02 -1.93481E-01 1.29354E-01 + 0.21299E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 3.03829E+01 1.21995E+02 -1.60984E+01 2.57674E+01 + 0.21299E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 6.25350E-07 -4.46822E+01 4.44636E-07 -4.39729E-07 + 0.21299E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 3.80583E-07 1.08515E+02 -1.20856E-07 3.60883E-07 + 0.21299E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 7.79733E-05 -1.61333E+02 -7.38715E-05 -2.49569E-05 + 0.20944E+01 0.66139E+01 0.00000E+00 0.00000E+00 1 8.62186E+00 -3.92754E+01 6.67428E+00 -5.45806E+00 + 0.20944E+01 0.66139E+01 0.00000E+00 0.00000E+00 3 5.18601E-02 -1.48205E+02 -4.40777E-02 -2.73244E-02 + 0.20944E+01 0.66139E+01 0.00000E+00 0.00000E+00 5 1.82417E+01 1.55870E+02 -1.66478E+01 7.45722E+00 + 0.20944E+01 0.66139E+01 0.00000E+00 0.00000E+00 2 3.41710E-07 -6.84710E+01 1.25398E-07 -3.17870E-07 + 0.20944E+01 0.66139E+01 0.00000E+00 0.00000E+00 4 1.36006E-06 7.03515E+01 4.57319E-07 1.28087E-06 + 0.20944E+01 0.66139E+01 0.00000E+00 0.00000E+00 6 2.09925E-05 1.77691E+02 -2.09755E-05 8.45886E-07 + 0.62832E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 5.90391E+00 0.00000E+00 5.90391E+00 0.00000E+00 + 0.62832E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 1.03049E+01 0.00000E+00 1.03049E+01 0.00000E+00 + 0.62832E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 4.72012E+01 0.00000E+00 4.72012E+01 0.00000E+00 + 0.62832E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 2.47290E-06 0.00000E+00 2.47290E-06 0.00000E+00 + 0.62832E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 2.20387E-07 0.00000E+00 2.20387E-07 0.00000E+00 + 0.62832E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 3.24727E-04 0.00000E+00 3.24727E-04 0.00000E+00 + 0.59840E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 8.57562E+00 -3.18531E+00 8.56237E+00 -4.76509E-01 + 0.59840E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 8.01474E+00 -5.94475E+00 7.97163E+00 -8.30081E-01 + 0.59840E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 4.52483E+01 2.80382E+01 3.99377E+01 2.12694E+01 + 0.59840E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 7.24296E-06 1.46447E+01 7.00765E-06 1.83120E-06 + 0.59840E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 1.72132E-04 3.47382E-01 1.72128E-04 1.04362E-06 + 0.59840E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 2.35161E-04 -1.29988E+01 2.29135E-04 -5.28951E-05 + 0.57120E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 1.03626E+01 -1.24358E+01 1.01195E+01 -2.23153E+00 + 0.57120E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 7.79538E+00 -2.62316E-01 7.79530E+00 -3.56893E-02 + 0.57120E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 6.40451E+01 7.78588E+01 1.34700E+01 6.26126E+01 + 0.57120E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 9.00051E-06 -1.53812E+02 -8.07663E-06 -3.97205E-06 + 0.57120E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 5.31848E-05 -1.58606E+02 -4.95202E-05 -1.94004E-05 + 0.57120E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 9.52901E-05 -1.28934E+02 -5.98826E-05 -7.41234E-05 + 0.54636E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 9.62803E+00 -2.88927E+01 8.42959E+00 -4.65199E+00 + 0.54636E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 9.52867E+00 4.66701E+00 9.49708E+00 7.75297E-01 + 0.54636E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 1.47868E+02 9.19563E+01 -5.04772E+00 1.47782E+02 + 0.54636E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 5.25813E-06 2.80636E+00 5.25182E-06 2.57441E-07 + 0.54636E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 5.16199E-05 -1.67789E+02 -5.04519E-05 -1.09184E-05 + 0.54636E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 3.89993E-05 1.76853E+02 -3.89405E-05 2.14113E-06 + 0.52360E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 5.91393E+00 -5.58509E+01 3.31977E+00 -4.89425E+00 + 0.52360E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 1.05439E+01 2.46454E+00 1.05341E+01 4.53397E-01 + 0.52360E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 2.20433E+02 8.93081E+01 2.66200E+00 2.20417E+02 + 0.52360E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 3.68271E-06 4.11869E+01 2.77148E-06 2.42512E-06 + 0.52360E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 1.11809E-05 1.53370E+02 -9.99484E-06 5.01164E-06 + 0.52360E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 1.46506E-04 1.40412E+02 -1.12905E-04 9.33622E-05 + 0.50265E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 4.10988E+00 -1.31636E+02 -2.73057E+00 -3.07167E+00 + 0.50265E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 9.85458E+00 5.49785E-01 9.85412E+00 9.45588E-02 + 0.50265E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 2.40466E+02 9.06469E+01 -2.71502E+00 2.40451E+02 + 0.50265E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 1.55339E-06 -5.29865E+01 9.35144E-07 -1.24037E-06 + 0.50265E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 8.18366E-06 3.38354E+01 6.79768E-06 4.55674E-06 + 0.50265E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 1.11246E-04 -1.51444E+02 -9.77133E-05 -5.31774E-05 + 0.48332E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 8.27029E+00 -1.47805E+02 -6.99867E+00 -4.40638E+00 + 0.48332E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 9.73732E+00 -1.17994E+01 9.53157E+00 -1.99115E+00 + 0.48332E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 2.50433E+02 9.69707E+01 -3.03928E+01 2.48582E+02 + 0.48332E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 2.41010E-06 -7.42805E+01 6.52964E-07 -2.31996E-06 + 0.48332E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 2.87916E-05 -6.84498E+01 1.05756E-05 -2.67790E-05 + 0.48332E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 7.92690E-05 1.42745E+02 -6.30943E-05 4.79863E-05 + 0.46542E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 1.64875E+01 -1.54720E+02 -1.49085E+01 -7.04097E+00 + 0.46542E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 8.35898E+00 -4.19717E+01 6.21470E+00 -5.59018E+00 + 0.46542E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 1.97876E+02 9.43858E+01 -1.51319E+01 1.97296E+02 + 0.46542E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 3.78488E-06 8.57492E+01 2.80542E-07 3.77447E-06 + 0.46542E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 4.85966E-05 1.04847E+02 -1.24527E-05 4.69740E-05 + 0.46542E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 2.43179E-04 -6.17130E+01 1.15240E-04 -2.14140E-04 + 0.44880E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 1.99548E+01 -1.60513E+02 -1.88118E+01 -6.65669E+00 + 0.44880E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 9.83852E+00 -6.71703E+01 3.81727E+00 -9.06779E+00 + 0.44880E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 1.26499E+02 1.00892E+02 -2.39036E+01 1.24220E+02 + 0.44880E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 7.61429E-07 -1.74308E+02 -7.57675E-07 -7.55193E-08 + 0.44880E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 8.07323E-05 9.40005E+01 -5.63228E-06 8.05356E-05 + 0.44880E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 5.48278E-05 1.07950E+02 -1.68972E-05 5.21591E-05 + 0.43332E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 1.42920E+01 -1.65818E+02 -1.38564E+01 -3.50167E+00 + 0.43332E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 1.29565E+01 -8.42976E+01 1.28737E+00 -1.28924E+01 + 0.43332E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 9.54914E+01 1.03302E+02 -2.19713E+01 9.29294E+01 + 0.43332E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 1.38529E-05 -2.72851E+00 1.38372E-05 -6.59447E-07 + 0.43332E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 4.50048E-05 -1.75778E+02 -4.48827E-05 -3.31294E-06 + 0.43332E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 1.72436E-04 -6.69572E+01 6.74948E-05 -1.58678E-04 + 0.41888E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 1.42835E+00 -1.64086E+02 -1.37360E+00 -3.91650E-01 + 0.41888E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 1.36582E+01 -9.18815E+01 -4.48425E-01 -1.36509E+01 + 0.41888E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 9.76353E+01 7.84168E+01 1.96043E+01 9.56469E+01 + 0.41888E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 2.44955E-06 1.11271E+02 -8.88656E-07 2.28267E-06 + 0.41888E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 5.75311E-06 1.71476E+02 -5.68956E-06 8.52745E-07 + 0.41888E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 6.70971E-04 1.65426E+02 -6.49380E-04 1.68841E-04 + 0.40537E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 9.41724E+00 2.15935E+01 8.75632E+00 3.46572E+00 + 0.40537E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 1.36787E+01 -9.28035E+01 -6.69034E-01 -1.36623E+01 + 0.40537E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 1.35133E+02 4.02130E+01 1.03194E+02 8.72458E+01 + 0.40537E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 2.32592E-06 -3.20880E+01 1.97060E-06 -1.23558E-06 + 0.40537E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 1.52844E-05 1.73902E+02 -1.51979E-05 1.62374E-06 + 0.40537E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 3.37060E-04 1.03583E+02 -7.91599E-05 3.27633E-04 + 0.39270E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 1.95308E+01 3.29987E+01 1.63802E+01 1.06369E+01 + 0.39270E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 9.49633E+00 -1.08874E+02 -3.07199E+00 -8.98572E+00 + 0.39270E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 1.29908E+02 3.77169E+01 1.02763E+02 7.94723E+01 + 0.39270E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 7.71496E-06 -1.66801E+02 -7.51117E-06 -1.76152E-06 + 0.39270E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 2.48816E-05 8.37905E+01 2.69130E-06 2.47356E-05 + 0.39270E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 3.90841E-04 -6.14880E+01 1.86565E-04 -3.43439E-04 + 0.38080E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 1.81935E+01 3.47059E+01 1.49566E+01 1.03587E+01 + 0.38080E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 3.50549E+00 -1.26184E+02 -2.06956E+00 -2.82938E+00 + 0.38080E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 1.70887E+02 4.83537E+01 1.13560E+02 1.27697E+02 + 0.38080E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 2.90942E-06 -1.53227E+02 -2.59752E-06 -1.31058E-06 + 0.38080E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 5.63419E-06 -1.33755E+02 -3.89647E-06 -4.06959E-06 + 0.38080E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 2.96044E-05 -9.34646E+00 2.92114E-05 -4.80787E-06 + 0.36960E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 1.08012E+01 2.27701E+01 9.95942E+00 4.18044E+00 + 0.36960E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 4.85946E-01 1.63433E+02 -4.65773E-01 1.38562E-01 + 0.36960E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 2.18764E+02 6.10854E+01 1.05773E+02 1.91493E+02 + 0.36960E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 5.98868E-06 -7.79747E+01 1.24770E-06 -5.85726E-06 + 0.36960E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 8.43922E-06 1.29354E+02 -5.35144E-06 6.52552E-06 + 0.36960E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 1.02320E-04 1.19823E+02 -5.08863E-05 8.87697E-05 + 0.35904E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 1.47548E+01 -8.20785E+01 2.03344E+00 -1.46140E+01 + 0.35904E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 1.76130E+00 1.49788E+02 -1.52205E+00 8.86295E-01 + 0.35904E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 2.39857E+02 6.48882E+01 1.01792E+02 2.17186E+02 + 0.35904E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 1.04571E-05 7.48680E+01 2.72978E-06 1.00946E-05 + 0.35904E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 2.69848E-05 8.01752E+01 4.60458E-06 2.65890E-05 + 0.35904E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 3.60923E-04 -8.89721E+01 6.47492E-06 -3.60865E-04 + 0.34907E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 3.11557E+01 -8.89644E+01 5.63105E-01 -3.11506E+01 + 0.34907E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 2.55169E+00 1.57719E+02 -2.36117E+00 9.67463E-01 + 0.34907E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 1.67756E+02 9.90604E+01 -2.64174E+01 1.65663E+02 + 0.34907E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 3.18279E-06 1.35611E+02 -2.27446E-06 2.22644E-06 + 0.34907E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 2.23326E-05 1.19345E+02 -1.09444E-05 1.94670E-05 + 0.34907E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 9.88082E-05 -5.25800E+00 9.83924E-05 -9.05484E-06 + 0.33963E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 3.80875E+01 -9.39284E+01 -2.60937E+00 -3.79980E+01 + 0.33963E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 3.00792E+00 1.62654E+02 -2.87113E+00 8.96768E-01 + 0.33963E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 1.94664E+02 1.12173E+02 -7.34673E+01 1.80268E+02 + 0.33963E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 1.58300E-06 -4.68795E+01 1.08203E-06 -1.15546E-06 + 0.33963E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 1.01737E-05 1.74472E+02 -1.01264E-05 9.79978E-07 + 0.33963E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 8.72434E-05 -2.12025E+01 8.13377E-05 -3.15529E-05 + 0.33069E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 2.68210E+01 -9.44621E+01 -2.08668E+00 -2.67397E+01 + 0.33069E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 2.67171E+00 9.78242E+01 -3.63712E-01 2.64683E+00 + 0.33069E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 9.20986E+01 1.13554E+02 -3.68035E+01 8.44255E+01 + 0.33069E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 2.29539E-06 -6.84780E+01 8.42083E-07 -2.13535E-06 + 0.33069E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 3.73658E-06 -1.58353E+02 -3.47306E-06 -1.37836E-06 + 0.33069E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 1.99293E-04 -1.45492E+02 -1.64227E-04 -1.12903E-04 + 0.32221E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 1.21057E+01 -9.83070E+01 -1.74900E+00 -1.19787E+01 + 0.32221E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 4.59951E+00 2.34660E+01 4.21911E+00 1.83155E+00 + 0.32221E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 5.91801E+01 1.77718E+01 5.63560E+01 1.80634E+01 + 0.32221E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 4.26720E-06 1.03064E+01 4.19835E-06 7.63455E-07 + 0.32221E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 1.55170E-05 1.77491E+02 -1.55021E-05 6.79328E-07 + 0.32221E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 5.60892E-04 7.30390E+00 5.56341E-04 7.13074E-05 + 0.31416E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 2.02263E+01 -1.74305E+02 -2.01265E+01 -2.00710E+00 + 0.31416E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 5.88358E+00 -2.04877E+01 5.51143E+00 -2.05929E+00 + 0.31416E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 2.09241E+02 -1.54382E+01 2.01691E+02 -5.56997E+01 + 0.31416E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 1.05707E-06 6.70860E+01 4.11569E-07 9.73653E-07 + 0.31416E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 1.93131E-06 4.64408E+01 1.33087E-06 1.39955E-06 + 0.31416E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 1.98348E-04 -1.48696E+02 -1.69472E-04 -1.03058E-04 + 0.30650E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 2.64396E+01 1.59031E+02 -2.46887E+01 9.46154E+00 + 0.30650E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 7.47283E-01 -1.13929E+02 -3.03098E-01 -6.83055E-01 + 0.30650E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 1.77796E+02 -2.05364E+01 1.66497E+02 -6.23713E+01 + 0.30650E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 2.47037E-06 1.32627E+02 -1.67301E-06 1.81763E-06 + 0.30650E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 5.82092E-06 -6.71781E+01 2.25774E-06 -5.36523E-06 + 0.30650E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 2.93983E-04 -5.11862E+00 2.92810E-04 -2.62285E-05 + 0.29920E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 1.71562E+01 1.61287E+02 -1.62493E+01 5.50423E+00 + 0.29920E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 3.47029E+00 1.42551E+02 -2.75503E+00 2.11015E+00 + 0.29920E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 8.54060E+01 -8.36267E-01 8.53969E+01 -1.24651E+00 + 0.29920E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 4.39346E-06 1.74635E+02 -4.37421E-06 4.10755E-07 + 0.29920E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 4.63987E-06 1.69859E+02 -4.56738E-06 8.16954E-07 + 0.29920E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 4.63400E-05 -6.59117E+01 1.89134E-05 -4.23046E-05 + 0.29224E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 5.00381E-01 1.72636E+02 -4.96254E-01 6.41332E-02 + 0.29224E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 3.48347E+00 1.42711E+02 -2.77140E+00 2.11043E+00 + 0.29224E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 1.57716E+01 -1.76893E+02 -1.57484E+01 -8.54818E-01 + 0.29224E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 2.46125E-06 2.35809E+01 2.25572E-06 9.84604E-07 + 0.29224E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 1.45776E-05 -1.67430E+02 -1.42282E-05 -3.17261E-06 + 0.29224E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 2.86432E-04 -1.04126E+02 -6.99049E-05 -2.77771E-04 + 0.28560E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 8.52864E+00 -9.01792E+00 8.42322E+00 -1.33681E+00 + 0.28560E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 2.59607E+00 1.73900E+02 -2.58137E+00 2.75871E-01 + 0.28560E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 6.19579E+01 -1.44455E+02 -5.04127E+01 -3.60185E+01 + 0.28560E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 2.99800E-06 1.56831E+02 -2.75620E-06 1.17957E-06 + 0.28560E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 5.52306E-06 -1.03701E+02 -1.30821E-06 -5.36589E-06 + 0.28560E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 3.71883E-05 1.10380E+02 -1.29506E-05 3.48605E-05 + 0.27925E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 4.82186E+00 -1.54664E+01 4.64724E+00 -1.28586E+00 + 0.27925E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 1.19564E+00 -1.45806E+02 -9.88961E-01 -6.71938E-01 + 0.27925E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 6.23020E+01 -9.07592E+01 -8.25510E-01 -6.22965E+01 + 0.27925E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 2.07462E-06 -1.30728E+01 2.02086E-06 -4.69257E-07 + 0.27925E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 5.62792E-07 1.71327E+02 -5.56357E-07 8.48648E-08 + 0.27925E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 6.54326E-05 -4.85076E+01 4.33505E-05 -4.90119E-05 + 0.27318E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 5.64400E+00 -9.32275E+01 -3.17758E-01 -5.63505E+00 + 0.27318E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 6.32594E-01 -5.50893E+01 3.62033E-01 -5.18755E-01 + 0.27318E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 3.94675E+01 -2.56991E+01 3.55636E+01 -1.71149E+01 + 0.27318E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 1.29084E-06 -1.54174E+02 -1.16192E-06 -5.62333E-07 + 0.27318E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 6.01958E-07 7.16060E+01 1.89947E-07 5.71204E-07 + 0.27318E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 9.32104E-05 1.69755E+02 -9.17244E-05 1.65777E-05 + 0.26737E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 1.29972E+01 -9.36366E+01 -8.24384E-01 -1.29710E+01 + 0.26737E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 1.18894E+00 -2.06858E+01 1.11230E+00 -4.19986E-01 + 0.26737E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 6.89764E+01 6.12789E+01 3.31464E+01 6.04902E+01 + 0.26737E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 3.57752E-06 -2.31626E+00 3.57460E-06 -1.44587E-07 + 0.26737E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 2.48896E-06 1.27661E+01 2.42743E-06 5.49988E-07 + 0.26737E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 3.68101E-05 -1.46714E+02 -3.07713E-05 -2.02018E-05 + 0.26180E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 1.63302E+01 -6.86421E+01 5.94735E+00 -1.52087E+01 + 0.26180E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 4.49127E-01 5.41642E+00 4.47122E-01 4.23948E-02 + 0.26180E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 9.54877E+01 9.86065E+01 -1.42895E+01 9.44125E+01 + 0.26180E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 2.97159E-06 -1.67766E+02 -2.90411E-06 -6.29680E-07 + 0.26180E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 2.93638E-06 -1.61344E+02 -2.78209E-06 -9.39310E-07 + 0.26180E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 5.50301E-05 -4.78333E+01 3.69412E-05 -4.07880E-05 + 0.25646E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 1.66997E+01 -4.81478E+01 1.11423E+01 -1.24391E+01 + 0.25646E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 6.05461E-01 -1.34738E+02 -4.26161E-01 -4.30082E-01 + 0.25646E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 7.85711E+01 1.23729E+02 -4.36281E+01 6.53453E+01 + 0.25646E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 1.11590E-06 1.61652E+01 1.07179E-06 3.10677E-07 + 0.25646E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 8.86620E-07 -1.74234E+02 -8.82134E-07 -8.90746E-08 + 0.25646E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 3.73154E-05 9.72877E+01 -4.73351E-06 3.70140E-05 + 0.25133E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 5.42557E+00 -8.77492E+01 2.13078E-01 -5.42139E+00 + 0.25133E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 8.16061E-01 1.74767E+02 -8.12659E-01 7.44272E-02 + 0.25133E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 2.15752E+01 1.57245E+02 -1.98959E+01 8.34507E+00 + 0.25133E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 1.15831E-06 -5.38900E+01 6.82637E-07 -9.35786E-07 + 0.25133E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 4.50014E-06 8.04552E+01 7.46210E-07 4.43784E-06 + 0.25133E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 2.34623E-04 -1.49946E+02 -2.03078E-04 -1.17504E-04 + 0.24640E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 3.89941E+00 -1.07579E+02 -1.17771E+00 -3.71731E+00 + 0.24640E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 4.17003E-01 -1.30725E+02 -2.72065E-01 -3.16026E-01 + 0.24640E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 8.19203E+00 6.22839E+01 3.81004E+00 7.25210E+00 + 0.24640E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 6.98504E-07 -7.48192E+01 1.82915E-07 -6.74129E-07 + 0.24640E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 1.86783E-06 -1.01923E+02 -3.85875E-07 -1.82754E-06 + 0.24640E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 8.43429E-05 1.15345E+02 -3.61044E-05 7.62247E-05 + 0.24166E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 6.45321E+00 -7.80147E+01 1.34008E+00 -6.31254E+00 + 0.24166E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 3.62547E-01 1.62050E+02 -3.44901E-01 1.11732E-01 + 0.24166E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 2.43291E+01 4.67136E+01 1.66811E+01 1.77100E+01 + 0.24166E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 2.20471E-07 1.77425E+02 -2.20249E-07 9.90632E-09 + 0.24166E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 2.67274E-07 9.70203E+01 -3.26663E-08 2.65271E-07 + 0.24166E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 7.53131E-05 -2.19087E+00 7.52580E-05 -2.87911E-06 + 0.23710E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 2.69783E+00 -1.20882E+02 -1.38471E+00 -2.31535E+00 + 0.23710E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 1.09522E+00 1.04462E+02 -2.73512E-01 1.06052E+00 + 0.23710E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 1.26360E+01 9.25038E+00 1.24717E+01 2.03123E+00 + 0.23710E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 8.21116E-07 -8.87743E+01 1.75640E-08 -8.20928E-07 + 0.23710E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 1.43127E-06 9.14343E+01 -3.58243E-08 1.43082E-06 + 0.23710E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 1.33451E-04 -7.36857E+01 3.74872E-05 -1.28078E-04 + 0.23271E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 3.39585E+00 1.35300E+02 -2.41376E+00 2.38864E+00 + 0.23271E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 7.52286E-01 1.18673E+02 -3.60959E-01 6.60033E-01 + 0.23271E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 1.67093E+01 -4.74039E+01 1.13093E+01 -1.23005E+01 + 0.23271E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 4.39838E-07 1.72376E+02 -4.35950E-07 5.83527E-08 + 0.23271E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 1.85323E-06 -8.52214E+01 1.54383E-07 -1.84678E-06 + 0.23271E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 1.60589E-04 -1.67553E+02 -1.56815E-04 -3.46128E-05 + 0.22848E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 5.51874E+00 1.66933E+02 -5.37585E+00 1.24769E+00 + 0.22848E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 2.84714E-01 1.12900E+02 -1.10791E-01 2.62274E-01 + 0.22848E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 2.52721E+01 -5.07864E+01 1.59773E+01 -1.95807E+01 + 0.22848E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 4.97787E-07 1.29828E+02 -3.18826E-07 3.82286E-07 + 0.22848E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 2.89941E-07 -1.56605E+01 2.79178E-07 -7.82660E-08 + 0.22848E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 4.31696E-05 -8.62942E+01 2.79020E-06 -4.30793E-05 + 0.22440E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 1.21458E+00 -1.19598E+02 -5.99895E-01 -1.05609E+00 + 0.22440E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 1.57155E-01 2.58256E+01 1.41459E-01 6.84620E-02 + 0.22440E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 1.38151E+01 -8.52521E+01 1.14350E+00 -1.37677E+01 + 0.22440E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 7.48505E-07 -1.34170E+01 7.28076E-07 -1.73680E-07 + 0.22440E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 4.59647E-07 1.40480E+02 -3.54571E-07 2.92498E-07 + 0.22440E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 8.49832E-05 5.86847E+01 4.41698E-05 7.26028E-05 + 0.22046E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 2.45612E+00 3.80589E+01 1.93389E+00 1.51413E+00 + 0.22046E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 1.83122E-01 7.38978E+00 1.81601E-01 2.35529E-02 + 0.22046E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 1.87865E+01 -1.10520E+02 -6.58526E+00 -1.75945E+01 + 0.22046E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 1.05256E-06 -1.77075E+02 -1.05119E-06 -5.37198E-08 + 0.22046E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 1.29575E-06 -2.39578E+01 1.18412E-06 -5.26157E-07 + 0.22046E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 8.27981E-05 1.37682E+02 -6.12225E-05 5.57436E-05 + 0.21666E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 6.47744E+00 1.86569E+01 6.13706E+00 2.07214E+00 + 0.21666E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 1.13712E-01 -6.85387E+01 4.16040E-02 -1.05828E-01 + 0.21666E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 2.16103E+01 -1.71289E+02 -2.13610E+01 -3.27289E+00 + 0.21666E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 6.65712E-08 -1.41710E+00 6.65509E-08 -1.64634E-09 + 0.21666E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 5.91348E-07 -1.11686E+01 5.80148E-07 -1.14543E-07 + 0.21666E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 9.55491E-05 1.76211E+02 -9.53403E-05 6.31337E-06 + 0.21299E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 1.27417E+01 -3.97895E+01 9.79074E+00 -8.15431E+00 + 0.21299E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 1.59209E-01 -1.73972E+02 -1.58329E-01 -1.67186E-02 + 0.21299E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 3.41054E+01 1.38204E+02 -2.54262E+01 2.27307E+01 + 0.21299E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 7.77594E-07 -1.61246E+02 -7.36311E-07 -2.49999E-07 + 0.21299E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 1.40706E-06 7.18500E+01 4.38305E-07 1.33705E-06 + 0.21299E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 6.59970E-05 -1.47245E+02 -5.55030E-05 -3.57075E-05 + 0.20944E+01 0.62832E+01 0.00000E+00 0.00000E+00 1 9.81475E+00 -2.26678E+01 9.05660E+00 -3.78249E+00 + 0.20944E+01 0.62832E+01 0.00000E+00 0.00000E+00 3 9.28732E-02 -1.22683E+02 -5.01505E-02 -7.81688E-02 + 0.20944E+01 0.62832E+01 0.00000E+00 0.00000E+00 5 2.62622E+01 1.70173E+02 -2.58769E+01 4.48207E+00 + 0.20944E+01 0.62832E+01 0.00000E+00 0.00000E+00 2 2.31612E-07 1.15432E+02 -9.94633E-08 2.09167E-07 + 0.20944E+01 0.62832E+01 0.00000E+00 0.00000E+00 4 1.28610E-06 1.05912E+02 -3.52594E-07 1.23683E-06 + 0.20944E+01 0.62832E+01 0.00000E+00 0.00000E+00 6 4.82629E-05 9.75200E+01 -6.31628E-06 4.78478E-05 + 0.59840E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 1.09850E+01 0.00000E+00 1.09850E+01 0.00000E+00 + 0.59840E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 6.47194E+00 0.00000E+00 6.47194E+00 0.00000E+00 + 0.59840E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 3.46609E+01 0.00000E+00 3.46609E+01 0.00000E+00 + 0.59840E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 6.59394E-06 0.00000E+00 6.59394E-06 0.00000E+00 + 0.59840E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 1.77902E-04 1.80000E+02 -1.77902E-04 0.00000E+00 + 0.59840E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 1.65336E-04 1.80000E+02 -1.65336E-04 0.00000E+00 + 0.57120E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 1.11754E+01 -9.39893E-02 1.11754E+01 -1.83324E-02 + 0.57120E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 5.06065E+00 4.33995E+00 5.04614E+00 3.82960E-01 + 0.57120E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 2.84963E+01 5.88432E+01 1.47435E+01 2.43858E+01 + 0.57120E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 8.81910E-06 -1.70866E+02 -8.70727E-06 -1.39996E-06 + 0.57120E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 1.44304E-05 -2.67406E+01 1.28871E-05 -6.49297E-06 + 0.57120E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 2.95995E-04 4.44914E+00 2.95103E-04 2.29616E-05 + 0.54636E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 8.62141E+00 -4.99175E+00 8.58871E+00 -7.50169E-01 + 0.54636E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 6.17112E+00 7.30961E+00 6.12097E+00 7.85157E-01 + 0.54636E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 7.74288E+01 8.98943E+01 1.42822E-01 7.74287E+01 + 0.54636E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 2.57402E-06 6.57058E+01 1.05901E-06 2.34608E-06 + 0.54636E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 1.43872E-04 -1.68412E+02 -1.40940E-04 -2.88988E-05 + 0.54636E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 1.74998E-04 1.10020E+02 -5.99097E-05 1.64423E-04 + 0.52360E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 4.14275E+00 -1.67133E+01 3.96774E+00 -1.19138E+00 + 0.52360E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 7.53184E+00 4.71273E+00 7.50638E+00 6.18816E-01 + 0.52360E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 1.35911E+02 8.81150E+01 4.47052E+00 1.35837E+02 + 0.52360E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 5.15111E-06 9.62023E+01 -5.56522E-07 5.12096E-06 + 0.52360E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 3.86131E-05 -7.92093E+00 3.82447E-05 -5.32113E-06 + 0.52360E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 7.75728E-04 -1.01591E+02 -1.55866E-04 -7.59908E-04 + 0.50265E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 1.52845E+00 -1.30061E+02 -9.83714E-01 -1.16982E+00 + 0.50265E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 7.79063E+00 4.77962E+00 7.76354E+00 6.49141E-01 + 0.50265E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 1.69954E+02 9.02368E+01 -7.02365E-01 1.69953E+02 + 0.50265E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 1.48099E-06 -1.59658E+02 -1.38863E-06 -5.14817E-07 + 0.50265E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 2.38411E-05 -6.15986E+00 2.37035E-05 -2.55822E-06 + 0.50265E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 4.27672E-04 -7.56874E+01 1.05726E-04 -4.14398E-04 + 0.48332E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 6.78364E+00 -1.40011E+02 -5.19741E+00 -4.35944E+00 + 0.48332E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 8.39106E+00 4.08969E-01 8.39085E+00 5.98938E-02 + 0.48332E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 1.99711E+02 9.52732E+01 -1.83544E+01 1.98866E+02 + 0.48332E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 4.16873E-07 -9.44169E+00 4.11226E-07 -6.83855E-08 + 0.48332E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 4.33594E-05 -5.16130E+01 2.69248E-05 -3.39866E-05 + 0.48332E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 4.14334E-04 1.30884E+00 4.14226E-04 9.46408E-06 + 0.46542E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 1.41326E+01 -1.52157E+02 -1.24965E+01 -6.60055E+00 + 0.46542E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 7.05931E+00 -2.27286E+01 6.51112E+00 -2.72748E+00 + 0.46542E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 1.64252E+02 9.38163E+01 -1.09323E+01 1.63887E+02 + 0.46542E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 7.76530E-06 8.25262E+01 1.01006E-06 7.69933E-06 + 0.46542E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 2.63104E-05 -7.17230E+01 8.25127E-06 -2.49831E-05 + 0.46542E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 3.06093E-04 -7.52805E+01 7.77742E-05 -2.96048E-04 + 0.44880E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 1.73601E+01 -1.59864E+02 -1.62990E+01 -5.97610E+00 + 0.44880E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 7.14007E+00 -5.17487E+01 4.42050E+00 -5.60712E+00 + 0.44880E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 1.06641E+02 1.05082E+02 -2.77485E+01 1.02968E+02 + 0.44880E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 8.77277E-07 4.69352E+01 5.99027E-07 6.40923E-07 + 0.44880E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 6.04188E-06 1.41966E+02 -4.75884E-06 3.72260E-06 + 0.44880E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 1.93977E-04 2.83565E+01 1.70702E-04 9.21309E-05 + 0.43332E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 1.37874E+01 -1.66151E+02 -1.33866E+01 -3.30023E+00 + 0.43332E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 9.53169E+00 -7.45402E+01 2.54079E+00 -9.18681E+00 + 0.43332E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 8.41987E+01 1.13848E+02 -3.40424E+01 7.70100E+01 + 0.43332E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 4.24039E-06 -6.48536E+01 1.80188E-06 -3.83851E-06 + 0.43332E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 2.65165E-05 -7.60887E+01 6.37509E-06 -2.57387E-05 + 0.43332E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 6.30566E-05 1.35977E+02 -4.53418E-05 4.38207E-05 + 0.41888E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 3.90796E+00 -1.72718E+02 -3.87644E+00 -4.95360E-01 + 0.41888E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 1.11858E+01 -8.42559E+01 1.11953E+00 -1.11296E+01 + 0.41888E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 8.04776E+01 8.93559E+01 9.04745E-01 8.04725E+01 + 0.41888E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 4.40714E-06 -1.68254E+00 4.40524E-06 -1.29401E-07 + 0.41888E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 1.60925E-05 -1.03732E+01 1.58294E-05 -2.89761E-06 + 0.41888E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 1.59651E-04 1.31805E+02 -1.06423E-04 1.19006E-04 + 0.40537E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 5.49813E+00 2.00886E+01 5.16364E+00 1.88846E+00 + 0.40537E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 1.22437E+01 -8.47448E+01 1.12144E+00 -1.21922E+01 + 0.40537E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 1.04503E+02 5.05528E+01 6.63975E+01 8.06981E+01 + 0.40537E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 2.07877E-06 1.70834E+02 -2.05222E-06 3.31135E-07 + 0.40537E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 1.57505E-05 -1.44737E+02 -1.28605E-05 -9.09318E-06 + 0.40537E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 3.90609E-04 -3.13783E+01 3.33481E-04 -2.03384E-04 + 0.39270E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 1.56346E+01 3.18553E+01 1.32797E+01 8.25153E+00 + 0.39270E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 1.00182E+01 -1.00170E+02 -1.76891E+00 -9.86082E+00 + 0.39270E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 9.25283E+01 4.89425E+01 6.07741E+01 6.97710E+01 + 0.39270E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 5.29367E-06 -5.90311E+01 2.72398E-06 -4.53904E-06 + 0.39270E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 3.48673E-05 1.26446E+02 -2.07134E-05 2.80478E-05 + 0.39270E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 2.23096E-04 7.90949E+01 4.22061E-05 2.19067E-04 + 0.38080E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 1.71699E+01 3.15258E+01 1.46357E+01 8.97786E+00 + 0.38080E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 4.39688E+00 -1.22342E+02 -2.35222E+00 -3.71478E+00 + 0.38080E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 1.21919E+02 6.13629E+01 5.84312E+01 1.07005E+02 + 0.38080E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 1.97229E-06 2.07451E+01 1.84442E-06 6.98609E-07 + 0.38080E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 1.39198E-05 8.35362E+01 1.56704E-06 1.38313E-05 + 0.38080E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 8.17599E-05 3.97494E+01 6.28610E-05 5.22798E-05 + 0.36960E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 1.26421E+01 2.82019E+01 1.11413E+01 5.97439E+00 + 0.36960E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 9.86110E-01 1.43611E+02 -7.93823E-01 5.85028E-01 + 0.36960E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 1.62040E+02 7.01230E+01 5.50938E+01 1.52386E+02 + 0.36960E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 1.72752E-06 -1.75686E+02 -1.72263E-06 -1.29937E-07 + 0.36960E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 2.53553E-06 -8.60031E+01 1.76733E-07 -2.52936E-06 + 0.36960E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 1.84802E-05 -7.43074E+01 4.99845E-06 -1.77914E-05 + 0.35904E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 8.58146E+00 -6.46448E+01 3.67482E+00 -7.75481E+00 + 0.35904E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 2.25008E+00 1.31671E+02 -1.49599E+00 1.68074E+00 + 0.35904E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 1.85082E+02 6.67743E+01 7.29880E+01 1.70083E+02 + 0.35904E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 7.71784E-06 -1.27980E+02 -4.74941E-06 -6.08343E-06 + 0.35904E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 2.81127E-05 -8.64495E+00 2.77933E-05 -4.22565E-06 + 0.35904E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 7.36180E-04 -9.35803E+01 -4.59720E-05 -7.34743E-04 + 0.34907E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 2.07575E+01 -8.43810E+01 2.03243E+00 -2.06578E+01 + 0.34907E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 3.05438E+00 1.33836E+02 -2.11547E+00 2.20318E+00 + 0.34907E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 1.14658E+02 9.18504E+01 -3.70231E+00 1.14598E+02 + 0.34907E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 6.16700E-06 1.44534E+02 -5.02277E-06 3.57822E-06 + 0.34907E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 1.73292E-05 -1.74580E+01 1.65310E-05 -5.19889E-06 + 0.34907E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 5.84131E-05 8.54724E+00 5.77643E-05 8.68163E-06 + 0.33963E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 3.32313E+01 -9.12902E+01 -7.48254E-01 -3.32229E+01 + 0.33963E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 2.65342E+00 1.63602E+02 -2.54549E+00 7.49070E-01 + 0.33963E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 1.51643E+02 1.22400E+02 -8.12537E+01 1.28037E+02 + 0.33963E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 7.33898E-06 -7.92161E+00 7.26895E-06 -1.01144E-06 + 0.33963E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 3.66225E-06 1.77425E+02 -3.65855E-06 1.64536E-07 + 0.33963E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 1.40356E-04 -1.67514E+02 -1.37037E-04 -3.03459E-05 + 0.33069E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 2.83126E+01 -9.20748E+01 -1.02505E+00 -2.82941E+01 + 0.33069E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 2.54106E+00 1.59514E+02 -2.38036E+00 8.89302E-01 + 0.33069E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 1.08688E+02 1.31426E+02 -7.19145E+01 8.14950E+01 + 0.33069E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 3.48199E-06 -4.70137E+01 2.37410E-06 -2.54714E-06 + 0.33069E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 9.22148E-06 -5.43524E+01 5.37426E-06 -7.49353E-06 + 0.33069E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 3.13689E-05 2.31006E+01 2.88536E-05 1.23074E-05 + 0.32221E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 1.55909E+01 -8.98648E+01 3.67918E-02 -1.55909E+01 + 0.32221E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 2.04784E+00 9.92223E+01 -3.28199E-01 2.02137E+00 + 0.32221E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 3.85623E+01 6.97844E+01 1.33253E+01 3.61868E+01 + 0.32221E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 2.71996E-06 1.73867E+02 -2.70439E-06 2.90591E-07 + 0.32221E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 1.11503E-05 8.28090E+01 1.39577E-06 1.10626E-05 + 0.32221E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 1.48161E-04 -1.37088E+02 -1.08513E-04 -1.00880E-04 + 0.31416E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 1.42439E+01 -1.65382E+02 -1.37829E+01 -3.59470E+00 + 0.31416E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 5.69421E+00 2.85440E+01 5.00208E+00 2.72088E+00 + 0.31416E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 1.65787E+02 -1.20901E+01 1.62110E+02 -3.47241E+01 + 0.31416E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 2.48114E-06 1.64997E+02 -2.39657E-06 6.42300E-07 + 0.31416E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 1.01738E-05 -1.49614E+02 -8.77631E-06 -5.14613E-06 + 0.31416E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 1.75452E-04 -3.20561E+01 1.48700E-04 -9.31208E-05 + 0.30650E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 2.21758E+01 1.57519E+02 -2.04906E+01 8.47937E+00 + 0.30650E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 2.95043E+00 -4.93568E+01 1.92175E+00 -2.23873E+00 + 0.30650E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 1.90641E+02 -1.93278E+01 1.79896E+02 -6.30967E+01 + 0.30650E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 2.05826E-06 1.17710E+01 2.01498E-06 4.19886E-07 + 0.30650E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 7.00076E-06 -1.69615E+02 -6.88607E-06 -1.26200E-06 + 0.30650E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 6.26422E-05 -1.74286E+01 5.97664E-05 -1.87624E-05 + 0.29920E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 1.90615E+01 1.61079E+02 -1.80315E+01 6.18104E+00 + 0.29920E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 2.93043E+00 1.75059E+02 -2.91954E+00 2.52407E-01 + 0.29920E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 1.19200E+02 -3.79372E+00 1.18939E+02 -7.88684E+00 + 0.29920E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 3.50499E-06 1.32305E+02 -2.35913E-06 2.59219E-06 + 0.29920E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 8.31450E-06 -8.84489E+00 8.21563E-06 -1.27844E-06 + 0.29920E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 2.14460E-05 1.45485E+02 -1.76709E-05 1.21518E-05 + 0.29224E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 4.01708E+00 1.60232E+02 -3.78036E+00 1.35862E+00 + 0.29224E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 3.46910E+00 1.53667E+02 -3.10911E+00 1.53887E+00 + 0.29224E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 2.39673E+01 3.48569E+01 1.96671E+01 1.36980E+01 + 0.29224E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 1.97343E-06 1.26511E+02 -1.17415E-06 1.58613E-06 + 0.29224E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 9.32155E-06 1.32594E+01 9.07306E-06 2.13798E-06 + 0.29224E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 7.15691E-05 1.70321E+02 -7.05504E-05 1.20328E-05 + 0.28560E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 8.40289E+00 -1.10596E+01 8.24684E+00 -1.61192E+00 + 0.28560E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 2.69048E+00 1.71630E+02 -2.66182E+00 3.91634E-01 + 0.28560E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 5.62408E+01 -1.59634E+02 -5.27252E+01 -1.95724E+01 + 0.28560E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 4.15364E-06 1.44841E-01 4.15363E-06 1.05002E-08 + 0.28560E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 1.33543E-06 -7.05098E+01 4.45559E-07 -1.25891E-06 + 0.28560E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 1.60016E-04 7.30903E+01 4.65428E-05 1.53097E-04 + 0.27925E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 9.32342E+00 -1.10714E+01 9.14990E+00 -1.79039E+00 + 0.27925E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 1.29594E+00 -1.61856E+02 -1.23150E+00 -4.03571E-01 + 0.27925E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 5.27295E+01 -1.32160E+02 -3.53925E+01 -3.90867E+01 + 0.27925E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 5.14815E-06 1.32895E+01 5.01029E-06 1.18341E-06 + 0.27925E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 7.12048E-06 -1.75082E+02 -7.09427E-06 -6.10408E-07 + 0.27925E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 1.03509E-04 -9.19846E+01 -3.58452E-06 -1.03447E-04 + 0.27318E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 4.15848E+00 -4.46545E+01 2.95817E+00 -2.92271E+00 + 0.27318E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 1.07287E+00 -4.88450E+01 7.06052E-01 -8.07797E-01 + 0.27318E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 3.30518E+01 -4.77442E+01 2.22254E+01 -2.44633E+01 + 0.27318E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 4.91078E-07 3.30892E+01 4.11436E-07 2.68101E-07 + 0.27318E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 1.02350E-06 -3.74969E+01 8.12028E-07 -6.23021E-07 + 0.27318E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 1.06334E-04 1.70991E+02 -1.05022E-04 1.66507E-05 + 0.26737E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 9.15123E+00 -8.16508E+01 1.32880E+00 -9.05424E+00 + 0.26737E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 1.04087E+00 -2.82201E+01 9.17149E-01 -4.92185E-01 + 0.26737E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 4.51318E+01 5.20800E+01 2.77362E+01 3.56031E+01 + 0.26737E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 7.03936E-07 -1.70871E+02 -6.95019E-07 -1.11691E-07 + 0.26737E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 1.39261E-06 -1.72684E+02 -1.38127E-06 -1.77326E-07 + 0.26737E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 2.41918E-04 -2.40940E+01 2.20842E-04 -9.87595E-05 + 0.26180E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 1.48188E+01 -7.34199E+01 4.22861E+00 -1.42026E+01 + 0.26180E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 8.49590E-01 1.36276E+01 8.25672E-01 2.00172E-01 + 0.26180E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 8.58737E+01 9.91577E+01 -1.36669E+01 8.47792E+01 + 0.26180E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 4.08571E-07 5.59054E+01 2.29029E-07 3.38343E-07 + 0.26180E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 3.61813E-06 -1.15183E+01 3.54526E-06 -7.22471E-07 + 0.26180E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 5.86875E-05 1.57998E+02 -5.44134E-05 2.19865E-05 + 0.25646E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 1.23029E+01 -4.14518E+01 9.22115E+00 -8.14437E+00 + 0.25646E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 6.49589E-02 -1.10504E+02 -2.27534E-02 -6.08436E-02 + 0.25646E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 7.16951E+01 1.28460E+02 -4.45925E+01 5.61399E+01 + 0.25646E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 1.27782E-06 -5.56339E+01 7.21304E-07 -1.05478E-06 + 0.25646E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 1.23170E-06 -3.15337E+01 1.04982E-06 -6.44180E-07 + 0.25646E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 7.03263E-05 1.20531E+02 -3.57263E-05 6.05758E-05 + 0.25133E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 5.49528E+00 -6.57413E+01 2.25777E+00 -5.01005E+00 + 0.25133E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 9.34159E-01 -1.70922E+02 -9.22458E-01 -1.47392E-01 + 0.25133E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 3.08961E+01 1.64540E+02 -2.97782E+01 8.23571E+00 + 0.25133E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 5.44889E-07 -2.61494E+01 4.89119E-07 -2.40140E-07 + 0.25133E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 6.64209E-07 -1.64739E+02 -6.40787E-07 -1.74831E-07 + 0.25133E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 1.87288E-04 -2.97581E+01 1.62590E-04 -9.29580E-05 + 0.24640E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 2.91957E+00 1.72296E+02 -2.89322E+00 3.91368E-01 + 0.24640E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 5.43845E-01 -1.51535E+02 -4.78101E-01 -2.59205E-01 + 0.24640E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 1.11798E+01 -8.80465E+01 3.81099E-01 -1.11733E+01 + 0.24640E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 2.81545E-07 1.74987E+00 2.81413E-07 8.59730E-09 + 0.24640E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 2.41150E-06 -3.37185E+01 2.00583E-06 -1.33866E-06 + 0.24640E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 7.97187E-05 9.48577E+01 -6.75071E-06 7.94324E-05 + 0.24166E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 3.27452E+00 -1.20483E+02 -1.66110E+00 -2.82192E+00 + 0.24166E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 5.36860E-01 -1.66958E+02 -5.23012E-01 -1.21148E-01 + 0.24166E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 2.35136E+01 2.28379E+01 2.16703E+01 9.12621E+00 + 0.24166E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 5.14627E-07 -1.36811E+02 -3.75216E-07 -3.52213E-07 + 0.24166E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 5.14549E-07 1.22494E+01 5.02834E-07 1.09171E-07 + 0.24166E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 3.32859E-06 -7.02685E+01 1.12378E-06 -3.13315E-06 + 0.23710E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 3.39751E+00 -1.07340E+02 -1.01261E+00 -3.24311E+00 + 0.23710E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 8.65482E-01 1.26168E+02 -5.10768E-01 6.98695E-01 + 0.23710E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 1.53179E+01 2.27541E+01 1.41257E+01 5.92460E+00 + 0.23710E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 5.39216E-07 -1.02122E+02 -1.13234E-07 -5.27192E-07 + 0.23710E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 2.39715E-06 8.98937E+01 4.44938E-09 2.39715E-06 + 0.23710E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 1.19709E-05 -1.25836E+02 -7.00860E-06 -9.70473E-06 + 0.23271E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 3.19160E+00 1.14574E+02 -1.32728E+00 2.90253E+00 + 0.23271E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 7.06257E-01 1.16821E+02 -3.18667E-01 6.30278E-01 + 0.23271E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 1.72590E+01 -4.86315E+01 1.14065E+01 -1.29525E+01 + 0.23271E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 2.65211E-07 -1.43991E+02 -2.14534E-07 -1.55922E-07 + 0.23271E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 1.33609E-06 1.23657E+01 1.30509E-06 2.86126E-07 + 0.23271E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 6.73948E-05 -2.15483E+01 6.26845E-05 -2.47531E-05 + 0.22848E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 5.27342E+00 1.78814E+02 -5.27229E+00 1.09110E-01 + 0.22848E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 5.21114E-01 1.38910E+02 -3.92750E-01 3.42501E-01 + 0.22848E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 2.52296E+01 -3.39495E+01 2.09287E+01 -1.40898E+01 + 0.22848E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 5.24691E-07 1.58051E+00 5.24491E-07 1.44718E-08 + 0.22848E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 3.85655E-07 -1.17208E+01 3.77614E-07 -7.83428E-08 + 0.22848E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 6.00027E-05 -9.67542E+01 -7.05695E-06 -5.95863E-05 + 0.22440E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 2.88678E+00 -1.13621E+02 -1.15671E+00 -2.64490E+00 + 0.22440E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 7.94747E-02 -1.78363E+02 -7.94423E-02 -2.27088E-03 + 0.22440E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 8.13199E+00 -7.06035E+01 2.70067E+00 -7.67044E+00 + 0.22440E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 1.61324E-06 -8.18919E+00 1.59679E-06 -2.29793E-07 + 0.22440E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 3.91995E-07 -4.41493E+01 2.81267E-07 -2.73037E-07 + 0.22440E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 4.12832E-05 -1.19263E+01 4.03921E-05 -8.53134E-06 + 0.22046E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 3.39637E+00 -8.85792E+00 3.35586E+00 -5.22989E-01 + 0.22046E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 2.91114E-01 -1.05421E+01 2.86200E-01 -5.32616E-02 + 0.22046E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 1.84714E+01 -1.23695E+02 -1.02474E+01 -1.53683E+01 + 0.22046E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 4.71313E-07 -8.48433E+01 4.23613E-08 -4.69405E-07 + 0.22046E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 8.13476E-07 -7.10160E+01 2.64627E-07 -7.69231E-07 + 0.22046E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 3.46717E-05 1.49316E+02 -2.98174E-05 1.76931E-05 + 0.21666E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 4.52805E+00 4.33783E+01 3.29114E+00 3.10992E+00 + 0.21666E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 2.55687E-01 6.85372E-01 2.55669E-01 3.05846E-03 + 0.21666E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 1.74282E+01 -1.42109E+02 -1.37540E+01 -1.07038E+01 + 0.21666E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 1.46962E-07 1.41564E+02 -1.15115E-07 9.13576E-08 + 0.21666E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 4.88409E-07 4.48379E+01 3.46333E-07 3.44379E-07 + 0.21666E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 1.71021E-05 2.68626E+01 1.52566E-05 7.72762E-06 + 0.21299E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 8.05826E+00 -9.21069E+00 7.95436E+00 -1.28985E+00 + 0.21299E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 1.02830E-01 1.77584E+02 -1.02739E-01 4.33512E-03 + 0.21299E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 2.21028E+01 1.57273E+02 -2.03866E+01 8.53926E+00 + 0.21299E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 6.54735E-07 -7.27371E+00 6.49466E-07 -8.28957E-08 + 0.21299E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 2.08353E-06 -1.16097E+02 -9.16537E-07 -1.87111E-06 + 0.21299E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 1.09556E-04 -1.73155E+02 -1.08775E-04 -1.30577E-05 + 0.20944E+01 0.59840E+01 0.00000E+00 0.00000E+00 1 5.95955E+00 -2.15535E+01 5.54283E+00 -2.18936E+00 + 0.20944E+01 0.59840E+01 0.00000E+00 0.00000E+00 3 9.50419E-02 -1.45501E+02 -7.83273E-02 -5.38313E-02 + 0.20944E+01 0.59840E+01 0.00000E+00 0.00000E+00 5 2.00706E+01 1.70879E+02 -1.98168E+01 3.18160E+00 + 0.20944E+01 0.59840E+01 0.00000E+00 0.00000E+00 2 4.74254E-07 -7.53282E+01 1.20120E-07 -4.58790E-07 + 0.20944E+01 0.59840E+01 0.00000E+00 0.00000E+00 4 1.17082E-06 3.79091E+01 9.23763E-07 7.19364E-07 + 0.20944E+01 0.59840E+01 0.00000E+00 0.00000E+00 6 3.71858E-05 -2.47347E+01 3.37742E-05 -1.55592E-05 + 0.57120E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 1.02149E+01 0.00000E+00 1.02149E+01 0.00000E+00 + 0.57120E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 4.47965E+00 0.00000E+00 4.47965E+00 0.00000E+00 + 0.57120E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 7.46496E+00 0.00000E+00 7.46496E+00 0.00000E+00 + 0.57120E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 5.98590E-06 0.00000E+00 5.98590E-06 0.00000E+00 + 0.57120E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 9.64316E-05 0.00000E+00 9.64316E-05 0.00000E+00 + 0.57120E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 4.37975E-04 1.80000E+02 -4.37975E-04 0.00000E+00 + 0.54636E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 7.50981E+00 4.86375E+00 7.48277E+00 6.36731E-01 + 0.54636E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 4.18102E+00 -5.88725E-01 4.18080E+00 -4.29600E-02 + 0.54636E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 3.36664E+01 8.50171E+01 2.92422E+00 3.35392E+01 + 0.54636E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 2.61880E-06 -9.95870E+01 -4.36150E-07 -2.58223E-06 + 0.54636E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 4.17069E-05 -5.67380E+00 4.15026E-05 -4.12334E-06 + 0.54636E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 2.17723E-04 8.95237E+01 1.80989E-06 2.17716E-04 + 0.52360E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 4.02649E+00 2.89555E-01 4.02644E+00 2.03485E-02 + 0.52360E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 5.28499E+00 -5.30058E+00 5.26239E+00 -4.88231E-01 + 0.52360E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 7.44962E+01 7.88636E+01 1.43886E+01 7.30934E+01 + 0.52360E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 1.24181E-05 -1.53606E+02 -1.11237E-05 -5.52033E-06 + 0.52360E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 6.13717E-05 1.77490E-01 6.13714E-05 1.90116E-07 + 0.52360E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 1.15253E-04 -9.58585E+01 -1.17642E-05 -1.14651E-04 + 0.50265E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 1.97627E+00 -5.77284E+01 1.05520E+00 -1.67098E+00 + 0.50265E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 6.23798E+00 -5.30954E+00 6.21121E+00 -5.77240E-01 + 0.50265E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 1.11467E+02 7.91107E+01 2.10574E+01 1.09460E+02 + 0.50265E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 1.87746E-06 -9.89904E+01 -2.93387E-07 -1.85439E-06 + 0.50265E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 8.59582E-05 2.29636E+00 8.58892E-05 3.44420E-06 + 0.50265E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 7.20053E-05 1.20026E+02 -3.60312E-05 6.23419E-05 + 0.48332E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 7.66566E+00 -1.16720E+02 -3.44668E+00 -6.84710E+00 + 0.48332E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 7.49049E+00 -3.47617E+00 7.47671E+00 -4.54174E-01 + 0.48332E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 1.64080E+02 8.40523E+01 1.70020E+01 1.63197E+02 + 0.48332E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 2.61326E-06 -4.29861E+01 1.91165E-06 -1.78178E-06 + 0.48332E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 1.16399E-05 6.44785E+01 5.01503E-06 1.05041E-05 + 0.48332E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 7.54591E-04 -2.16679E+00 7.54051E-04 -2.85300E-05 + 0.46542E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 1.25515E+01 -1.45485E+02 -1.03421E+01 -7.11203E+00 + 0.46542E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 7.04674E+00 -1.52314E+01 6.79921E+00 -1.85131E+00 + 0.46542E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 1.61562E+02 7.97376E+01 2.87834E+01 1.58977E+02 + 0.46542E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 4.13550E-06 1.22165E+02 -2.20158E-06 3.50077E-06 + 0.46542E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 2.78338E-05 1.22909E+02 -1.51224E-05 2.33674E-05 + 0.46542E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 9.87998E-05 1.56425E+01 9.51406E-05 2.66398E-05 + 0.44880E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 1.52580E+01 -1.61753E+02 -1.44907E+01 -4.77746E+00 + 0.44880E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 6.48486E+00 -3.49833E+01 5.31318E+00 -3.71801E+00 + 0.44880E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 1.24071E+02 8.62579E+01 8.09747E+00 1.23806E+02 + 0.44880E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 5.67409E-06 -6.38091E+01 2.50434E-06 -5.09152E-06 + 0.44880E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 2.74965E-06 1.44549E+02 -2.23990E-06 1.59481E-06 + 0.44880E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 1.24424E-04 -2.54441E+01 1.12355E-04 -5.34562E-05 + 0.43332E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 1.41922E+01 -1.75021E+02 -1.41387E+01 -1.23178E+00 + 0.43332E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 7.57184E+00 -6.36837E+01 3.35680E+00 -6.78710E+00 + 0.43332E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 1.02622E+02 9.28261E+01 -5.05970E+00 1.02497E+02 + 0.43332E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 4.98681E-06 9.36143E+01 -3.14369E-07 4.97690E-06 + 0.43332E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 4.12648E-05 6.52713E+01 1.72620E-05 3.74808E-05 + 0.43332E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 2.24914E-05 -1.18228E+02 -1.06379E-05 -1.98166E-05 + 0.41888E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 9.15092E+00 1.74218E+02 -9.10437E+00 9.21871E-01 + 0.41888E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 9.29926E+00 -8.19755E+01 1.29814E+00 -9.20821E+00 + 0.41888E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 8.98246E+01 7.62896E+01 2.12897E+01 8.72652E+01 + 0.41888E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 2.98149E-06 -3.79619E+01 2.35067E-06 -1.83402E-06 + 0.41888E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 8.85435E-06 1.04824E+01 8.70658E-06 1.61091E-06 + 0.41888E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 2.21401E-04 -6.13899E+01 1.06017E-04 -1.94368E-04 + 0.40537E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 4.14913E+00 1.46048E+02 -3.44174E+00 2.31725E+00 + 0.40537E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 1.09946E+01 -8.59271E+01 7.80904E-01 -1.09669E+01 + 0.40537E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 9.07217E+01 4.85957E+01 6.00004E+01 6.80468E+01 + 0.40537E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 2.66687E-06 -2.94809E+01 2.32156E-06 -1.31246E-06 + 0.40537E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 5.73985E-06 -7.80569E+01 1.18781E-06 -5.61560E-06 + 0.40537E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 3.86073E-04 1.68162E+01 3.69564E-04 1.11692E-04 + 0.39270E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 1.00444E+01 4.87412E+01 6.62391E+00 7.55079E+00 + 0.39270E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 1.12553E+01 -9.94915E+01 -1.85602E+00 -1.11013E+01 + 0.39270E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 6.95897E+01 4.06864E+01 5.27692E+01 4.53668E+01 + 0.39270E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 1.96660E-06 -1.26342E+02 -1.16541E-06 -1.58409E-06 + 0.39270E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 2.07290E-06 2.83811E+01 1.82375E-06 9.85322E-07 + 0.39270E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 4.35997E-04 1.16139E+02 -1.92077E-04 3.91407E-04 + 0.38080E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 1.56865E+01 2.87788E+01 1.37490E+01 7.55195E+00 + 0.38080E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 7.57676E+00 -1.20476E+02 -3.84281E+00 -6.52994E+00 + 0.38080E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 8.08863E+01 5.70005E+01 4.40533E+01 6.78373E+01 + 0.38080E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 3.28596E-06 -1.16801E+02 -1.48162E-06 -2.93297E-06 + 0.38080E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 2.80339E-05 8.33059E+01 3.26789E-06 2.78428E-05 + 0.38080E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 3.24332E-04 5.95622E+01 1.64308E-04 2.79633E-04 + 0.36960E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 1.53836E+01 2.05026E+01 1.44092E+01 5.38812E+00 + 0.36960E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 3.23460E+00 -1.56820E+02 -2.97348E+00 -1.27320E+00 + 0.36960E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 1.10475E+02 6.38076E+01 4.87623E+01 9.91314E+01 + 0.36960E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 1.21372E-06 1.55506E+02 -1.10449E-06 5.03210E-07 + 0.36960E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 4.58907E-06 5.67212E+01 2.51808E-06 3.83651E-06 + 0.36960E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 5.92775E-05 1.71852E+02 -5.86792E-05 8.40093E-06 + 0.35904E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 6.88002E+00 -1.66383E+01 6.59197E+00 -1.96995E+00 + 0.35904E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 3.16907E+00 1.56837E+02 -2.91361E+00 1.24654E+00 + 0.35904E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 1.48407E+02 5.47296E+01 8.56956E+01 1.21165E+02 + 0.35904E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 2.05894E-06 1.27032E+01 2.00854E-06 4.52762E-07 + 0.35904E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 1.68421E-05 7.02014E+00 1.67158E-05 2.05841E-06 + 0.35904E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 3.53966E-05 -5.26832E+01 2.14582E-05 -2.81507E-05 + 0.34907E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 1.04411E+01 -6.19719E+01 4.90633E+00 -9.21657E+00 + 0.34907E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 4.19313E+00 1.30498E+02 -2.72313E+00 3.18856E+00 + 0.34907E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 1.04116E+02 5.33859E+01 6.20971E+01 8.35708E+01 + 0.34907E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 4.02686E-06 1.44219E+02 -3.26680E-06 2.35448E-06 + 0.34907E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 3.92191E-06 1.16902E+02 -1.77454E-06 3.49748E-06 + 0.34907E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 1.19854E-04 -1.26405E+02 -7.11320E-05 -9.64639E-05 + 0.33963E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 2.65745E+01 -9.00176E+01 -8.14939E-03 -2.65745E+01 + 0.33963E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 2.76655E+00 1.38778E+02 -2.08089E+00 1.82310E+00 + 0.33963E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 8.08926E+01 1.00148E+02 -1.42531E+01 7.96271E+01 + 0.33963E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 5.68869E-06 4.36954E+01 4.11306E-06 3.92989E-06 + 0.33963E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 1.33704E-05 -1.35765E+02 -9.57978E-06 -9.32718E-06 + 0.33963E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 3.40696E-04 1.02597E+02 -7.43030E-05 3.32495E-04 + 0.33069E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 3.04006E+01 -9.70922E+01 -3.75344E+00 -3.01680E+01 + 0.33069E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 2.23542E+00 1.66141E+02 -2.17034E+00 5.35471E-01 + 0.33069E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 1.06629E+02 1.29937E+02 -6.84496E+01 8.17579E+01 + 0.33069E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 3.98052E-06 -8.30454E+00 3.93878E-06 -5.74924E-07 + 0.33069E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 3.70015E-06 -4.41525E+01 2.65481E-06 -2.57742E-06 + 0.33069E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 1.12089E-04 -7.79530E+01 2.33946E-05 -1.09621E-04 + 0.32221E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 2.36420E+01 -9.37694E+01 -1.55426E+00 -2.35909E+01 + 0.32221E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 1.73827E+00 1.64975E+02 -1.67884E+00 4.50642E-01 + 0.32221E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 7.59278E+01 9.97430E+01 -1.28492E+01 7.48326E+01 + 0.32221E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 1.88579E-06 -1.43600E+02 -1.51786E-06 -1.11907E-06 + 0.32221E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 8.32736E-06 1.07210E+02 -2.46385E-06 7.95452E-06 + 0.32221E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 1.08406E-04 1.06341E+02 -3.05008E-05 1.04027E-04 + 0.31416E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 1.74735E+01 -1.39613E+02 -1.33094E+01 -1.13218E+01 + 0.31416E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 2.88153E+00 7.81500E+01 5.91725E-01 2.82012E+00 + 0.31416E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 1.17968E+02 -2.14392E+00 1.17885E+02 -4.41315E+00 + 0.31416E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 2.51649E-06 -1.55793E+02 -2.29522E-06 -1.03185E-06 + 0.31416E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 1.38084E-05 -2.06160E+00 1.37995E-05 -4.96741E-07 + 0.31416E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 2.72856E-05 -4.53785E+01 1.91660E-05 -1.94209E-05 + 0.30650E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 2.06164E+01 1.58492E+02 -1.91808E+01 7.55869E+00 + 0.30650E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 4.69557E+00 2.77499E+00 4.69006E+00 2.27330E-01 + 0.30650E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 1.88758E+02 -2.33758E+01 1.73265E+02 -7.48916E+01 + 0.30650E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 5.04870E-07 -1.05307E+02 -1.33278E-07 -4.86961E-07 + 0.30650E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 1.60592E-06 -7.07432E+01 5.29639E-07 -1.51607E-06 + 0.30650E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 6.56823E-04 1.37769E+00 6.56633E-04 1.57919E-05 + 0.29920E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 2.25953E+01 1.52676E+02 -2.00743E+01 1.03717E+01 + 0.29920E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 2.32050E+00 -1.04703E+02 -5.88950E-01 -2.24452E+00 + 0.29920E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 1.52627E+02 -1.61501E+01 1.46604E+02 -4.24539E+01 + 0.29920E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 9.14697E-07 1.03020E+01 8.99951E-07 1.63581E-07 + 0.29920E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 6.88285E-06 -1.67411E+02 -6.71738E-06 -1.50011E-06 + 0.29920E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 8.84776E-05 2.21249E+01 8.19625E-05 3.33231E-05 + 0.29224E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 1.32952E+01 1.48378E+02 -1.13213E+01 6.97080E+00 + 0.29224E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 3.15337E+00 1.66589E+02 -3.06738E+00 7.31372E-01 + 0.29224E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 6.65698E+01 -6.19835E+00 6.61806E+01 -7.18759E+00 + 0.29224E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 6.45059E-07 1.54676E+02 -5.83072E-07 2.75912E-07 + 0.29224E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 3.05150E-06 1.50598E+01 2.94670E-06 7.92861E-07 + 0.29224E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 1.22420E-04 1.07560E+02 -3.69345E-05 1.16716E-04 + 0.28560E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 3.47422E+00 2.99892E+01 3.00909E+00 1.73654E+00 + 0.28560E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 3.39986E+00 1.62820E+02 -3.24816E+00 1.00424E+00 + 0.28560E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 3.66457E+01 -1.53853E+02 -3.28956E+01 -1.61489E+01 + 0.28560E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 2.43623E-06 9.94688E+01 -4.00784E-07 2.40304E-06 + 0.28560E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 4.81624E-06 3.72280E+01 3.83485E-06 2.91377E-06 + 0.28560E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 6.96905E-05 1.11322E+02 -2.53399E-05 6.49203E-05 + 0.27925E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 1.08322E+01 -6.50012E+00 1.07626E+01 -1.22626E+00 + 0.27925E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 1.93184E+00 1.67225E+02 -1.88401E+00 4.27179E-01 + 0.27925E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 7.11993E+01 -1.51151E+02 -6.23631E+01 -3.43538E+01 + 0.27925E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 1.15518E-06 1.87730E+01 1.09372E-06 3.71759E-07 + 0.27925E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 6.36775E-06 -1.70921E+02 -6.28797E-06 -1.00484E-06 + 0.27925E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 1.95081E-04 5.32745E+01 1.16655E-04 1.56360E-04 + 0.27318E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 7.24969E+00 -1.00030E+01 7.13949E+00 -1.25927E+00 + 0.27318E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 1.52688E-01 -3.86588E+01 1.19231E-01 -9.53815E-02 + 0.27318E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 3.44907E+01 -1.06802E+02 -9.97007E+00 -3.30183E+01 + 0.27318E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 4.87927E-07 1.22357E+02 -2.61135E-07 4.12166E-07 + 0.27318E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 8.68302E-07 -1.23057E+02 -4.73632E-07 -7.27751E-07 + 0.27318E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 1.24449E-04 -1.76781E+02 -1.24252E-04 -6.98791E-06 + 0.26737E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 5.23931E+00 -6.32612E+01 2.35729E+00 -4.67906E+00 + 0.26737E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 1.64465E+00 -3.59177E+01 1.33194E+00 -9.64787E-01 + 0.26737E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 2.50593E+01 -8.62430E-01 2.50565E+01 -3.77185E-01 + 0.26737E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 2.39202E-07 1.15476E+02 -1.02887E-07 2.15944E-07 + 0.26737E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 3.89160E-06 -1.69903E+02 -3.83133E-06 -6.82244E-07 + 0.26737E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 5.13754E-05 -6.18759E+01 2.42175E-05 -4.53094E-05 + 0.26180E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 1.22534E+01 -7.66818E+01 2.82267E+00 -1.19238E+01 + 0.26180E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 7.43205E-01 8.01682E+00 7.35942E-01 1.03650E-01 + 0.26180E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 5.94932E+01 8.60326E+01 4.11626E+00 5.93506E+01 + 0.26180E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 4.73671E-07 4.09117E+00 4.72464E-07 3.37934E-08 + 0.26180E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 3.53368E-06 2.85207E+01 3.10485E-06 1.68725E-06 + 0.26180E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 4.59472E-04 -9.26007E-01 4.59412E-04 -7.42560E-06 + 0.25646E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 1.26969E+01 -6.61049E+01 5.14305E+00 -1.16086E+01 + 0.25646E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 2.91581E-01 2.85316E+01 2.56170E-01 1.39272E-01 + 0.25646E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 7.56438E+01 1.14833E+02 -3.17679E+01 6.86497E+01 + 0.25646E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 1.82893E-06 2.55540E+01 1.65002E-06 7.88931E-07 + 0.25646E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 2.91509E-06 -1.83542E+01 2.76680E-06 -9.17934E-07 + 0.25646E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 9.83039E-05 -1.43817E+01 9.52233E-05 -2.44167E-05 + 0.25133E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 6.36930E+00 -5.82184E+01 3.35460E+00 -5.41430E+00 + 0.25133E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 5.80794E-01 1.65735E+02 -5.62887E-01 1.43107E-01 + 0.25133E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 4.13946E+01 1.53774E+02 -3.71335E+01 1.82927E+01 + 0.25133E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 5.69602E-07 1.57901E+02 -5.27758E-07 2.14285E-07 + 0.25133E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 2.98635E-07 -3.70450E+01 2.38359E-07 -1.79910E-07 + 0.25133E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 5.01107E-05 -1.24159E+02 -2.81367E-05 -4.14658E-05 + 0.24640E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 4.61629E+00 -1.66487E+02 -4.48849E+00 -1.07870E+00 + 0.24640E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 8.71174E-01 -1.60970E+02 -8.23565E-01 -2.84051E-01 + 0.24640E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 7.79897E+00 -7.70502E+01 1.74772E+00 -7.60062E+00 + 0.24640E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 1.02340E-06 -9.80404E+01 -1.43144E-07 -1.01334E-06 + 0.24640E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 2.90322E-06 9.29018E+01 -1.46973E-07 2.89949E-06 + 0.24640E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 9.82722E-05 -9.68960E+01 -1.17993E-05 -9.75613E-05 + 0.24166E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 4.85968E+00 -1.48820E+02 -4.15768E+00 -2.51598E+00 + 0.24166E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 6.35750E-01 -1.36669E+02 -4.62447E-01 -4.36257E-01 + 0.24166E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 1.90515E+01 8.02180E+00 1.88651E+01 2.65863E+00 + 0.24166E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 1.04814E-06 1.78731E+02 -1.04788E-06 2.32142E-08 + 0.24166E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 1.62592E-06 4.95579E+01 1.05470E-06 1.23742E-06 + 0.24166E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 5.39542E-05 -3.19503E+01 4.57805E-05 -2.85516E-05 + 0.23710E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 4.37025E+00 -1.28904E+02 -2.74458E+00 -3.40093E+00 + 0.23710E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 6.52942E-01 1.41168E+02 -5.08633E-01 4.09421E-01 + 0.23710E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 2.23638E+01 9.17346E+00 2.20778E+01 3.56533E+00 + 0.23710E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 6.64961E-07 1.63154E+02 -6.36425E-07 1.92708E-07 + 0.23710E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 1.01124E-06 1.15771E+02 -4.39656E-07 9.10667E-07 + 0.23710E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 1.98060E-05 -1.70495E+02 -1.95341E-05 -3.27070E-06 + 0.23271E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 2.55935E+00 1.26816E+02 -1.53369E+00 2.04892E+00 + 0.23271E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 8.48228E-01 1.22658E+02 -4.57722E-01 7.14129E-01 + 0.23271E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 1.97468E+01 -2.02661E+01 1.85244E+01 -6.83991E+00 + 0.23271E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 9.60406E-07 -9.88632E+01 -1.47976E-07 -9.48938E-07 + 0.23271E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 1.58475E-06 4.00878E+00 1.58088E-06 1.10789E-07 + 0.23271E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 1.24206E-04 -1.15732E+02 -5.39258E-05 -1.11889E-04 + 0.22848E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 4.36546E+00 1.74120E+02 -4.34249E+00 4.47222E-01 + 0.22848E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 5.44368E-01 1.51962E+02 -4.80477E-01 2.55888E-01 + 0.22848E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 2.01849E+01 -2.91119E+01 1.76350E+01 -9.82028E+00 + 0.22848E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 5.56837E-07 2.55319E+01 5.02459E-07 2.40004E-07 + 0.22848E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 2.86296E-07 -2.44898E+01 2.60540E-07 -1.18679E-07 + 0.22848E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 1.49935E-05 -8.43709E+00 1.48312E-05 -2.19989E-06 + 0.22440E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 2.48100E+00 -1.60344E+02 -2.33643E+00 -8.34559E-01 + 0.22440E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 2.15085E-01 1.11536E+02 -7.89534E-02 2.00070E-01 + 0.22440E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 1.58894E+01 -6.99203E+01 5.45525E+00 -1.49235E+01 + 0.22440E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 3.67491E-07 6.68744E+01 1.44332E-07 3.37961E-07 + 0.22440E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 1.18158E-06 -8.18047E+01 1.68430E-07 -1.16951E-06 + 0.22440E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 1.17852E-04 1.33501E+02 -8.11258E-05 8.54851E-05 + 0.22046E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 3.14049E+00 -4.08285E+01 2.37631E+00 -2.05324E+00 + 0.22046E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 2.53272E-01 -9.81690E+00 2.49563E-01 -4.31829E-02 + 0.22046E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 1.58040E+01 -1.13392E+02 -6.27455E+00 -1.45051E+01 + 0.22046E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 6.21994E-07 1.70010E+02 -6.12563E-07 1.07902E-07 + 0.22046E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 2.68583E-07 8.13919E+01 4.02003E-08 2.65558E-07 + 0.22046E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 5.68628E-06 5.81654E+00 5.65700E-06 5.76267E-07 + 0.21666E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 4.89733E+00 2.44962E+01 4.45652E+00 2.03060E+00 + 0.21666E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 2.13311E-01 1.66824E+00 2.13221E-01 6.20994E-03 + 0.21666E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 1.88895E+01 -1.42023E+02 -1.48899E+01 -1.16235E+01 + 0.21666E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 1.04396E-07 1.78438E+02 -1.04357E-07 2.84610E-09 + 0.21666E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 3.68357E-07 -1.06204E+02 -1.02794E-07 -3.53724E-07 + 0.21666E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 3.95047E-05 1.33516E+02 -2.72012E-05 2.86481E-05 + 0.21299E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 6.58220E+00 7.61821E-01 6.58162E+00 8.75163E-02 + 0.21299E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 1.26116E-01 -1.66726E+01 1.20814E-01 -3.61830E-02 + 0.21299E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 1.99369E+01 1.66275E+02 -1.93676E+01 4.73023E+00 + 0.21299E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 3.70774E-07 -1.65468E+02 -3.58912E-07 -9.30363E-08 + 0.21299E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 3.23307E-07 1.26321E+02 -1.91496E-07 2.60493E-07 + 0.21299E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 1.82290E-05 -1.31291E+02 -1.20289E-05 -1.36968E-05 + 0.20944E+01 0.57120E+01 0.00000E+00 0.00000E+00 1 6.06488E+00 -3.93139E+01 4.69232E+00 -3.84252E+00 + 0.20944E+01 0.57120E+01 0.00000E+00 0.00000E+00 3 8.86606E-02 1.39109E+02 -6.70232E-02 5.80395E-02 + 0.20944E+01 0.57120E+01 0.00000E+00 0.00000E+00 5 2.17542E+01 1.55179E+02 -1.97446E+01 9.13213E+00 + 0.20944E+01 0.57120E+01 0.00000E+00 0.00000E+00 2 5.07419E-07 1.49347E+02 -4.36516E-07 2.58704E-07 + 0.20944E+01 0.57120E+01 0.00000E+00 0.00000E+00 4 9.50604E-07 1.39140E+02 -7.18951E-07 6.21899E-07 + 0.20944E+01 0.57120E+01 0.00000E+00 0.00000E+00 6 1.53974E-04 3.52314E+01 1.25770E-04 8.88244E-05 + 0.54636E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 6.53436E+00 0.00000E+00 6.53436E+00 0.00000E+00 + 0.54636E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 4.44089E+00 0.00000E+00 4.44089E+00 0.00000E+00 + 0.54636E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 5.82008E+00 0.00000E+00 5.82008E+00 0.00000E+00 + 0.54636E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 1.49396E-06 1.80000E+02 -1.49396E-06 0.00000E+00 + 0.54636E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 3.37838E-05 1.80000E+02 -3.37838E-05 0.00000E+00 + 0.54636E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 2.77129E-04 1.80000E+02 -2.77129E-04 0.00000E+00 + 0.52360E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 5.71150E+00 1.73962E+00 5.70887E+00 1.73386E-01 + 0.52360E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 4.07099E+00 -6.68426E+00 4.04332E+00 -4.73854E-01 + 0.52360E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 3.19284E+01 6.05354E+01 1.57051E+01 2.77988E+01 + 0.52360E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 3.10787E-06 1.03712E+00 3.10736E-06 5.62530E-08 + 0.52360E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 4.34319E-05 1.79731E+02 -4.34314E-05 2.04047E-07 + 0.52360E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 1.68452E-04 2.71090E+00 1.68264E-04 7.96718E-06 + 0.50265E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 5.65635E+00 -1.91346E+01 5.34384E+00 -1.85409E+00 + 0.50265E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 5.18814E+00 -7.74244E+00 5.14084E+00 -6.98947E-01 + 0.50265E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 6.43399E+01 6.57444E+01 2.64313E+01 5.86601E+01 + 0.50265E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 6.72966E-06 1.00191E+01 6.62703E-06 1.17080E-06 + 0.50265E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 6.71881E-05 7.07628E-01 6.71829E-05 8.29781E-07 + 0.50265E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 1.76581E-04 -8.11217E+01 2.72528E-05 -1.74466E-04 + 0.48332E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 8.44450E+00 -7.88314E+01 1.63568E+00 -8.28457E+00 + 0.48332E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 7.06339E+00 -5.34327E+00 7.03270E+00 -6.57760E-01 + 0.48332E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 1.21787E+02 7.85162E+01 2.42466E+01 1.19349E+02 + 0.48332E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 9.06178E-06 1.58579E+01 8.71691E-06 2.47615E-06 + 0.48332E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 3.76670E-05 1.77455E+02 -3.76299E-05 1.67280E-06 + 0.48332E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 8.95805E-05 -2.85428E+00 8.94693E-05 -4.46074E-06 + 0.46542E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 9.33084E+00 -1.23086E+02 -5.09371E+00 -7.81784E+00 + 0.46542E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 7.42256E+00 -8.76646E+00 7.33585E+00 -1.13125E+00 + 0.46542E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 1.57952E+02 7.71986E+01 3.49978E+01 1.54026E+02 + 0.46542E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 4.06211E-06 -1.43195E+02 -3.25245E-06 -2.43359E-06 + 0.46542E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 1.48759E-05 1.67724E+02 -1.45358E-05 3.16286E-06 + 0.46542E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 4.00131E-04 1.77942E+02 -3.99873E-04 1.43663E-05 + 0.44880E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 1.13452E+01 -1.50939E+02 -9.91686E+00 -5.51089E+00 + 0.44880E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 7.03617E+00 -1.32935E+01 6.84763E+00 -1.61789E+00 + 0.44880E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 1.58510E+02 8.67937E+01 8.86567E+00 1.58262E+02 + 0.44880E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 3.04534E-06 7.67219E+01 6.99445E-07 2.96393E-06 + 0.44880E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 1.00869E-05 7.81365E+01 2.07368E-06 9.87148E-06 + 0.44880E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 4.42042E-05 -1.17733E+02 -2.05706E-05 -3.91262E-05 + 0.43332E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 1.31605E+01 -1.68447E+02 -1.28939E+01 -2.63569E+00 + 0.43332E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 7.00254E+00 -3.55241E+01 5.69917E+00 -4.06879E+00 + 0.43332E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 1.61502E+02 9.46548E+01 -1.31064E+01 1.60969E+02 + 0.43332E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 2.67917E-06 9.62504E+01 -2.91692E-07 2.66325E-06 + 0.43332E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 4.30023E-05 -5.37781E+01 2.54107E-05 -3.46915E-05 + 0.43332E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 1.19002E-04 -6.98984E+01 4.08995E-05 -1.11753E-04 + 0.41888E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 1.33054E+01 -1.72232E+02 -1.31833E+01 -1.79829E+00 + 0.41888E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 8.15543E+00 -6.62426E+01 3.28554E+00 -7.46433E+00 + 0.41888E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 1.42363E+02 8.42888E+01 1.41671E+01 1.41656E+02 + 0.41888E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 1.02366E-06 1.79993E+02 -1.02366E-06 1.20154E-10 + 0.41888E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 3.02935E-05 1.46187E+02 -2.51695E-05 1.68580E-05 + 0.41888E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 1.50202E-04 1.92090E+01 1.41840E-04 4.94187E-05 + 0.40537E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 1.25380E+01 -1.74037E+02 -1.24701E+01 -1.30258E+00 + 0.40537E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 1.02611E+01 -8.12895E+01 1.55397E+00 -1.01428E+01 + 0.40537E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 1.03160E+02 6.43549E+01 4.46474E+01 9.29984E+01 + 0.40537E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 2.97074E-06 1.58726E+02 -2.76829E-06 1.07789E-06 + 0.40537E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 2.43988E-05 -7.58180E+01 5.97777E-06 -2.36552E-05 + 0.40537E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 7.15040E-05 -1.46509E+02 -5.96323E-05 -3.94563E-05 + 0.39270E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 4.90225E+00 1.29831E+02 -3.14004E+00 3.76460E+00 + 0.39270E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 1.22265E+01 -9.16600E+01 -3.54188E-01 -1.22213E+01 + 0.39270E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 7.73848E+01 4.89503E+01 5.08196E+01 5.83590E+01 + 0.39270E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 1.63148E-06 3.92209E+01 1.26393E-06 1.03160E-06 + 0.39270E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 1.24227E-05 -1.48915E+02 -1.06388E-05 -6.41401E-06 + 0.39270E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 9.55249E-04 2.04144E+01 8.95254E-04 3.33198E-04 + 0.38080E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 9.87457E+00 2.97583E+01 8.57238E+00 4.90116E+00 + 0.38080E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 1.10468E+01 -1.04697E+02 -2.80266E+00 -1.06854E+01 + 0.38080E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 8.07052E+01 5.19664E+01 4.97244E+01 6.35674E+01 + 0.38080E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 8.40495E-06 -8.57481E+01 6.23152E-07 -8.38182E-06 + 0.38080E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 2.05864E-05 1.00375E+02 -3.70734E-06 2.02498E-05 + 0.38080E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 2.99599E-04 8.68811E+01 1.63009E-05 2.99156E-04 + 0.36960E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 1.58176E+01 1.59663E+01 1.52074E+01 4.35097E+00 + 0.36960E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 7.02563E+00 -1.19673E+02 -3.47804E+00 -6.10432E+00 + 0.36960E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 1.00875E+02 5.59096E+01 5.65404E+01 8.35400E+01 + 0.36960E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 6.42307E-06 8.29984E+01 7.82954E-07 6.37517E-06 + 0.36960E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 6.21482E-06 1.32834E+02 -4.22534E-06 4.55747E-06 + 0.36960E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 2.34478E-04 1.53641E+01 2.26098E-04 6.21255E-05 + 0.35904E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 9.32396E+00 7.60154E+00 9.24202E+00 1.23340E+00 + 0.35904E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 4.36071E+00 -1.54281E+02 -3.92869E+00 -1.89239E+00 + 0.35904E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 1.48939E+02 5.45205E+01 8.64460E+01 1.21285E+02 + 0.35904E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 7.16653E-06 1.56386E+01 6.90124E-06 1.93187E-06 + 0.35904E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 5.04603E-06 -1.20657E+01 4.93455E-06 -1.05479E-06 + 0.35904E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 1.41221E-04 9.39580E+01 -9.74778E-06 1.40884E-04 + 0.34907E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 7.04550E+00 1.20930E+01 6.88915E+00 1.47603E+00 + 0.34907E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 4.55483E+00 1.47978E+02 -3.86178E+00 2.41520E+00 + 0.34907E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 1.50527E+02 4.90789E+01 9.85980E+01 1.13740E+02 + 0.34907E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 9.75791E-06 8.01248E+01 1.67351E-06 9.61334E-06 + 0.34907E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 1.40242E-05 1.54483E+02 -1.26563E-05 6.04132E-06 + 0.34907E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 2.22461E-04 9.94438E+01 -3.65013E-05 2.19446E-04 + 0.33963E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 1.72367E+01 -8.35975E+01 1.92210E+00 -1.71292E+01 + 0.33963E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 3.91734E+00 1.28954E+02 -2.46279E+00 3.04633E+00 + 0.33963E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 1.21978E+02 5.67663E+01 6.68508E+01 1.02028E+02 + 0.33963E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 7.94696E-06 -5.67469E+01 4.35763E-06 -6.64570E-06 + 0.33963E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 1.38855E-05 -5.64221E+01 7.67967E-06 -1.15685E-05 + 0.33963E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 1.75357E-04 1.16788E+02 -7.90327E-05 1.56538E-04 + 0.33069E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 2.92457E+01 -9.58342E+01 -2.97281E+00 -2.90943E+01 + 0.33069E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 2.67398E+00 1.38815E+02 -2.01239E+00 1.76081E+00 + 0.33069E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 8.81710E+01 1.14151E+02 -3.60749E+01 8.04533E+01 + 0.33069E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 5.17865E-06 1.63399E+02 -4.96279E-06 1.47957E-06 + 0.33069E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 1.04401E-05 1.33611E+02 -7.20114E-06 7.55903E-06 + 0.33069E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 2.21777E-04 1.78626E+02 -2.21714E-04 5.31814E-06 + 0.32221E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 3.11136E+01 -8.83524E+01 8.94576E-01 -3.11007E+01 + 0.32221E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 1.92173E+00 1.74342E+02 -1.91236E+00 1.89461E-01 + 0.32221E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 1.17059E+02 1.06225E+02 -3.27070E+01 1.12396E+02 + 0.32221E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 2.17994E-06 -1.27946E+01 2.12581E-06 -4.82763E-07 + 0.32221E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 5.06175E-06 5.93239E+01 2.58242E-06 4.35344E-06 + 0.32221E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 5.60655E-05 1.00836E+02 -1.05398E-05 5.50659E-05 + 0.31416E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 2.75236E+01 -1.07618E+02 -8.33063E+00 -2.62326E+01 + 0.31416E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 1.73171E+00 1.55920E+02 -1.58102E+00 7.06556E-01 + 0.31416E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 5.92926E+01 2.92955E+01 5.17095E+01 2.90127E+01 + 0.31416E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 5.36199E-07 -1.01054E+02 -1.02805E-07 -5.26252E-07 + 0.31416E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 9.11044E-06 -9.17066E+01 -2.71322E-07 -9.10639E-06 + 0.31416E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 2.18072E-05 1.79968E+02 -2.18072E-05 1.22568E-08 + 0.30650E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 1.71732E+01 -1.73701E+02 -1.70695E+01 -1.88425E+00 + 0.30650E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 2.81579E+00 5.79971E+01 1.49227E+00 2.38785E+00 + 0.30650E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 1.65505E+02 -1.84555E+01 1.56993E+02 -5.23934E+01 + 0.30650E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 2.32061E-06 -9.89173E+01 -3.59714E-07 -2.29256E-06 + 0.30650E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 7.78115E-06 -4.09957E+01 5.87289E-06 -5.10445E-06 + 0.30650E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 2.51024E-04 -2.68349E+00 2.50749E-04 -1.17526E-05 + 0.29920E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 2.41265E+01 1.56701E+02 -2.21591E+01 9.54275E+00 + 0.29920E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 3.00991E+00 -7.69470E+00 2.98281E+00 -4.03011E-01 + 0.29920E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 1.95064E+02 -1.87713E+01 1.84688E+02 -6.27698E+01 + 0.29920E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 1.09666E-06 -8.33061E+01 1.27831E-07 -1.08918E-06 + 0.29920E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 2.23630E-06 5.19508E+01 1.37831E-06 1.76104E-06 + 0.29920E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 3.85432E-05 -2.91319E+01 3.36675E-05 -1.87637E-05 + 0.29224E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 2.15265E+01 1.56290E+02 -1.97094E+01 8.65612E+00 + 0.29224E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 2.25988E+00 -1.48703E+02 -1.93103E+00 -1.17395E+00 + 0.29224E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 1.47728E+02 -9.17068E+00 1.45839E+02 -2.35442E+01 + 0.29224E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 2.56340E-06 -1.37704E+02 -1.89609E-06 -1.72507E-06 + 0.29224E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 6.15094E-06 -2.45089E+01 5.59672E-06 -2.55162E-06 + 0.29224E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 1.82474E-04 4.76863E+01 1.22839E-04 1.34934E-04 + 0.28560E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 8.06762E+00 1.58494E+02 -7.50597E+00 2.95753E+00 + 0.28560E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 4.33822E+00 1.73448E+02 -4.30988E+00 4.95021E-01 + 0.28560E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 3.45333E+01 -3.04104E+01 2.97823E+01 -1.74804E+01 + 0.28560E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 5.34450E-06 9.70056E+00 5.26808E-06 9.00543E-07 + 0.28560E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 1.04099E-05 6.58347E+00 1.03413E-05 1.19350E-06 + 0.28560E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 1.13229E-04 -5.19380E+01 6.98076E-05 -8.91504E-05 + 0.27925E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 7.76293E+00 -8.54001E+00 7.67686E+00 -1.15280E+00 + 0.27925E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 3.36832E+00 1.67323E+02 -3.28621E+00 7.39220E-01 + 0.27925E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 5.48304E+01 -1.58266E+02 -5.09326E+01 -2.03037E+01 + 0.27925E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 1.79615E-06 -4.18172E+01 1.33862E-06 -1.19759E-06 + 0.27925E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 3.39551E-06 7.22245E+01 1.03661E-06 3.23341E-06 + 0.27925E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 5.45619E-04 -1.08212E+02 -1.70528E-04 -5.18286E-04 + 0.27318E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 1.03154E+01 -4.84894E+00 1.02785E+01 -8.71949E-01 + 0.27318E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 1.10185E+00 -1.79853E+02 -1.10185E+00 -2.82829E-03 + 0.27318E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 5.55570E+01 -1.31403E+02 -3.67428E+01 -4.16719E+01 + 0.27318E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 2.66853E-06 1.81940E+01 2.53511E-06 8.33211E-07 + 0.27318E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 1.80145E-06 1.33758E+02 -1.24590E-06 1.30114E-06 + 0.27318E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 5.91855E-05 3.79505E+01 4.66703E-05 3.63980E-05 + 0.26737E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 5.59303E+00 -1.94830E+01 5.27277E+00 -1.86542E+00 + 0.26737E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 1.22882E+00 -2.58274E+01 1.10608E+00 -5.35350E-01 + 0.26737E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 2.88458E+01 -5.46657E+01 1.66829E+01 -2.35322E+01 + 0.26737E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 7.28835E-07 7.56760E+01 1.80318E-07 7.06177E-07 + 0.26737E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 4.17566E-07 1.30393E+02 -2.70592E-07 3.18028E-07 + 0.26737E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 1.02450E-04 1.51548E+02 -9.00756E-05 4.88099E-05 + 0.26180E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 9.11121E+00 -7.91578E+01 1.71386E+00 -8.94856E+00 + 0.26180E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 1.66363E+00 -2.69731E+01 1.48266E+00 -7.54575E-01 + 0.26180E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 4.60503E+01 5.50638E+01 2.63713E+01 3.77516E+01 + 0.26180E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 1.22677E-06 -4.57649E+01 8.55800E-07 -8.78961E-07 + 0.26180E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 2.91355E-06 -1.52346E+01 2.81116E-06 -7.65601E-07 + 0.26180E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 9.29840E-05 1.19715E+02 -4.60912E-05 8.07566E-05 + 0.25646E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 1.40741E+01 -7.36498E+01 3.96195E+00 -1.35049E+01 + 0.25646E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 5.36721E-01 4.05500E+01 4.07822E-01 3.48929E-01 + 0.25646E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 6.85838E+01 1.05367E+02 -1.81743E+01 6.61319E+01 + 0.25646E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 2.26125E-06 8.99458E+00 2.23344E-06 3.53526E-07 + 0.25646E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 1.63501E-05 -2.31840E+00 1.63368E-05 -6.61408E-07 + 0.25646E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 1.32387E-04 7.77910E+00 1.31169E-04 1.79192E-05 + 0.25133E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 9.62566E+00 -6.69010E+01 3.77634E+00 -8.85395E+00 + 0.25133E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 7.40150E-01 1.31312E+02 -4.88621E-01 5.55942E-01 + 0.25133E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 5.91191E+01 1.36602E+02 -4.29561E+01 4.06182E+01 + 0.25133E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 6.71915E-07 -1.27640E+02 -4.10340E-07 -5.32062E-07 + 0.25133E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 3.53800E-06 5.25320E+01 2.15223E-06 2.80809E-06 + 0.25133E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 6.47967E-05 7.93180E+01 1.20106E-05 6.36738E-05 + 0.24640E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 1.74923E+00 -1.39085E+02 -1.32186E+00 -1.14564E+00 + 0.24640E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 8.45645E-01 -1.53617E+02 -7.57563E-01 -3.75785E-01 + 0.24640E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 2.19684E+01 -1.69599E+02 -2.16074E+01 -3.96607E+00 + 0.24640E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 2.08014E-06 -1.73471E+02 -2.06664E-06 -2.36539E-07 + 0.24640E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 3.38682E-07 -1.41685E+01 3.28380E-07 -8.29005E-08 + 0.24640E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 1.44413E-04 -1.13804E+02 -5.82857E-05 -1.32129E-04 + 0.24166E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 4.55595E+00 -1.73651E+02 -4.52801E+00 -5.03793E-01 + 0.24166E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 7.66563E-01 -1.48906E+02 -6.56424E-01 -3.95888E-01 + 0.24166E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 2.18018E+01 -4.33491E+01 1.58540E+01 -1.49657E+01 + 0.24166E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 1.75121E-06 -1.07796E+02 -5.35227E-07 -1.66741E-06 + 0.24166E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 2.17689E-06 -6.45374E+01 9.35895E-07 -1.96544E-06 + 0.24166E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 3.31997E-05 1.36752E+02 -2.41826E-05 2.27470E-05 + 0.23710E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 7.64026E+00 -1.43906E+02 -6.17371E+00 -4.50099E+00 + 0.23710E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 4.99947E-01 -1.68126E+02 -4.89249E-01 -1.02872E-01 + 0.23710E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 3.51742E+01 4.07763E+00 3.50851E+01 2.50116E+00 + 0.23710E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 4.34923E-07 9.28315E+01 -2.14845E-08 4.34392E-07 + 0.23710E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 1.98862E-06 1.77528E+02 -1.98677E-06 8.57866E-08 + 0.23710E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 4.78479E-05 -1.63637E+02 -4.59099E-05 -1.34795E-05 + 0.23271E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 1.98820E+00 -1.76035E+02 -1.98344E+00 -1.37476E-01 + 0.23271E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 6.39079E-01 1.44489E+02 -5.20214E-01 3.71212E-01 + 0.23271E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 2.12325E+01 1.02940E+01 2.08907E+01 3.79422E+00 + 0.23271E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 1.46673E-06 5.79947E+01 7.77364E-07 1.24379E-06 + 0.23271E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 3.76672E-07 1.13126E+02 -1.47937E-07 3.46405E-07 + 0.23271E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 2.46978E-04 -1.70113E+02 -2.43311E-04 -4.24057E-05 + 0.22848E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 2.11496E+00 -1.69566E+02 -2.07999E+00 -3.83019E-01 + 0.22848E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 7.33241E-01 1.45984E+02 -6.07769E-01 4.10195E-01 + 0.22848E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 1.76411E+01 -1.25686E+01 1.72184E+01 -3.83885E+00 + 0.22848E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 2.05035E-06 1.74383E+02 -2.04050E-06 2.00683E-07 + 0.22848E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 2.82985E-06 1.01492E+01 2.78557E-06 4.98656E-07 + 0.22848E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 9.37087E-05 -5.64944E+01 5.17290E-05 -7.81373E-05 + 0.22440E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 5.66124E+00 -1.69160E+02 -5.56021E+00 -1.06474E+00 + 0.22440E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 6.47423E-01 1.51273E+02 -5.67736E-01 3.11179E-01 + 0.22440E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 2.23996E+01 -3.25902E+01 1.88726E+01 -1.20650E+01 + 0.22440E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 3.18712E-07 1.00843E+02 -5.99563E-08 3.13022E-07 + 0.22440E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 1.05643E-06 1.21432E+02 -5.50909E-07 9.01407E-07 + 0.22440E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 6.13908E-05 -1.13349E+02 -2.43313E-05 -5.63632E-05 + 0.22046E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 4.51636E+00 -5.67433E+01 2.47673E+00 -3.77668E+00 + 0.22046E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 2.23387E-01 -1.39872E+01 2.16764E-01 -5.39937E-02 + 0.22046E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 1.11117E+01 -1.24014E+02 -6.21577E+00 -9.21058E+00 + 0.22046E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 8.37757E-07 1.46500E+01 8.10521E-07 2.11880E-07 + 0.22046E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 1.21977E-06 -6.58888E+00 1.21171E-06 -1.39962E-07 + 0.22046E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 5.40782E-05 1.07654E+02 -1.64004E-05 5.15314E-05 + 0.21666E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 4.97233E+00 2.07158E+01 4.65085E+00 1.75888E+00 + 0.21666E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 3.84311E-01 -2.12144E+01 3.58267E-01 -1.39066E-01 + 0.21666E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 2.28454E+01 -1.30294E+02 -1.47743E+01 -1.74251E+01 + 0.21666E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 9.58696E-07 -7.59350E+01 2.32985E-07 -9.29955E-07 + 0.21666E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 1.58897E-07 -1.67748E+02 -1.55277E-07 -3.37210E-08 + 0.21666E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 1.10231E-04 1.90794E+01 1.04176E-04 3.60322E-05 + 0.21299E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 6.67158E+00 1.66303E+01 6.39251E+00 1.90938E+00 + 0.21299E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 2.72303E-01 4.29880E+01 1.99189E-01 1.85668E-01 + 0.21299E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 1.82403E+01 -1.62126E+02 -1.73599E+01 -5.59853E+00 + 0.21299E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 2.38795E-07 -1.32919E+02 -1.62611E-07 -1.74873E-07 + 0.21299E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 2.22212E-07 9.20238E+01 -7.84722E-09 2.22073E-07 + 0.21299E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 2.24813E-05 1.09368E+02 -7.45565E-06 2.12090E-05 + 0.20944E+01 0.54636E+01 0.00000E+00 0.00000E+00 1 4.39920E+00 -3.86944E+01 3.43354E+00 -2.75023E+00 + 0.20944E+01 0.54636E+01 0.00000E+00 0.00000E+00 3 2.37916E-01 1.67772E+02 -2.32518E-01 5.03905E-02 + 0.20944E+01 0.54636E+01 0.00000E+00 0.00000E+00 5 1.84230E+01 1.54584E+02 -1.66400E+01 7.90692E+00 + 0.20944E+01 0.54636E+01 0.00000E+00 0.00000E+00 2 7.41753E-07 -1.04603E+02 -1.87008E-07 -7.17792E-07 + 0.20944E+01 0.54636E+01 0.00000E+00 0.00000E+00 4 2.13328E-06 -4.88010E+01 1.40514E-06 -1.60513E-06 + 0.20944E+01 0.54636E+01 0.00000E+00 0.00000E+00 6 5.99037E-05 9.26611E+01 -2.78127E-06 5.98391E-05 + 0.52360E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 7.53421E+00 0.00000E+00 7.53421E+00 0.00000E+00 + 0.52360E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 3.75432E+00 0.00000E+00 3.75432E+00 0.00000E+00 + 0.52360E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 2.08797E+01 0.00000E+00 2.08797E+01 0.00000E+00 + 0.52360E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 1.41169E-05 1.80000E+02 -1.41169E-05 0.00000E+00 + 0.52360E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 1.19227E-04 1.80000E+02 -1.19227E-04 0.00000E+00 + 0.52360E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 1.10875E-04 1.80000E+02 -1.10875E-04 0.00000E+00 + 0.50265E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 8.96585E+00 -3.80702E+00 8.94606E+00 -5.95298E-01 + 0.50265E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 3.22761E+00 -2.57220E+00 3.22436E+00 -1.44850E-01 + 0.50265E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 3.21804E+01 3.74632E+01 2.55430E+01 1.95738E+01 + 0.50265E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 2.36466E-06 1.55988E+02 -2.16003E-06 9.62233E-07 + 0.50265E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 3.76280E-05 -1.79549E+02 -3.76268E-05 -2.96319E-07 + 0.50265E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 1.95019E-04 8.08475E+01 3.10203E-05 1.92536E-04 + 0.48332E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 8.43420E+00 -4.32118E+01 6.14708E+00 -5.77487E+00 + 0.48332E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 4.93606E+00 -2.96563E+00 4.92945E+00 -2.55377E-01 + 0.48332E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 6.42040E+01 6.73669E+01 2.47076E+01 5.92596E+01 + 0.48332E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 7.33808E-06 -2.60516E+01 6.59252E-06 -3.22273E-06 + 0.48332E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 2.55113E-05 -1.09131E+00 2.55066E-05 -4.85884E-07 + 0.48332E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 1.64361E-04 -8.18021E+01 2.34367E-05 -1.62682E-04 + 0.46542E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 5.81462E+00 -8.39562E+01 6.12215E-01 -5.78230E+00 + 0.46542E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 6.11431E+00 -3.95967E+00 6.09972E+00 -4.22220E-01 + 0.46542E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 1.08506E+02 7.33575E+01 3.10761E+01 1.03961E+02 + 0.46542E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 1.09093E-06 3.45825E+01 8.98172E-07 6.19202E-07 + 0.46542E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 4.81676E-05 -1.50310E+02 -4.18441E-05 -2.38576E-05 + 0.46542E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 7.65365E-05 -1.16774E+02 -3.44772E-05 -6.83312E-05 + 0.44880E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 6.38610E+00 -1.26442E+02 -3.79342E+00 -5.13734E+00 + 0.44880E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 6.58539E+00 9.19907E-01 6.58454E+00 1.05727E-01 + 0.44880E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 1.34139E+02 8.78198E+01 5.10303E+00 1.34042E+02 + 0.44880E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 1.89950E-06 -5.51876E+00 1.89069E-06 -1.82678E-07 + 0.44880E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 1.12405E-05 -1.45374E+02 -9.24958E-06 -6.38700E-06 + 0.44880E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 4.32992E-04 -1.42951E+02 -3.45580E-04 -2.60876E-04 + 0.43332E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 9.27134E+00 -1.51824E+02 -8.17273E+00 -4.37771E+00 + 0.43332E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 6.77850E+00 -7.52385E+00 6.72014E+00 -8.87568E-01 + 0.43332E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 1.64803E+02 1.00326E+02 -2.95409E+01 1.62134E+02 + 0.43332E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 2.41946E-06 -1.66309E+02 -2.35071E-06 -5.72640E-07 + 0.43332E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 1.26414E-05 -9.73644E+01 -1.62037E-06 -1.25371E-05 + 0.43332E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 4.89615E-04 -1.76744E+02 -4.88825E-04 -2.78104E-05 + 0.41888E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 1.28091E+01 -1.58246E+02 -1.18969E+01 -4.74726E+00 + 0.41888E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 6.68927E+00 -3.80377E+01 5.26850E+00 -4.12179E+00 + 0.41888E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 1.61073E+02 9.58360E+01 -1.63781E+01 1.60238E+02 + 0.41888E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 1.18540E-05 -9.59672E+01 -1.23233E-06 -1.17897E-05 + 0.41888E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 3.89176E-05 -8.63102E+01 2.50453E-06 -3.88370E-05 + 0.41888E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 8.06997E-05 8.65834E+00 7.97800E-05 1.21487E-05 + 0.40537E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 1.54594E+01 -1.63657E+02 -1.48348E+01 -4.35005E+00 + 0.40537E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 8.09605E+00 -6.82691E+01 2.99754E+00 -7.52069E+00 + 0.40537E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 1.05668E+02 8.63043E+01 6.81102E+00 1.05448E+02 + 0.40537E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 2.44960E-06 2.61966E+01 2.19799E-06 1.08138E-06 + 0.40537E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 6.06481E-06 -2.74751E+01 5.38077E-06 -2.79808E-06 + 0.40537E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 1.91884E-04 -7.18936E+00 1.90376E-04 -2.40141E-05 + 0.39270E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 8.62853E+00 -1.77776E+02 -8.62202E+00 -3.34893E-01 + 0.39270E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 1.04814E+01 -8.15917E+01 1.53266E+00 -1.03688E+01 + 0.39270E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 7.06246E+01 7.42599E+01 1.91587E+01 6.79763E+01 + 0.39270E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 6.53027E-06 -1.58468E+02 -6.07456E-06 -2.39669E-06 + 0.39270E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 2.04180E-05 1.29273E+02 -1.29249E-05 1.58064E-05 + 0.39270E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 2.89359E-04 -1.09560E+01 2.84085E-04 -5.49941E-05 + 0.38080E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 3.02672E+00 2.47272E+01 2.74920E+00 1.26607E+00 + 0.38080E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 1.14897E+01 -9.05132E+01 -1.02903E-01 -1.14892E+01 + 0.38080E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 7.00032E+01 6.76632E+01 2.66047E+01 6.47505E+01 + 0.38080E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 2.89638E-06 -1.10151E+01 2.84302E-06 -5.53408E-07 + 0.38080E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 2.00720E-05 -8.81556E+00 1.98349E-05 -3.07612E-06 + 0.38080E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 6.93391E-04 -1.63092E+02 -6.63417E-04 -2.01666E-04 + 0.36960E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 1.25830E+01 9.74300E+00 1.24015E+01 2.12940E+00 + 0.36960E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 9.46871E+00 -9.90628E+01 -1.49147E+00 -9.35051E+00 + 0.36960E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 8.59360E+01 6.47641E+01 3.66384E+01 7.77343E+01 + 0.36960E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 6.36779E-06 -1.54405E+02 -5.74294E-06 -2.75088E-06 + 0.36960E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 1.14664E-05 1.34198E+02 -7.99375E-06 8.22063E-06 + 0.36960E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 1.04245E-04 -5.01827E+00 1.03846E-04 -9.11867E-06 + 0.35904E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 1.15053E+01 7.79393E+00 1.13990E+01 1.56023E+00 + 0.35904E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 6.17642E+00 -1.18485E+02 -2.94572E+00 -5.42872E+00 + 0.35904E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 1.25851E+02 6.86490E+01 4.58200E+01 1.17214E+02 + 0.35904E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 5.73967E-06 -4.95838E+01 3.72123E-06 -4.36992E-06 + 0.35904E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 4.06619E-05 -8.84383E+01 1.10818E-06 -4.06468E-05 + 0.35904E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 7.27326E-05 4.44879E+01 5.18873E-05 5.09680E-05 + 0.34907E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 1.09889E+01 3.51412E+01 8.98602E+00 6.32513E+00 + 0.34907E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 4.18827E+00 -1.78978E+02 -4.18760E+00 -7.46708E-02 + 0.34907E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 1.45850E+02 6.12421E+01 7.01697E+01 1.27861E+02 + 0.34907E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 1.23131E-06 1.09254E+01 1.20899E-06 2.33372E-07 + 0.34907E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 2.28484E-06 -7.19399E+01 7.08331E-07 -2.17227E-06 + 0.34907E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 1.36990E-04 1.13027E+02 -5.35859E-05 1.26075E-04 + 0.33963E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 9.07286E+00 -6.15870E+01 4.31709E+00 -7.97995E+00 + 0.33963E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 4.59208E+00 1.37068E+02 -3.36217E+00 3.12778E+00 + 0.33963E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 1.54476E+02 6.17409E+01 7.31379E+01 1.36065E+02 + 0.33963E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 2.86166E-06 1.05196E+02 -7.50084E-07 2.76161E-06 + 0.33963E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 5.92382E-06 -1.62334E+02 -5.64447E-06 -1.79766E-06 + 0.33963E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 1.58812E-04 -8.57058E+01 1.18914E-05 -1.58366E-04 + 0.33069E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 2.12912E+01 -9.33613E+01 -1.24833E+00 -2.12545E+01 + 0.33069E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 4.01594E+00 1.27862E+02 -2.46484E+00 3.17054E+00 + 0.33069E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 9.31132E+01 8.39103E+01 9.87795E+00 9.25877E+01 + 0.33069E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 5.25206E-06 1.49005E+02 -4.50211E-06 2.70465E-06 + 0.33069E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 5.39996E-06 -4.03940E+01 4.11264E-06 -3.49939E-06 + 0.33069E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 2.13580E-04 7.13992E+01 6.81260E-05 2.02423E-04 + 0.32221E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 3.00291E+01 -8.43513E+01 2.95573E+00 -2.98832E+01 + 0.32221E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 1.94817E+00 1.55468E+02 -1.77230E+00 8.08891E-01 + 0.32221E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 1.38474E+02 1.00777E+02 -2.58938E+01 1.36032E+02 + 0.32221E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 3.86594E-06 1.75161E+02 -3.85216E-06 3.26093E-07 + 0.32221E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 1.54805E-05 1.72005E+02 -1.53300E-05 2.15302E-06 + 0.32221E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 1.97626E-04 1.57348E+02 -1.82381E-04 7.61136E-05 + 0.31416E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 3.38244E+01 -9.07615E+01 -4.49554E-01 -3.38214E+01 + 0.31416E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 1.98349E+00 -1.52645E+02 -1.76169E+00 -9.11418E-01 + 0.31416E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 3.76552E+01 7.12798E+01 1.20853E+01 3.56631E+01 + 0.31416E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 1.22357E-06 -1.22760E+02 -6.62094E-07 -1.02895E-06 + 0.31416E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 1.08981E-05 1.72884E+01 1.04057E-05 3.23872E-06 + 0.31416E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 1.08846E-04 -1.45744E+01 1.05344E-04 -2.73896E-05 + 0.30650E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 1.69522E+01 -1.28560E+02 -1.05669E+01 -1.32558E+01 + 0.30650E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 1.18904E+00 1.53963E+02 -1.06837E+00 5.21925E-01 + 0.30650E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 9.81093E+01 -4.01391E+00 9.78687E+01 -6.86751E+00 + 0.30650E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 2.26781E-06 7.81826E+01 4.64431E-07 2.21974E-06 + 0.30650E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 8.04637E-06 -1.18270E+02 -3.81094E-06 -7.08667E-06 + 0.30650E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 1.76461E-04 -6.43890E+00 1.75348E-04 -1.97890E-05 + 0.29920E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 1.92104E+01 1.68106E+02 -1.87979E+01 3.95943E+00 + 0.29920E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 1.85149E+00 4.98551E+01 1.19370E+00 1.41531E+00 + 0.29920E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 1.88989E+02 -1.28711E+01 1.84241E+02 -4.20989E+01 + 0.29920E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 4.22603E-07 1.68010E+02 -4.13383E-07 8.77930E-08 + 0.29920E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 8.14059E-07 -1.30654E+02 -5.30348E-07 -6.17595E-07 + 0.29920E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 5.29403E-04 -1.60558E+00 5.29195E-04 -1.48333E-05 + 0.29224E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 2.30707E+01 1.57904E+02 -2.13762E+01 8.67839E+00 + 0.29224E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 1.76287E+00 -3.11942E+01 1.50799E+00 -9.13059E-01 + 0.29224E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 1.93071E+02 -5.45565E+00 1.92196E+02 -1.83563E+01 + 0.29224E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 8.08553E-07 -3.22782E+00 8.07270E-07 -4.55266E-08 + 0.29224E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 6.12746E-06 8.80493E+01 2.08576E-07 6.12391E-06 + 0.29224E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 7.81907E-05 1.57129E+02 -7.20436E-05 3.03892E-05 + 0.28560E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 1.48419E+01 1.66346E+02 -1.44224E+01 3.50360E+00 + 0.28560E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 4.20039E+00 -1.52773E+02 -3.73500E+00 -1.92175E+00 + 0.28560E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 1.00351E+02 -3.02837E+00 1.00211E+02 -5.30157E+00 + 0.28560E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 2.07503E-06 -1.40599E+01 2.01287E-06 -5.04100E-07 + 0.28560E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 4.01934E-06 -1.62635E+02 -3.83614E-06 -1.19964E-06 + 0.28560E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 7.87633E-05 7.24520E+01 2.37475E-05 7.50981E-05 + 0.27925E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 2.95635E+00 -3.01897E+01 2.55536E+00 -1.48664E+00 + 0.27925E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 4.13593E+00 -1.78931E+02 -4.13521E+00 -7.71765E-02 + 0.27925E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 2.17284E+01 1.63141E+02 -2.07946E+01 6.30152E+00 + 0.27925E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 9.62163E-07 -6.37696E+01 4.25259E-07 -8.63083E-07 + 0.27925E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 7.59972E-06 1.03477E+01 7.47612E-06 1.36507E-06 + 0.27925E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 1.65855E-04 1.06700E+02 -4.76605E-05 1.58859E-04 + 0.27318E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 1.14201E+01 -9.31357E+00 1.12695E+01 -1.84820E+00 + 0.27318E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 2.23052E+00 -1.73798E+02 -2.21747E+00 -2.40977E-01 + 0.27318E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 5.57894E+01 -1.45163E+02 -4.57908E+01 -3.18695E+01 + 0.27318E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 1.15841E-06 5.45692E+01 6.71552E-07 9.43889E-07 + 0.27318E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 4.48418E-06 1.26113E+02 -2.64288E-06 3.62257E-06 + 0.27318E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 9.65439E-05 6.17768E+01 4.56563E-05 8.50660E-05 + 0.26737E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 9.36756E+00 4.99571E-01 9.36720E+00 8.16762E-02 + 0.26737E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 4.85602E-01 -7.27745E+01 1.43803E-01 -4.63821E-01 + 0.26737E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 3.98543E+01 -1.06543E+02 -1.13482E+01 -3.82045E+01 + 0.26737E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 4.17504E-07 5.73853E+01 2.25029E-07 3.51670E-07 + 0.26737E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 5.40847E-07 1.76427E+02 -5.39796E-07 3.37071E-08 + 0.26737E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 7.76624E-05 -7.57777E+00 7.69842E-05 -1.02415E-05 + 0.26180E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 6.44795E+00 -5.65037E+01 3.55852E+00 -5.37708E+00 + 0.26180E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 2.03461E+00 -8.90165E+00 2.01010E+00 -3.14833E-01 + 0.26180E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 2.90133E+01 2.82133E+01 2.55663E+01 1.37162E+01 + 0.26180E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 9.66864E-07 -1.03700E+02 -2.28985E-07 -9.39357E-07 + 0.26180E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 3.11292E-06 -1.27407E+02 -1.89101E-06 -2.47272E-06 + 0.26180E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 1.51658E-04 -2.57437E+01 1.36605E-04 -6.58722E-05 + 0.25646E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 1.29764E+01 -8.09912E+01 2.03192E+00 -1.28163E+01 + 0.25646E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 6.74103E-01 -4.91289E+00 6.71627E-01 -5.77309E-02 + 0.25646E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 6.12599E+01 8.15671E+01 8.98382E+00 6.05975E+01 + 0.25646E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 7.38051E-07 1.51740E+02 -6.50081E-07 3.49450E-07 + 0.25646E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 6.49757E-06 -4.24732E+00 6.47973E-06 -4.81222E-07 + 0.25646E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 1.26421E-04 2.52659E+01 1.14327E-04 5.39588E-05 + 0.25133E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 1.20759E+01 -6.91038E+01 4.30721E+00 -1.12817E+01 + 0.25133E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 8.61048E-01 1.05183E+02 -2.25508E-01 8.30993E-01 + 0.25133E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 6.55511E+01 1.29462E+02 -4.16621E+01 5.06084E+01 + 0.25133E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 8.04953E-07 1.56647E+02 -7.39009E-07 3.19085E-07 + 0.25133E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 9.23869E-06 3.96671E+01 7.11163E-06 5.89729E-06 + 0.25133E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 2.05938E-05 6.13738E+01 9.86636E-06 1.80765E-05 + 0.24640E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 4.62848E+00 -9.74843E+01 -6.02881E-01 -4.58905E+00 + 0.24640E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 6.39531E-01 -1.76386E+02 -6.38260E-01 -4.03100E-02 + 0.24640E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 2.98257E+01 1.67307E+02 -2.90968E+01 6.55375E+00 + 0.24640E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 8.73953E-08 -2.84346E+01 7.68520E-08 -4.16137E-08 + 0.24640E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 8.14544E-07 1.47715E+02 -6.88614E-07 4.35079E-07 + 0.24640E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 2.20147E-04 -9.67046E+01 -2.57023E-05 -2.18642E-04 + 0.24166E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 5.08018E+00 1.66643E+02 -4.94277E+00 1.17357E+00 + 0.24166E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 1.16603E+00 -1.46755E+02 -9.75195E-01 -6.39235E-01 + 0.24166E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 2.26205E+01 -5.98790E+01 1.13516E+01 -1.95660E+01 + 0.24166E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 9.17526E-07 -1.20305E+02 -4.62982E-07 -7.92149E-07 + 0.24166E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 1.38381E-06 -8.37781E+01 1.49977E-07 -1.37566E-06 + 0.24166E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 2.60106E-04 -1.76244E+02 -2.59548E-04 -1.70385E-05 + 0.23710E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 9.52136E+00 -1.49105E+02 -8.17035E+00 -4.88893E+00 + 0.23710E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 4.77275E-01 -1.31583E+02 -3.16772E-01 -3.56996E-01 + 0.23710E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 4.25455E+01 -6.76851E+00 4.22489E+01 -5.01433E+00 + 0.23710E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 7.33966E-07 9.04735E+00 7.24835E-07 1.15417E-07 + 0.23710E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 1.02470E-06 4.96254E+00 1.02086E-06 8.86413E-08 + 0.23710E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 2.69905E-05 -7.83844E+01 5.43440E-06 -2.64378E-05 + 0.23271E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 4.80717E+00 -1.67014E+02 -4.68422E+00 -1.08023E+00 + 0.23271E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 5.31932E-01 1.55869E+02 -4.85450E-01 2.17463E-01 + 0.23271E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 2.87521E+01 6.54093E+00 2.85650E+01 3.27524E+00 + 0.23271E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 1.11696E-06 1.07822E+02 -3.41849E-07 1.06336E-06 + 0.23271E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 1.86716E-06 2.50167E+01 1.69199E-06 7.89590E-07 + 0.23271E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 3.04155E-04 1.69411E+02 -2.98975E-04 5.58922E-05 + 0.22848E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 1.16398E+00 -1.01660E+02 -2.35249E-01 -1.13996E+00 + 0.22848E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 4.89038E-01 -1.73994E+02 -4.86354E-01 -5.11669E-02 + 0.22848E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 1.66391E+01 3.50974E+01 1.36137E+01 9.56697E+00 + 0.22848E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 7.12174E-07 3.07129E+01 6.12283E-07 3.63733E-07 + 0.22848E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 8.42663E-07 -3.46222E+00 8.41125E-07 -5.08888E-08 + 0.22848E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 3.31010E-04 1.75591E+02 -3.30031E-04 2.54442E-05 + 0.22440E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 3.95516E+00 -1.41486E+02 -3.09472E+00 -2.46292E+00 + 0.22440E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 7.47717E-01 1.72096E+02 -7.40614E-01 1.02821E-01 + 0.22440E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 1.61967E+01 -1.17232E+01 1.58588E+01 -3.29089E+00 + 0.22440E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 6.46410E-07 -4.37834E+01 4.66683E-07 -4.47272E-07 + 0.22440E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 9.35776E-07 -1.05082E+02 -2.43498E-07 -9.03540E-07 + 0.22440E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 1.10858E-04 -1.12644E+02 -4.26813E-05 -1.02312E-04 + 0.22046E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 3.19762E+00 -4.89847E+01 2.09847E+00 -2.41272E+00 + 0.22046E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 1.88840E-01 7.47427E+01 4.96940E-02 1.82184E-01 + 0.22046E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 1.28132E+01 -1.09937E+02 -4.36919E+00 -1.20453E+01 + 0.22046E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 5.27430E-07 -7.33365E+01 1.51241E-07 -5.05280E-07 + 0.22046E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 2.11820E-06 -3.26218E+01 1.78405E-06 -1.14190E-06 + 0.22046E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 3.22750E-04 8.42832E+01 3.21497E-05 3.21145E-04 + 0.21666E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 4.57979E+00 -2.30650E+01 4.21369E+00 -1.79425E+00 + 0.21666E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 4.04980E-01 -2.98210E+01 3.51354E-01 -2.01393E-01 + 0.21666E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 1.49522E+01 -1.28846E+02 -9.37844E+00 -1.16453E+01 + 0.21666E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 1.97488E-06 -8.74714E+01 8.71268E-08 -1.97296E-06 + 0.21666E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 1.57814E-06 8.65666E+01 9.45124E-08 1.57530E-06 + 0.21666E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 1.49560E-04 4.71977E+00 1.49053E-04 1.23062E-05 + 0.21299E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 7.76191E+00 2.19548E+01 7.19901E+00 2.90198E+00 + 0.21299E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 3.27989E-01 3.70247E+01 2.61858E-01 1.97501E-01 + 0.21299E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 2.12801E+01 -1.47470E+02 -1.79415E+01 -1.14431E+01 + 0.21299E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 2.29190E-07 -1.14691E+01 2.24613E-07 -4.55718E-08 + 0.21299E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 3.43855E-07 -1.56082E+02 -3.14327E-07 -1.39408E-07 + 0.21299E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 1.47230E-04 -1.79795E+02 -1.47229E-04 -5.27011E-07 + 0.20944E+01 0.52360E+01 0.00000E+00 0.00000E+00 1 3.38109E+00 -6.56580E+00 3.35891E+00 -3.86608E-01 + 0.20944E+01 0.52360E+01 0.00000E+00 0.00000E+00 3 6.45679E-02 1.58685E+02 -6.01512E-02 2.34702E-02 + 0.20944E+01 0.52360E+01 0.00000E+00 0.00000E+00 5 1.60540E+01 1.75852E+02 -1.60120E+01 1.16112E+00 + 0.20944E+01 0.52360E+01 0.00000E+00 0.00000E+00 2 4.78585E-07 1.42016E+02 -3.77215E-07 2.94538E-07 + 0.20944E+01 0.52360E+01 0.00000E+00 0.00000E+00 4 5.02631E-07 2.20693E+01 4.65803E-07 1.88852E-07 + 0.20944E+01 0.52360E+01 0.00000E+00 0.00000E+00 6 9.52886E-05 7.84447E+01 1.90875E-05 9.33573E-05 + 0.50265E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 1.11895E+01 0.00000E+00 1.11895E+01 0.00000E+00 + 0.50265E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 2.82091E+00 0.00000E+00 2.82091E+00 0.00000E+00 + 0.50265E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 2.64750E+01 0.00000E+00 2.64750E+01 0.00000E+00 + 0.50265E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 9.73499E-06 0.00000E+00 9.73499E-06 0.00000E+00 + 0.50265E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 7.42950E-05 0.00000E+00 7.42950E-05 0.00000E+00 + 0.50265E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 1.98255E-04 1.80000E+02 -1.98255E-04 0.00000E+00 + 0.48332E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 9.62832E+00 -1.62854E+01 9.24201E+00 -2.69999E+00 + 0.48332E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 2.71464E+00 -1.09759E+01 2.66499E+00 -5.16855E-01 + 0.48332E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 3.11864E+01 3.46594E+01 2.56523E+01 1.77356E+01 + 0.48332E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 6.91307E-06 1.12572E+02 -2.65360E-06 6.38350E-06 + 0.48332E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 1.89790E-05 -1.08452E+02 -6.00692E-06 -1.80033E-05 + 0.48332E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 2.21642E-04 1.12301E+02 -8.41064E-05 2.05064E-04 + 0.46542E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 6.36367E+00 -3.47157E+01 5.23086E+00 -3.62414E+00 + 0.46542E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 3.72776E+00 -1.25698E+01 3.63842E+00 -8.11267E-01 + 0.46542E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 5.95614E+01 5.60072E+01 3.33001E+01 4.93828E+01 + 0.46542E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 7.99151E-06 -8.77740E+01 3.10400E-07 -7.98548E-06 + 0.46542E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 2.83735E-05 -1.63743E+02 -2.72390E-05 -7.94312E-06 + 0.46542E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 9.16611E-05 -3.39640E+01 7.60227E-05 -5.12084E-05 + 0.44880E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 5.45415E+00 -7.63781E+01 1.28453E+00 -5.30073E+00 + 0.44880E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 4.77546E+00 -1.53022E+00 4.77375E+00 -1.27525E-01 + 0.44880E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 9.08734E+01 7.24901E+01 2.73411E+01 8.66627E+01 + 0.44880E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 4.19672E-06 -9.75109E+01 -5.48574E-07 -4.16071E-06 + 0.44880E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 2.22750E-05 -1.77748E+02 -2.22577E-05 -8.75475E-07 + 0.44880E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 3.88350E-04 -4.79951E+01 2.59881E-04 -2.88578E-04 + 0.43332E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 7.19281E+00 -1.17808E+02 -3.35555E+00 -6.36214E+00 + 0.43332E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 5.90979E+00 2.75031E+00 5.90299E+00 2.83573E-01 + 0.43332E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 1.26820E+02 8.97330E+01 5.90962E-01 1.26818E+02 + 0.43332E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 1.49490E-06 1.78037E+02 -1.49402E-06 5.11942E-08 + 0.43332E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 7.79136E-06 1.57199E+02 -7.18250E-06 3.01942E-06 + 0.43332E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 2.99339E-04 -1.30036E+01 2.91662E-04 -6.73547E-05 + 0.41888E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 1.08235E+01 -1.41111E+02 -8.42460E+00 -6.79511E+00 + 0.41888E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 5.98815E+00 -1.47366E+01 5.79117E+00 -1.52324E+00 + 0.41888E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 1.44398E+02 9.14703E+01 -3.70494E+00 1.44350E+02 + 0.41888E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 3.42265E-06 -6.64286E+01 1.36869E-06 -3.13708E-06 + 0.41888E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 3.64658E-05 4.80135E+01 2.43940E-05 2.71051E-05 + 0.41888E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 3.23145E-04 -6.43209E+00 3.21111E-04 -3.62005E-05 + 0.40537E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 1.43945E+01 -1.59489E+02 -1.34820E+01 -5.04355E+00 + 0.40537E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 6.12710E+00 -5.10362E+01 3.85290E+00 -4.76409E+00 + 0.40537E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 1.02554E+02 8.90316E+01 1.73323E+00 1.02539E+02 + 0.40537E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 6.74020E-06 8.20094E+01 9.36964E-07 6.67476E-06 + 0.40537E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 3.69362E-05 1.17380E+02 -1.69867E-05 3.27984E-05 + 0.40537E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 3.77510E-05 7.93696E+01 6.96404E-06 3.71031E-05 + 0.39270E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 1.12842E+01 -1.73593E+02 -1.12138E+01 -1.25913E+00 + 0.39270E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 7.65564E+00 -7.63779E+01 1.80303E+00 -7.44029E+00 + 0.39270E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 5.79963E+01 8.16865E+01 8.38564E+00 5.73868E+01 + 0.39270E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 1.51342E-05 -5.91308E+01 7.76503E-06 -1.29903E-05 + 0.39270E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 1.22922E-05 -5.03142E+01 7.84954E-06 -9.45957E-06 + 0.39270E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 3.11124E-04 1.36414E+01 3.02348E-04 7.33768E-05 + 0.38080E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 3.09592E+00 1.75972E+02 -3.08827E+00 2.17444E-01 + 0.38080E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 9.52389E+00 -8.49410E+01 8.39824E-01 -9.48678E+00 + 0.38080E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 3.69054E+01 8.13485E+01 5.55149E+00 3.64855E+01 + 0.38080E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 7.47218E-07 1.42401E+02 -5.92019E-07 4.55904E-07 + 0.38080E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 1.45225E-05 1.50267E+02 -1.26106E-05 7.20246E-06 + 0.38080E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 3.88444E-04 -8.58408E+01 2.81731E-05 -3.87421E-04 + 0.36960E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 7.01121E+00 7.07561E+00 6.95781E+00 8.63634E-01 + 0.36960E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 9.68596E+00 -9.02475E+01 -4.18467E-02 -9.68587E+00 + 0.36960E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 4.85200E+01 8.22975E+01 6.50308E+00 4.80822E+01 + 0.36960E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 2.00628E-06 1.46307E+02 -1.66928E-06 1.11297E-06 + 0.36960E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 1.28497E-05 -1.01635E+02 -2.59157E-06 -1.25857E-05 + 0.36960E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 3.91089E-04 -9.31400E+01 -2.14223E-05 -3.90501E-04 + 0.35904E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 1.15109E+01 4.28940E+00 1.14786E+01 8.60948E-01 + 0.35904E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 7.75261E+00 -9.92663E+01 -1.24835E+00 -7.65145E+00 + 0.35904E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 8.55675E+01 8.68969E+01 4.63199E+00 8.54421E+01 + 0.35904E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 2.76476E-06 7.24923E+01 8.31733E-07 2.63669E-06 + 0.35904E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 1.46807E-05 -1.35888E+02 -1.05405E-05 -1.02186E-05 + 0.35904E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 8.45874E-05 -7.70688E+01 1.89291E-05 -8.24423E-05 + 0.34907E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 1.40865E+01 2.91166E+01 1.23064E+01 6.85433E+00 + 0.34907E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 5.03602E+00 -1.35480E+02 -3.59070E+00 -3.53105E+00 + 0.34907E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 1.05751E+02 7.35438E+01 2.99575E+01 1.01419E+02 + 0.34907E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 2.31449E-06 -1.45371E+01 2.24039E-06 -5.80954E-07 + 0.34907E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 8.70572E-06 4.63002E+01 6.01461E-06 6.29398E-06 + 0.34907E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 3.30086E-05 -1.69965E+02 -3.25036E-05 -5.75148E-06 + 0.33963E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 9.12517E+00 -1.07972E+01 8.96362E+00 -1.70945E+00 + 0.33963E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 4.38530E+00 1.61825E+02 -4.16652E+00 1.36783E+00 + 0.33963E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 1.38215E+02 7.52581E+01 3.51708E+01 1.33665E+02 + 0.33963E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 8.06570E-07 1.69609E+02 -7.93343E-07 1.45474E-07 + 0.33963E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 1.95319E-06 9.33447E+01 -1.13954E-07 1.94986E-06 + 0.33963E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 1.03018E-04 -4.01881E+01 7.86988E-05 -6.64775E-05 + 0.33069E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 1.21963E+01 -8.50841E+01 1.04513E+00 -1.21514E+01 + 0.33069E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 5.11158E+00 1.33286E+02 -3.50470E+00 3.72093E+00 + 0.33069E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 1.25639E+02 7.58915E+01 3.06258E+01 1.21850E+02 + 0.33069E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 3.56942E-06 1.52193E+02 -3.15722E-06 1.66514E-06 + 0.33069E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 9.86237E-06 6.63853E+01 3.95071E-06 9.03650E-06 + 0.33069E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 2.66107E-04 9.26763E+01 -1.24254E-05 2.65817E-04 + 0.32221E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 2.38871E+01 -8.55946E+01 1.83483E+00 -2.38166E+01 + 0.32221E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 3.06998E+00 1.29081E+02 -1.93537E+00 2.38309E+00 + 0.32221E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 1.62254E+02 9.01057E+01 -2.99219E-01 1.62254E+02 + 0.32221E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 1.32076E-06 1.00832E+02 -2.48215E-07 1.29722E-06 + 0.32221E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 7.16394E-06 3.61648E+01 5.78361E-06 4.22751E-06 + 0.32221E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 2.42871E-04 -8.46123E+01 2.28043E-05 -2.41798E-04 + 0.31416E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 3.36947E+01 -8.77468E+01 1.32471E+00 -3.36687E+01 + 0.31416E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 1.13155E+00 -1.58115E+02 -1.05001E+00 -4.21778E-01 + 0.31416E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 6.41842E+01 6.75898E+01 2.44692E+01 5.93369E+01 + 0.31416E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 3.48796E-06 -1.60836E+02 -3.29467E-06 -1.14501E-06 + 0.31416E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 7.47989E-06 -3.26421E+00 7.46776E-06 -4.25908E-07 + 0.31416E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 3.12326E-05 8.27451E+01 3.94415E-06 3.09825E-05 + 0.30650E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 2.33617E+01 -1.03017E+02 -5.26197E+00 -2.27614E+01 + 0.30650E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 1.69862E+00 -1.45079E+02 -1.39277E+00 -9.72377E-01 + 0.30650E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 3.90213E+01 3.34586E+01 3.25549E+01 2.15138E+01 + 0.30650E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 8.60713E-07 -7.26590E+01 2.56542E-07 -8.21592E-07 + 0.30650E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 8.82026E-06 1.81999E+01 8.37900E-06 2.75486E-06 + 0.30650E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 5.95840E-05 -2.78659E+01 5.26748E-05 -2.78498E-05 + 0.29920E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 1.37105E+01 -1.62335E+02 -1.30641E+01 -4.16040E+00 + 0.29920E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 3.76263E-01 1.38786E+02 -2.83046E-01 2.47909E-01 + 0.29920E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 1.37310E+02 -4.88104E+00 1.36812E+02 -1.16833E+01 + 0.29920E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 1.28371E-06 1.00265E+02 -2.28760E-07 1.26316E-06 + 0.29920E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 1.45242E-06 7.62394E+01 3.45480E-07 1.41074E-06 + 0.29920E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 1.28979E-04 -2.80484E+00 1.28825E-04 -6.31150E-06 + 0.29224E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 2.04638E+01 1.56800E+02 -1.88090E+01 8.06146E+00 + 0.29224E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 1.41680E+00 2.85309E+01 1.24474E+00 6.76707E-01 + 0.29224E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 1.97473E+02 -5.77804E+00 1.96470E+02 -1.98806E+01 + 0.29224E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 1.31384E-06 1.59898E+02 -1.23380E-06 4.51556E-07 + 0.29224E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 4.29102E-06 1.54208E+02 -3.86357E-06 1.86702E-06 + 0.29224E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 1.65198E-04 1.76210E+02 -1.64837E-04 1.09209E-05 + 0.28560E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 1.93171E+01 1.58667E+02 -1.79935E+01 7.02738E+00 + 0.28560E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 1.89263E+00 -8.19206E+01 2.65999E-01 -1.87384E+00 + 0.28560E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 1.55298E+02 -1.87323E+00 1.55215E+02 -5.07642E+00 + 0.28560E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 3.74458E-06 -8.17064E+01 5.40137E-07 -3.70542E-06 + 0.28560E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 1.31918E-06 1.22470E+02 -7.08211E-07 1.11296E-06 + 0.28560E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 1.73125E-04 -1.16866E+02 -7.82369E-05 -1.54438E-04 + 0.27925E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 4.99890E+00 1.68569E+02 -4.89974E+00 9.90731E-01 + 0.27925E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 3.45270E+00 -1.55193E+02 -3.13411E+00 -1.44862E+00 + 0.27925E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 3.05743E+01 3.03029E+01 2.63970E+01 1.54269E+01 + 0.27925E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 5.97475E-06 -1.75134E+02 -5.95322E-06 -5.06828E-07 + 0.27925E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 3.83531E-06 2.09347E+00 3.83275E-06 1.40103E-07 + 0.27925E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 1.33143E-04 1.16428E+02 -5.92588E-05 1.19228E-04 + 0.27318E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 8.43332E+00 -1.60186E+01 8.10587E+00 -2.32717E+00 + 0.27318E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 3.04044E+00 -1.62750E+02 -2.90368E+00 -9.01637E-01 + 0.27318E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 4.02717E+01 -1.69461E+02 -3.95924E+01 -7.36561E+00 + 0.27318E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 5.48985E-06 4.74033E+01 3.71571E-06 4.04128E-06 + 0.27318E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 3.44502E-06 -1.08578E+02 -1.09757E-06 -3.26551E-06 + 0.27318E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 8.07513E-05 5.36019E+01 4.79172E-05 6.49978E-05 + 0.26737E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 1.25211E+01 4.61169E+00 1.24806E+01 1.00673E+00 + 0.26737E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 1.29891E+00 -1.43155E+02 -1.03946E+00 -7.78896E-01 + 0.26737E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 5.31763E+01 -1.30371E+02 -3.44441E+01 -4.05132E+01 + 0.26737E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 7.33682E-07 6.05101E+01 3.61170E-07 6.38628E-07 + 0.26737E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 3.22720E-06 -1.11160E+02 -1.16492E-06 -3.00962E-06 + 0.26737E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 1.60505E-04 -6.81732E+01 5.96764E-05 -1.48999E-04 + 0.26180E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 7.64411E+00 -1.17115E+01 7.48498E+00 -1.55163E+00 + 0.26180E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 1.19988E+00 -8.62382E+00 1.18632E+00 -1.79918E-01 + 0.26180E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 2.12205E+01 -6.62011E+01 8.56305E+00 -1.94160E+01 + 0.26180E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 8.93283E-07 -6.60960E+01 3.61963E-07 -8.16662E-07 + 0.26180E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 9.41601E-07 -6.56555E+01 3.88149E-07 -8.57877E-07 + 0.26180E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 1.45774E-04 -1.61001E+02 -1.37833E-04 -4.74581E-05 + 0.25646E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 1.04154E+01 -7.31618E+01 3.01703E+00 -9.96884E+00 + 0.25646E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 1.24620E+00 -2.28593E+01 1.14832E+00 -4.84109E-01 + 0.25646E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 5.10858E+01 7.61498E+01 1.22292E+01 4.96004E+01 + 0.25646E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 1.24477E-06 1.25705E+02 -7.26459E-07 1.01080E-06 + 0.25646E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 3.30111E-06 6.72682E+01 1.27561E-06 3.04470E-06 + 0.25646E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 1.11507E-04 1.66710E+02 -1.08520E-04 2.56334E-05 + 0.25133E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 1.23709E+01 -7.59340E+01 3.00662E+00 -1.20000E+01 + 0.25133E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 8.84163E-01 9.82377E+01 -1.26684E-01 8.75040E-01 + 0.25133E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 6.07072E+01 1.02045E+02 -1.26689E+01 5.93706E+01 + 0.25133E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 3.07496E-06 2.94182E+01 2.67847E-06 1.51036E-06 + 0.25133E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 3.39210E-06 8.28198E+01 4.23980E-07 3.36550E-06 + 0.25133E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 5.73622E-05 1.65783E+01 5.49777E-05 1.63669E-05 + 0.24640E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 9.66235E+00 -7.90094E+01 1.84211E+00 -9.48513E+00 + 0.24640E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 5.27550E-01 1.55728E+02 -4.80917E-01 2.16858E-01 + 0.24640E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 4.92998E+01 1.40672E+02 -3.81348E+01 3.12444E+01 + 0.24640E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 1.62826E-06 -2.45580E+00 1.62676E-06 -6.97687E-08 + 0.24640E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 2.29658E-06 9.13198E+01 -5.28969E-08 2.29597E-06 + 0.24640E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 2.38803E-04 -8.43777E+01 2.33955E-05 -2.37654E-04 + 0.24166E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 4.92963E+00 -1.57492E+02 -4.55411E+00 -1.88714E+00 + 0.24166E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 1.09402E+00 -1.52654E+02 -9.71761E-01 -5.02553E-01 + 0.24166E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 1.17710E+01 -1.07567E+02 -3.55268E+00 -1.12221E+01 + 0.24166E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 1.04661E-06 -1.79702E+02 -1.04660E-06 -5.45038E-09 + 0.24166E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 1.76718E-06 1.16508E+02 -7.88741E-07 1.58139E-06 + 0.24166E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 6.86849E-05 -3.75922E+01 5.44240E-05 -4.19004E-05 + 0.23710E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 9.92705E+00 -1.55376E+02 -9.02429E+00 -4.13625E+00 + 0.23710E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 7.72167E-01 -1.44123E+02 -6.25670E-01 -4.52525E-01 + 0.23710E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 4.80738E+01 -1.54383E+01 4.63391E+01 -1.27973E+01 + 0.23710E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 9.00049E-07 -1.61844E+02 -8.55238E-07 -2.80457E-07 + 0.23710E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 4.22897E-07 1.48757E+01 4.08724E-07 1.08567E-07 + 0.23710E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 1.97942E-04 -7.55125E+01 4.95188E-05 -1.91648E-04 + 0.23271E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 9.82730E+00 -1.59122E+02 -9.18208E+00 -3.50218E+00 + 0.23271E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 5.00788E-01 -1.34158E+02 -3.48866E-01 -3.59279E-01 + 0.23271E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 4.42546E+01 2.45543E+00 4.42140E+01 1.89597E+00 + 0.23271E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 7.15859E-07 -8.10554E+01 1.11301E-07 -7.07153E-07 + 0.23271E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 6.87954E-07 -6.34517E+01 3.07482E-07 -6.15415E-07 + 0.23271E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 5.28500E-05 -1.53481E+01 5.09652E-05 -1.39885E-05 + 0.22848E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 8.94771E-01 -1.39363E+02 -6.78994E-01 -5.82737E-01 + 0.22848E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 3.77395E-01 8.39421E+01 3.98281E-02 3.75287E-01 + 0.22848E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 1.71118E+01 3.30766E+01 1.43386E+01 9.33892E+00 + 0.22848E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 8.12147E-07 9.77825E+01 -1.09975E-07 8.04666E-07 + 0.22848E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 6.01499E-07 8.02667E+01 1.01691E-07 5.92841E-07 + 0.22848E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 2.71202E-04 1.46142E+02 -2.25213E-04 1.51095E-04 + 0.22440E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 1.67839E+00 -1.56966E+02 -1.54457E+00 -6.56730E-01 + 0.22440E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 6.58292E-01 -1.73629E+02 -6.54227E-01 -7.30461E-02 + 0.22440E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 1.64088E+01 1.32339E+01 1.59731E+01 3.75643E+00 + 0.22440E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 4.10977E-07 1.67298E+01 3.93581E-07 1.18303E-07 + 0.22440E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 1.46794E-06 -1.16602E+02 -6.57318E-07 -1.31254E-06 + 0.22440E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 1.79252E-04 1.54715E+02 -1.62078E-04 7.65631E-05 + 0.22046E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 7.86548E-01 -6.87817E+01 2.84670E-01 -7.33227E-01 + 0.22046E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 3.63471E-01 1.75102E+02 -3.62143E-01 3.10369E-02 + 0.22046E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 1.12091E+01 -8.59341E+01 7.94762E-01 -1.11809E+01 + 0.22046E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 7.60333E-07 -1.46459E+02 -6.33730E-07 -4.20110E-07 + 0.22046E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 7.35325E-07 -1.36337E+02 -5.31940E-07 -5.07684E-07 + 0.22046E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 2.26161E-04 -9.32031E+01 -1.26367E-05 -2.25808E-04 + 0.21666E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 5.90800E+00 -1.52575E+01 5.69976E+00 -1.55473E+00 + 0.21666E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 6.12908E-01 -2.77919E+01 5.42207E-01 -2.85776E-01 + 0.21666E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 2.04930E+01 -1.34947E+02 -1.44774E+01 -1.45040E+01 + 0.21666E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 1.00341E-06 1.50115E+02 -8.69981E-07 4.99965E-07 + 0.21666E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 8.54220E-07 1.07393E+02 -2.55349E-07 8.15162E-07 + 0.21666E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 4.00927E-04 4.17903E+01 2.98927E-04 2.67180E-04 + 0.21299E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 6.32361E+00 2.25799E+01 5.83887E+00 2.42809E+00 + 0.21299E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 3.18424E-01 7.07448E+01 1.05009E-01 3.00611E-01 + 0.21299E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 2.05948E+01 -1.20227E+02 -1.03678E+01 -1.77947E+01 + 0.21299E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 7.94815E-07 8.67586E+01 4.49408E-08 7.93544E-07 + 0.21299E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 7.90932E-07 -9.97660E+01 -1.34161E-07 -7.79471E-07 + 0.21299E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 9.57385E-05 2.72675E+01 8.50998E-05 4.38621E-05 + 0.20944E+01 0.50265E+01 0.00000E+00 0.00000E+00 1 3.57485E+00 1.54417E+01 3.44581E+00 9.51835E-01 + 0.20944E+01 0.50265E+01 0.00000E+00 0.00000E+00 3 1.16256E-01 1.33405E+02 -7.98851E-02 8.44616E-02 + 0.20944E+01 0.50265E+01 0.00000E+00 0.00000E+00 5 1.23147E+01 -1.57538E+02 -1.13804E+01 -4.70512E+00 + 0.20944E+01 0.50265E+01 0.00000E+00 0.00000E+00 2 6.94994E-07 6.96187E+01 2.42043E-07 6.51484E-07 + 0.20944E+01 0.50265E+01 0.00000E+00 0.00000E+00 4 4.34147E-07 -1.04665E+02 -1.09915E-07 -4.20003E-07 + 0.20944E+01 0.50265E+01 0.00000E+00 0.00000E+00 6 1.35596E-04 6.36852E+01 6.01102E-05 1.21545E-04 + 0.48332E+01 0.48332E+01 0.00000E+00 0.00000E+00 1 1.04644E+01 0.00000E+00 1.04644E+01 0.00000E+00 + 0.48332E+01 0.48332E+01 0.00000E+00 0.00000E+00 3 3.19883E+00 0.00000E+00 3.19883E+00 0.00000E+00 + 0.48332E+01 0.48332E+01 0.00000E+00 0.00000E+00 5 2.48829E+01 0.00000E+00 2.48829E+01 0.00000E+00 + 0.48332E+01 0.48332E+01 0.00000E+00 0.00000E+00 2 3.22501E-06 0.00000E+00 3.22501E-06 0.00000E+00 + 0.48332E+01 0.48332E+01 0.00000E+00 0.00000E+00 4 7.28804E-05 1.80000E+02 -7.28804E-05 0.00000E+00 + 0.48332E+01 0.48332E+01 0.00000E+00 0.00000E+00 6 1.25341E-04 0.00000E+00 1.25341E-04 0.00000E+00 + 0.46542E+01 0.48332E+01 0.00000E+00 0.00000E+00 1 1.00256E+01 -5.64966E+00 9.97689E+00 -9.86974E-01 + 0.46542E+01 0.48332E+01 0.00000E+00 0.00000E+00 3 2.71071E+00 -1.65456E+01 2.59847E+00 -7.71952E-01 + 0.46542E+01 0.48332E+01 0.00000E+00 0.00000E+00 5 3.08633E+01 3.71522E+01 2.45991E+01 1.86394E+01 + 0.46542E+01 0.48332E+01 0.00000E+00 0.00000E+00 2 8.59590E-06 -2.23438E+01 7.95052E-06 -3.26784E-06 + 0.46542E+01 0.48332E+01 0.00000E+00 0.00000E+00 4 4.08262E-05 1.93275E+00 4.08030E-05 1.37692E-06 + 0.46542E+01 0.48332E+01 0.00000E+00 0.00000E+00 6 2.12696E-04 -1.72151E+02 -2.10703E-04 -2.90454E-05 + 0.44880E+01 0.48332E+01 0.00000E+00 0.00000E+00 1 9.37061E+00 -2.31543E+01 8.61580E+00 -3.68461E+00 + 0.44880E+01 0.48332E+01 0.00000E+00 0.00000E+00 3 4.07500E+00 -1.09002E+01 4.00148E+00 -7.70577E-01 + 0.44880E+01 0.48332E+01 0.00000E+00 0.00000E+00 5 6.31225E+01 6.34151E+01 2.82488E+01 5.64487E+01 + 0.44880E+01 0.48332E+01 0.00000E+00 0.00000E+00 2 6.04498E-06 -3.81718E+01 4.75233E-06 -3.73592E-06 + 0.44880E+01 0.48332E+01 0.00000E+00 0.00000E+00 4 1.27567E-05 -1.53967E+02 -1.14624E-05 -5.59887E-06 + 0.44880E+01 0.48332E+01 0.00000E+00 0.00000E+00 6 1.61396E-04 -1.20826E+02 -8.27052E-05 -1.38594E-04 + 0.43332E+01 0.48332E+01 0.00000E+00 0.00000E+00 1 7.75074E+00 -5.39501E+01 4.56123E+00 -6.26652E+00 + 0.43332E+01 0.48332E+01 0.00000E+00 0.00000E+00 3 5.81517E+00 -3.15554E+00 5.80635E+00 -3.20106E-01 + 0.43332E+01 0.48332E+01 0.00000E+00 0.00000E+00 5 1.15706E+02 7.75657E+01 2.49140E+01 1.12992E+02 + 0.43332E+01 0.48332E+01 0.00000E+00 0.00000E+00 2 1.96406E-06 -5.76773E+01 1.05016E-06 -1.65973E-06 + 0.43332E+01 0.48332E+01 0.00000E+00 0.00000E+00 4 2.73142E-05 -5.94317E+01 1.38911E-05 -2.35181E-05 + 0.43332E+01 0.48332E+01 0.00000E+00 0.00000E+00 6 2.48414E-04 -2.96355E+00 2.48081E-04 -1.28431E-05 + 0.41888E+01 0.48332E+01 0.00000E+00 0.00000E+00 1 6.55113E+00 -1.05933E+02 -1.79837E+00 -6.29946E+00 + 0.41888E+01 0.48332E+01 0.00000E+00 0.00000E+00 3 6.56726E+00 -6.26143E+00 6.52809E+00 -7.16259E-01 + 0.41888E+01 0.48332E+01 0.00000E+00 0.00000E+00 5 1.57225E+02 8.16626E+01 2.27978E+01 1.55563E+02 + 0.41888E+01 0.48332E+01 0.00000E+00 0.00000E+00 2 1.28265E-06 -1.12641E+01 1.25794E-06 -2.50542E-07 + 0.41888E+01 0.48332E+01 0.00000E+00 0.00000E+00 4 8.34859E-06 -1.62507E+02 -7.96249E-06 -2.50952E-06 + 0.41888E+01 0.48332E+01 0.00000E+00 0.00000E+00 6 1.68199E-04 -4.80236E+01 1.12496E-04 -1.25043E-04 + 0.40537E+01 0.48332E+01 0.00000E+00 0.00000E+00 1 9.41865E+00 -1.54192E+02 -8.47923E+00 -4.10045E+00 + 0.40537E+01 0.48332E+01 0.00000E+00 0.00000E+00 3 6.23300E+00 -2.09699E+01 5.82018E+00 -2.23064E+00 + 0.40537E+01 0.48332E+01 0.00000E+00 0.00000E+00 5 1.48735E+02 8.53551E+01 1.20447E+01 1.48247E+02 + 0.40537E+01 0.48332E+01 0.00000E+00 0.00000E+00 2 6.12898E-07 9.25504E+01 -2.72726E-08 6.12291E-07 + 0.40537E+01 0.48332E+01 0.00000E+00 0.00000E+00 4 3.48440E-05 1.01781E+02 -7.11390E-06 3.41101E-05 + 0.40537E+01 0.48332E+01 0.00000E+00 0.00000E+00 6 2.18108E-04 -1.68210E+02 -2.13507E-04 -4.45665E-05 + 0.39270E+01 0.48332E+01 0.00000E+00 0.00000E+00 1 1.15015E+01 -1.70140E+02 -1.13316E+01 -1.96944E+00 + 0.39270E+01 0.48332E+01 0.00000E+00 0.00000E+00 3 6.85207E+00 -5.93857E+01 3.48945E+00 -5.89699E+00 + 0.39270E+01 0.48332E+01 0.00000E+00 0.00000E+00 5 1.14711E+02 7.78759E+01 2.40927E+01 1.12152E+02 + 0.39270E+01 0.48332E+01 0.00000E+00 0.00000E+00 2 1.06454E-05 -7.97306E+01 1.89782E-06 -1.04748E-05 + 0.39270E+01 0.48332E+01 0.00000E+00 0.00000E+00 4 4.20366E-05 1.00930E+02 -7.97027E-06 4.12741E-05 + 0.39270E+01 0.48332E+01 0.00000E+00 0.00000E+00 6 5.22967E-05 1.21214E+02 -2.71021E-05 4.47261E-05 + 0.38080E+01 0.48332E+01 0.00000E+00 0.00000E+00 1 9.22740E+00 -1.70119E+02 -9.09052E+00 -1.58346E+00 + 0.38080E+01 0.48332E+01 0.00000E+00 0.00000E+00 3 8.58333E+00 -8.38013E+01 9.26804E-01 -8.53315E+00 + 0.38080E+01 0.48332E+01 0.00000E+00 0.00000E+00 5 5.83331E+01 6.00373E+01 2.91336E+01 5.05369E+01 + 0.38080E+01 0.48332E+01 0.00000E+00 0.00000E+00 2 2.80205E-06 -1.54526E+02 -2.52965E-06 -1.20515E-06 + 0.38080E+01 0.48332E+01 0.00000E+00 0.00000E+00 4 1.55535E-05 -6.29095E+01 7.08303E-06 -1.38471E-05 + 0.38080E+01 0.48332E+01 0.00000E+00 0.00000E+00 6 2.62247E-05 1.08573E+02 -8.35299E-06 2.48588E-05 + 0.36960E+01 0.48332E+01 0.00000E+00 0.00000E+00 1 1.92252E+00 -1.60713E+02 -1.81462E+00 -6.35011E-01 + 0.36960E+01 0.48332E+01 0.00000E+00 0.00000E+00 3 9.54552E+00 -9.35831E+01 -5.96552E-01 -9.52686E+00 + 0.36960E+01 0.48332E+01 0.00000E+00 0.00000E+00 5 2.68521E+01 6.13980E+01 1.28547E+01 2.35753E+01 + 0.36960E+01 0.48332E+01 0.00000E+00 0.00000E+00 2 3.88851E-06 5.44162E+01 2.26270E-06 3.16240E-06 + 0.36960E+01 0.48332E+01 0.00000E+00 0.00000E+00 4 8.13673E-06 -3.65344E+01 6.53786E-06 -4.84384E-06 + 0.36960E+01 0.48332E+01 0.00000E+00 0.00000E+00 6 3.90576E-04 1.56684E+02 -3.58680E-04 1.54593E-04 + 0.35904E+01 0.48332E+01 0.00000E+00 0.00000E+00 1 7.75612E+00 -2.21451E+00 7.75033E+00 -2.99704E-01 + 0.35904E+01 0.48332E+01 0.00000E+00 0.00000E+00 3 8.20848E+00 -9.51051E+01 -7.30417E-01 -8.17591E+00 + 0.35904E+01 0.48332E+01 0.00000E+00 0.00000E+00 5 5.30154E+01 8.35660E+01 5.94080E+00 5.26815E+01 + 0.35904E+01 0.48332E+01 0.00000E+00 0.00000E+00 2 1.82977E-06 -5.87638E+01 9.48857E-07 -1.56452E-06 + 0.35904E+01 0.48332E+01 0.00000E+00 0.00000E+00 4 2.89537E-05 -1.33049E+02 -1.97646E-05 -2.11584E-05 + 0.35904E+01 0.48332E+01 0.00000E+00 0.00000E+00 6 2.08685E-04 1.48084E+02 -1.77137E-04 1.10327E-04 + 0.34907E+01 0.48332E+01 0.00000E+00 0.00000E+00 1 1.44961E+01 2.58237E+01 1.30485E+01 6.31455E+00 + 0.34907E+01 0.48332E+01 0.00000E+00 0.00000E+00 3 7.01070E+00 -1.01541E+02 -1.40258E+00 -6.86897E+00 + 0.34907E+01 0.48332E+01 0.00000E+00 0.00000E+00 5 6.72475E+01 5.13728E+01 4.19793E+01 5.25353E+01 + 0.34907E+01 0.48332E+01 0.00000E+00 0.00000E+00 2 4.12304E-06 8.24110E+01 5.44511E-07 4.08693E-06 + 0.34907E+01 0.48332E+01 0.00000E+00 0.00000E+00 4 1.45313E-05 5.53510E+01 8.26175E-06 1.19542E-05 + 0.34907E+01 0.48332E+01 0.00000E+00 0.00000E+00 6 2.79006E-04 -9.00913E+01 -4.44569E-07 -2.79006E-04 + 0.33963E+01 0.48332E+01 0.00000E+00 0.00000E+00 1 1.47560E+01 1.54127E+01 1.42254E+01 3.92171E+00 + 0.33963E+01 0.48332E+01 0.00000E+00 0.00000E+00 3 3.82245E+00 -1.51150E+02 -3.34803E+00 -1.84439E+00 + 0.33963E+01 0.48332E+01 0.00000E+00 0.00000E+00 5 6.65579E+01 7.99503E+01 1.16145E+01 6.55367E+01 + 0.33963E+01 0.48332E+01 0.00000E+00 0.00000E+00 2 1.36614E-06 -6.03954E+01 6.74886E-07 -1.18779E-06 + 0.33963E+01 0.48332E+01 0.00000E+00 0.00000E+00 4 1.16263E-06 1.63627E+01 1.11554E-06 3.27533E-07 + 0.33963E+01 0.48332E+01 0.00000E+00 0.00000E+00 6 4.36239E-05 -1.68709E+02 -4.27795E-05 -8.54156E-06 + 0.33069E+01 0.48332E+01 0.00000E+00 0.00000E+00 1 7.78324E+00 -2.34923E+01 7.13812E+00 -3.10261E+00 + 0.33069E+01 0.48332E+01 0.00000E+00 0.00000E+00 3 4.16237E+00 1.47518E+02 -3.51123E+00 2.23531E+00 + 0.33069E+01 0.48332E+01 0.00000E+00 0.00000E+00 5 1.01090E+02 9.44395E+01 -7.82505E+00 1.00786E+02 + 0.33069E+01 0.48332E+01 0.00000E+00 0.00000E+00 2 3.24512E-07 -8.29216E+01 3.99887E-08 -3.22038E-07 + 0.33069E+01 0.48332E+01 0.00000E+00 0.00000E+00 4 1.60596E-05 1.39587E+02 -1.22277E-05 1.04112E-05 + 0.33069E+01 0.48332E+01 0.00000E+00 0.00000E+00 6 4.96662E-04 -7.06798E+01 1.64319E-04 -4.68692E-04 + 0.32221E+01 0.48332E+01 0.00000E+00 0.00000E+00 1 1.81824E+01 -8.00203E+01 3.15100E+00 -1.79073E+01 + 0.32221E+01 0.48332E+01 0.00000E+00 0.00000E+00 3 3.75970E+00 1.35240E+02 -2.66964E+00 2.64733E+00 + 0.32221E+01 0.48332E+01 0.00000E+00 0.00000E+00 5 1.73675E+02 9.41778E+01 -1.26525E+01 1.73213E+02 + 0.32221E+01 0.48332E+01 0.00000E+00 0.00000E+00 2 8.71764E-06 -6.17670E+01 4.12396E-06 -7.68051E-06 + 0.32221E+01 0.48332E+01 0.00000E+00 0.00000E+00 4 1.69695E-05 -8.27163E+01 2.15142E-06 -1.68325E-05 + 0.32221E+01 0.48332E+01 0.00000E+00 0.00000E+00 6 2.59909E-04 -1.04983E+02 -6.71966E-05 -2.51072E-04 + 0.31416E+01 0.48332E+01 0.00000E+00 0.00000E+00 1 3.19150E+01 -9.03957E+01 -2.20423E-01 -3.19142E+01 + 0.31416E+01 0.48332E+01 0.00000E+00 0.00000E+00 3 1.87961E+00 1.44169E+02 -1.52390E+00 1.10030E+00 + 0.31416E+01 0.48332E+01 0.00000E+00 0.00000E+00 5 1.07339E+02 8.12790E+01 1.62751E+01 1.06098E+02 + 0.31416E+01 0.48332E+01 0.00000E+00 0.00000E+00 2 2.16934E-07 1.11218E+02 -7.85125E-08 2.02228E-07 + 0.31416E+01 0.48332E+01 0.00000E+00 0.00000E+00 4 1.28446E-05 1.68973E+02 -1.26074E-05 2.45681E-06 + 0.31416E+01 0.48332E+01 0.00000E+00 0.00000E+00 6 1.23672E-04 7.98172E+01 2.18640E-05 1.21724E-04 + 0.30650E+01 0.48332E+01 0.00000E+00 0.00000E+00 1 2.99587E+01 -9.64093E+01 -3.34432E+00 -2.97714E+01 + 0.30650E+01 0.48332E+01 0.00000E+00 0.00000E+00 3 2.08075E+00 -1.53099E+02 -1.85560E+00 -9.41437E-01 + 0.30650E+01 0.48332E+01 0.00000E+00 0.00000E+00 5 6.80559E+01 9.93427E+01 -1.10482E+01 6.71532E+01 + 0.30650E+01 0.48332E+01 0.00000E+00 0.00000E+00 2 6.25991E-06 -6.25091E+01 2.88962E-06 -5.55307E-06 + 0.30650E+01 0.48332E+01 0.00000E+00 0.00000E+00 4 3.23582E-05 9.59620E+01 -3.36098E-06 3.21832E-05 + 0.30650E+01 0.48332E+01 0.00000E+00 0.00000E+00 6 9.49330E-05 7.74185E+01 2.06790E-05 9.26534E-05 + 0.29920E+01 0.48332E+01 0.00000E+00 0.00000E+00 1 1.52530E+01 -1.21431E+02 -7.95399E+00 -1.30149E+01 + 0.29920E+01 0.48332E+01 0.00000E+00 0.00000E+00 3 1.12831E+00 -1.56514E+02 -1.03484E+00 -4.49656E-01 + 0.29920E+01 0.48332E+01 0.00000E+00 0.00000E+00 5 9.00396E+01 2.41544E+01 8.21563E+01 3.68439E+01 + 0.29920E+01 0.48332E+01 0.00000E+00 0.00000E+00 2 1.80019E-06 4.54653E+01 1.26255E-06 1.28323E-06 + 0.29920E+01 0.48332E+01 0.00000E+00 0.00000E+00 4 2.99524E-06 1.39239E+02 -2.26871E-06 1.95561E-06 + 0.29920E+01 0.48332E+01 0.00000E+00 0.00000E+00 6 1.91694E-04 1.79652E+02 -1.91691E-04 1.16516E-06 + 0.29224E+01 0.48332E+01 0.00000E+00 0.00000E+00 1 1.54486E+01 1.58645E+02 -1.43879E+01 5.62542E+00 + 0.29224E+01 0.48332E+01 0.00000E+00 0.00000E+00 3 7.76804E-01 9.46853E+00 7.66221E-01 1.27789E-01 + 0.29224E+01 0.48332E+01 0.00000E+00 0.00000E+00 5 1.79619E+02 -3.09177E+00 1.79358E+02 -9.68783E+00 + 0.29224E+01 0.48332E+01 0.00000E+00 0.00000E+00 2 1.23982E-06 7.33429E+01 3.55387E-07 1.18780E-06 + 0.29224E+01 0.48332E+01 0.00000E+00 0.00000E+00 4 1.90822E-06 1.16326E+02 -8.46250E-07 1.71031E-06 + 0.29224E+01 0.48332E+01 0.00000E+00 0.00000E+00 6 3.30674E-04 -3.74367E+00 3.29968E-04 -2.15906E-05 + 0.28560E+01 0.48332E+01 0.00000E+00 0.00000E+00 1 2.09488E+01 1.51230E+02 -1.83629E+01 1.00825E+01 + 0.28560E+01 0.48332E+01 0.00000E+00 0.00000E+00 3 1.37432E+00 -4.72511E+01 9.32867E-01 -1.00921E+00 + 0.28560E+01 0.48332E+01 0.00000E+00 0.00000E+00 5 1.94993E+02 -1.54717E+00 1.94921E+02 -5.26477E+00 + 0.28560E+01 0.48332E+01 0.00000E+00 0.00000E+00 2 3.66052E-06 -1.72997E+02 -3.63321E-06 -4.46291E-07 + 0.28560E+01 0.48332E+01 0.00000E+00 0.00000E+00 4 4.54166E-06 1.69611E+02 -4.46721E-06 8.18986E-07 + 0.28560E+01 0.48332E+01 0.00000E+00 0.00000E+00 6 1.06069E-04 3.40227E+01 8.79119E-05 5.93480E-05 + 0.27925E+01 0.48332E+01 0.00000E+00 0.00000E+00 1 1.09755E+01 1.67132E+02 -1.06999E+01 2.44427E+00 + 0.27925E+01 0.48332E+01 0.00000E+00 0.00000E+00 3 2.49646E+00 -1.26726E+02 -1.49286E+00 -2.00092E+00 + 0.27925E+01 0.48332E+01 0.00000E+00 0.00000E+00 5 9.73635E+01 1.18122E+01 9.53017E+01 1.99308E+01 + 0.27925E+01 0.48332E+01 0.00000E+00 0.00000E+00 2 2.96715E-06 1.59759E+02 -2.78392E-06 1.02652E-06 + 0.27925E+01 0.48332E+01 0.00000E+00 0.00000E+00 4 7.83336E-06 -3.42583E+01 6.47434E-06 -4.40958E-06 + 0.27925E+01 0.48332E+01 0.00000E+00 0.00000E+00 6 2.17687E-04 9.46983E+01 -1.78303E-05 2.16955E-04 + 0.27318E+01 0.48332E+01 0.00000E+00 0.00000E+00 1 5.09673E+00 -7.67017E+01 1.17235E+00 -4.96007E+00 + 0.27318E+01 0.48332E+01 0.00000E+00 0.00000E+00 3 3.42131E+00 -1.58024E+02 -3.17272E+00 -1.28032E+00 + 0.27318E+01 0.48332E+01 0.00000E+00 0.00000E+00 5 2.06124E+01 1.22136E+02 -1.09644E+01 1.74543E+01 + 0.27318E+01 0.48332E+01 0.00000E+00 0.00000E+00 2 3.41374E-06 7.73821E+01 7.45724E-07 3.33129E-06 + 0.27318E+01 0.48332E+01 0.00000E+00 0.00000E+00 4 4.14190E-06 1.67013E+02 -4.03596E-06 9.30784E-07 + 0.27318E+01 0.48332E+01 0.00000E+00 0.00000E+00 6 3.45582E-04 -9.64654E+01 -3.89137E-05 -3.43384E-04 + 0.26737E+01 0.48332E+01 0.00000E+00 0.00000E+00 1 1.15270E+01 -8.03734E+00 1.14137E+01 -1.61168E+00 + 0.26737E+01 0.48332E+01 0.00000E+00 0.00000E+00 3 1.77607E+00 -1.50820E+02 -1.55067E+00 -8.65931E-01 + 0.26737E+01 0.48332E+01 0.00000E+00 0.00000E+00 5 5.46932E+01 -1.65232E+02 -5.28865E+01 -1.39415E+01 + 0.26737E+01 0.48332E+01 0.00000E+00 0.00000E+00 2 6.53051E-06 -9.17732E+01 -2.02078E-07 -6.52738E-06 + 0.26737E+01 0.48332E+01 0.00000E+00 0.00000E+00 4 1.25097E-06 7.68846E+01 2.83863E-07 1.21834E-06 + 0.26737E+01 0.48332E+01 0.00000E+00 0.00000E+00 6 3.49109E-04 8.16878E+01 5.04693E-05 3.45442E-04 + 0.26180E+01 0.48332E+01 0.00000E+00 0.00000E+00 1 1.13931E+01 4.55905E+00 1.13571E+01 9.05599E-01 + 0.26180E+01 0.48332E+01 0.00000E+00 0.00000E+00 3 9.29119E-01 -1.92046E+01 8.77413E-01 -3.05626E-01 + 0.26180E+01 0.48332E+01 0.00000E+00 0.00000E+00 5 3.49733E+01 -1.12821E+02 -1.35646E+01 -3.22356E+01 + 0.26180E+01 0.48332E+01 0.00000E+00 0.00000E+00 2 3.51264E-06 -3.78759E+01 2.77267E-06 -2.15660E-06 + 0.26180E+01 0.48332E+01 0.00000E+00 0.00000E+00 4 1.86634E-06 1.01923E+02 -3.85576E-07 1.82607E-06 + 0.26180E+01 0.48332E+01 0.00000E+00 0.00000E+00 6 4.03558E-05 -9.30670E+00 3.98246E-05 -6.52631E-06 + 0.25646E+01 0.48332E+01 0.00000E+00 0.00000E+00 1 4.68430E+00 -5.37737E+01 2.76831E+00 -3.77877E+00 + 0.25646E+01 0.48332E+01 0.00000E+00 0.00000E+00 3 2.08591E+00 -1.19187E+01 2.04094E+00 -4.30791E-01 + 0.25646E+01 0.48332E+01 0.00000E+00 0.00000E+00 5 1.09668E+01 6.06880E+01 5.36897E+00 9.56271E+00 + 0.25646E+01 0.48332E+01 0.00000E+00 0.00000E+00 2 1.08055E-06 1.15214E+01 1.05877E-06 2.15821E-07 + 0.25646E+01 0.48332E+01 0.00000E+00 0.00000E+00 4 2.29727E-06 -1.62826E+01 2.20513E-06 -6.44098E-07 + 0.25646E+01 0.48332E+01 0.00000E+00 0.00000E+00 6 1.70603E-04 1.18914E+01 1.66942E-04 3.51541E-05 + 0.25133E+01 0.48332E+01 0.00000E+00 0.00000E+00 1 1.05609E+01 -8.62247E+01 6.95368E-01 -1.05380E+01 + 0.25133E+01 0.48332E+01 0.00000E+00 0.00000E+00 3 6.37168E-01 1.00801E+01 6.27333E-01 1.11520E-01 + 0.25133E+01 0.48332E+01 0.00000E+00 0.00000E+00 5 6.56575E+01 8.51396E+01 5.56305E+00 6.54214E+01 + 0.25133E+01 0.48332E+01 0.00000E+00 0.00000E+00 2 2.03295E-06 5.13828E+01 1.26879E-06 1.58841E-06 + 0.25133E+01 0.48332E+01 0.00000E+00 0.00000E+00 4 4.66140E-06 1.67772E+02 -4.55565E-06 9.87261E-07 + 0.25133E+01 0.48332E+01 0.00000E+00 0.00000E+00 6 1.07278E-04 1.54967E+02 -9.72004E-05 4.53944E-05 + 0.24640E+01 0.48332E+01 0.00000E+00 0.00000E+00 1 1.27994E+01 -7.84852E+01 2.55502E+00 -1.25418E+01 + 0.24640E+01 0.48332E+01 0.00000E+00 0.00000E+00 3 4.94420E-01 1.10521E+02 -1.73323E-01 4.63045E-01 + 0.24640E+01 0.48332E+01 0.00000E+00 0.00000E+00 5 5.64381E+01 1.31005E+02 -3.70306E+01 4.25910E+01 + 0.24640E+01 0.48332E+01 0.00000E+00 0.00000E+00 2 2.20938E-06 1.36289E+02 -1.59702E-06 1.52672E-06 + 0.24640E+01 0.48332E+01 0.00000E+00 0.00000E+00 4 1.91932E-07 6.19834E+01 9.01557E-08 1.69439E-07 + 0.24640E+01 0.48332E+01 0.00000E+00 0.00000E+00 6 4.38317E-05 5.48782E+01 2.52171E-05 3.58513E-05 + 0.24166E+01 0.48332E+01 0.00000E+00 0.00000E+00 1 5.39650E+00 -7.78313E+01 1.13753E+00 -5.27525E+00 + 0.24166E+01 0.48332E+01 0.00000E+00 0.00000E+00 3 1.23552E+00 -1.55283E+02 -1.12232E+00 -5.16618E-01 + 0.24166E+01 0.48332E+01 0.00000E+00 0.00000E+00 5 2.90920E+01 1.68706E+02 -2.85286E+01 5.69751E+00 + 0.24166E+01 0.48332E+01 0.00000E+00 0.00000E+00 2 1.24849E-06 -4.77788E+01 8.38979E-07 -9.24578E-07 + 0.24166E+01 0.48332E+01 0.00000E+00 0.00000E+00 4 1.42469E-07 -1.62425E+02 -1.35819E-07 -4.30185E-08 + 0.24166E+01 0.48332E+01 0.00000E+00 0.00000E+00 6 2.14377E-04 7.10893E+01 6.94781E-05 2.02806E-04 + 0.23710E+01 0.48332E+01 0.00000E+00 0.00000E+00 1 8.75869E+00 -1.51462E+02 -7.69453E+00 -4.18436E+00 + 0.23710E+01 0.48332E+01 0.00000E+00 0.00000E+00 3 1.21269E+00 -1.36615E+02 -8.81333E-01 -8.32985E-01 + 0.23710E+01 0.48332E+01 0.00000E+00 0.00000E+00 5 3.76464E+01 -1.84101E+01 3.57196E+01 -1.18893E+01 + 0.23710E+01 0.48332E+01 0.00000E+00 0.00000E+00 2 2.78226E-06 1.06855E+02 -8.06736E-07 2.66273E-06 + 0.23710E+01 0.48332E+01 0.00000E+00 0.00000E+00 4 5.39561E-06 8.54686E+01 4.26282E-07 5.37874E-06 + 0.23710E+01 0.48332E+01 0.00000E+00 0.00000E+00 6 2.20271E-04 -8.07641E+01 3.53534E-05 -2.17416E-04 + 0.23271E+01 0.48332E+01 0.00000E+00 0.00000E+00 1 1.31917E+01 -1.48560E+02 -1.12550E+01 -6.88079E+00 + 0.23271E+01 0.48332E+01 0.00000E+00 0.00000E+00 3 5.57510E-01 -1.35576E+02 -3.98162E-01 -3.90236E-01 + 0.23271E+01 0.48332E+01 0.00000E+00 0.00000E+00 5 6.11752E+01 6.03850E+00 6.08357E+01 6.43543E+00 + 0.23271E+01 0.48332E+01 0.00000E+00 0.00000E+00 2 8.16892E-07 -6.95722E+01 2.85117E-07 -7.65520E-07 + 0.23271E+01 0.48332E+01 0.00000E+00 0.00000E+00 4 1.56550E-06 1.03005E+02 -3.52307E-07 1.52535E-06 + 0.23271E+01 0.48332E+01 0.00000E+00 0.00000E+00 6 3.92997E-05 1.85961E+01 3.72479E-05 1.25325E-05 + 0.22848E+01 0.48332E+01 0.00000E+00 0.00000E+00 1 6.28677E+00 -1.33302E+02 -4.31172E+00 -4.57521E+00 + 0.22848E+01 0.48332E+01 0.00000E+00 0.00000E+00 3 4.95118E-01 1.28465E+02 -3.07984E-01 3.87670E-01 + 0.22848E+01 0.48332E+01 0.00000E+00 0.00000E+00 5 3.71250E+01 3.49568E+01 3.04271E+01 2.12711E+01 + 0.22848E+01 0.48332E+01 0.00000E+00 0.00000E+00 2 1.45025E-06 -2.53847E+01 1.31023E-06 -6.21713E-07 + 0.22848E+01 0.48332E+01 0.00000E+00 0.00000E+00 4 1.58951E-06 -1.17552E+02 -7.35237E-07 -1.40925E-06 + 0.22848E+01 0.48332E+01 0.00000E+00 0.00000E+00 6 5.14833E-05 -5.32402E+01 3.08108E-05 -4.12459E-05 + 0.22440E+01 0.48332E+01 0.00000E+00 0.00000E+00 1 3.50430E+00 -6.41035E+01 1.53049E+00 -3.15242E+00 + 0.22440E+01 0.48332E+01 0.00000E+00 0.00000E+00 3 2.53868E-01 1.18666E+02 -1.21782E-01 2.22751E-01 + 0.22440E+01 0.48332E+01 0.00000E+00 0.00000E+00 5 1.93677E+01 8.78491E+01 7.26903E-01 1.93541E+01 + 0.22440E+01 0.48332E+01 0.00000E+00 0.00000E+00 2 1.63987E-06 -5.62461E+01 9.11158E-07 -1.36344E-06 + 0.22440E+01 0.48332E+01 0.00000E+00 0.00000E+00 4 2.84991E-06 1.28568E+02 -1.77675E-06 2.22827E-06 + 0.22440E+01 0.48332E+01 0.00000E+00 0.00000E+00 6 8.78713E-05 1.32914E+02 -5.98316E-05 6.43549E-05 + 0.22046E+01 0.48332E+01 0.00000E+00 0.00000E+00 1 3.66869E-01 6.28073E+01 1.67654E-01 3.26321E-01 + 0.22046E+01 0.48332E+01 0.00000E+00 0.00000E+00 3 3.53485E-01 1.72663E+02 -3.50591E-01 4.51420E-02 + 0.22046E+01 0.48332E+01 0.00000E+00 0.00000E+00 5 1.03054E+01 -8.42659E+01 1.02963E+00 -1.02539E+01 + 0.22046E+01 0.48332E+01 0.00000E+00 0.00000E+00 2 4.86330E-07 -3.43568E+01 4.01484E-07 -2.74458E-07 + 0.22046E+01 0.48332E+01 0.00000E+00 0.00000E+00 4 3.33287E-07 1.69119E+02 -3.27296E-07 6.29140E-08 + 0.22046E+01 0.48332E+01 0.00000E+00 0.00000E+00 6 1.31059E-05 9.51348E+01 -1.17297E-06 1.30533E-05 + 0.21666E+01 0.48332E+01 0.00000E+00 0.00000E+00 1 1.27873E+00 -2.10489E+01 1.19341E+00 -4.59275E-01 + 0.21666E+01 0.48332E+01 0.00000E+00 0.00000E+00 3 4.76858E-01 -5.07315E+00 4.74990E-01 -4.21674E-02 + 0.21666E+01 0.48332E+01 0.00000E+00 0.00000E+00 5 1.78203E+01 -1.03311E+02 -4.10277E+00 -1.73416E+01 + 0.21666E+01 0.48332E+01 0.00000E+00 0.00000E+00 2 9.14117E-07 -9.71371E+00 9.01011E-07 -1.54235E-07 + 0.21666E+01 0.48332E+01 0.00000E+00 0.00000E+00 4 1.36950E-06 -1.24376E+02 -7.73251E-07 -1.13032E-06 + 0.21666E+01 0.48332E+01 0.00000E+00 0.00000E+00 6 1.89661E-04 7.47085E+01 5.00191E-05 1.82946E-04 + 0.21299E+01 0.48332E+01 0.00000E+00 0.00000E+00 1 5.72659E+00 -2.79141E+00 5.71980E+00 -2.78885E-01 + 0.21299E+01 0.48332E+01 0.00000E+00 0.00000E+00 3 3.44330E-01 -4.58230E+01 2.39956E-01 -2.46951E-01 + 0.21299E+01 0.48332E+01 0.00000E+00 0.00000E+00 5 1.37471E+01 -1.36426E+02 -9.95957E+00 -9.47570E+00 + 0.21299E+01 0.48332E+01 0.00000E+00 0.00000E+00 2 6.04199E-07 7.47776E+01 1.58642E-07 5.83000E-07 + 0.21299E+01 0.48332E+01 0.00000E+00 0.00000E+00 4 1.63791E-06 -1.38232E+01 1.59048E-06 -3.91342E-07 + 0.21299E+01 0.48332E+01 0.00000E+00 0.00000E+00 6 8.72882E-05 -1.78363E+01 8.30927E-05 -2.67363E-05 + 0.20944E+01 0.48332E+01 0.00000E+00 0.00000E+00 1 4.83848E+00 4.42904E+01 3.46343E+00 3.37869E+00 + 0.20944E+01 0.48332E+01 0.00000E+00 0.00000E+00 3 2.05584E-01 -6.36087E+00 2.04318E-01 -2.27767E-02 + 0.20944E+01 0.48332E+01 0.00000E+00 0.00000E+00 5 1.71840E+01 -1.15706E+02 -7.45362E+00 -1.54833E+01 + 0.20944E+01 0.48332E+01 0.00000E+00 0.00000E+00 2 6.04098E-07 6.83354E+01 2.23016E-07 5.61426E-07 + 0.20944E+01 0.48332E+01 0.00000E+00 0.00000E+00 4 9.01799E-07 6.40653E+01 3.94400E-07 8.10982E-07 + 0.20944E+01 0.48332E+01 0.00000E+00 0.00000E+00 6 2.98284E-06 7.57160E+01 7.35953E-07 2.89063E-06 + 0.46542E+01 0.46542E+01 0.00000E+00 0.00000E+00 1 1.08409E+01 0.00000E+00 1.08409E+01 0.00000E+00 + 0.46542E+01 0.46542E+01 0.00000E+00 0.00000E+00 3 2.01273E+00 0.00000E+00 2.01273E+00 0.00000E+00 + 0.46542E+01 0.46542E+01 0.00000E+00 0.00000E+00 5 1.65837E+01 0.00000E+00 1.65837E+01 0.00000E+00 + 0.46542E+01 0.46542E+01 0.00000E+00 0.00000E+00 2 9.65052E-06 1.80000E+02 -9.65052E-06 0.00000E+00 + 0.46542E+01 0.46542E+01 0.00000E+00 0.00000E+00 4 8.82891E-05 1.80000E+02 -8.82891E-05 0.00000E+00 + 0.46542E+01 0.46542E+01 0.00000E+00 0.00000E+00 6 6.59716E-05 0.00000E+00 6.59716E-05 0.00000E+00 + 0.44880E+01 0.46542E+01 0.00000E+00 0.00000E+00 1 9.46095E+00 -4.15104E-01 9.46070E+00 -6.85434E-02 + 0.44880E+01 0.46542E+01 0.00000E+00 0.00000E+00 3 1.71168E+00 -3.66090E+00 1.70818E+00 -1.09293E-01 + 0.44880E+01 0.46542E+01 0.00000E+00 0.00000E+00 5 2.49622E+01 4.65027E+01 1.71820E+01 1.81077E+01 + 0.44880E+01 0.46542E+01 0.00000E+00 0.00000E+00 2 1.38581E-06 4.66573E+01 9.51168E-07 1.00785E-06 + 0.44880E+01 0.46542E+01 0.00000E+00 0.00000E+00 4 1.89982E-05 2.37919E+01 1.73837E-05 7.66418E-06 + 0.44880E+01 0.46542E+01 0.00000E+00 0.00000E+00 6 2.56113E-04 -1.19745E+01 2.50540E-04 -5.31372E-05 + 0.43332E+01 0.46542E+01 0.00000E+00 0.00000E+00 1 6.02833E+00 -1.71330E+01 5.76081E+00 -1.77589E+00 + 0.43332E+01 0.46542E+01 0.00000E+00 0.00000E+00 3 3.65292E+00 5.79460E-01 3.65274E+00 3.69431E-02 + 0.43332E+01 0.46542E+01 0.00000E+00 0.00000E+00 5 6.05989E+01 6.68092E+01 2.38635E+01 5.57024E+01 + 0.43332E+01 0.46542E+01 0.00000E+00 0.00000E+00 2 6.89207E-06 -1.39069E+02 -5.20692E-06 -4.51538E-06 + 0.43332E+01 0.46542E+01 0.00000E+00 0.00000E+00 4 1.68936E-05 9.38698E+00 1.66673E-05 2.75537E-06 + 0.43332E+01 0.46542E+01 0.00000E+00 0.00000E+00 6 1.76494E-04 -6.29574E+01 8.02437E-05 -1.57198E-04 + 0.41888E+01 0.46542E+01 0.00000E+00 0.00000E+00 1 2.91165E+00 -8.30896E+01 3.50319E-01 -2.89050E+00 + 0.41888E+01 0.46542E+01 0.00000E+00 0.00000E+00 3 5.40012E+00 1.22021E-02 5.40012E+00 1.15005E-03 + 0.41888E+01 0.46542E+01 0.00000E+00 0.00000E+00 5 1.06919E+02 7.51024E+01 2.74879E+01 1.03325E+02 + 0.41888E+01 0.46542E+01 0.00000E+00 0.00000E+00 2 1.67979E-06 1.00709E+02 -3.12133E-07 1.65054E-06 + 0.41888E+01 0.46542E+01 0.00000E+00 0.00000E+00 4 4.50920E-06 2.30276E+01 4.14989E-06 1.76388E-06 + 0.41888E+01 0.46542E+01 0.00000E+00 0.00000E+00 6 3.53499E-04 -1.49855E+01 3.41477E-04 -9.14061E-05 + 0.40537E+01 0.46542E+01 0.00000E+00 0.00000E+00 1 5.75761E+00 -1.52850E+02 -5.12322E+00 -2.62729E+00 + 0.40537E+01 0.46542E+01 0.00000E+00 0.00000E+00 3 5.49138E+00 -3.27318E-01 5.49129E+00 -3.13708E-02 + 0.40537E+01 0.46542E+01 0.00000E+00 0.00000E+00 5 1.29194E+02 8.83921E+01 3.62513E+00 1.29143E+02 + 0.40537E+01 0.46542E+01 0.00000E+00 0.00000E+00 2 6.27261E-06 1.78081E+02 -6.26909E-06 2.10016E-07 + 0.40537E+01 0.46542E+01 0.00000E+00 0.00000E+00 4 1.13844E-05 1.59813E+02 -1.06850E-05 3.92857E-06 + 0.40537E+01 0.46542E+01 0.00000E+00 0.00000E+00 6 9.80759E-05 8.41031E+01 1.00762E-05 9.75569E-05 + 0.39270E+01 0.46542E+01 0.00000E+00 0.00000E+00 1 9.16210E+00 -1.72833E+02 -9.09052E+00 -1.14309E+00 + 0.39270E+01 0.46542E+01 0.00000E+00 0.00000E+00 3 5.53163E+00 -2.74032E+01 4.91093E+00 -2.54593E+00 + 0.39270E+01 0.46542E+01 0.00000E+00 0.00000E+00 5 1.27873E+02 8.83149E+01 3.76024E+00 1.27818E+02 + 0.39270E+01 0.46542E+01 0.00000E+00 0.00000E+00 2 2.05636E-06 -1.05863E+02 -5.62074E-07 -1.97805E-06 + 0.39270E+01 0.46542E+01 0.00000E+00 0.00000E+00 4 1.33401E-05 -8.54271E+01 1.06358E-06 -1.32976E-05 + 0.39270E+01 0.46542E+01 0.00000E+00 0.00000E+00 6 8.87322E-05 -2.58481E+01 7.98548E-05 -3.86860E-05 + 0.38080E+01 0.46542E+01 0.00000E+00 0.00000E+00 1 9.51327E+00 -1.76014E+02 -9.49025E+00 -6.61376E-01 + 0.38080E+01 0.46542E+01 0.00000E+00 0.00000E+00 3 6.40721E+00 -6.84535E+01 2.35309E+00 -5.95947E+00 + 0.38080E+01 0.46542E+01 0.00000E+00 0.00000E+00 5 7.42168E+01 8.16261E+01 1.08084E+01 7.34255E+01 + 0.38080E+01 0.46542E+01 0.00000E+00 0.00000E+00 2 2.58546E-06 -1.55740E+02 -2.35714E-06 -1.06231E-06 + 0.38080E+01 0.46542E+01 0.00000E+00 0.00000E+00 4 7.57731E-06 -9.84820E+01 -1.11764E-06 -7.49443E-06 + 0.38080E+01 0.46542E+01 0.00000E+00 0.00000E+00 6 7.42063E-05 9.03764E+01 -4.87543E-07 7.42047E-05 + 0.36960E+01 0.46542E+01 0.00000E+00 0.00000E+00 1 6.03398E+00 -1.77079E+02 -6.02614E+00 -3.07448E-01 + 0.36960E+01 0.46542E+01 0.00000E+00 0.00000E+00 3 8.38618E+00 -9.09261E+01 -1.35543E-01 -8.38508E+00 + 0.36960E+01 0.46542E+01 0.00000E+00 0.00000E+00 5 2.25214E+01 8.94707E+01 2.08045E-01 2.25205E+01 + 0.36960E+01 0.46542E+01 0.00000E+00 0.00000E+00 2 7.89931E-06 -1.78740E+02 -7.89740E-06 -1.73703E-07 + 0.36960E+01 0.46542E+01 0.00000E+00 0.00000E+00 4 3.36338E-07 -1.08346E+01 3.30342E-07 -6.32232E-08 + 0.36960E+01 0.46542E+01 0.00000E+00 0.00000E+00 6 3.55267E-04 7.45705E+00 3.52262E-04 4.61076E-05 + 0.35904E+01 0.46542E+01 0.00000E+00 0.00000E+00 1 2.27767E+00 -4.58419E+00 2.27038E+00 -1.82040E-01 + 0.35904E+01 0.46542E+01 0.00000E+00 0.00000E+00 3 8.33528E+00 -9.65905E+01 -9.56659E-01 -8.28020E+00 + 0.35904E+01 0.46542E+01 0.00000E+00 0.00000E+00 5 3.56218E+01 9.22071E+01 -1.37185E+00 3.55953E+01 + 0.35904E+01 0.46542E+01 0.00000E+00 0.00000E+00 2 8.49359E-06 -7.08828E+01 2.78166E-06 -8.02518E-06 + 0.35904E+01 0.46542E+01 0.00000E+00 0.00000E+00 4 7.82728E-06 1.66687E+02 -7.61695E-06 1.80234E-06 + 0.35904E+01 0.46542E+01 0.00000E+00 0.00000E+00 6 5.29534E-04 1.45779E+02 -4.37857E-04 2.97805E-04 + 0.34907E+01 0.46542E+01 0.00000E+00 0.00000E+00 1 1.09966E+01 2.68909E+01 9.80752E+00 4.97369E+00 + 0.34907E+01 0.46542E+01 0.00000E+00 0.00000E+00 3 7.95680E+00 -9.20732E+01 -2.87842E-01 -7.95159E+00 + 0.34907E+01 0.46542E+01 0.00000E+00 0.00000E+00 5 6.08364E+01 3.72031E+01 4.84560E+01 3.67842E+01 + 0.34907E+01 0.46542E+01 0.00000E+00 0.00000E+00 2 4.30854E-06 8.86784E+01 9.93722E-08 4.30739E-06 + 0.34907E+01 0.46542E+01 0.00000E+00 0.00000E+00 4 2.05975E-05 9.45562E+01 -1.63619E-06 2.05324E-05 + 0.34907E+01 0.46542E+01 0.00000E+00 0.00000E+00 6 1.91161E-04 1.29509E+02 -1.21618E-04 1.47484E-04 + 0.33963E+01 0.46542E+01 0.00000E+00 0.00000E+00 1 1.68832E+01 1.99092E+01 1.58742E+01 5.74926E+00 + 0.33963E+01 0.46542E+01 0.00000E+00 0.00000E+00 3 4.82276E+00 -1.20918E+02 -2.47799E+00 -4.13746E+00 + 0.33963E+01 0.46542E+01 0.00000E+00 0.00000E+00 5 4.00389E+01 4.61275E+01 2.77492E+01 2.88633E+01 + 0.33963E+01 0.46542E+01 0.00000E+00 0.00000E+00 2 5.82395E-07 -9.25349E+01 -2.57580E-08 -5.81825E-07 + 0.33963E+01 0.46542E+01 0.00000E+00 0.00000E+00 4 2.03909E-06 -1.51311E+02 -1.78877E-06 -9.78874E-07 + 0.33963E+01 0.46542E+01 0.00000E+00 0.00000E+00 6 7.50381E-05 -1.42586E+02 -5.96006E-05 -4.55904E-05 + 0.33069E+01 0.46542E+01 0.00000E+00 0.00000E+00 1 1.32585E+01 1.57655E+01 1.27597E+01 3.60234E+00 + 0.33069E+01 0.46542E+01 0.00000E+00 0.00000E+00 3 3.25371E+00 1.62348E+02 -3.10052E+00 9.86632E-01 + 0.33069E+01 0.46542E+01 0.00000E+00 0.00000E+00 5 5.16749E+01 8.89101E+01 9.82902E-01 5.16655E+01 + 0.33069E+01 0.46542E+01 0.00000E+00 0.00000E+00 2 3.38507E-06 -1.57731E+02 -3.13259E-06 -1.28278E-06 + 0.33069E+01 0.46542E+01 0.00000E+00 0.00000E+00 4 7.47223E-06 -2.88573E+01 6.54436E-06 -3.60633E-06 + 0.33069E+01 0.46542E+01 0.00000E+00 0.00000E+00 6 9.01929E-05 1.67240E+02 -8.79655E-05 1.99205E-05 + 0.32221E+01 0.46542E+01 0.00000E+00 0.00000E+00 1 1.19235E+01 -4.07648E+01 9.03082E+00 -7.78553E+00 + 0.32221E+01 0.46542E+01 0.00000E+00 0.00000E+00 3 3.90671E+00 1.33688E+02 -2.69850E+00 2.82498E+00 + 0.32221E+01 0.46542E+01 0.00000E+00 0.00000E+00 5 1.31979E+02 9.77302E+01 -1.77524E+01 1.30780E+02 + 0.32221E+01 0.46542E+01 0.00000E+00 0.00000E+00 2 4.83330E-06 -3.90876E+01 3.75153E-06 -3.04744E-06 + 0.32221E+01 0.46542E+01 0.00000E+00 0.00000E+00 4 1.46975E-05 9.46731E+01 -1.19740E-06 1.46487E-05 + 0.32221E+01 0.46542E+01 0.00000E+00 0.00000E+00 6 1.36881E-04 8.59982E+01 9.55276E-06 1.36548E-04 + 0.31416E+01 0.46542E+01 0.00000E+00 0.00000E+00 1 2.50933E+01 -8.69055E+01 1.35463E+00 -2.50567E+01 + 0.31416E+01 0.46542E+01 0.00000E+00 0.00000E+00 3 3.83416E+00 1.18822E+02 -1.84843E+00 3.35917E+00 + 0.31416E+01 0.46542E+01 0.00000E+00 0.00000E+00 5 1.11381E+02 8.03687E+01 1.86348E+01 1.09811E+02 + 0.31416E+01 0.46542E+01 0.00000E+00 0.00000E+00 2 3.39797E-06 2.13182E+00 3.39562E-06 1.26400E-07 + 0.31416E+01 0.46542E+01 0.00000E+00 0.00000E+00 4 4.01928E-06 9.04324E+01 -3.03344E-08 4.01916E-06 + 0.31416E+01 0.46542E+01 0.00000E+00 0.00000E+00 6 3.74698E-04 7.62794E+01 8.88733E-05 3.64005E-04 + 0.30650E+01 0.46542E+01 0.00000E+00 0.00000E+00 1 3.20708E+01 -9.58358E+01 -3.26087E+00 -3.19046E+01 + 0.30650E+01 0.46542E+01 0.00000E+00 0.00000E+00 3 1.19621E+00 -1.78490E+02 -1.19579E+00 -3.15264E-02 + 0.30650E+01 0.46542E+01 0.00000E+00 0.00000E+00 5 7.77592E+01 1.16154E+02 -3.42755E+01 6.97975E+01 + 0.30650E+01 0.46542E+01 0.00000E+00 0.00000E+00 2 4.75826E-06 -8.84318E+01 1.30221E-07 -4.75647E-06 + 0.30650E+01 0.46542E+01 0.00000E+00 0.00000E+00 4 6.08711E-06 -1.65761E+02 -5.90009E-06 -1.49727E-06 + 0.30650E+01 0.46542E+01 0.00000E+00 0.00000E+00 6 5.82750E-05 2.88880E+01 5.10236E-05 2.81526E-05 + 0.29920E+01 0.46542E+01 0.00000E+00 0.00000E+00 1 2.43242E+01 -1.06896E+02 -7.06968E+00 -2.32742E+01 + 0.29920E+01 0.46542E+01 0.00000E+00 0.00000E+00 3 1.71157E+00 -1.36557E+02 -1.24269E+00 -1.17694E+00 + 0.29920E+01 0.46542E+01 0.00000E+00 0.00000E+00 5 5.71352E+01 9.62607E+01 -6.23071E+00 5.67944E+01 + 0.29920E+01 0.46542E+01 0.00000E+00 0.00000E+00 2 3.53527E-06 1.01731E+02 -7.18786E-07 3.46142E-06 + 0.29920E+01 0.46542E+01 0.00000E+00 0.00000E+00 4 4.46172E-06 3.23699E+01 3.76841E-06 2.38873E-06 + 0.29920E+01 0.46542E+01 0.00000E+00 0.00000E+00 6 6.45984E-05 -1.55556E+02 -5.88080E-05 -2.67315E-05 + 0.29224E+01 0.46542E+01 0.00000E+00 0.00000E+00 1 1.32283E+01 -1.66318E+02 -1.28530E+01 -3.12885E+00 + 0.29224E+01 0.46542E+01 0.00000E+00 0.00000E+00 3 6.52058E-01 -8.65270E+01 3.95010E-02 -6.50860E-01 + 0.29224E+01 0.46542E+01 0.00000E+00 0.00000E+00 5 1.01495E+02 9.01129E+00 1.00242E+02 1.58970E+01 + 0.29224E+01 0.46542E+01 0.00000E+00 0.00000E+00 2 3.68755E-07 -1.72979E+02 -3.65990E-07 -4.50733E-08 + 0.29224E+01 0.46542E+01 0.00000E+00 0.00000E+00 4 6.69941E-06 -1.70548E+02 -6.60846E-06 -1.10020E-06 + 0.29224E+01 0.46542E+01 0.00000E+00 0.00000E+00 6 1.18505E-04 2.56697E+01 1.06810E-04 5.13343E-05 + 0.28560E+01 0.46542E+01 0.00000E+00 0.00000E+00 1 2.06074E+01 1.43963E+02 -1.66639E+01 1.21235E+01 + 0.28560E+01 0.46542E+01 0.00000E+00 0.00000E+00 3 1.30648E+00 -1.38602E+01 1.26844E+00 -3.12972E-01 + 0.28560E+01 0.46542E+01 0.00000E+00 0.00000E+00 5 1.83429E+02 -1.63682E+00 1.83354E+02 -5.23946E+00 + 0.28560E+01 0.46542E+01 0.00000E+00 0.00000E+00 2 2.06518E-06 -1.27030E+01 2.01463E-06 -4.54126E-07 + 0.28560E+01 0.46542E+01 0.00000E+00 0.00000E+00 4 1.17051E-07 -1.40697E+00 1.17016E-07 -2.87405E-09 + 0.28560E+01 0.46542E+01 0.00000E+00 0.00000E+00 6 3.38916E-04 3.96723E+00 3.38104E-04 2.34482E-05 + 0.27925E+01 0.46542E+01 0.00000E+00 0.00000E+00 1 1.66763E+01 1.39610E+02 -1.27015E+01 1.08060E+01 + 0.27925E+01 0.46542E+01 0.00000E+00 0.00000E+00 3 9.21958E-01 -3.21556E+01 7.80535E-01 -4.90684E-01 + 0.27925E+01 0.46542E+01 0.00000E+00 0.00000E+00 5 1.46778E+02 6.42831E-01 1.46769E+02 1.64674E+00 + 0.27925E+01 0.46542E+01 0.00000E+00 0.00000E+00 2 1.05831E-06 -7.55007E+01 2.64967E-07 -1.02460E-06 + 0.27925E+01 0.46542E+01 0.00000E+00 0.00000E+00 4 2.74319E-06 -1.05741E+02 -7.44195E-07 -2.64031E-06 + 0.27925E+01 0.46542E+01 0.00000E+00 0.00000E+00 6 8.41903E-05 -6.52032E+00 8.36457E-05 -9.56027E-06 + 0.27318E+01 0.46542E+01 0.00000E+00 0.00000E+00 1 3.91223E+00 -1.74609E+02 -3.89493E+00 -3.67540E-01 + 0.27318E+01 0.46542E+01 0.00000E+00 0.00000E+00 3 2.72267E+00 -1.07883E+02 -8.36079E-01 -2.59112E+00 + 0.27318E+01 0.46542E+01 0.00000E+00 0.00000E+00 5 3.93988E+01 3.08576E+01 3.38217E+01 2.02078E+01 + 0.27318E+01 0.46542E+01 0.00000E+00 0.00000E+00 2 1.04844E-06 8.29296E+01 1.29052E-07 1.04046E-06 + 0.27318E+01 0.46542E+01 0.00000E+00 0.00000E+00 4 8.17425E-07 2.40871E+01 7.46249E-07 3.33611E-07 + 0.27318E+01 0.46542E+01 0.00000E+00 0.00000E+00 6 1.45471E-04 1.68996E+01 1.39189E-04 4.22877E-05 + 0.26737E+01 0.46542E+01 0.00000E+00 0.00000E+00 1 9.82422E+00 -1.03295E+01 9.66500E+00 -1.76157E+00 + 0.26737E+01 0.46542E+01 0.00000E+00 0.00000E+00 3 3.68708E+00 -1.45839E+02 -3.05092E+00 -2.07037E+00 + 0.26737E+01 0.46542E+01 0.00000E+00 0.00000E+00 5 6.24661E+01 1.71379E+02 -6.17604E+01 9.36325E+00 + 0.26737E+01 0.46542E+01 0.00000E+00 0.00000E+00 2 1.73370E-06 -1.11186E+02 -6.26556E-07 -1.61652E-06 + 0.26737E+01 0.46542E+01 0.00000E+00 0.00000E+00 4 1.77585E-05 8.27823E+01 2.23117E-06 1.76177E-05 + 0.26737E+01 0.46542E+01 0.00000E+00 0.00000E+00 6 1.69999E-04 5.47321E+01 9.81574E-05 1.38798E-04 + 0.26180E+01 0.46542E+01 0.00000E+00 0.00000E+00 1 1.55906E+01 4.50344E+00 1.55424E+01 1.22416E+00 + 0.26180E+01 0.46542E+01 0.00000E+00 0.00000E+00 3 1.46226E+00 1.79538E+02 -1.46221E+00 1.18027E-02 + 0.26180E+01 0.46542E+01 0.00000E+00 0.00000E+00 5 6.33406E+01 -1.50289E+02 -5.50137E+01 -3.13932E+01 + 0.26180E+01 0.46542E+01 0.00000E+00 0.00000E+00 2 3.15654E-06 1.61399E+02 -2.99165E-06 1.00686E-06 + 0.26180E+01 0.46542E+01 0.00000E+00 0.00000E+00 4 6.64136E-07 -3.66522E+01 5.32819E-07 -3.96460E-07 + 0.26180E+01 0.46542E+01 0.00000E+00 0.00000E+00 6 9.08234E-05 -7.78938E+01 1.90479E-05 -8.88036E-05 + 0.25646E+01 0.46542E+01 0.00000E+00 0.00000E+00 1 8.86325E+00 -1.80546E+01 8.42684E+00 -2.74693E+00 + 0.25646E+01 0.46542E+01 0.00000E+00 0.00000E+00 3 1.60068E+00 1.50408E+01 1.54584E+00 4.15387E-01 + 0.25646E+01 0.46542E+01 0.00000E+00 0.00000E+00 5 2.74521E+01 -1.22700E+02 -1.48306E+01 -2.31013E+01 + 0.25646E+01 0.46542E+01 0.00000E+00 0.00000E+00 2 2.96415E-07 -6.02400E+01 1.47131E-07 -2.57322E-07 + 0.25646E+01 0.46542E+01 0.00000E+00 0.00000E+00 4 4.47366E-06 4.42923E+01 3.20218E-06 3.12404E-06 + 0.25646E+01 0.46542E+01 0.00000E+00 0.00000E+00 6 3.29782E-04 1.79494E+02 -3.29769E-04 2.91440E-06 + 0.25133E+01 0.46542E+01 0.00000E+00 0.00000E+00 1 8.24895E+00 -7.59011E+01 2.00941E+00 -8.00046E+00 + 0.25133E+01 0.46542E+01 0.00000E+00 0.00000E+00 3 1.98328E+00 5.50875E+00 1.97412E+00 1.90390E-01 + 0.25133E+01 0.46542E+01 0.00000E+00 0.00000E+00 5 4.94510E+01 7.95770E+01 8.94634E+00 4.86350E+01 + 0.25133E+01 0.46542E+01 0.00000E+00 0.00000E+00 2 7.83438E-07 5.81119E+00 7.79412E-07 7.93235E-08 + 0.25133E+01 0.46542E+01 0.00000E+00 0.00000E+00 4 2.09427E-06 1.26537E+02 -1.24681E-06 1.68269E-06 + 0.25133E+01 0.46542E+01 0.00000E+00 0.00000E+00 6 1.69178E-04 9.49695E+01 -1.46551E-05 1.68542E-04 + 0.24640E+01 0.46542E+01 0.00000E+00 0.00000E+00 1 1.52592E+01 -8.55843E+01 1.17483E+00 -1.52139E+01 + 0.24640E+01 0.46542E+01 0.00000E+00 0.00000E+00 3 7.74396E-01 4.97247E+01 5.00617E-01 5.90823E-01 + 0.24640E+01 0.46542E+01 0.00000E+00 0.00000E+00 5 6.17472E+01 9.89024E+01 -9.55544E+00 6.10034E+01 + 0.24640E+01 0.46542E+01 0.00000E+00 0.00000E+00 2 3.45826E-06 -7.00863E+00 3.43242E-06 -4.21973E-07 + 0.24640E+01 0.46542E+01 0.00000E+00 0.00000E+00 4 6.62089E-06 3.80541E+01 5.21348E-06 4.08115E-06 + 0.24640E+01 0.46542E+01 0.00000E+00 0.00000E+00 6 7.92283E-05 3.27693E+01 6.66197E-05 4.28830E-05 + 0.24166E+01 0.46542E+01 0.00000E+00 0.00000E+00 1 8.11793E+00 -7.59950E+01 1.96459E+00 -7.87663E+00 + 0.24166E+01 0.46542E+01 0.00000E+00 0.00000E+00 3 7.58032E-01 -1.46931E+02 -6.35241E-01 -4.13619E-01 + 0.24166E+01 0.46542E+01 0.00000E+00 0.00000E+00 5 4.55735E+01 1.54560E+02 -4.11546E+01 1.95766E+01 + 0.24166E+01 0.46542E+01 0.00000E+00 0.00000E+00 2 9.90009E-07 -2.19411E+01 9.18302E-07 -3.69920E-07 + 0.24166E+01 0.46542E+01 0.00000E+00 0.00000E+00 4 9.11880E-07 -5.35796E+01 5.41388E-07 -7.33774E-07 + 0.24166E+01 0.46542E+01 0.00000E+00 0.00000E+00 6 9.69887E-05 -9.58958E+01 -9.96258E-06 -9.64757E-05 + 0.23710E+01 0.46542E+01 0.00000E+00 0.00000E+00 1 6.96888E+00 -1.43048E+02 -5.56909E+00 -4.18933E+00 + 0.23710E+01 0.46542E+01 0.00000E+00 0.00000E+00 3 1.08359E+00 -1.53817E+02 -9.72402E-01 -4.78114E-01 + 0.23710E+01 0.46542E+01 0.00000E+00 0.00000E+00 5 1.28855E+01 -4.50380E+01 9.10535E+00 -9.11743E+00 + 0.23710E+01 0.46542E+01 0.00000E+00 0.00000E+00 2 5.93908E-07 9.23721E+01 -2.45817E-08 5.93399E-07 + 0.23710E+01 0.46542E+01 0.00000E+00 0.00000E+00 4 3.66744E-06 -1.10860E+02 -1.30590E-06 -3.42705E-06 + 0.23710E+01 0.46542E+01 0.00000E+00 0.00000E+00 6 1.11409E-04 1.77212E+02 -1.11278E-04 5.41892E-06 + 0.23271E+01 0.46542E+01 0.00000E+00 0.00000E+00 1 1.13412E+01 -1.58358E+02 -1.05417E+01 -4.18263E+00 + 0.23271E+01 0.46542E+01 0.00000E+00 0.00000E+00 3 1.16026E+00 -1.18725E+02 -5.57630E-01 -1.01747E+00 + 0.23271E+01 0.46542E+01 0.00000E+00 0.00000E+00 5 5.04011E+01 2.54713E+00 5.03513E+01 2.23988E+00 + 0.23271E+01 0.46542E+01 0.00000E+00 0.00000E+00 2 1.02012E-06 1.58251E+02 -9.47504E-07 3.78003E-07 + 0.23271E+01 0.46542E+01 0.00000E+00 0.00000E+00 4 3.19311E-07 -1.71371E+01 3.05134E-07 -9.40879E-08 + 0.23271E+01 0.46542E+01 0.00000E+00 0.00000E+00 6 3.89382E-05 -8.49493E+01 3.42801E-06 -3.87870E-05 + 0.22848E+01 0.46542E+01 0.00000E+00 0.00000E+00 1 8.57056E+00 -1.38997E+02 -6.46802E+00 -5.62310E+00 + 0.22848E+01 0.46542E+01 0.00000E+00 0.00000E+00 3 2.80234E-01 -1.31492E+02 -1.85659E-01 -2.09909E-01 + 0.22848E+01 0.46542E+01 0.00000E+00 0.00000E+00 5 4.85387E+01 2.23672E+01 4.48868E+01 1.84710E+01 + 0.22848E+01 0.46542E+01 0.00000E+00 0.00000E+00 2 1.54378E-06 -4.73810E+01 1.04532E-06 -1.13603E-06 + 0.22848E+01 0.46542E+01 0.00000E+00 0.00000E+00 4 7.91354E-07 4.96946E+00 7.88379E-07 6.85508E-08 + 0.22848E+01 0.46542E+01 0.00000E+00 0.00000E+00 6 7.60684E-05 1.52108E+02 -6.72319E-05 3.55848E-05 + 0.22440E+01 0.46542E+01 0.00000E+00 0.00000E+00 1 1.56768E+00 -7.00888E+01 5.33896E-01 -1.47397E+00 + 0.22440E+01 0.46542E+01 0.00000E+00 0.00000E+00 3 6.85395E-01 1.08906E+02 -2.22084E-01 6.48417E-01 + 0.22440E+01 0.46542E+01 0.00000E+00 0.00000E+00 5 1.55926E+01 4.90208E+01 1.02254E+01 1.17716E+01 + 0.22440E+01 0.46542E+01 0.00000E+00 0.00000E+00 2 7.61186E-07 -7.43275E+01 2.05626E-07 -7.32887E-07 + 0.22440E+01 0.46542E+01 0.00000E+00 0.00000E+00 4 1.16428E-06 -8.67971E+01 6.50517E-08 -1.16246E-06 + 0.22440E+01 0.46542E+01 0.00000E+00 0.00000E+00 6 2.85245E-05 -1.38745E+02 -2.14443E-05 -1.88093E-05 + 0.22046E+01 0.46542E+01 0.00000E+00 0.00000E+00 1 2.74154E+00 4.43214E+01 1.96138E+00 1.91546E+00 + 0.22046E+01 0.46542E+01 0.00000E+00 0.00000E+00 3 2.61835E-01 1.58742E+02 -2.44020E-01 9.49312E-02 + 0.22046E+01 0.46542E+01 0.00000E+00 0.00000E+00 5 3.33730E+00 -1.08007E+02 -1.03167E+00 -3.17384E+00 + 0.22046E+01 0.46542E+01 0.00000E+00 0.00000E+00 2 9.62360E-08 -1.32354E+02 -6.48346E-08 -7.11185E-08 + 0.22046E+01 0.46542E+01 0.00000E+00 0.00000E+00 4 1.78861E-06 -8.51565E+01 1.51021E-07 -1.78222E-06 + 0.22046E+01 0.46542E+01 0.00000E+00 0.00000E+00 6 8.63866E-05 -2.06519E+01 8.08354E-05 -3.04676E-05 + 0.21666E+01 0.46542E+01 0.00000E+00 0.00000E+00 1 1.84819E+00 -2.83335E+01 1.62678E+00 -8.77156E-01 + 0.21666E+01 0.46542E+01 0.00000E+00 0.00000E+00 3 2.26351E-01 2.16419E+01 2.10395E-01 8.34792E-02 + 0.21666E+01 0.46542E+01 0.00000E+00 0.00000E+00 5 1.80425E+01 -1.16043E+02 -7.92136E+00 -1.62106E+01 + 0.21666E+01 0.46542E+01 0.00000E+00 0.00000E+00 2 1.98939E-07 -2.91068E+01 1.73816E-07 -9.67719E-08 + 0.21666E+01 0.46542E+01 0.00000E+00 0.00000E+00 4 2.09516E-07 5.25623E+01 1.27364E-07 1.66359E-07 + 0.21666E+01 0.46542E+01 0.00000E+00 0.00000E+00 6 1.08476E-04 -2.00664E-02 1.08476E-04 -3.79909E-08 + 0.21299E+01 0.46542E+01 0.00000E+00 0.00000E+00 1 5.70004E+00 -5.71380E+00 5.67172E+00 -5.67492E-01 + 0.21299E+01 0.46542E+01 0.00000E+00 0.00000E+00 3 5.29171E-01 5.40638E+00 5.26817E-01 4.98580E-02 + 0.21299E+01 0.46542E+01 0.00000E+00 0.00000E+00 5 2.09184E+01 -1.29827E+02 -1.33976E+01 -1.60651E+01 + 0.21299E+01 0.46542E+01 0.00000E+00 0.00000E+00 2 5.66860E-07 -5.07035E+01 3.59012E-07 -4.38681E-07 + 0.21299E+01 0.46542E+01 0.00000E+00 0.00000E+00 4 1.28650E-06 -1.32291E+02 -8.65687E-07 -9.51664E-07 + 0.21299E+01 0.46542E+01 0.00000E+00 0.00000E+00 6 9.66744E-05 -3.42580E+01 7.99025E-05 -5.44199E-05 + 0.20944E+01 0.46542E+01 0.00000E+00 0.00000E+00 1 5.40101E+00 1.97323E+01 5.08386E+00 1.82352E+00 + 0.20944E+01 0.46542E+01 0.00000E+00 0.00000E+00 3 3.74667E-01 2.53657E+01 3.38546E-01 1.60505E-01 + 0.20944E+01 0.46542E+01 0.00000E+00 0.00000E+00 5 1.47298E+01 -1.15011E+02 -6.22758E+00 -1.33486E+01 + 0.20944E+01 0.46542E+01 0.00000E+00 0.00000E+00 2 1.60977E-06 -1.75032E+02 -1.60372E-06 -1.39404E-07 + 0.20944E+01 0.46542E+01 0.00000E+00 0.00000E+00 4 1.09414E-06 4.38368E+01 7.89219E-07 7.57808E-07 + 0.20944E+01 0.46542E+01 0.00000E+00 0.00000E+00 6 4.73855E-05 1.47929E+01 4.58149E-05 1.20988E-05 + 0.44880E+01 0.44880E+01 0.00000E+00 0.00000E+00 1 8.20771E+00 0.00000E+00 8.20771E+00 0.00000E+00 + 0.44880E+01 0.44880E+01 0.00000E+00 0.00000E+00 3 1.23545E+00 0.00000E+00 1.23545E+00 0.00000E+00 + 0.44880E+01 0.44880E+01 0.00000E+00 0.00000E+00 5 1.52004E+01 0.00000E+00 1.52004E+01 0.00000E+00 + 0.44880E+01 0.44880E+01 0.00000E+00 0.00000E+00 2 2.82072E-06 0.00000E+00 2.82072E-06 0.00000E+00 + 0.44880E+01 0.44880E+01 0.00000E+00 0.00000E+00 4 7.74719E-06 1.80000E+02 -7.74719E-06 0.00000E+00 + 0.44880E+01 0.44880E+01 0.00000E+00 0.00000E+00 6 1.95014E-04 1.80000E+02 -1.95014E-04 0.00000E+00 + 0.43332E+01 0.44880E+01 0.00000E+00 0.00000E+00 1 5.37124E+00 -8.37639E-01 5.37066E+00 -7.85223E-02 + 0.43332E+01 0.44880E+01 0.00000E+00 0.00000E+00 3 1.31822E+00 -5.01532E+00 1.31317E+00 -1.15241E-01 + 0.43332E+01 0.44880E+01 0.00000E+00 0.00000E+00 5 2.82496E+01 3.64762E+01 2.27156E+01 1.67940E+01 + 0.43332E+01 0.44880E+01 0.00000E+00 0.00000E+00 2 7.39731E-06 -1.77241E+02 -7.38873E-06 -3.56130E-07 + 0.43332E+01 0.44880E+01 0.00000E+00 0.00000E+00 4 2.48040E-05 1.70534E+02 -2.44663E-05 4.07931E-06 + 0.43332E+01 0.44880E+01 0.00000E+00 0.00000E+00 6 2.70325E-04 -1.23129E+02 -1.47741E-04 -2.26381E-04 + 0.41888E+01 0.44880E+01 0.00000E+00 0.00000E+00 1 2.37925E+00 -3.91820E+01 1.84426E+00 -1.50318E+00 + 0.41888E+01 0.44880E+01 0.00000E+00 0.00000E+00 3 3.45166E+00 -7.34894E+00 3.42331E+00 -4.41508E-01 + 0.41888E+01 0.44880E+01 0.00000E+00 0.00000E+00 5 6.39842E+01 5.28859E+01 3.86083E+01 5.10233E+01 + 0.41888E+01 0.44880E+01 0.00000E+00 0.00000E+00 2 5.85022E-06 -2.32411E+00 5.84541E-06 -2.37239E-07 + 0.41888E+01 0.44880E+01 0.00000E+00 0.00000E+00 4 3.41337E-05 1.75141E+02 -3.40110E-05 2.89113E-06 + 0.41888E+01 0.44880E+01 0.00000E+00 0.00000E+00 6 2.82444E-04 -1.35105E+02 -2.00085E-04 -1.99350E-04 + 0.40537E+01 0.44880E+01 0.00000E+00 0.00000E+00 1 3.94354E+00 -1.11025E+02 -1.41486E+00 -3.68099E+00 + 0.40537E+01 0.44880E+01 0.00000E+00 0.00000E+00 3 4.62057E+00 -3.24295E+00 4.61317E+00 -2.61386E-01 + 0.40537E+01 0.44880E+01 0.00000E+00 0.00000E+00 5 9.58528E+01 7.39828E+01 2.64482E+01 9.21317E+01 + 0.40537E+01 0.44880E+01 0.00000E+00 0.00000E+00 2 3.47169E-06 -1.46085E+02 -2.88104E-06 -1.93708E-06 + 0.40537E+01 0.44880E+01 0.00000E+00 0.00000E+00 4 2.82485E-06 -1.70009E+02 -2.78200E-06 -4.90115E-07 + 0.40537E+01 0.44880E+01 0.00000E+00 0.00000E+00 6 3.36278E-04 -1.38216E+02 -2.50749E-04 -2.24072E-04 + 0.39270E+01 0.44880E+01 0.00000E+00 0.00000E+00 1 7.43450E+00 -1.58294E+02 -6.90733E+00 -2.74965E+00 + 0.39270E+01 0.44880E+01 0.00000E+00 0.00000E+00 3 5.61809E+00 -1.06262E+01 5.52174E+00 -1.03598E+00 + 0.39270E+01 0.44880E+01 0.00000E+00 0.00000E+00 5 1.30562E+02 7.94323E+01 2.39446E+01 1.28347E+02 + 0.39270E+01 0.44880E+01 0.00000E+00 0.00000E+00 2 2.58419E-06 1.10814E+00 2.58370E-06 4.99768E-08 + 0.39270E+01 0.44880E+01 0.00000E+00 0.00000E+00 4 9.97917E-06 1.11127E+02 -3.59686E-06 9.30841E-06 + 0.39270E+01 0.44880E+01 0.00000E+00 0.00000E+00 6 4.22164E-04 -1.88099E+01 3.99617E-04 -1.36118E-04 + 0.38080E+01 0.44880E+01 0.00000E+00 0.00000E+00 1 1.00516E+01 -1.77618E+02 -1.00429E+01 -4.17811E-01 + 0.38080E+01 0.44880E+01 0.00000E+00 0.00000E+00 3 5.52543E+00 -4.50597E+01 3.90299E+00 -3.91113E+00 + 0.38080E+01 0.44880E+01 0.00000E+00 0.00000E+00 5 1.04375E+02 7.82244E+01 2.13009E+01 1.02179E+02 + 0.38080E+01 0.44880E+01 0.00000E+00 0.00000E+00 2 4.48175E-06 -1.37943E+02 -3.32762E-06 -3.00217E-06 + 0.38080E+01 0.44880E+01 0.00000E+00 0.00000E+00 4 3.06780E-05 -1.27059E+02 -1.84877E-05 -2.44815E-05 + 0.38080E+01 0.44880E+01 0.00000E+00 0.00000E+00 6 1.06012E-04 1.48999E+02 -9.08691E-05 5.46027E-05 + 0.36960E+01 0.44880E+01 0.00000E+00 0.00000E+00 1 1.04423E+01 1.71817E+02 -1.03360E+01 1.48639E+00 + 0.36960E+01 0.44880E+01 0.00000E+00 0.00000E+00 3 7.10628E+00 -8.24452E+01 9.34292E-01 -7.04459E+00 + 0.36960E+01 0.44880E+01 0.00000E+00 0.00000E+00 5 4.96662E+01 7.98816E+01 8.72548E+00 4.88938E+01 + 0.36960E+01 0.44880E+01 0.00000E+00 0.00000E+00 2 2.06840E-06 -6.05915E+01 1.01565E-06 -1.80186E-06 + 0.36960E+01 0.44880E+01 0.00000E+00 0.00000E+00 4 7.72715E-06 -9.68657E+01 -9.23722E-07 -7.67174E-06 + 0.36960E+01 0.44880E+01 0.00000E+00 0.00000E+00 6 2.09872E-04 -1.67720E+02 -2.05070E-04 -4.46388E-05 + 0.35904E+01 0.44880E+01 0.00000E+00 0.00000E+00 1 5.79401E+00 1.72201E+02 -5.74042E+00 7.86251E-01 + 0.35904E+01 0.44880E+01 0.00000E+00 0.00000E+00 3 8.34659E+00 -9.74645E+01 -1.08432E+00 -8.27585E+00 + 0.35904E+01 0.44880E+01 0.00000E+00 0.00000E+00 5 4.13746E+01 6.45669E+01 1.77686E+01 3.73649E+01 + 0.35904E+01 0.44880E+01 0.00000E+00 0.00000E+00 2 2.31395E-06 -7.72457E+00 2.29295E-06 -3.11021E-07 + 0.35904E+01 0.44880E+01 0.00000E+00 0.00000E+00 4 1.90290E-06 -7.07303E+01 6.27986E-07 -1.79629E-06 + 0.35904E+01 0.44880E+01 0.00000E+00 0.00000E+00 6 2.38965E-05 -1.34099E+02 -1.66296E-05 -1.71609E-05 + 0.34907E+01 0.44880E+01 0.00000E+00 0.00000E+00 1 4.74138E+00 8.42594E+01 4.74254E-01 4.71760E+00 + 0.34907E+01 0.44880E+01 0.00000E+00 0.00000E+00 3 9.03825E+00 -9.11925E+01 -1.88093E-01 -9.03629E+00 + 0.34907E+01 0.44880E+01 0.00000E+00 0.00000E+00 5 7.20215E+01 1.91973E+01 6.80166E+01 2.36822E+01 + 0.34907E+01 0.44880E+01 0.00000E+00 0.00000E+00 2 9.56521E-06 9.79618E+01 -1.32490E-06 9.47300E-06 + 0.34907E+01 0.44880E+01 0.00000E+00 0.00000E+00 4 1.14631E-05 1.01071E+02 -2.20123E-06 1.12497E-05 + 0.34907E+01 0.44880E+01 0.00000E+00 0.00000E+00 6 1.14824E-04 9.82463E+00 1.13140E-04 1.95928E-05 + 0.33963E+01 0.44880E+01 0.00000E+00 0.00000E+00 1 1.41298E+01 2.97508E+01 1.22674E+01 7.01163E+00 + 0.33963E+01 0.44880E+01 0.00000E+00 0.00000E+00 3 7.57949E+00 -1.09438E+02 -2.52229E+00 -7.14750E+00 + 0.33963E+01 0.44880E+01 0.00000E+00 0.00000E+00 5 5.79701E+01 7.83744E+00 5.74286E+01 7.90497E+00 + 0.33963E+01 0.44880E+01 0.00000E+00 0.00000E+00 2 5.85396E-06 1.13502E+02 -2.33443E-06 5.36837E-06 + 0.33963E+01 0.44880E+01 0.00000E+00 0.00000E+00 4 3.55761E-05 7.60773E+01 8.56006E-06 3.45309E-05 + 0.33963E+01 0.44880E+01 0.00000E+00 0.00000E+00 6 2.72150E-04 -1.60028E+02 -2.55784E-04 -9.29547E-05 + 0.33069E+01 0.44880E+01 0.00000E+00 0.00000E+00 1 1.80036E+01 2.61719E+01 1.61578E+01 7.94079E+00 + 0.33069E+01 0.44880E+01 0.00000E+00 0.00000E+00 3 3.96228E+00 -1.55077E+02 -3.59329E+00 -1.66969E+00 + 0.33069E+01 0.44880E+01 0.00000E+00 0.00000E+00 5 3.41004E+01 2.93564E+01 2.97214E+01 1.67174E+01 + 0.33069E+01 0.44880E+01 0.00000E+00 0.00000E+00 2 1.89239E-06 1.64670E+02 -1.82505E-06 5.00320E-07 + 0.33069E+01 0.44880E+01 0.00000E+00 0.00000E+00 4 5.75905E-06 -4.10865E+01 4.34070E-06 -3.78484E-06 + 0.33069E+01 0.44880E+01 0.00000E+00 0.00000E+00 6 7.39804E-05 -7.42334E+01 2.01019E-05 -7.11970E-05 + 0.32221E+01 0.44880E+01 0.00000E+00 0.00000E+00 1 1.43397E+01 1.19128E+01 1.40309E+01 2.96004E+00 + 0.32221E+01 0.44880E+01 0.00000E+00 0.00000E+00 3 3.69151E+00 1.57100E+02 -3.40057E+00 1.43646E+00 + 0.32221E+01 0.44880E+01 0.00000E+00 0.00000E+00 5 7.05546E+01 9.72479E+01 -8.90137E+00 6.99908E+01 + 0.32221E+01 0.44880E+01 0.00000E+00 0.00000E+00 2 5.71585E-06 7.67887E+01 1.30632E-06 5.56457E-06 + 0.32221E+01 0.44880E+01 0.00000E+00 0.00000E+00 4 2.30255E-06 1.67796E+02 -2.25051E-06 4.86752E-07 + 0.32221E+01 0.44880E+01 0.00000E+00 0.00000E+00 6 9.29369E-05 -1.37274E+02 -6.82722E-05 -6.30569E-05 + 0.31416E+01 0.44880E+01 0.00000E+00 0.00000E+00 1 1.54847E+01 -6.14354E+01 7.40401E+00 -1.35999E+01 + 0.31416E+01 0.44880E+01 0.00000E+00 0.00000E+00 3 6.33386E+00 1.33251E+02 -4.33993E+00 4.61333E+00 + 0.31416E+01 0.44880E+01 0.00000E+00 0.00000E+00 5 1.05431E+02 8.39707E+01 1.10742E+01 1.04848E+02 + 0.31416E+01 0.44880E+01 0.00000E+00 0.00000E+00 2 2.92901E-06 -7.54817E+01 7.34271E-07 -2.83548E-06 + 0.31416E+01 0.44880E+01 0.00000E+00 0.00000E+00 4 6.42315E-06 -3.48802E+01 5.26923E-06 -3.67316E-06 + 0.31416E+01 0.44880E+01 0.00000E+00 0.00000E+00 6 2.54870E-04 -9.33373E+01 -1.48369E-05 -2.54438E-04 + 0.30650E+01 0.44880E+01 0.00000E+00 0.00000E+00 1 2.93349E+01 -9.30372E+01 -1.55431E+00 -2.92937E+01 + 0.30650E+01 0.44880E+01 0.00000E+00 0.00000E+00 3 3.49776E+00 1.20568E+02 -1.77880E+00 3.01167E+00 + 0.30650E+01 0.44880E+01 0.00000E+00 0.00000E+00 5 8.15714E+01 9.60748E+01 -8.63238E+00 8.11133E+01 + 0.30650E+01 0.44880E+01 0.00000E+00 0.00000E+00 2 8.88471E-07 -1.16760E+02 -4.00044E-07 -7.93313E-07 + 0.30650E+01 0.44880E+01 0.00000E+00 0.00000E+00 4 4.97863E-06 -9.29401E+01 -2.55359E-07 -4.97207E-06 + 0.30650E+01 0.44880E+01 0.00000E+00 0.00000E+00 6 2.78113E-04 -1.26789E+02 -1.66553E-04 -2.22727E-04 + 0.29920E+01 0.44880E+01 0.00000E+00 0.00000E+00 1 3.25052E+01 -1.00385E+02 -5.85955E+00 -3.19727E+01 + 0.29920E+01 0.44880E+01 0.00000E+00 0.00000E+00 3 1.05006E+00 -1.75780E+02 -1.04722E+00 -7.72786E-02 + 0.29920E+01 0.44880E+01 0.00000E+00 0.00000E+00 5 4.80560E+01 1.06928E+02 -1.39922E+01 4.59739E+01 + 0.29920E+01 0.44880E+01 0.00000E+00 0.00000E+00 2 2.58829E-06 1.04599E+02 -6.52393E-07 2.50472E-06 + 0.29920E+01 0.44880E+01 0.00000E+00 0.00000E+00 4 8.24988E-06 6.40969E+01 3.60396E-06 7.42105E-06 + 0.29920E+01 0.44880E+01 0.00000E+00 0.00000E+00 6 5.84191E-05 3.04726E+01 5.03498E-05 2.96258E-05 + 0.29224E+01 0.44880E+01 0.00000E+00 0.00000E+00 1 2.11304E+01 -1.19083E+02 -1.02711E+01 -1.84661E+01 + 0.29224E+01 0.44880E+01 0.00000E+00 0.00000E+00 3 1.19195E+00 -1.04271E+02 -2.93827E-01 -1.15517E+00 + 0.29224E+01 0.44880E+01 0.00000E+00 0.00000E+00 5 3.91909E+01 -9.43425E-01 3.91855E+01 -6.45283E-01 + 0.29224E+01 0.44880E+01 0.00000E+00 0.00000E+00 2 1.33768E-06 -1.70734E+02 -1.32022E-06 -2.15399E-07 + 0.29224E+01 0.44880E+01 0.00000E+00 0.00000E+00 4 5.05416E-06 7.56776E+01 1.25028E-06 4.89708E-06 + 0.29224E+01 0.44880E+01 0.00000E+00 0.00000E+00 6 4.45711E-05 -1.12080E+02 -1.67540E-05 -4.13024E-05 + 0.28560E+01 0.44880E+01 0.00000E+00 0.00000E+00 1 1.77188E+01 1.62054E+02 -1.68568E+01 5.45943E+00 + 0.28560E+01 0.44880E+01 0.00000E+00 0.00000E+00 3 1.11434E+00 -4.82269E+01 7.42358E-01 -8.31065E-01 + 0.28560E+01 0.44880E+01 0.00000E+00 0.00000E+00 5 1.39163E+02 -3.28551E+00 1.38934E+02 -7.97562E+00 + 0.28560E+01 0.44880E+01 0.00000E+00 0.00000E+00 2 1.21618E-06 7.59742E+01 2.94752E-07 1.17992E-06 + 0.28560E+01 0.44880E+01 0.00000E+00 0.00000E+00 4 1.16201E-06 -9.20517E+01 -4.16008E-08 -1.16126E-06 + 0.28560E+01 0.44880E+01 0.00000E+00 0.00000E+00 6 3.56333E-04 3.18418E-01 3.56327E-04 1.98029E-06 + 0.27925E+01 0.44880E+01 0.00000E+00 0.00000E+00 1 2.41365E+01 1.37621E+02 -1.78295E+01 1.62689E+01 + 0.27925E+01 0.44880E+01 0.00000E+00 0.00000E+00 3 6.21218E-01 -3.19083E+01 5.27349E-01 -3.28352E-01 + 0.27925E+01 0.44880E+01 0.00000E+00 0.00000E+00 5 1.93105E+02 -3.17509E+00 1.92808E+02 -1.06956E+01 + 0.27925E+01 0.44880E+01 0.00000E+00 0.00000E+00 2 3.12285E-06 -1.64945E+02 -3.01567E-06 -8.11129E-07 + 0.27925E+01 0.44880E+01 0.00000E+00 0.00000E+00 4 2.17572E-06 1.36766E+02 -1.58515E-06 1.49033E-06 + 0.27925E+01 0.44880E+01 0.00000E+00 0.00000E+00 6 8.09821E-05 5.51027E+01 4.63305E-05 6.64198E-05 + 0.27318E+01 0.44880E+01 0.00000E+00 0.00000E+00 1 1.59476E+01 1.48987E+02 -1.36680E+01 8.21664E+00 + 0.27318E+01 0.44880E+01 0.00000E+00 0.00000E+00 3 4.87512E-01 -3.40797E+01 4.03786E-01 -2.73175E-01 + 0.27318E+01 0.44880E+01 0.00000E+00 0.00000E+00 5 1.13289E+02 3.16459E+00 1.13116E+02 6.25405E+00 + 0.27318E+01 0.44880E+01 0.00000E+00 0.00000E+00 2 7.78613E-06 1.00078E+02 -1.36251E-06 7.66599E-06 + 0.27318E+01 0.44880E+01 0.00000E+00 0.00000E+00 4 3.37567E-06 -3.10469E+01 2.89209E-06 -1.74097E-06 + 0.27318E+01 0.44880E+01 0.00000E+00 0.00000E+00 6 2.40651E-04 8.93961E+01 2.53629E-06 2.40638E-04 + 0.26737E+01 0.44880E+01 0.00000E+00 0.00000E+00 1 1.81615E+00 8.87485E+01 3.96657E-02 1.81572E+00 + 0.26737E+01 0.44880E+01 0.00000E+00 0.00000E+00 3 3.07312E+00 -8.57888E+01 2.25671E-01 -3.06483E+00 + 0.26737E+01 0.44880E+01 0.00000E+00 0.00000E+00 5 2.66534E+01 1.61328E+02 -2.52505E+01 8.53309E+00 + 0.26737E+01 0.44880E+01 0.00000E+00 0.00000E+00 2 1.07533E-06 -6.92945E+01 3.80197E-07 -1.00587E-06 + 0.26737E+01 0.44880E+01 0.00000E+00 0.00000E+00 4 2.07909E-06 1.17232E+02 -9.51366E-07 1.84866E-06 + 0.26737E+01 0.44880E+01 0.00000E+00 0.00000E+00 6 1.48196E-04 2.50432E+01 1.34264E-04 6.27317E-05 + 0.26180E+01 0.44880E+01 0.00000E+00 0.00000E+00 1 1.40861E+01 9.71102E+00 1.38842E+01 2.37602E+00 + 0.26180E+01 0.44880E+01 0.00000E+00 0.00000E+00 3 4.35835E+00 -1.37428E+02 -3.20961E+00 -2.94849E+00 + 0.26180E+01 0.44880E+01 0.00000E+00 0.00000E+00 5 8.57005E+01 -1.61592E+02 -8.13156E+01 -2.70621E+01 + 0.26180E+01 0.44880E+01 0.00000E+00 0.00000E+00 2 4.39733E-06 1.14177E+02 -1.80097E-06 4.01161E-06 + 0.26180E+01 0.44880E+01 0.00000E+00 0.00000E+00 4 3.88043E-07 9.37030E+01 -2.50615E-08 3.87233E-07 + 0.26180E+01 0.44880E+01 0.00000E+00 0.00000E+00 6 4.72748E-04 8.98773E+01 1.01241E-06 4.72747E-04 + 0.25646E+01 0.44880E+01 0.00000E+00 0.00000E+00 1 1.56780E+01 7.36320E+00 1.55487E+01 2.00927E+00 + 0.25646E+01 0.44880E+01 0.00000E+00 0.00000E+00 3 7.00815E-01 1.31171E+02 -4.61352E-01 5.27539E-01 + 0.25646E+01 0.44880E+01 0.00000E+00 0.00000E+00 5 6.97706E+01 -1.32454E+02 -4.70946E+01 -5.14784E+01 + 0.25646E+01 0.44880E+01 0.00000E+00 0.00000E+00 2 6.26356E-07 1.61315E+02 -5.93343E-07 2.00664E-07 + 0.25646E+01 0.44880E+01 0.00000E+00 0.00000E+00 4 6.74307E-06 1.79193E+02 -6.74240E-06 9.49510E-08 + 0.25646E+01 0.44880E+01 0.00000E+00 0.00000E+00 6 1.06517E-04 -1.47744E+02 -9.00780E-05 -5.68484E-05 + 0.25133E+01 0.44880E+01 0.00000E+00 0.00000E+00 1 6.04235E+00 -1.32470E+01 5.88157E+00 -1.38461E+00 + 0.25133E+01 0.44880E+01 0.00000E+00 0.00000E+00 3 2.28236E+00 2.36356E+01 2.09091E+00 9.15042E-01 + 0.25133E+01 0.44880E+01 0.00000E+00 0.00000E+00 5 3.55506E+00 1.79169E+02 -3.55468E+00 5.15419E-02 + 0.25133E+01 0.44880E+01 0.00000E+00 0.00000E+00 2 1.89977E-06 -1.77235E+02 -1.89756E-06 -9.16532E-08 + 0.25133E+01 0.44880E+01 0.00000E+00 0.00000E+00 4 6.21371E-07 -1.21954E+02 -3.28856E-07 -5.27215E-07 + 0.25133E+01 0.44880E+01 0.00000E+00 0.00000E+00 6 2.80256E-04 2.50753E+01 2.53842E-04 1.18775E-04 + 0.24640E+01 0.44880E+01 0.00000E+00 0.00000E+00 1 1.38171E+01 -8.08788E+01 2.19034E+00 -1.36424E+01 + 0.24640E+01 0.44880E+01 0.00000E+00 0.00000E+00 3 1.82382E+00 3.35913E+01 1.51925E+00 1.00906E+00 + 0.24640E+01 0.44880E+01 0.00000E+00 0.00000E+00 5 6.14841E+01 9.22494E+01 -2.41325E+00 6.14367E+01 + 0.24640E+01 0.44880E+01 0.00000E+00 0.00000E+00 2 9.96059E-07 1.64118E+02 -9.58037E-07 2.72575E-07 + 0.24640E+01 0.44880E+01 0.00000E+00 0.00000E+00 4 2.05705E-06 2.83607E+01 1.81016E-06 9.77143E-07 + 0.24640E+01 0.44880E+01 0.00000E+00 0.00000E+00 6 3.10234E-04 1.26740E+02 -1.85579E-04 2.48607E-04 + 0.24166E+01 0.44880E+01 0.00000E+00 0.00000E+00 1 1.34836E+01 -8.69895E+01 7.08138E-01 -1.34650E+01 + 0.24166E+01 0.44880E+01 0.00000E+00 0.00000E+00 3 4.97706E-01 8.61063E+01 3.37967E-02 4.96557E-01 + 0.24166E+01 0.44880E+01 0.00000E+00 0.00000E+00 5 5.16093E+01 1.19803E+02 -2.56506E+01 4.47835E+01 + 0.24166E+01 0.44880E+01 0.00000E+00 0.00000E+00 2 1.00495E-06 -2.57958E+01 9.04809E-07 -4.37320E-07 + 0.24166E+01 0.44880E+01 0.00000E+00 0.00000E+00 4 2.24183E-06 1.34165E+02 -1.56195E-06 1.60814E-06 + 0.24166E+01 0.44880E+01 0.00000E+00 0.00000E+00 6 7.06145E-05 1.34967E+02 -4.99034E-05 4.99606E-05 + 0.23710E+01 0.44880E+01 0.00000E+00 0.00000E+00 1 8.54119E+00 -1.13470E+02 -3.40170E+00 -7.83456E+00 + 0.23710E+01 0.44880E+01 0.00000E+00 0.00000E+00 3 1.58466E+00 -1.55849E+02 -1.44596E+00 -6.48360E-01 + 0.23710E+01 0.44880E+01 0.00000E+00 0.00000E+00 5 1.85065E+01 -1.72692E+02 -1.83562E+01 -2.35403E+00 + 0.23710E+01 0.44880E+01 0.00000E+00 0.00000E+00 2 8.27026E-07 -1.24498E+02 -4.68405E-07 -6.81592E-07 + 0.23710E+01 0.44880E+01 0.00000E+00 0.00000E+00 4 4.54976E-06 4.35127E+00 4.53665E-06 3.45195E-07 + 0.23710E+01 0.44880E+01 0.00000E+00 0.00000E+00 6 1.43210E-04 3.95659E+01 1.10400E-04 9.12201E-05 + 0.23271E+01 0.44880E+01 0.00000E+00 0.00000E+00 1 1.15826E+01 -1.59406E+02 -1.08424E+01 -4.07413E+00 + 0.23271E+01 0.44880E+01 0.00000E+00 0.00000E+00 3 8.54534E-01 -1.19406E+02 -4.19569E-01 -7.44440E-01 + 0.23271E+01 0.44880E+01 0.00000E+00 0.00000E+00 5 3.53808E+01 -1.50251E+01 3.41712E+01 -9.17218E+00 + 0.23271E+01 0.44880E+01 0.00000E+00 0.00000E+00 2 1.07456E-06 -1.45569E+02 -8.86304E-07 -6.07570E-07 + 0.23271E+01 0.44880E+01 0.00000E+00 0.00000E+00 4 1.03640E-06 -7.94285E+01 1.90140E-07 -1.01881E-06 + 0.23271E+01 0.44880E+01 0.00000E+00 0.00000E+00 6 1.18121E-04 9.29843E+01 -6.14971E-06 1.17961E-04 + 0.22848E+01 0.44880E+01 0.00000E+00 0.00000E+00 1 1.19231E+01 -1.54334E+02 -1.07466E+01 -5.16426E+00 + 0.22848E+01 0.44880E+01 0.00000E+00 0.00000E+00 3 6.83538E-01 -1.03620E+02 -1.60955E-01 -6.64317E-01 + 0.22848E+01 0.44880E+01 0.00000E+00 0.00000E+00 5 6.71843E+01 1.71912E+01 6.41827E+01 1.98571E+01 + 0.22848E+01 0.44880E+01 0.00000E+00 0.00000E+00 2 1.27559E-07 -1.52609E+02 -1.13258E-07 -5.86838E-08 + 0.22848E+01 0.44880E+01 0.00000E+00 0.00000E+00 4 1.00646E-06 1.14306E+02 -4.14267E-07 9.17251E-07 + 0.22848E+01 0.44880E+01 0.00000E+00 0.00000E+00 6 1.62773E-04 -8.91432E+00 1.60807E-04 -2.52229E-05 + 0.22440E+01 0.44880E+01 0.00000E+00 0.00000E+00 1 5.84467E+00 -1.06255E+02 -1.63605E+00 -5.61102E+00 + 0.22440E+01 0.44880E+01 0.00000E+00 0.00000E+00 3 3.43587E-01 1.27792E+02 -2.10548E-01 2.71517E-01 + 0.22440E+01 0.44880E+01 0.00000E+00 0.00000E+00 5 4.19236E+01 4.86555E+01 2.76941E+01 3.14742E+01 + 0.22440E+01 0.44880E+01 0.00000E+00 0.00000E+00 2 5.26340E-07 -8.82270E+01 1.62847E-08 -5.26088E-07 + 0.22440E+01 0.44880E+01 0.00000E+00 0.00000E+00 4 1.06391E-06 9.17274E+01 -3.20708E-08 1.06342E-06 + 0.22440E+01 0.44880E+01 0.00000E+00 0.00000E+00 6 1.00402E-04 1.75379E+02 -1.00075E-04 8.08888E-06 + 0.22046E+01 0.44880E+01 0.00000E+00 0.00000E+00 1 4.10025E+00 7.27721E+01 1.21438E+00 3.91629E+00 + 0.22046E+01 0.44880E+01 0.00000E+00 0.00000E+00 3 6.38044E-01 8.74933E+01 2.79051E-02 6.37434E-01 + 0.22046E+01 0.44880E+01 0.00000E+00 0.00000E+00 5 5.81083E+00 -1.21138E+02 -3.00480E+00 -4.97362E+00 + 0.22046E+01 0.44880E+01 0.00000E+00 0.00000E+00 2 2.91869E-07 1.12777E+02 -1.12994E-07 2.69109E-07 + 0.22046E+01 0.44880E+01 0.00000E+00 0.00000E+00 4 8.94608E-07 -6.12997E+01 4.29616E-07 -7.84700E-07 + 0.22046E+01 0.44880E+01 0.00000E+00 0.00000E+00 6 1.36761E-04 1.03152E+02 -3.11176E-05 1.33174E-04 + 0.21666E+01 0.44880E+01 0.00000E+00 0.00000E+00 1 3.58146E+00 6.48346E+01 1.52295E+00 3.24153E+00 + 0.21666E+01 0.44880E+01 0.00000E+00 0.00000E+00 3 4.28102E-01 1.30794E+02 -2.79695E-01 3.24102E-01 + 0.21666E+01 0.44880E+01 0.00000E+00 0.00000E+00 5 2.27408E+01 -1.11607E+02 -8.37402E+00 -2.11428E+01 + 0.21666E+01 0.44880E+01 0.00000E+00 0.00000E+00 2 9.28011E-07 1.10146E+02 -3.19625E-07 8.71232E-07 + 0.21666E+01 0.44880E+01 0.00000E+00 0.00000E+00 4 3.40680E-06 -6.41329E+01 1.48634E-06 -3.06547E-06 + 0.21666E+01 0.44880E+01 0.00000E+00 0.00000E+00 6 1.35780E-04 8.14200E+01 2.02570E-05 1.34260E-04 + 0.21299E+01 0.44880E+01 0.00000E+00 0.00000E+00 1 3.29607E+00 -6.56151E+00 3.27448E+00 -3.76642E-01 + 0.21299E+01 0.44880E+01 0.00000E+00 0.00000E+00 3 1.57739E-01 -5.83506E+00 1.56921E-01 -1.60365E-02 + 0.21299E+01 0.44880E+01 0.00000E+00 0.00000E+00 5 2.13603E+01 -1.12140E+02 -8.05000E+00 -1.97853E+01 + 0.21299E+01 0.44880E+01 0.00000E+00 0.00000E+00 2 1.79094E-06 -1.03761E+02 -4.26020E-07 -1.73954E-06 + 0.21299E+01 0.44880E+01 0.00000E+00 0.00000E+00 4 1.52543E-06 -8.03930E+00 1.51044E-06 -2.13335E-07 + 0.21299E+01 0.44880E+01 0.00000E+00 0.00000E+00 6 4.27486E-04 -2.75493E+00 4.26992E-04 -2.05467E-05 + 0.20944E+01 0.44880E+01 0.00000E+00 0.00000E+00 1 6.12811E+00 -1.17245E+00 6.12683E+00 -1.25391E-01 + 0.20944E+01 0.44880E+01 0.00000E+00 0.00000E+00 3 5.65241E-01 2.01803E+01 5.30542E-01 1.94995E-01 + 0.20944E+01 0.44880E+01 0.00000E+00 0.00000E+00 5 1.97309E+01 -1.23800E+02 -1.09764E+01 -1.63960E+01 + 0.20944E+01 0.44880E+01 0.00000E+00 0.00000E+00 2 8.26599E-07 1.76278E+02 -8.24855E-07 5.36611E-08 + 0.20944E+01 0.44880E+01 0.00000E+00 0.00000E+00 4 3.06678E-06 -1.24235E+01 2.99497E-06 -6.59777E-07 + 0.20944E+01 0.44880E+01 0.00000E+00 0.00000E+00 6 2.84272E-04 2.52215E+00 2.83997E-04 1.25096E-05 + 0.43332E+01 0.43332E+01 0.00000E+00 0.00000E+00 1 5.07129E+00 0.00000E+00 5.07129E+00 0.00000E+00 + 0.43332E+01 0.43332E+01 0.00000E+00 0.00000E+00 3 9.79364E-01 0.00000E+00 9.79364E-01 0.00000E+00 + 0.43332E+01 0.43332E+01 0.00000E+00 0.00000E+00 5 2.31055E+01 0.00000E+00 2.31055E+01 0.00000E+00 + 0.43332E+01 0.43332E+01 0.00000E+00 0.00000E+00 2 9.40717E-07 0.00000E+00 9.40717E-07 0.00000E+00 + 0.43332E+01 0.43332E+01 0.00000E+00 0.00000E+00 4 1.38222E-05 1.80000E+02 -1.38222E-05 0.00000E+00 + 0.43332E+01 0.43332E+01 0.00000E+00 0.00000E+00 6 3.93004E-05 1.80000E+02 -3.93004E-05 0.00000E+00 + 0.41888E+01 0.43332E+01 0.00000E+00 0.00000E+00 1 4.46667E+00 -3.11570E+00 4.46007E+00 -2.42774E-01 + 0.41888E+01 0.43332E+01 0.00000E+00 0.00000E+00 3 1.29856E+00 -1.17697E+01 1.27125E+00 -2.64878E-01 + 0.41888E+01 0.43332E+01 0.00000E+00 0.00000E+00 5 3.37675E+01 2.58795E+01 3.03811E+01 1.47388E+01 + 0.41888E+01 0.43332E+01 0.00000E+00 0.00000E+00 2 5.43361E-06 -1.71523E+02 -5.37425E-06 -8.00944E-07 + 0.41888E+01 0.43332E+01 0.00000E+00 0.00000E+00 4 5.31395E-06 -1.43231E+02 -4.25674E-06 -3.18091E-06 + 0.41888E+01 0.43332E+01 0.00000E+00 0.00000E+00 6 1.41143E-04 1.26116E+02 -8.31936E-05 1.14018E-04 + 0.40537E+01 0.43332E+01 0.00000E+00 0.00000E+00 1 5.10580E+00 -4.68008E+01 3.49511E+00 -3.72202E+00 + 0.40537E+01 0.43332E+01 0.00000E+00 0.00000E+00 3 3.37279E+00 -8.78047E+00 3.33326E+00 -5.14852E-01 + 0.40537E+01 0.43332E+01 0.00000E+00 0.00000E+00 5 5.79704E+01 5.65199E+01 3.19792E+01 4.83518E+01 + 0.40537E+01 0.43332E+01 0.00000E+00 0.00000E+00 2 3.97561E-06 1.38687E+01 3.85971E-06 9.52947E-07 + 0.40537E+01 0.43332E+01 0.00000E+00 0.00000E+00 4 1.91522E-05 7.71988E+00 1.89786E-05 2.57271E-06 + 0.40537E+01 0.43332E+01 0.00000E+00 0.00000E+00 6 1.05663E-04 2.96310E+01 9.18455E-05 5.22412E-05 + 0.39270E+01 0.43332E+01 0.00000E+00 0.00000E+00 1 5.37634E+00 -1.12638E+02 -2.06936E+00 -4.96214E+00 + 0.39270E+01 0.43332E+01 0.00000E+00 0.00000E+00 3 5.50638E+00 -4.22476E+00 5.49142E+00 -4.05651E-01 + 0.39270E+01 0.43332E+01 0.00000E+00 0.00000E+00 5 1.14070E+02 7.16085E+01 3.59900E+01 1.08243E+02 + 0.39270E+01 0.43332E+01 0.00000E+00 0.00000E+00 2 7.81424E-07 1.79157E+02 -7.81339E-07 1.14946E-08 + 0.39270E+01 0.43332E+01 0.00000E+00 0.00000E+00 4 1.10585E-05 9.18203E+00 1.09168E-05 1.76462E-06 + 0.39270E+01 0.43332E+01 0.00000E+00 0.00000E+00 6 2.22501E-04 1.77242E+02 -2.22243E-04 1.07079E-05 + 0.38080E+01 0.43332E+01 0.00000E+00 0.00000E+00 1 7.57554E+00 -1.56164E+02 -6.92940E+00 -3.06141E+00 + 0.38080E+01 0.43332E+01 0.00000E+00 0.00000E+00 3 6.04128E+00 -1.76203E+01 5.75785E+00 -1.82875E+00 + 0.38080E+01 0.43332E+01 0.00000E+00 0.00000E+00 5 1.27679E+02 7.82447E+01 2.60122E+01 1.25001E+02 + 0.38080E+01 0.43332E+01 0.00000E+00 0.00000E+00 2 1.51385E-06 1.11148E+02 -5.46157E-07 1.41190E-06 + 0.38080E+01 0.43332E+01 0.00000E+00 0.00000E+00 4 8.20659E-06 1.92254E+00 8.20197E-06 2.75317E-07 + 0.38080E+01 0.43332E+01 0.00000E+00 0.00000E+00 6 4.68329E-04 -1.15851E+02 -2.04208E-04 -4.21463E-04 + 0.36960E+01 0.43332E+01 0.00000E+00 0.00000E+00 1 1.09464E+01 -1.76176E+02 -1.09220E+01 -7.30001E-01 + 0.36960E+01 0.43332E+01 0.00000E+00 0.00000E+00 3 5.98609E+00 -4.98542E+01 3.85945E+00 -4.57581E+00 + 0.36960E+01 0.43332E+01 0.00000E+00 0.00000E+00 5 1.05510E+02 8.89257E+01 1.97829E+00 1.05492E+02 + 0.36960E+01 0.43332E+01 0.00000E+00 0.00000E+00 2 7.53654E-06 1.23273E+01 7.36278E-06 1.60902E-06 + 0.36960E+01 0.43332E+01 0.00000E+00 0.00000E+00 4 1.32866E-05 2.03953E+00 1.32781E-05 4.72856E-07 + 0.36960E+01 0.43332E+01 0.00000E+00 0.00000E+00 6 2.33320E-05 -1.60176E+02 -2.19493E-05 -7.91254E-06 + 0.35904E+01 0.43332E+01 0.00000E+00 0.00000E+00 1 1.16227E+01 -1.75116E+02 -1.15805E+01 -9.89506E-01 + 0.35904E+01 0.43332E+01 0.00000E+00 0.00000E+00 3 7.50840E+00 -8.17525E+01 1.07707E+00 -7.43075E+00 + 0.35904E+01 0.43332E+01 0.00000E+00 0.00000E+00 5 9.31463E+01 7.62133E+01 2.21974E+01 9.04627E+01 + 0.35904E+01 0.43332E+01 0.00000E+00 0.00000E+00 2 2.21708E-06 -5.03717E+01 1.41406E-06 -1.70759E-06 + 0.35904E+01 0.43332E+01 0.00000E+00 0.00000E+00 4 6.24296E-06 -9.74600E+01 -8.10549E-07 -6.19012E-06 + 0.35904E+01 0.43332E+01 0.00000E+00 0.00000E+00 6 2.20646E-04 1.71244E+02 -2.18074E-04 3.35895E-05 + 0.34907E+01 0.43332E+01 0.00000E+00 0.00000E+00 1 9.91124E+00 1.70876E+02 -9.78583E+00 1.57171E+00 + 0.34907E+01 0.43332E+01 0.00000E+00 0.00000E+00 3 8.98237E+00 -8.55609E+01 6.95228E-01 -8.95542E+00 + 0.34907E+01 0.43332E+01 0.00000E+00 0.00000E+00 5 8.36746E+01 3.79240E+01 6.60048E+01 5.14277E+01 + 0.34907E+01 0.43332E+01 0.00000E+00 0.00000E+00 2 3.96319E-06 6.28273E+00 3.93938E-06 4.33711E-07 + 0.34907E+01 0.43332E+01 0.00000E+00 0.00000E+00 4 6.68931E-06 1.75875E+02 -6.67198E-06 4.81184E-07 + 0.34907E+01 0.43332E+01 0.00000E+00 0.00000E+00 6 6.05053E-04 -1.75492E+02 -6.03181E-04 -4.75604E-05 + 0.33963E+01 0.43332E+01 0.00000E+00 0.00000E+00 1 5.22278E+00 6.32367E+01 2.35185E+00 4.66328E+00 + 0.33963E+01 0.43332E+01 0.00000E+00 0.00000E+00 3 9.95700E+00 -9.65514E+01 -1.13604E+00 -9.89198E+00 + 0.33963E+01 0.43332E+01 0.00000E+00 0.00000E+00 5 8.06507E+01 2.37571E+01 7.38165E+01 3.24909E+01 + 0.33963E+01 0.43332E+01 0.00000E+00 0.00000E+00 2 4.52206E-06 -9.73877E+01 -5.81463E-07 -4.48452E-06 + 0.33963E+01 0.43332E+01 0.00000E+00 0.00000E+00 4 1.09977E-05 -7.14272E+01 3.50286E-06 -1.04249E-05 + 0.33963E+01 0.43332E+01 0.00000E+00 0.00000E+00 6 1.71753E-04 1.65905E+01 1.64602E-04 4.90406E-05 + 0.33069E+01 0.43332E+01 0.00000E+00 0.00000E+00 1 1.42413E+01 3.41087E+01 1.17914E+01 7.98600E+00 + 0.33069E+01 0.43332E+01 0.00000E+00 0.00000E+00 3 6.94569E+00 -1.17360E+02 -3.19213E+00 -6.16870E+00 + 0.33069E+01 0.43332E+01 0.00000E+00 0.00000E+00 5 7.00133E+01 2.02529E+01 6.56846E+01 2.42361E+01 + 0.33069E+01 0.43332E+01 0.00000E+00 0.00000E+00 2 1.99408E-06 -1.70362E+02 -1.96594E-06 -3.33841E-07 + 0.33069E+01 0.43332E+01 0.00000E+00 0.00000E+00 4 6.73913E-06 -9.55806E+01 -6.55350E-07 -6.70719E-06 + 0.33069E+01 0.43332E+01 0.00000E+00 0.00000E+00 6 1.46192E-04 1.04010E+02 -3.53907E-05 1.41843E-04 + 0.32221E+01 0.43332E+01 0.00000E+00 0.00000E+00 1 1.63284E+01 3.15191E+01 1.39194E+01 8.53620E+00 + 0.32221E+01 0.43332E+01 0.00000E+00 0.00000E+00 3 4.06834E+00 -1.48284E+02 -3.46080E+00 -2.13874E+00 + 0.32221E+01 0.43332E+01 0.00000E+00 0.00000E+00 5 4.27329E+01 5.19851E+01 2.63177E+01 3.36672E+01 + 0.32221E+01 0.43332E+01 0.00000E+00 0.00000E+00 2 3.72574E-06 -7.86200E+01 7.35144E-07 -3.65249E-06 + 0.32221E+01 0.43332E+01 0.00000E+00 0.00000E+00 4 1.59636E-06 -9.45953E+01 -1.27896E-07 -1.59122E-06 + 0.32221E+01 0.43332E+01 0.00000E+00 0.00000E+00 6 5.54995E-05 1.30395E+02 -3.59669E-05 4.22680E-05 + 0.31416E+01 0.43332E+01 0.00000E+00 0.00000E+00 1 1.22859E+01 4.82504E+00 1.22424E+01 1.03341E+00 + 0.31416E+01 0.43332E+01 0.00000E+00 0.00000E+00 3 6.40875E+00 1.63227E+02 -6.13611E+00 1.84941E+00 + 0.31416E+01 0.43332E+01 0.00000E+00 0.00000E+00 5 7.03853E+01 8.35350E+01 7.92519E+00 6.99377E+01 + 0.31416E+01 0.43332E+01 0.00000E+00 0.00000E+00 2 1.61875E-06 1.27391E+02 -9.82980E-07 1.28612E-06 + 0.31416E+01 0.43332E+01 0.00000E+00 0.00000E+00 4 1.89818E-05 8.96061E+01 1.30498E-07 1.89813E-05 + 0.31416E+01 0.43332E+01 0.00000E+00 0.00000E+00 6 3.45162E-04 9.58889E+01 -3.54136E-05 3.43340E-04 + 0.30650E+01 0.43332E+01 0.00000E+00 0.00000E+00 1 1.91272E+01 -7.78922E+01 4.01195E+00 -1.87017E+01 + 0.30650E+01 0.43332E+01 0.00000E+00 0.00000E+00 3 6.12241E+00 1.36277E+02 -4.42463E+00 4.23162E+00 + 0.30650E+01 0.43332E+01 0.00000E+00 0.00000E+00 5 9.45763E+01 8.41165E+01 9.69472E+00 9.40781E+01 + 0.30650E+01 0.43332E+01 0.00000E+00 0.00000E+00 2 4.56232E-06 -3.38401E+01 3.78944E-06 -2.54065E-06 + 0.30650E+01 0.43332E+01 0.00000E+00 0.00000E+00 4 1.72283E-05 1.01260E+02 -3.36397E-06 1.68967E-05 + 0.30650E+01 0.43332E+01 0.00000E+00 0.00000E+00 6 2.18251E-04 7.99024E+01 3.82649E-05 2.14870E-04 + 0.29920E+01 0.43332E+01 0.00000E+00 0.00000E+00 1 3.21398E+01 -9.38482E+01 -2.15699E+00 -3.20673E+01 + 0.29920E+01 0.43332E+01 0.00000E+00 0.00000E+00 3 2.92713E+00 1.34729E+02 -2.05997E+00 2.07957E+00 + 0.29920E+01 0.43332E+01 0.00000E+00 0.00000E+00 5 7.93017E+01 7.43670E+01 2.13698E+01 7.63681E+01 + 0.29920E+01 0.43332E+01 0.00000E+00 0.00000E+00 2 2.62614E-06 1.03028E+01 2.58380E-06 4.69687E-07 + 0.29920E+01 0.43332E+01 0.00000E+00 0.00000E+00 4 1.19551E-05 -1.79860E+02 -1.19550E-05 -2.91821E-08 + 0.29920E+01 0.43332E+01 0.00000E+00 0.00000E+00 6 2.77585E-04 9.65414E+01 -3.16229E-05 2.75778E-04 + 0.29224E+01 0.43332E+01 0.00000E+00 0.00000E+00 1 3.08334E+01 -9.97428E+01 -5.21779E+00 -3.03887E+01 + 0.29224E+01 0.43332E+01 0.00000E+00 0.00000E+00 3 8.28573E-01 -1.34399E+02 -5.79708E-01 -5.92006E-01 + 0.29224E+01 0.43332E+01 0.00000E+00 0.00000E+00 5 5.68051E+01 3.28899E+01 4.77001E+01 3.08466E+01 + 0.29224E+01 0.43332E+01 0.00000E+00 0.00000E+00 2 7.54031E-06 -1.12808E+02 -2.92300E-06 -6.95071E-06 + 0.29224E+01 0.43332E+01 0.00000E+00 0.00000E+00 4 2.05026E-06 3.58839E+01 1.66113E-06 1.20175E-06 + 0.29224E+01 0.43332E+01 0.00000E+00 0.00000E+00 6 1.92499E-04 -1.40830E+02 -1.49240E-04 -1.21586E-04 + 0.28560E+01 0.43332E+01 0.00000E+00 0.00000E+00 1 1.66654E+01 -1.40972E+02 -1.29462E+01 -1.04942E+01 + 0.28560E+01 0.43332E+01 0.00000E+00 0.00000E+00 3 1.56974E+00 -7.45015E+01 4.19456E-01 -1.51266E+00 + 0.28560E+01 0.43332E+01 0.00000E+00 0.00000E+00 5 9.56490E+01 -5.92783E+00 9.51375E+01 -9.87821E+00 + 0.28560E+01 0.43332E+01 0.00000E+00 0.00000E+00 2 5.14135E-06 -6.00038E+01 2.57038E-06 -4.45271E-06 + 0.28560E+01 0.43332E+01 0.00000E+00 0.00000E+00 4 1.46091E-05 -9.85623E+01 -2.17509E-06 -1.44463E-05 + 0.28560E+01 0.43332E+01 0.00000E+00 0.00000E+00 6 3.50466E-05 1.68620E+02 -3.43577E-05 6.91492E-06 + 0.27925E+01 0.43332E+01 0.00000E+00 0.00000E+00 1 2.18655E+01 1.54618E+02 -1.97549E+01 9.37257E+00 + 0.27925E+01 0.43332E+01 0.00000E+00 0.00000E+00 3 1.25797E+00 -5.81664E+01 6.63520E-01 -1.06875E+00 + 0.27925E+01 0.43332E+01 0.00000E+00 0.00000E+00 5 1.76802E+02 2.63132E+00 1.76615E+02 8.11681E+00 + 0.27925E+01 0.43332E+01 0.00000E+00 0.00000E+00 2 3.61616E-06 -1.51794E+02 -3.18675E-06 -1.70915E-06 + 0.27925E+01 0.43332E+01 0.00000E+00 0.00000E+00 4 1.35321E-06 -1.22186E+01 1.32255E-06 -2.86397E-07 + 0.27925E+01 0.43332E+01 0.00000E+00 0.00000E+00 6 2.48916E-04 -1.01339E+01 2.45033E-04 -4.37967E-05 + 0.27318E+01 0.43332E+01 0.00000E+00 0.00000E+00 1 2.53304E+01 1.52341E+02 -2.24358E+01 1.17585E+01 + 0.27318E+01 0.43332E+01 0.00000E+00 0.00000E+00 3 2.31037E-01 -2.13919E+01 2.15120E-01 -8.42696E-02 + 0.27318E+01 0.43332E+01 0.00000E+00 0.00000E+00 5 1.84353E+02 4.63019E+00 1.83751E+02 1.48817E+01 + 0.27318E+01 0.43332E+01 0.00000E+00 0.00000E+00 2 8.07725E-06 9.83075E+01 -1.16704E-06 7.99250E-06 + 0.27318E+01 0.43332E+01 0.00000E+00 0.00000E+00 4 5.52874E-06 -1.45322E+02 -4.54661E-06 -3.14568E-06 + 0.27318E+01 0.43332E+01 0.00000E+00 0.00000E+00 6 4.16629E-04 1.21885E+01 4.07238E-04 8.79622E-05 + 0.26737E+01 0.43332E+01 0.00000E+00 0.00000E+00 1 1.32193E+01 1.61185E+02 -1.25129E+01 4.26341E+00 + 0.26737E+01 0.43332E+01 0.00000E+00 0.00000E+00 3 9.51858E-01 7.44381E+00 9.43836E-01 1.23317E-01 + 0.26737E+01 0.43332E+01 0.00000E+00 0.00000E+00 5 6.71158E+01 1.18837E+01 6.56773E+01 1.38209E+01 + 0.26737E+01 0.43332E+01 0.00000E+00 0.00000E+00 2 8.91860E-07 -1.20254E+02 -4.49347E-07 -7.70390E-07 + 0.26737E+01 0.43332E+01 0.00000E+00 0.00000E+00 4 8.00998E-06 -1.23297E+02 -4.39735E-06 -6.69501E-06 + 0.26737E+01 0.43332E+01 0.00000E+00 0.00000E+00 6 3.83521E-05 2.88252E+01 3.36001E-05 1.84911E-05 + 0.26180E+01 0.43332E+01 0.00000E+00 0.00000E+00 1 5.09621E+00 2.59369E+01 4.58290E+00 2.22899E+00 + 0.26180E+01 0.43332E+01 0.00000E+00 0.00000E+00 3 4.08113E+00 -8.28213E+01 5.09997E-01 -4.04913E+00 + 0.26180E+01 0.43332E+01 0.00000E+00 0.00000E+00 5 6.04505E+01 -1.57289E+02 -5.57635E+01 -2.33388E+01 + 0.26180E+01 0.43332E+01 0.00000E+00 0.00000E+00 2 1.02340E-06 7.21566E+01 3.13587E-07 9.74173E-07 + 0.26180E+01 0.43332E+01 0.00000E+00 0.00000E+00 4 4.09722E-06 4.18394E+01 3.05250E-06 2.73303E-06 + 0.26180E+01 0.43332E+01 0.00000E+00 0.00000E+00 6 1.59372E-04 -9.63505E+01 -1.76284E-05 -1.58395E-04 + 0.25646E+01 0.43332E+01 0.00000E+00 0.00000E+00 1 1.65154E+01 1.13934E+01 1.61899E+01 3.26253E+00 + 0.25646E+01 0.43332E+01 0.00000E+00 0.00000E+00 3 2.65042E+00 -1.43689E+02 -2.13576E+00 -1.56948E+00 + 0.25646E+01 0.43332E+01 0.00000E+00 0.00000E+00 5 8.18473E+01 -1.37662E+02 -6.05005E+01 -5.51241E+01 + 0.25646E+01 0.43332E+01 0.00000E+00 0.00000E+00 2 2.48807E-06 -9.53675E+01 -2.32744E-07 -2.47716E-06 + 0.25646E+01 0.43332E+01 0.00000E+00 0.00000E+00 4 3.00291E-06 -3.15750E+01 2.55834E-06 -1.57236E-06 + 0.25646E+01 0.43332E+01 0.00000E+00 0.00000E+00 6 3.76345E-04 9.03377E+01 -2.21819E-06 3.76339E-04 + 0.25133E+01 0.43332E+01 0.00000E+00 0.00000E+00 1 9.67992E+00 2.54712E+01 8.73904E+00 4.16293E+00 + 0.25133E+01 0.43332E+01 0.00000E+00 0.00000E+00 3 1.29070E+00 4.89030E+01 8.48422E-01 9.72667E-01 + 0.25133E+01 0.43332E+01 0.00000E+00 0.00000E+00 5 5.52077E+01 -1.03493E+02 -1.28813E+01 -5.36839E+01 + 0.25133E+01 0.43332E+01 0.00000E+00 0.00000E+00 2 4.84692E-06 -1.79751E+02 -4.84687E-06 -2.10662E-08 + 0.25133E+01 0.43332E+01 0.00000E+00 0.00000E+00 4 4.69804E-06 1.73604E+02 -4.66880E-06 5.23382E-07 + 0.25133E+01 0.43332E+01 0.00000E+00 0.00000E+00 6 1.19965E-04 -1.70591E+02 -1.18351E-04 -1.96121E-05 + 0.24640E+01 0.43332E+01 0.00000E+00 0.00000E+00 1 7.26561E+00 -6.59185E+01 2.96463E+00 -6.63325E+00 + 0.24640E+01 0.43332E+01 0.00000E+00 0.00000E+00 3 2.30605E+00 4.97067E+01 1.49132E+00 1.75892E+00 + 0.24640E+01 0.43332E+01 0.00000E+00 0.00000E+00 5 2.44241E+01 7.88540E+01 4.72142E+00 2.39634E+01 + 0.24640E+01 0.43332E+01 0.00000E+00 0.00000E+00 2 7.71764E-07 8.62082E+01 5.10380E-08 7.70075E-07 + 0.24640E+01 0.43332E+01 0.00000E+00 0.00000E+00 4 3.54337E-06 1.23354E+02 -1.94816E-06 2.95975E-06 + 0.24640E+01 0.43332E+01 0.00000E+00 0.00000E+00 6 2.23907E-04 -6.05246E+00 2.22659E-04 -2.36086E-05 + 0.24166E+01 0.43332E+01 0.00000E+00 0.00000E+00 1 1.61036E+01 -8.72178E+01 7.81658E-01 -1.60847E+01 + 0.24166E+01 0.43332E+01 0.00000E+00 0.00000E+00 3 1.02971E+00 7.20648E+01 3.17090E-01 9.79671E-01 + 0.24166E+01 0.43332E+01 0.00000E+00 0.00000E+00 5 6.50727E+01 1.04637E+02 -1.64436E+01 6.29608E+01 + 0.24166E+01 0.43332E+01 0.00000E+00 0.00000E+00 2 1.21224E-06 -7.50122E+01 3.13502E-07 -1.17100E-06 + 0.24166E+01 0.43332E+01 0.00000E+00 0.00000E+00 4 4.42075E-06 1.37786E+00 4.41947E-06 1.06301E-07 + 0.24166E+01 0.43332E+01 0.00000E+00 0.00000E+00 6 3.75264E-04 1.58657E+01 3.60968E-04 1.02591E-04 + 0.23710E+01 0.43332E+01 0.00000E+00 0.00000E+00 1 1.32432E+01 -9.25998E+01 -6.00717E-01 -1.32296E+01 + 0.23710E+01 0.43332E+01 0.00000E+00 0.00000E+00 3 7.34305E-01 1.76249E+02 -7.32732E-01 4.80422E-02 + 0.23710E+01 0.43332E+01 0.00000E+00 0.00000E+00 5 2.77179E+01 1.42185E+02 -2.18969E+01 1.69944E+01 + 0.23710E+01 0.43332E+01 0.00000E+00 0.00000E+00 2 2.52055E-06 7.21031E+01 7.74579E-07 2.39859E-06 + 0.23710E+01 0.43332E+01 0.00000E+00 0.00000E+00 4 3.07331E-06 7.11795E+01 9.91463E-07 2.90899E-06 + 0.23710E+01 0.43332E+01 0.00000E+00 0.00000E+00 6 1.36398E-04 9.45828E+01 -1.08981E-05 1.35962E-04 + 0.23271E+01 0.43332E+01 0.00000E+00 0.00000E+00 1 9.87988E+00 -1.34443E+02 -6.91787E+00 -7.05373E+00 + 0.23271E+01 0.43332E+01 0.00000E+00 0.00000E+00 3 1.61924E+00 -1.39543E+02 -1.23206E+00 -1.05070E+00 + 0.23271E+01 0.43332E+01 0.00000E+00 0.00000E+00 5 1.70007E+01 -2.12971E+01 1.58398E+01 -6.17475E+00 + 0.23271E+01 0.43332E+01 0.00000E+00 0.00000E+00 2 1.49575E-06 -1.22737E+02 -8.08872E-07 -1.25817E-06 + 0.23271E+01 0.43332E+01 0.00000E+00 0.00000E+00 4 3.95773E-07 -2.59444E+01 3.55887E-07 -1.73150E-07 + 0.23271E+01 0.43332E+01 0.00000E+00 0.00000E+00 6 2.05022E-04 -1.14161E+02 -8.39156E-05 -1.87062E-04 + 0.22848E+01 0.43332E+01 0.00000E+00 0.00000E+00 1 1.34511E+01 -1.54965E+02 -1.21873E+01 -5.69215E+00 + 0.22848E+01 0.43332E+01 0.00000E+00 0.00000E+00 3 8.22848E-01 -8.81330E+01 2.68084E-02 -8.22411E-01 + 0.22848E+01 0.43332E+01 0.00000E+00 0.00000E+00 5 5.29721E+01 1.38699E+01 5.14276E+01 1.26984E+01 + 0.22848E+01 0.43332E+01 0.00000E+00 0.00000E+00 2 2.61649E-06 1.05471E+02 -6.97944E-07 2.52168E-06 + 0.22848E+01 0.43332E+01 0.00000E+00 0.00000E+00 4 4.48384E-06 -5.80028E+01 2.37589E-06 -3.80262E-06 + 0.22848E+01 0.43332E+01 0.00000E+00 0.00000E+00 6 1.01342E-04 7.28621E+01 2.98627E-05 9.68422E-05 + 0.22440E+01 0.43332E+01 0.00000E+00 0.00000E+00 1 9.12994E+00 -1.27198E+02 -5.51968E+00 -7.27247E+00 + 0.22440E+01 0.43332E+01 0.00000E+00 0.00000E+00 3 1.36989E-01 1.53339E+02 -1.22424E-01 6.14683E-02 + 0.22440E+01 0.43332E+01 0.00000E+00 0.00000E+00 5 5.89502E+01 3.94286E+01 4.55341E+01 3.74403E+01 + 0.22440E+01 0.43332E+01 0.00000E+00 0.00000E+00 2 8.47232E-07 1.70204E+02 -8.34879E-07 1.44147E-07 + 0.22440E+01 0.43332E+01 0.00000E+00 0.00000E+00 4 1.69172E-06 -1.40073E+01 1.64142E-06 -4.09474E-07 + 0.22440E+01 0.43332E+01 0.00000E+00 0.00000E+00 6 9.31813E-05 5.20281E+01 5.73321E-05 7.34561E-05 + 0.22046E+01 0.43332E+01 0.00000E+00 0.00000E+00 1 7.97611E-01 -1.40360E+02 -6.14215E-01 -5.08845E-01 + 0.22046E+01 0.43332E+01 0.00000E+00 0.00000E+00 3 9.03227E-01 1.15790E+02 -3.92972E-01 8.13260E-01 + 0.22046E+01 0.43332E+01 0.00000E+00 0.00000E+00 5 1.57612E+01 4.33998E+01 1.14518E+01 1.08293E+01 + 0.22046E+01 0.43332E+01 0.00000E+00 0.00000E+00 2 2.11099E-06 1.14950E+02 -8.90485E-07 1.91398E-06 + 0.22046E+01 0.43332E+01 0.00000E+00 0.00000E+00 4 9.60250E-08 -1.57565E+02 -8.87569E-08 -3.66472E-08 + 0.22046E+01 0.43332E+01 0.00000E+00 0.00000E+00 6 3.63068E-04 2.39092E+01 3.31912E-04 1.47147E-04 + 0.21666E+01 0.43332E+01 0.00000E+00 0.00000E+00 1 6.04597E+00 8.24021E+01 7.99398E-01 5.99289E+00 + 0.21666E+01 0.43332E+01 0.00000E+00 0.00000E+00 3 3.51556E-01 1.31246E+02 -2.31780E-01 2.64329E-01 + 0.21666E+01 0.43332E+01 0.00000E+00 0.00000E+00 5 2.74735E+01 -1.20898E+02 -1.41080E+01 -2.35745E+01 + 0.21666E+01 0.43332E+01 0.00000E+00 0.00000E+00 2 2.55730E-06 2.53775E+00 2.55479E-06 1.13231E-07 + 0.21666E+01 0.43332E+01 0.00000E+00 0.00000E+00 4 4.41747E-07 4.48023E+01 3.13438E-07 3.11282E-07 + 0.21666E+01 0.43332E+01 0.00000E+00 0.00000E+00 6 2.40619E-04 6.55200E+01 9.97068E-05 2.18989E-04 + 0.21299E+01 0.43332E+01 0.00000E+00 0.00000E+00 1 3.60038E+00 4.92048E+01 2.35233E+00 2.72567E+00 + 0.21299E+01 0.43332E+01 0.00000E+00 0.00000E+00 3 3.22598E-01 1.06722E+02 -9.28219E-02 3.08955E-01 + 0.21299E+01 0.43332E+01 0.00000E+00 0.00000E+00 5 2.92969E+01 -1.03175E+02 -6.67742E+00 -2.85258E+01 + 0.21299E+01 0.43332E+01 0.00000E+00 0.00000E+00 2 3.10952E-07 1.19311E+02 -1.52227E-07 2.71143E-07 + 0.21299E+01 0.43332E+01 0.00000E+00 0.00000E+00 4 1.22356E-06 -9.35317E+01 -7.53721E-08 -1.22124E-06 + 0.21299E+01 0.43332E+01 0.00000E+00 0.00000E+00 6 1.11664E-04 -3.41756E+01 9.23822E-05 -6.27254E-05 + 0.20944E+01 0.43332E+01 0.00000E+00 0.00000E+00 1 5.50013E+00 -7.29228E+00 5.45564E+00 -6.98136E-01 + 0.20944E+01 0.43332E+01 0.00000E+00 0.00000E+00 3 1.79911E-01 8.30410E+01 2.17979E-02 1.78585E-01 + 0.20944E+01 0.43332E+01 0.00000E+00 0.00000E+00 5 2.08291E+01 -1.04474E+02 -5.20613E+00 -2.01680E+01 + 0.20944E+01 0.43332E+01 0.00000E+00 0.00000E+00 2 9.86928E-07 -6.90353E+01 3.53115E-07 -9.21595E-07 + 0.20944E+01 0.43332E+01 0.00000E+00 0.00000E+00 4 4.39384E-07 -5.29968E+01 2.64447E-07 -3.50893E-07 + 0.20944E+01 0.43332E+01 0.00000E+00 0.00000E+00 6 2.08248E-04 6.53284E+00 2.06896E-04 2.36930E-05 + 0.41888E+01 0.41888E+01 0.00000E+00 0.00000E+00 1 6.48684E+00 0.00000E+00 6.48684E+00 0.00000E+00 + 0.41888E+01 0.41888E+01 0.00000E+00 0.00000E+00 3 7.73413E-01 0.00000E+00 7.73413E-01 0.00000E+00 + 0.41888E+01 0.41888E+01 0.00000E+00 0.00000E+00 5 2.53595E+01 0.00000E+00 2.53595E+01 0.00000E+00 + 0.41888E+01 0.41888E+01 0.00000E+00 0.00000E+00 2 7.64812E-06 1.80000E+02 -7.64812E-06 0.00000E+00 + 0.41888E+01 0.41888E+01 0.00000E+00 0.00000E+00 4 2.00730E-05 0.00000E+00 2.00730E-05 0.00000E+00 + 0.41888E+01 0.41888E+01 0.00000E+00 0.00000E+00 6 6.28068E-05 1.80000E+02 -6.28068E-05 0.00000E+00 + 0.40537E+01 0.41888E+01 0.00000E+00 0.00000E+00 1 7.01967E+00 -1.35679E+01 6.82377E+00 -1.64680E+00 + 0.40537E+01 0.41888E+01 0.00000E+00 0.00000E+00 3 1.05330E+00 -8.19724E+00 1.04254E+00 -1.50180E-01 + 0.40537E+01 0.41888E+01 0.00000E+00 0.00000E+00 5 2.75399E+01 2.15287E+01 2.56185E+01 1.01062E+01 + 0.40537E+01 0.41888E+01 0.00000E+00 0.00000E+00 2 5.79760E-06 -3.72060E+00 5.78538E-06 -3.76212E-07 + 0.40537E+01 0.41888E+01 0.00000E+00 0.00000E+00 4 3.93022E-05 -1.75969E+02 -3.92050E-05 -2.76263E-06 + 0.40537E+01 0.41888E+01 0.00000E+00 0.00000E+00 6 1.04767E-04 -1.31594E+02 -6.95495E-05 -7.83517E-05 + 0.39270E+01 0.41888E+01 0.00000E+00 0.00000E+00 1 4.49262E+00 -5.56609E+01 2.53424E+00 -3.70962E+00 + 0.39270E+01 0.41888E+01 0.00000E+00 0.00000E+00 3 3.57442E+00 -5.04241E-01 3.57428E+00 -3.14568E-02 + 0.39270E+01 0.41888E+01 0.00000E+00 0.00000E+00 5 6.44900E+01 5.65313E+01 3.55650E+01 5.37968E+01 + 0.39270E+01 0.41888E+01 0.00000E+00 0.00000E+00 2 3.68047E-06 5.42635E+01 2.14961E-06 2.98748E-06 + 0.39270E+01 0.41888E+01 0.00000E+00 0.00000E+00 4 1.11418E-05 1.26443E+02 -6.61841E-06 8.96301E-06 + 0.39270E+01 0.41888E+01 0.00000E+00 0.00000E+00 6 2.88546E-04 6.76529E+01 1.09710E-04 2.66876E-04 + 0.38080E+01 0.41888E+01 0.00000E+00 0.00000E+00 1 4.17225E+00 -1.13479E+02 -1.66227E+00 -3.82682E+00 + 0.38080E+01 0.41888E+01 0.00000E+00 0.00000E+00 3 5.54044E+00 -1.61213E+00 5.53825E+00 -1.55871E-01 + 0.38080E+01 0.41888E+01 0.00000E+00 0.00000E+00 5 9.96159E+01 7.27893E+01 2.94750E+01 9.51555E+01 + 0.38080E+01 0.41888E+01 0.00000E+00 0.00000E+00 2 2.70807E-06 9.01289E+01 -6.09050E-09 2.70806E-06 + 0.38080E+01 0.41888E+01 0.00000E+00 0.00000E+00 4 1.78545E-05 1.47301E+01 1.72677E-05 4.53981E-06 + 0.38080E+01 0.41888E+01 0.00000E+00 0.00000E+00 6 4.93255E-04 -4.60047E+01 3.42615E-04 -3.54846E-04 + 0.36960E+01 0.41888E+01 0.00000E+00 0.00000E+00 1 6.96793E+00 -1.51136E+02 -6.10229E+00 -3.36365E+00 + 0.36960E+01 0.41888E+01 0.00000E+00 0.00000E+00 3 5.51884E+00 -1.06100E+01 5.42449E+00 -1.01615E+00 + 0.36960E+01 0.41888E+01 0.00000E+00 0.00000E+00 5 1.20954E+02 9.51201E+01 -1.07943E+01 1.20471E+02 + 0.36960E+01 0.41888E+01 0.00000E+00 0.00000E+00 2 3.27303E-06 -1.06900E+02 -9.51495E-07 -3.13168E-06 + 0.36960E+01 0.41888E+01 0.00000E+00 0.00000E+00 4 1.65348E-05 -1.08467E+01 1.62393E-05 -3.11154E-06 + 0.36960E+01 0.41888E+01 0.00000E+00 0.00000E+00 6 1.18252E-04 1.67534E+02 -1.15464E-04 2.55255E-05 + 0.35904E+01 0.41888E+01 0.00000E+00 0.00000E+00 1 1.12844E+01 -1.61157E+02 -1.06796E+01 -3.64451E+00 + 0.35904E+01 0.41888E+01 0.00000E+00 0.00000E+00 3 5.55211E+00 -4.53170E+01 3.90416E+00 -3.94759E+00 + 0.35904E+01 0.41888E+01 0.00000E+00 0.00000E+00 5 1.32999E+02 9.23510E+01 -5.45588E+00 1.32887E+02 + 0.35904E+01 0.41888E+01 0.00000E+00 0.00000E+00 2 2.03379E-06 -8.00185E+01 3.52518E-07 -2.00300E-06 + 0.35904E+01 0.41888E+01 0.00000E+00 0.00000E+00 4 6.79647E-06 9.41052E+01 -4.86546E-07 6.77903E-06 + 0.35904E+01 0.41888E+01 0.00000E+00 0.00000E+00 6 1.01714E-04 -2.77438E+01 9.00207E-05 -4.73498E-05 + 0.34907E+01 0.41888E+01 0.00000E+00 0.00000E+00 1 1.34513E+01 -1.76494E+02 -1.34261E+01 -8.22581E-01 + 0.34907E+01 0.41888E+01 0.00000E+00 0.00000E+00 3 6.80861E+00 -7.49129E+01 1.77219E+00 -6.57392E+00 + 0.34907E+01 0.41888E+01 0.00000E+00 0.00000E+00 5 7.65267E+01 7.50702E+01 1.97160E+01 7.39433E+01 + 0.34907E+01 0.41888E+01 0.00000E+00 0.00000E+00 2 1.79661E-06 -4.29575E+01 1.31487E-06 -1.22431E-06 + 0.34907E+01 0.41888E+01 0.00000E+00 0.00000E+00 4 4.61535E-06 9.00330E+00 4.55848E-06 7.22262E-07 + 0.34907E+01 0.41888E+01 0.00000E+00 0.00000E+00 6 1.21187E-04 1.75633E+02 -1.20835E-04 9.22779E-06 + 0.33963E+01 0.41888E+01 0.00000E+00 0.00000E+00 1 5.22578E+00 1.73861E+02 -5.19581E+00 5.58891E-01 + 0.33963E+01 0.41888E+01 0.00000E+00 0.00000E+00 3 9.10490E+00 -8.59902E+01 6.36673E-01 -9.08261E+00 + 0.33963E+01 0.41888E+01 0.00000E+00 0.00000E+00 5 6.16048E+01 6.03537E+01 3.04725E+01 5.35405E+01 + 0.33963E+01 0.41888E+01 0.00000E+00 0.00000E+00 2 3.35045E-06 1.71939E+02 -3.31735E-06 4.69796E-07 + 0.33963E+01 0.41888E+01 0.00000E+00 0.00000E+00 4 1.62756E-06 2.07969E+01 1.52152E-06 5.77877E-07 + 0.33963E+01 0.41888E+01 0.00000E+00 0.00000E+00 6 1.63446E-04 1.69251E+02 -1.60578E-04 3.04850E-05 + 0.33069E+01 0.41888E+01 0.00000E+00 0.00000E+00 1 5.02997E+00 3.11574E+01 4.30439E+00 2.60247E+00 + 0.33069E+01 0.41888E+01 0.00000E+00 0.00000E+00 3 8.77972E+00 -9.59310E+01 -9.07219E-01 -8.73273E+00 + 0.33069E+01 0.41888E+01 0.00000E+00 0.00000E+00 5 6.80553E+01 4.06978E+01 5.15967E+01 4.43768E+01 + 0.33069E+01 0.41888E+01 0.00000E+00 0.00000E+00 2 1.25156E-06 -1.42384E+02 -9.91378E-07 -7.63916E-07 + 0.33069E+01 0.41888E+01 0.00000E+00 0.00000E+00 4 1.12454E-05 5.25091E+01 6.84437E-06 8.92269E-06 + 0.33069E+01 0.41888E+01 0.00000E+00 0.00000E+00 6 1.67745E-04 1.65800E+02 -1.62619E-04 4.11498E-05 + 0.32221E+01 0.41888E+01 0.00000E+00 0.00000E+00 1 1.26382E+01 2.88566E+01 1.10689E+01 6.09943E+00 + 0.32221E+01 0.41888E+01 0.00000E+00 0.00000E+00 3 6.11340E+00 -1.04566E+02 -1.53748E+00 -5.91691E+00 + 0.32221E+01 0.41888E+01 0.00000E+00 0.00000E+00 5 4.77220E+01 4.16726E+01 3.56463E+01 3.17291E+01 + 0.32221E+01 0.41888E+01 0.00000E+00 0.00000E+00 2 6.18386E-07 1.25269E+02 -3.57065E-07 5.04882E-07 + 0.32221E+01 0.41888E+01 0.00000E+00 0.00000E+00 4 5.99195E-06 6.89773E+01 2.14954E-06 5.59312E-06 + 0.32221E+01 0.41888E+01 0.00000E+00 0.00000E+00 6 4.00888E-05 -1.31967E+02 -2.68076E-05 -2.98071E-05 + 0.31416E+01 0.41888E+01 0.00000E+00 0.00000E+00 1 1.55983E+01 2.90607E+01 1.36346E+01 7.57667E+00 + 0.31416E+01 0.41888E+01 0.00000E+00 0.00000E+00 3 5.01387E+00 -1.51603E+02 -4.41055E+00 -2.38452E+00 + 0.31416E+01 0.41888E+01 0.00000E+00 0.00000E+00 5 5.47676E+01 7.25931E+01 1.63840E+01 5.22594E+01 + 0.31416E+01 0.41888E+01 0.00000E+00 0.00000E+00 2 1.85559E-06 -1.76148E+02 -1.85140E-06 -1.24642E-07 + 0.31416E+01 0.41888E+01 0.00000E+00 0.00000E+00 4 4.75395E-07 1.31660E+02 -3.16000E-07 3.55169E-07 + 0.31416E+01 0.41888E+01 0.00000E+00 0.00000E+00 6 8.79023E-05 -7.54780E+01 2.20416E-05 -8.50940E-05 + 0.30650E+01 0.41888E+01 0.00000E+00 0.00000E+00 1 1.06276E+01 -3.21471E+01 8.99820E+00 -5.65488E+00 + 0.30650E+01 0.41888E+01 0.00000E+00 0.00000E+00 3 5.59744E+00 1.58971E+02 -5.22464E+00 2.00861E+00 + 0.30650E+01 0.41888E+01 0.00000E+00 0.00000E+00 5 9.68289E+01 8.22240E+01 1.31010E+01 9.59385E+01 + 0.30650E+01 0.41888E+01 0.00000E+00 0.00000E+00 2 3.82484E-06 -8.21159E+01 5.24654E-07 -3.78869E-06 + 0.30650E+01 0.41888E+01 0.00000E+00 0.00000E+00 4 1.14474E-05 -1.30477E+02 -7.43103E-06 -8.70768E-06 + 0.30650E+01 0.41888E+01 0.00000E+00 0.00000E+00 6 2.38493E-04 1.05151E+02 -6.23317E-05 2.30204E-04 + 0.29920E+01 0.41888E+01 0.00000E+00 0.00000E+00 1 2.27325E+01 -8.59489E+01 1.60597E+00 -2.26757E+01 + 0.29920E+01 0.41888E+01 0.00000E+00 0.00000E+00 3 4.98552E+00 1.40613E+02 -3.85322E+00 3.16356E+00 + 0.29920E+01 0.41888E+01 0.00000E+00 0.00000E+00 5 1.22472E+02 7.59981E+01 2.96327E+01 1.18833E+02 + 0.29920E+01 0.41888E+01 0.00000E+00 0.00000E+00 2 3.67646E-06 9.02158E+00 3.63098E-06 5.76493E-07 + 0.29920E+01 0.41888E+01 0.00000E+00 0.00000E+00 4 8.67807E-06 -6.10874E+01 4.19563E-06 -7.59642E-06 + 0.29920E+01 0.41888E+01 0.00000E+00 0.00000E+00 6 8.22928E-05 1.59916E+02 -7.72884E-05 2.82594E-05 + 0.29224E+01 0.41888E+01 0.00000E+00 0.00000E+00 1 3.25831E+01 -9.43154E+01 -2.45178E+00 -3.24907E+01 + 0.29224E+01 0.41888E+01 0.00000E+00 0.00000E+00 3 1.89907E+00 1.29476E+02 -1.20735E+00 1.46587E+00 + 0.29224E+01 0.41888E+01 0.00000E+00 0.00000E+00 5 1.08220E+02 6.95201E+01 3.78638E+01 1.01380E+02 + 0.29224E+01 0.41888E+01 0.00000E+00 0.00000E+00 2 5.50650E-06 2.72721E+01 4.89440E-06 2.52317E-06 + 0.29224E+01 0.41888E+01 0.00000E+00 0.00000E+00 4 1.02178E-05 -2.37346E+01 9.35360E-06 -4.11269E-06 + 0.29224E+01 0.41888E+01 0.00000E+00 0.00000E+00 6 1.17314E-04 -7.21536E+01 3.59527E-05 -1.11669E-04 + 0.28560E+01 0.41888E+01 0.00000E+00 0.00000E+00 1 2.44692E+01 -1.06641E+02 -7.00725E+00 -2.34444E+01 + 0.28560E+01 0.41888E+01 0.00000E+00 0.00000E+00 3 1.36489E+00 -7.83752E+01 2.75027E-01 -1.33689E+00 + 0.28560E+01 0.41888E+01 0.00000E+00 0.00000E+00 5 7.12660E+01 1.91992E+01 6.73023E+01 2.34360E+01 + 0.28560E+01 0.41888E+01 0.00000E+00 0.00000E+00 2 5.19246E-06 4.75730E+00 5.17458E-06 4.30638E-07 + 0.28560E+01 0.41888E+01 0.00000E+00 0.00000E+00 4 1.07138E-05 -1.56160E+02 -9.79973E-06 -4.33031E-06 + 0.28560E+01 0.41888E+01 0.00000E+00 0.00000E+00 6 4.87567E-04 5.62815E+00 4.85217E-04 4.78166E-05 + 0.27925E+01 0.41888E+01 0.00000E+00 0.00000E+00 1 1.41849E+01 -1.59537E+02 -1.32898E+01 -4.95917E+00 + 0.27925E+01 0.41888E+01 0.00000E+00 0.00000E+00 3 1.91879E+00 -7.21314E+01 5.88751E-01 -1.82623E+00 + 0.27925E+01 0.41888E+01 0.00000E+00 0.00000E+00 5 1.03452E+02 4.88088E+00 1.03077E+02 8.80214E+00 + 0.27925E+01 0.41888E+01 0.00000E+00 0.00000E+00 2 1.67619E-06 6.07368E+01 8.19359E-07 1.46228E-06 + 0.27925E+01 0.41888E+01 0.00000E+00 0.00000E+00 4 5.73748E-06 -6.22261E+00 5.70368E-06 -6.21895E-07 + 0.27925E+01 0.41888E+01 0.00000E+00 0.00000E+00 6 1.14525E-03 -4.63393E-01 1.14521E-03 -9.26237E-06 + 0.27318E+01 0.41888E+01 0.00000E+00 0.00000E+00 1 2.36123E+01 1.59947E+02 -2.21808E+01 8.09648E+00 + 0.27318E+01 0.41888E+01 0.00000E+00 0.00000E+00 3 8.60534E-01 -5.42733E+01 5.02483E-01 -6.98591E-01 + 0.27318E+01 0.41888E+01 0.00000E+00 0.00000E+00 5 1.87322E+02 1.16926E+01 1.83435E+02 3.79630E+01 + 0.27318E+01 0.41888E+01 0.00000E+00 0.00000E+00 2 5.02948E-07 1.00235E+02 -8.93651E-08 4.94945E-07 + 0.27318E+01 0.41888E+01 0.00000E+00 0.00000E+00 4 1.03024E-05 1.35013E+02 -7.28656E-06 7.28325E-06 + 0.27318E+01 0.41888E+01 0.00000E+00 0.00000E+00 6 1.03803E-04 -6.52765E+01 4.34144E-05 -9.42878E-05 + 0.26737E+01 0.41888E+01 0.00000E+00 0.00000E+00 1 2.06771E+01 1.59803E+02 -1.94057E+01 7.13874E+00 + 0.26737E+01 0.41888E+01 0.00000E+00 0.00000E+00 3 5.89591E-01 6.76704E+01 2.24006E-01 5.45379E-01 + 0.26737E+01 0.41888E+01 0.00000E+00 0.00000E+00 5 1.51086E+02 1.30584E+01 1.47179E+02 3.41368E+01 + 0.26737E+01 0.41888E+01 0.00000E+00 0.00000E+00 2 1.87543E-06 -1.19461E+02 -9.22393E-07 -1.63292E-06 + 0.26737E+01 0.41888E+01 0.00000E+00 0.00000E+00 4 2.90886E-06 7.21368E+01 8.92279E-07 2.76863E-06 + 0.26737E+01 0.41888E+01 0.00000E+00 0.00000E+00 6 1.19601E-04 1.02015E+01 1.17711E-04 2.11825E-05 + 0.26180E+01 0.41888E+01 0.00000E+00 0.00000E+00 1 6.71576E+00 1.58701E+02 -6.25704E+00 2.43942E+00 + 0.26180E+01 0.41888E+01 0.00000E+00 0.00000E+00 3 1.62728E+00 -1.54873E+01 1.56820E+00 -4.34526E-01 + 0.26180E+01 0.41888E+01 0.00000E+00 0.00000E+00 5 2.21959E+01 9.54187E+00 2.18889E+01 3.67939E+00 + 0.26180E+01 0.41888E+01 0.00000E+00 0.00000E+00 2 1.10704E-06 -1.31242E+02 -7.29803E-07 -8.32416E-07 + 0.26180E+01 0.41888E+01 0.00000E+00 0.00000E+00 4 1.61485E-06 -5.70039E+01 8.79418E-07 -1.35438E-06 + 0.26180E+01 0.41888E+01 0.00000E+00 0.00000E+00 6 2.45856E-04 -9.11268E+01 -4.83482E-06 -2.45808E-04 + 0.25646E+01 0.41888E+01 0.00000E+00 0.00000E+00 1 1.31367E+01 6.70867E+00 1.30467E+01 1.53464E+00 + 0.25646E+01 0.41888E+01 0.00000E+00 0.00000E+00 3 3.22618E+00 -9.60850E+01 -3.41988E-01 -3.20800E+00 + 0.25646E+01 0.41888E+01 0.00000E+00 0.00000E+00 5 6.22209E+01 -1.59036E+02 -5.81023E+01 -2.22614E+01 + 0.25646E+01 0.41888E+01 0.00000E+00 0.00000E+00 2 1.78537E-06 -1.44561E+02 -1.45460E-06 -1.03521E-06 + 0.25646E+01 0.41888E+01 0.00000E+00 0.00000E+00 4 4.45840E-06 1.04797E+02 -1.13864E-06 4.31055E-06 + 0.25646E+01 0.41888E+01 0.00000E+00 0.00000E+00 6 2.68711E-04 9.67867E+01 -3.17543E-05 2.66828E-04 + 0.25133E+01 0.41888E+01 0.00000E+00 0.00000E+00 1 1.31227E+01 1.42538E+01 1.27187E+01 3.23104E+00 + 0.25133E+01 0.41888E+01 0.00000E+00 0.00000E+00 3 1.47186E+00 -1.50341E+02 -1.27903E+00 -7.28329E-01 + 0.25133E+01 0.41888E+01 0.00000E+00 0.00000E+00 5 6.82948E+01 -1.13312E+02 -2.70269E+01 -6.27194E+01 + 0.25133E+01 0.41888E+01 0.00000E+00 0.00000E+00 2 3.11815E-06 -1.59790E+02 -2.92617E-06 -1.07721E-06 + 0.25133E+01 0.41888E+01 0.00000E+00 0.00000E+00 4 1.00559E-06 -3.12468E+01 8.59717E-07 -5.21623E-07 + 0.25133E+01 0.41888E+01 0.00000E+00 0.00000E+00 6 1.84919E-04 1.40688E+02 -1.43073E-04 1.17154E-04 + 0.24640E+01 0.41888E+01 0.00000E+00 0.00000E+00 1 6.69099E+00 -1.20948E+01 6.54246E+00 -1.40196E+00 + 0.24640E+01 0.41888E+01 0.00000E+00 0.00000E+00 3 1.68529E+00 6.26765E+01 7.73573E-01 1.49727E+00 + 0.24640E+01 0.41888E+01 0.00000E+00 0.00000E+00 5 1.87394E+01 -8.45434E+01 1.78196E+00 -1.86545E+01 + 0.24640E+01 0.41888E+01 0.00000E+00 0.00000E+00 2 4.63418E-07 -1.92458E+01 4.37519E-07 -1.52752E-07 + 0.24640E+01 0.41888E+01 0.00000E+00 0.00000E+00 4 4.75384E-07 2.73762E+00 4.74842E-07 2.27055E-08 + 0.24640E+01 0.41888E+01 0.00000E+00 0.00000E+00 6 3.82594E-04 1.75790E+02 -3.81561E-04 2.80897E-05 + 0.24166E+01 0.41888E+01 0.00000E+00 0.00000E+00 1 1.35250E+01 -8.38004E+01 1.46060E+00 -1.34459E+01 + 0.24166E+01 0.41888E+01 0.00000E+00 0.00000E+00 3 1.45970E+00 5.55770E+01 8.25166E-01 1.20409E+00 + 0.24166E+01 0.41888E+01 0.00000E+00 0.00000E+00 5 4.44890E+01 8.68769E+01 2.42384E+00 4.44229E+01 + 0.24166E+01 0.41888E+01 0.00000E+00 0.00000E+00 2 7.89015E-07 -1.48447E+02 -6.72361E-07 -4.12885E-07 + 0.24166E+01 0.41888E+01 0.00000E+00 0.00000E+00 4 1.85428E-06 -1.33649E+02 -1.27990E-06 -1.34172E-06 + 0.24166E+01 0.41888E+01 0.00000E+00 0.00000E+00 6 3.63341E-04 1.22523E+00 3.63258E-04 7.76922E-06 + 0.23710E+01 0.41888E+01 0.00000E+00 0.00000E+00 1 1.66976E+01 -9.03175E+01 -9.25140E-02 -1.66973E+01 + 0.23710E+01 0.41888E+01 0.00000E+00 0.00000E+00 3 1.20097E+00 1.25340E+02 -6.94673E-01 9.79669E-01 + 0.23710E+01 0.41888E+01 0.00000E+00 0.00000E+00 5 5.11578E+01 1.11759E+02 -1.89642E+01 4.75129E+01 + 0.23710E+01 0.41888E+01 0.00000E+00 0.00000E+00 2 2.39352E-06 -6.02234E+01 1.18867E-06 -2.07750E-06 + 0.23710E+01 0.41888E+01 0.00000E+00 0.00000E+00 4 1.97298E-06 -9.69558E+00 1.94480E-06 -3.32276E-07 + 0.23710E+01 0.41888E+01 0.00000E+00 0.00000E+00 6 2.17366E-04 1.46285E+02 -1.80806E-04 1.20652E-04 + 0.23271E+01 0.41888E+01 0.00000E+00 0.00000E+00 1 1.16679E+01 -9.86518E+01 -1.75519E+00 -1.15351E+01 + 0.23271E+01 0.41888E+01 0.00000E+00 0.00000E+00 3 1.14775E+00 -1.25827E+02 -6.71822E-01 -9.30584E-01 + 0.23271E+01 0.41888E+01 0.00000E+00 0.00000E+00 5 1.59516E+01 1.12124E+02 -6.00766E+00 1.47770E+01 + 0.23271E+01 0.41888E+01 0.00000E+00 0.00000E+00 2 1.48127E-06 -5.88326E+01 7.66618E-07 -1.26746E-06 + 0.23271E+01 0.41888E+01 0.00000E+00 0.00000E+00 4 8.55860E-07 1.08823E+02 -2.76134E-07 8.10090E-07 + 0.23271E+01 0.41888E+01 0.00000E+00 0.00000E+00 6 9.38232E-05 -9.59826E+01 -9.77881E-06 -9.33123E-05 + 0.22848E+01 0.41888E+01 0.00000E+00 0.00000E+00 1 1.13979E+01 -1.49117E+02 -9.78183E+00 -5.85047E+00 + 0.22848E+01 0.41888E+01 0.00000E+00 0.00000E+00 3 1.22211E+00 -1.32562E+02 -8.26618E-01 -9.00143E-01 + 0.22848E+01 0.41888E+01 0.00000E+00 0.00000E+00 5 3.97461E+01 -8.73721E+00 3.92849E+01 -6.03754E+00 + 0.22848E+01 0.41888E+01 0.00000E+00 0.00000E+00 2 8.31702E-07 -7.15682E+01 2.62965E-07 -7.89036E-07 + 0.22848E+01 0.41888E+01 0.00000E+00 0.00000E+00 4 4.28666E-06 1.14583E+02 -1.78330E-06 3.89812E-06 + 0.22848E+01 0.41888E+01 0.00000E+00 0.00000E+00 6 2.37198E-04 -1.03927E+02 -5.70900E-05 -2.30225E-04 + 0.22440E+01 0.41888E+01 0.00000E+00 0.00000E+00 1 1.17051E+01 -1.36396E+02 -8.47598E+00 -8.07260E+00 + 0.22440E+01 0.41888E+01 0.00000E+00 0.00000E+00 3 6.59616E-01 -8.94013E+01 6.89227E-03 -6.59580E-01 + 0.22440E+01 0.41888E+01 0.00000E+00 0.00000E+00 5 6.25539E+01 3.80792E+01 4.92399E+01 3.85801E+01 + 0.22440E+01 0.41888E+01 0.00000E+00 0.00000E+00 2 6.51883E-07 1.61394E+02 -6.17812E-07 2.07990E-07 + 0.22440E+01 0.41888E+01 0.00000E+00 0.00000E+00 4 2.49532E-06 -1.43498E+01 2.41747E-06 -6.18443E-07 + 0.22440E+01 0.41888E+01 0.00000E+00 0.00000E+00 6 1.84478E-04 1.42668E+02 -1.46686E-04 1.11873E-04 + 0.22046E+01 0.41888E+01 0.00000E+00 0.00000E+00 1 5.20753E+00 -1.30930E+02 -3.41166E+00 -3.93434E+00 + 0.22046E+01 0.41888E+01 0.00000E+00 0.00000E+00 3 4.93804E-01 1.24009E+02 -2.76199E-01 4.09336E-01 + 0.22046E+01 0.41888E+01 0.00000E+00 0.00000E+00 5 3.53341E+01 3.74062E+01 2.80676E+01 2.14642E+01 + 0.22046E+01 0.41888E+01 0.00000E+00 0.00000E+00 2 1.28167E-06 1.51122E+02 -1.12229E-06 6.18989E-07 + 0.22046E+01 0.41888E+01 0.00000E+00 0.00000E+00 4 1.38933E-06 1.01390E+02 -2.74368E-07 1.36196E-06 + 0.22046E+01 0.41888E+01 0.00000E+00 0.00000E+00 6 3.93195E-04 1.47587E+02 -3.31938E-04 2.10760E-04 + 0.21666E+01 0.41888E+01 0.00000E+00 0.00000E+00 1 3.14285E+00 9.38862E+01 -2.13009E-01 3.13562E+00 + 0.21666E+01 0.41888E+01 0.00000E+00 0.00000E+00 3 8.24709E-01 1.06777E+02 -2.38052E-01 7.89605E-01 + 0.21666E+01 0.41888E+01 0.00000E+00 0.00000E+00 5 1.24851E+01 -9.90126E+01 -1.95583E+00 -1.23310E+01 + 0.21666E+01 0.41888E+01 0.00000E+00 0.00000E+00 2 2.21493E-06 4.65107E+01 1.52436E-06 1.60694E-06 + 0.21666E+01 0.41888E+01 0.00000E+00 0.00000E+00 4 9.94788E-07 -2.62797E+01 8.91970E-07 -4.40446E-07 + 0.21666E+01 0.41888E+01 0.00000E+00 0.00000E+00 6 4.52367E-04 2.03106E+01 4.24241E-04 1.57021E-04 + 0.21299E+01 0.41888E+01 0.00000E+00 0.00000E+00 1 6.29181E+00 7.25710E+01 1.88455E+00 6.00295E+00 + 0.21299E+01 0.41888E+01 0.00000E+00 0.00000E+00 3 6.40239E-01 -1.78326E+02 -6.39966E-01 -1.87053E-02 + 0.21299E+01 0.41888E+01 0.00000E+00 0.00000E+00 5 2.97364E+01 -1.09609E+02 -9.97938E+00 -2.80119E+01 + 0.21299E+01 0.41888E+01 0.00000E+00 0.00000E+00 2 7.11084E-07 3.96924E+01 5.47168E-07 4.54146E-07 + 0.21299E+01 0.41888E+01 0.00000E+00 0.00000E+00 4 6.03890E-08 1.15598E+02 -2.60909E-08 5.44619E-08 + 0.21299E+01 0.41888E+01 0.00000E+00 0.00000E+00 6 2.35594E-04 -9.15589E+01 -6.40917E-06 -2.35507E-04 + 0.20944E+01 0.41888E+01 0.00000E+00 0.00000E+00 1 6.32458E+00 -2.06444E+00 6.32047E+00 -2.27833E-01 + 0.20944E+01 0.41888E+01 0.00000E+00 0.00000E+00 3 3.38992E-01 -9.83060E+00 3.34014E-01 -5.78780E-02 + 0.20944E+01 0.41888E+01 0.00000E+00 0.00000E+00 5 2.48838E+01 -1.15452E+02 -1.06941E+01 -2.24687E+01 + 0.20944E+01 0.41888E+01 0.00000E+00 0.00000E+00 2 9.21138E-07 1.44517E+02 -7.50068E-07 5.34690E-07 + 0.20944E+01 0.41888E+01 0.00000E+00 0.00000E+00 4 2.04347E-06 1.02156E+02 -4.30303E-07 1.99765E-06 + 0.20944E+01 0.41888E+01 0.00000E+00 0.00000E+00 6 1.62229E-04 1.29872E+01 1.58079E-04 3.64582E-05 + 0.40537E+01 0.40537E+01 0.00000E+00 0.00000E+00 1 7.93167E+00 0.00000E+00 7.93167E+00 0.00000E+00 + 0.40537E+01 0.40537E+01 0.00000E+00 0.00000E+00 3 5.15023E-01 0.00000E+00 5.15023E-01 0.00000E+00 + 0.40537E+01 0.40537E+01 0.00000E+00 0.00000E+00 5 2.39291E+01 0.00000E+00 2.39291E+01 0.00000E+00 + 0.40537E+01 0.40537E+01 0.00000E+00 0.00000E+00 2 4.05870E-06 1.80000E+02 -4.05870E-06 0.00000E+00 + 0.40537E+01 0.40537E+01 0.00000E+00 0.00000E+00 4 9.43191E-06 0.00000E+00 9.43191E-06 0.00000E+00 + 0.40537E+01 0.40537E+01 0.00000E+00 0.00000E+00 6 3.75096E-05 1.80000E+02 -3.75096E-05 0.00000E+00 + 0.39270E+01 0.40537E+01 0.00000E+00 0.00000E+00 1 5.50084E+00 -1.45464E+01 5.32450E+00 -1.38161E+00 + 0.39270E+01 0.40537E+01 0.00000E+00 0.00000E+00 3 8.92781E-01 -1.19330E+01 8.73488E-01 -1.84599E-01 + 0.39270E+01 0.40537E+01 0.00000E+00 0.00000E+00 5 3.59352E+01 2.73504E+01 3.19181E+01 1.65097E+01 + 0.39270E+01 0.40537E+01 0.00000E+00 0.00000E+00 2 4.71451E-06 -2.03719E+01 4.41963E-06 -1.64118E-06 + 0.39270E+01 0.40537E+01 0.00000E+00 0.00000E+00 4 9.57669E-06 -1.28097E+02 -5.90877E-06 -7.53654E-06 + 0.39270E+01 0.40537E+01 0.00000E+00 0.00000E+00 6 1.41924E-04 7.53378E+01 3.59237E-05 1.37302E-04 + 0.38080E+01 0.40537E+01 0.00000E+00 0.00000E+00 1 4.06516E+00 -5.17330E+01 2.51766E+00 -3.19169E+00 + 0.38080E+01 0.40537E+01 0.00000E+00 0.00000E+00 3 3.30660E+00 -6.05502E+00 3.28815E+00 -3.48792E-01 + 0.38080E+01 0.40537E+01 0.00000E+00 0.00000E+00 5 6.60400E+01 4.57436E+01 4.60874E+01 4.72994E+01 + 0.38080E+01 0.40537E+01 0.00000E+00 0.00000E+00 2 3.90424E-06 4.05631E+01 2.96601E-06 2.53887E-06 + 0.38080E+01 0.40537E+01 0.00000E+00 0.00000E+00 4 1.25465E-05 -2.85962E+01 1.10160E-05 -6.00516E-06 + 0.38080E+01 0.40537E+01 0.00000E+00 0.00000E+00 6 3.16559E-04 -1.59959E+02 -2.97391E-04 -1.08481E-04 + 0.36960E+01 0.40537E+01 0.00000E+00 0.00000E+00 1 4.77527E+00 -9.96938E+01 -8.04076E-01 -4.70709E+00 + 0.36960E+01 0.40537E+01 0.00000E+00 0.00000E+00 3 4.47471E+00 -3.66716E+00 4.46555E+00 -2.86204E-01 + 0.36960E+01 0.40537E+01 0.00000E+00 0.00000E+00 5 9.20614E+01 7.90448E+01 1.74954E+01 9.03837E+01 + 0.36960E+01 0.40537E+01 0.00000E+00 0.00000E+00 2 5.31833E-06 -1.02836E+01 5.23290E-06 -9.49428E-07 + 0.36960E+01 0.40537E+01 0.00000E+00 0.00000E+00 4 2.62040E-06 5.56891E+01 1.47707E-06 2.16442E-06 + 0.36960E+01 0.40537E+01 0.00000E+00 0.00000E+00 6 2.77584E-04 -1.19341E+02 -1.36016E-04 -2.41976E-04 + 0.35904E+01 0.40537E+01 0.00000E+00 0.00000E+00 1 7.73377E+00 -1.40117E+02 -5.93454E+00 -4.95908E+00 + 0.35904E+01 0.40537E+01 0.00000E+00 0.00000E+00 3 4.57656E+00 -1.61005E+01 4.39705E+00 -1.26918E+00 + 0.35904E+01 0.40537E+01 0.00000E+00 0.00000E+00 5 1.32818E+02 8.76946E+01 5.34265E+00 1.32710E+02 + 0.35904E+01 0.40537E+01 0.00000E+00 0.00000E+00 2 3.37262E-06 3.17850E+01 2.86683E-06 1.77647E-06 + 0.35904E+01 0.40537E+01 0.00000E+00 0.00000E+00 4 4.03861E-06 3.71330E+01 3.21973E-06 2.43798E-06 + 0.35904E+01 0.40537E+01 0.00000E+00 0.00000E+00 6 2.97167E-04 -4.52873E+01 2.09072E-04 -2.11179E-04 + 0.34907E+01 0.40537E+01 0.00000E+00 0.00000E+00 1 1.29152E+01 -1.74598E+02 -1.28578E+01 -1.21586E+00 + 0.34907E+01 0.40537E+01 0.00000E+00 0.00000E+00 3 5.11651E+00 -6.00191E+01 2.55678E+00 -4.43188E+00 + 0.34907E+01 0.40537E+01 0.00000E+00 0.00000E+00 5 8.23909E+01 7.85503E+01 1.63552E+01 8.07513E+01 + 0.34907E+01 0.40537E+01 0.00000E+00 0.00000E+00 2 2.37419E-06 8.85355E+01 6.06766E-08 2.37341E-06 + 0.34907E+01 0.40537E+01 0.00000E+00 0.00000E+00 4 1.07008E-05 -1.31686E+02 -7.11648E-06 -7.99137E-06 + 0.34907E+01 0.40537E+01 0.00000E+00 0.00000E+00 6 9.41660E-05 1.03124E+02 -2.13814E-05 9.17065E-05 + 0.33963E+01 0.40537E+01 0.00000E+00 0.00000E+00 1 9.45635E+00 1.76581E+02 -9.43952E+00 5.63905E-01 + 0.33963E+01 0.40537E+01 0.00000E+00 0.00000E+00 3 7.18096E+00 -8.80091E+01 2.49476E-01 -7.17663E+00 + 0.33963E+01 0.40537E+01 0.00000E+00 0.00000E+00 5 3.79429E+01 6.49102E+01 1.60892E+01 3.43628E+01 + 0.33963E+01 0.40537E+01 0.00000E+00 0.00000E+00 2 4.04051E-06 1.48583E+02 -3.44814E-06 2.10619E-06 + 0.33963E+01 0.40537E+01 0.00000E+00 0.00000E+00 4 8.87520E-07 1.00679E+02 -1.64459E-07 8.72149E-07 + 0.33963E+01 0.40537E+01 0.00000E+00 0.00000E+00 6 2.74035E-04 1.77649E+02 -2.73805E-04 1.12421E-05 + 0.33069E+01 0.40537E+01 0.00000E+00 0.00000E+00 1 1.86728E+00 1.73295E+02 -1.85451E+00 2.18015E-01 + 0.33069E+01 0.40537E+01 0.00000E+00 0.00000E+00 3 8.10527E+00 -9.54885E+01 -7.75233E-01 -8.06811E+00 + 0.33069E+01 0.40537E+01 0.00000E+00 0.00000E+00 5 3.95781E+01 2.80403E+01 3.49323E+01 1.86054E+01 + 0.33069E+01 0.40537E+01 0.00000E+00 0.00000E+00 2 1.27607E-06 1.09150E+02 -4.18603E-07 1.20546E-06 + 0.33069E+01 0.40537E+01 0.00000E+00 0.00000E+00 4 7.05246E-06 -1.65720E+02 -6.83455E-06 -1.73957E-06 + 0.33069E+01 0.40537E+01 0.00000E+00 0.00000E+00 6 3.59734E-04 -1.52736E+02 -3.19769E-04 -1.64793E-04 + 0.32221E+01 0.40537E+01 0.00000E+00 0.00000E+00 1 7.67607E+00 1.64110E+01 7.36334E+00 2.16868E+00 + 0.32221E+01 0.40537E+01 0.00000E+00 0.00000E+00 3 6.67713E+00 -9.16102E+01 -1.87625E-01 -6.67449E+00 + 0.32221E+01 0.40537E+01 0.00000E+00 0.00000E+00 5 3.91493E+01 1.81226E+01 3.72072E+01 1.21774E+01 + 0.32221E+01 0.40537E+01 0.00000E+00 0.00000E+00 2 3.63269E-06 -4.15059E+01 2.72048E-06 -2.40737E-06 + 0.32221E+01 0.40537E+01 0.00000E+00 0.00000E+00 4 1.35277E-05 -8.24470E+01 1.77813E-06 -1.34103E-05 + 0.32221E+01 0.40537E+01 0.00000E+00 0.00000E+00 6 1.03505E-04 1.38036E+02 -7.69622E-05 6.92098E-05 + 0.31416E+01 0.40537E+01 0.00000E+00 0.00000E+00 1 1.73003E+01 2.69133E+01 1.54266E+01 7.83085E+00 + 0.31416E+01 0.40537E+01 0.00000E+00 0.00000E+00 3 5.02387E+00 -1.12268E+02 -1.90377E+00 -4.64918E+00 + 0.31416E+01 0.40537E+01 0.00000E+00 0.00000E+00 5 3.04201E+01 5.36915E+01 1.80127E+01 2.45138E+01 + 0.31416E+01 0.40537E+01 0.00000E+00 0.00000E+00 2 1.14504E-06 -6.70207E+01 4.47020E-07 -1.05417E-06 + 0.31416E+01 0.40537E+01 0.00000E+00 0.00000E+00 4 2.97976E-06 1.00616E+02 -5.48946E-07 2.92876E-06 + 0.31416E+01 0.40537E+01 0.00000E+00 0.00000E+00 6 3.29800E-04 -6.82815E+01 1.22041E-04 -3.06389E-04 + 0.30650E+01 0.40537E+01 0.00000E+00 0.00000E+00 1 1.48567E+01 8.69953E+00 1.46858E+01 2.24712E+00 + 0.30650E+01 0.40537E+01 0.00000E+00 0.00000E+00 3 3.66198E+00 -1.79893E+02 -3.66197E+00 -6.80940E-03 + 0.30650E+01 0.40537E+01 0.00000E+00 0.00000E+00 5 6.66238E+01 1.01043E+02 -1.27615E+01 6.53901E+01 + 0.30650E+01 0.40537E+01 0.00000E+00 0.00000E+00 2 2.27177E-06 -1.64866E+02 -2.19299E-06 -5.93101E-07 + 0.30650E+01 0.40537E+01 0.00000E+00 0.00000E+00 4 1.25017E-05 -1.43571E+02 -1.00588E-05 -7.42392E-06 + 0.30650E+01 0.40537E+01 0.00000E+00 0.00000E+00 6 2.60211E-04 -2.56226E+01 2.34622E-04 -1.12526E-04 + 0.29920E+01 0.40537E+01 0.00000E+00 0.00000E+00 1 1.28405E+01 -6.19126E+01 6.04552E+00 -1.13283E+01 + 0.29920E+01 0.40537E+01 0.00000E+00 0.00000E+00 3 5.15737E+00 1.52075E+02 -4.55686E+00 2.41526E+00 + 0.29920E+01 0.40537E+01 0.00000E+00 0.00000E+00 5 1.17315E+02 9.60383E+01 -1.23407E+01 1.16664E+02 + 0.29920E+01 0.40537E+01 0.00000E+00 0.00000E+00 2 8.93827E-07 -1.21580E+02 -4.68086E-07 -7.61460E-07 + 0.29920E+01 0.40537E+01 0.00000E+00 0.00000E+00 4 8.50937E-06 9.17108E+01 -2.54051E-07 8.50557E-06 + 0.29920E+01 0.40537E+01 0.00000E+00 0.00000E+00 6 1.62997E-04 1.12774E+02 -6.30970E-05 1.50289E-04 + 0.29224E+01 0.40537E+01 0.00000E+00 0.00000E+00 1 2.78480E+01 -9.47433E+01 -2.30281E+00 -2.77526E+01 + 0.29224E+01 0.40537E+01 0.00000E+00 0.00000E+00 3 4.47331E+00 1.38270E+02 -3.33838E+00 2.97754E+00 + 0.29224E+01 0.40537E+01 0.00000E+00 0.00000E+00 5 1.38257E+02 8.58618E+01 9.97705E+00 1.37897E+02 + 0.29224E+01 0.40537E+01 0.00000E+00 0.00000E+00 2 3.98414E-07 4.41144E+01 2.86042E-07 2.77333E-07 + 0.29224E+01 0.40537E+01 0.00000E+00 0.00000E+00 4 5.59270E-06 -1.69625E+02 -5.50126E-06 -1.00720E-06 + 0.29224E+01 0.40537E+01 0.00000E+00 0.00000E+00 6 2.92238E-04 2.12371E+01 2.72392E-04 1.05857E-04 + 0.28560E+01 0.40537E+01 0.00000E+00 0.00000E+00 1 2.98546E+01 -1.02463E+02 -6.44313E+00 -2.91511E+01 + 0.28560E+01 0.40537E+01 0.00000E+00 0.00000E+00 3 7.56140E-01 -1.75258E+02 -7.53552E-01 -6.25079E-02 + 0.28560E+01 0.40537E+01 0.00000E+00 0.00000E+00 5 8.08784E+01 5.60148E+01 4.52092E+01 6.70629E+01 + 0.28560E+01 0.40537E+01 0.00000E+00 0.00000E+00 2 3.67137E-06 4.75184E+01 2.47947E-06 2.70762E-06 + 0.28560E+01 0.40537E+01 0.00000E+00 0.00000E+00 4 6.40114E-06 -4.97478E+01 4.13612E-06 -4.88540E-06 + 0.28560E+01 0.40537E+01 0.00000E+00 0.00000E+00 6 2.52995E-04 8.42088E+01 2.55280E-05 2.51704E-04 + 0.27925E+01 0.40537E+01 0.00000E+00 0.00000E+00 1 1.73877E+01 -1.10782E+02 -6.16931E+00 -1.62565E+01 + 0.27925E+01 0.40537E+01 0.00000E+00 0.00000E+00 3 1.88540E+00 -8.41686E+01 1.91559E-01 -1.87565E+00 + 0.27925E+01 0.40537E+01 0.00000E+00 0.00000E+00 5 6.57465E+01 1.07970E+01 6.45826E+01 1.23162E+01 + 0.27925E+01 0.40537E+01 0.00000E+00 0.00000E+00 2 9.72430E-06 8.19681E+01 1.35872E-06 9.62891E-06 + 0.27925E+01 0.40537E+01 0.00000E+00 0.00000E+00 4 5.84373E-06 -4.15816E+01 4.37118E-06 -3.87840E-06 + 0.27925E+01 0.40537E+01 0.00000E+00 0.00000E+00 6 7.00636E-05 -1.69208E+02 -6.88245E-05 -1.31188E-05 + 0.27318E+01 0.40537E+01 0.00000E+00 0.00000E+00 1 1.51683E+01 1.74176E+02 -1.50900E+01 1.53918E+00 + 0.27318E+01 0.40537E+01 0.00000E+00 0.00000E+00 3 1.58038E+00 -5.47858E+01 9.11304E-01 -1.29117E+00 + 0.27318E+01 0.40537E+01 0.00000E+00 0.00000E+00 5 1.45460E+02 1.18471E+01 1.42362E+02 2.98631E+01 + 0.27318E+01 0.40537E+01 0.00000E+00 0.00000E+00 2 1.12364E-06 1.23063E+02 -6.13022E-07 9.41685E-07 + 0.27318E+01 0.40537E+01 0.00000E+00 0.00000E+00 4 3.73405E-06 -3.60184E+01 3.02020E-06 -2.19579E-06 + 0.27318E+01 0.40537E+01 0.00000E+00 0.00000E+00 6 5.63901E-04 2.40767E+00 5.63403E-04 2.36891E-05 + 0.26737E+01 0.40537E+01 0.00000E+00 0.00000E+00 1 2.29483E+01 1.53822E+02 -2.05944E+01 1.01239E+01 + 0.26737E+01 0.40537E+01 0.00000E+00 0.00000E+00 3 7.57870E-01 -2.96059E+01 6.58926E-01 -3.74411E-01 + 0.26737E+01 0.40537E+01 0.00000E+00 0.00000E+00 5 1.83182E+02 1.53093E+01 1.76681E+02 4.83652E+01 + 0.26737E+01 0.40537E+01 0.00000E+00 0.00000E+00 2 2.11263E-06 -1.34134E+02 -1.47111E-06 -1.51625E-06 + 0.26737E+01 0.40537E+01 0.00000E+00 0.00000E+00 4 6.23844E-06 4.58813E+01 4.34288E-06 4.47857E-06 + 0.26737E+01 0.40537E+01 0.00000E+00 0.00000E+00 6 8.91970E-05 -1.56730E+02 -8.19411E-05 -3.52387E-05 + 0.26180E+01 0.40537E+01 0.00000E+00 0.00000E+00 1 1.78593E+01 1.57830E+02 -1.65389E+01 6.73937E+00 + 0.26180E+01 0.40537E+01 0.00000E+00 0.00000E+00 3 7.87512E-01 6.12427E+01 3.78873E-01 6.90385E-01 + 0.26180E+01 0.40537E+01 0.00000E+00 0.00000E+00 5 1.09789E+02 2.08657E+01 1.02589E+02 3.91044E+01 + 0.26180E+01 0.40537E+01 0.00000E+00 0.00000E+00 2 1.64275E-06 -7.14811E+00 1.62998E-06 -2.04414E-07 + 0.26180E+01 0.40537E+01 0.00000E+00 0.00000E+00 4 7.32611E-06 3.93416E+01 5.66587E-06 4.64434E-06 + 0.26180E+01 0.40537E+01 0.00000E+00 0.00000E+00 6 9.24244E-05 -4.71481E+01 6.28584E-05 -6.77576E-05 + 0.25646E+01 0.40537E+01 0.00000E+00 0.00000E+00 1 3.38395E+00 3.27929E+01 2.84466E+00 1.83276E+00 + 0.25646E+01 0.40537E+01 0.00000E+00 0.00000E+00 3 1.24906E+00 -4.52135E+01 8.79918E-01 -8.86501E-01 + 0.25646E+01 0.40537E+01 0.00000E+00 0.00000E+00 5 2.81682E+01 1.77447E+02 -2.81402E+01 1.25476E+00 + 0.25646E+01 0.40537E+01 0.00000E+00 0.00000E+00 2 2.07135E-06 -1.15008E+02 -8.75651E-07 -1.87715E-06 + 0.25646E+01 0.40537E+01 0.00000E+00 0.00000E+00 4 5.85203E-06 1.31156E+01 5.69938E-06 1.32792E-06 + 0.25646E+01 0.40537E+01 0.00000E+00 0.00000E+00 6 2.47529E-04 1.10393E+02 -8.62543E-05 2.32014E-04 + 0.25133E+01 0.40537E+01 0.00000E+00 0.00000E+00 1 1.53956E+01 8.74480E+00 1.52167E+01 2.34065E+00 + 0.25133E+01 0.40537E+01 0.00000E+00 0.00000E+00 3 2.51281E+00 -8.38434E+01 2.69488E-01 -2.49832E+00 + 0.25133E+01 0.40537E+01 0.00000E+00 0.00000E+00 5 8.09653E+01 -1.42901E+02 -6.45771E+01 -4.88383E+01 + 0.25133E+01 0.40537E+01 0.00000E+00 0.00000E+00 2 2.14093E-06 2.26032E+01 1.97648E-06 8.22860E-07 + 0.25133E+01 0.40537E+01 0.00000E+00 0.00000E+00 4 3.19528E-06 1.23701E+02 -1.77295E-06 2.65829E-06 + 0.25133E+01 0.40537E+01 0.00000E+00 0.00000E+00 6 6.83209E-04 1.14831E+02 -2.86913E-04 6.20045E-04 + 0.24640E+01 0.40537E+01 0.00000E+00 0.00000E+00 1 1.37163E+01 1.77301E+01 1.30648E+01 4.17707E+00 + 0.24640E+01 0.40537E+01 0.00000E+00 0.00000E+00 3 7.72818E-01 9.13810E+01 -1.86247E-02 7.72594E-01 + 0.24640E+01 0.40537E+01 0.00000E+00 0.00000E+00 5 6.19191E+01 -1.13444E+02 -2.46345E+01 -5.68077E+01 + 0.24640E+01 0.40537E+01 0.00000E+00 0.00000E+00 2 1.23797E-06 1.17899E+02 -5.79273E-07 1.09408E-06 + 0.24640E+01 0.40537E+01 0.00000E+00 0.00000E+00 4 2.62775E-06 6.50925E+01 1.10669E-06 2.38334E-06 + 0.24640E+01 0.40537E+01 0.00000E+00 0.00000E+00 6 1.12838E-04 8.23849E+01 1.49529E-05 1.11842E-04 + 0.24166E+01 0.40537E+01 0.00000E+00 0.00000E+00 1 7.17977E+00 -5.02235E+01 4.59358E+00 -5.51799E+00 + 0.24166E+01 0.40537E+01 0.00000E+00 0.00000E+00 3 1.78239E+00 3.68958E+01 1.42542E+00 1.07008E+00 + 0.24166E+01 0.40537E+01 0.00000E+00 0.00000E+00 5 2.03924E+01 3.78034E+01 1.61124E+01 1.24996E+01 + 0.24166E+01 0.40537E+01 0.00000E+00 0.00000E+00 2 1.84962E-07 -7.47689E+01 4.85920E-08 -1.78465E-07 + 0.24166E+01 0.40537E+01 0.00000E+00 0.00000E+00 4 1.40995E-06 9.43835E-01 1.40976E-06 2.32251E-08 + 0.24166E+01 0.40537E+01 0.00000E+00 0.00000E+00 6 1.15670E-04 -1.05309E+02 -3.05388E-05 -1.11565E-04 + 0.23710E+01 0.40537E+01 0.00000E+00 0.00000E+00 1 1.70895E+01 -8.94882E+01 1.52666E-01 -1.70888E+01 + 0.23710E+01 0.40537E+01 0.00000E+00 0.00000E+00 3 1.17627E+00 1.03139E+02 -2.67391E-01 1.14548E+00 + 0.23710E+01 0.40537E+01 0.00000E+00 0.00000E+00 5 5.53933E+01 8.83361E+01 1.60841E+00 5.53700E+01 + 0.23710E+01 0.40537E+01 0.00000E+00 0.00000E+00 2 7.48079E-07 1.02634E+02 -1.63621E-07 7.29966E-07 + 0.23710E+01 0.40537E+01 0.00000E+00 0.00000E+00 4 4.51030E-06 1.23966E+02 -2.51989E-06 3.74072E-06 + 0.23710E+01 0.40537E+01 0.00000E+00 0.00000E+00 6 3.37854E-05 -1.40432E+02 -2.60441E-05 -2.15212E-05 + 0.23271E+01 0.40537E+01 0.00000E+00 0.00000E+00 1 1.64236E+01 -8.53436E+01 1.33325E+00 -1.63694E+01 + 0.23271E+01 0.40537E+01 0.00000E+00 0.00000E+00 3 5.37516E-01 -1.51654E+02 -4.73066E-01 -2.55209E-01 + 0.23271E+01 0.40537E+01 0.00000E+00 0.00000E+00 5 4.84180E+01 1.18071E+02 -2.27836E+01 4.27225E+01 + 0.23271E+01 0.40537E+01 0.00000E+00 0.00000E+00 2 1.06364E-06 -1.12067E+02 -3.99595E-07 -9.85720E-07 + 0.23271E+01 0.40537E+01 0.00000E+00 0.00000E+00 4 3.16652E-06 -1.33650E+02 -2.18570E-06 -2.29119E-06 + 0.23271E+01 0.40537E+01 0.00000E+00 0.00000E+00 6 1.24263E-04 1.68143E+02 -1.21612E-04 2.55333E-05 + 0.22848E+01 0.40537E+01 0.00000E+00 0.00000E+00 1 9.33669E+00 -1.14548E+02 -3.87903E+00 -8.49275E+00 + 0.22848E+01 0.40537E+01 0.00000E+00 0.00000E+00 3 2.16053E+00 -1.29597E+02 -1.37708E+00 -1.66479E+00 + 0.22848E+01 0.40537E+01 0.00000E+00 0.00000E+00 5 1.17227E+01 1.71008E+01 1.12044E+01 3.44710E+00 + 0.22848E+01 0.40537E+01 0.00000E+00 0.00000E+00 2 4.54382E-07 3.53902E+01 3.70424E-07 2.63152E-07 + 0.22848E+01 0.40537E+01 0.00000E+00 0.00000E+00 4 6.10360E-07 -2.95768E+01 5.30827E-07 -3.01267E-07 + 0.22848E+01 0.40537E+01 0.00000E+00 0.00000E+00 6 2.29188E-04 -1.09224E+02 -7.54647E-05 -2.16408E-04 + 0.22440E+01 0.40537E+01 0.00000E+00 0.00000E+00 1 1.12895E+01 -1.39455E+02 -8.57887E+00 -7.33867E+00 + 0.22440E+01 0.40537E+01 0.00000E+00 0.00000E+00 3 7.88906E-01 -1.11571E+02 -2.90043E-01 -7.33654E-01 + 0.22440E+01 0.40537E+01 0.00000E+00 0.00000E+00 5 4.83940E+01 1.71607E+01 4.62396E+01 1.42788E+01 + 0.22440E+01 0.40537E+01 0.00000E+00 0.00000E+00 2 1.12683E-06 3.27870E+01 9.47313E-07 6.10198E-07 + 0.22440E+01 0.40537E+01 0.00000E+00 0.00000E+00 4 5.93665E-06 7.17933E+01 1.85489E-06 5.63944E-06 + 0.22440E+01 0.40537E+01 0.00000E+00 0.00000E+00 6 1.41049E-04 1.08058E+02 -4.37224E-05 1.34102E-04 + 0.22046E+01 0.40537E+01 0.00000E+00 0.00000E+00 1 9.91854E+00 -1.29616E+02 -6.32447E+00 -7.64058E+00 + 0.22046E+01 0.40537E+01 0.00000E+00 0.00000E+00 3 2.84806E-01 -1.64659E+02 -2.74657E-01 -7.53513E-02 + 0.22046E+01 0.40537E+01 0.00000E+00 0.00000E+00 5 5.97951E+01 3.69975E+01 4.77561E+01 3.59835E+01 + 0.22046E+01 0.40537E+01 0.00000E+00 0.00000E+00 2 1.99398E-06 -1.67324E+02 -1.94538E-06 -4.37558E-07 + 0.22046E+01 0.40537E+01 0.00000E+00 0.00000E+00 4 1.15104E-06 -3.23022E+01 9.72908E-07 -6.15099E-07 + 0.22046E+01 0.40537E+01 0.00000E+00 0.00000E+00 6 8.85739E-05 -1.74101E+02 -8.81049E-05 -9.10296E-06 + 0.21666E+01 0.40537E+01 0.00000E+00 0.00000E+00 1 7.67812E-01 -1.47211E+02 -6.45475E-01 -4.15810E-01 + 0.21666E+01 0.40537E+01 0.00000E+00 0.00000E+00 3 9.78963E-01 1.02536E+02 -2.12482E-01 9.55625E-01 + 0.21666E+01 0.40537E+01 0.00000E+00 0.00000E+00 5 9.03753E+00 5.45268E+01 5.24468E+00 7.36004E+00 + 0.21666E+01 0.40537E+01 0.00000E+00 0.00000E+00 2 3.85539E-07 8.71090E+01 1.94451E-08 3.85049E-07 + 0.21666E+01 0.40537E+01 0.00000E+00 0.00000E+00 4 1.58217E-06 -6.76103E+00 1.57117E-06 -1.86267E-07 + 0.21666E+01 0.40537E+01 0.00000E+00 0.00000E+00 6 1.64033E-04 1.48235E+02 -1.39463E-04 8.63532E-05 + 0.21299E+01 0.40537E+01 0.00000E+00 0.00000E+00 1 8.82986E+00 9.18809E+01 -2.89808E-01 8.82510E+00 + 0.21299E+01 0.40537E+01 0.00000E+00 0.00000E+00 3 3.71931E-01 1.46110E+02 -3.08742E-01 2.07390E-01 + 0.21299E+01 0.40537E+01 0.00000E+00 0.00000E+00 5 3.74194E+01 -1.08915E+02 -1.21301E+01 -3.53987E+01 + 0.21299E+01 0.40537E+01 0.00000E+00 0.00000E+00 2 1.18649E-06 1.14575E+02 -4.93441E-07 1.07902E-06 + 0.21299E+01 0.40537E+01 0.00000E+00 0.00000E+00 4 7.39018E-07 4.93191E+01 4.81726E-07 5.60436E-07 + 0.21299E+01 0.40537E+01 0.00000E+00 0.00000E+00 6 1.53950E-04 -1.91304E+01 1.45448E-04 -5.04524E-05 + 0.20944E+01 0.40537E+01 0.00000E+00 0.00000E+00 1 5.23777E+00 7.39917E+01 1.44446E+00 5.03466E+00 + 0.20944E+01 0.40537E+01 0.00000E+00 0.00000E+00 3 1.88034E-01 1.13575E+02 -7.52036E-02 1.72341E-01 + 0.20944E+01 0.40537E+01 0.00000E+00 0.00000E+00 5 3.29456E+01 -9.35317E+01 -2.02949E+00 -3.28830E+01 + 0.20944E+01 0.40537E+01 0.00000E+00 0.00000E+00 2 5.04541E-07 -3.08888E+01 4.32980E-07 -2.59018E-07 + 0.20944E+01 0.40537E+01 0.00000E+00 0.00000E+00 4 2.90749E-07 -1.42562E+02 -2.30857E-07 -1.76748E-07 + 0.20944E+01 0.40537E+01 0.00000E+00 0.00000E+00 6 1.56771E-04 6.20163E+01 7.35603E-05 1.38441E-04 + 0.39270E+01 0.39270E+01 0.00000E+00 0.00000E+00 1 5.76997E+00 0.00000E+00 5.76997E+00 0.00000E+00 + 0.39270E+01 0.39270E+01 0.00000E+00 0.00000E+00 3 3.95736E-01 0.00000E+00 3.95736E-01 0.00000E+00 + 0.39270E+01 0.39270E+01 0.00000E+00 0.00000E+00 5 2.53020E+01 0.00000E+00 2.53020E+01 0.00000E+00 + 0.39270E+01 0.39270E+01 0.00000E+00 0.00000E+00 2 2.48037E-06 1.80000E+02 -2.48037E-06 0.00000E+00 + 0.39270E+01 0.39270E+01 0.00000E+00 0.00000E+00 4 1.99374E-05 1.80000E+02 -1.99374E-05 0.00000E+00 + 0.39270E+01 0.39270E+01 0.00000E+00 0.00000E+00 6 4.48895E-05 1.80000E+02 -4.48895E-05 0.00000E+00 + 0.38080E+01 0.39270E+01 0.00000E+00 0.00000E+00 1 5.18944E+00 -6.33177E+00 5.15778E+00 -5.72320E-01 + 0.38080E+01 0.39270E+01 0.00000E+00 0.00000E+00 3 9.45808E-01 -7.53298E+00 9.37645E-01 -1.23992E-01 + 0.38080E+01 0.39270E+01 0.00000E+00 0.00000E+00 5 3.46020E+01 1.45736E+01 3.34887E+01 8.70664E+00 + 0.38080E+01 0.39270E+01 0.00000E+00 0.00000E+00 2 9.70845E-06 -2.00819E+00 9.70249E-06 -3.40207E-07 + 0.38080E+01 0.39270E+01 0.00000E+00 0.00000E+00 4 1.56607E-05 1.67556E+02 -1.52927E-05 3.37476E-06 + 0.38080E+01 0.39270E+01 0.00000E+00 0.00000E+00 6 2.13112E-04 1.31900E+02 -1.42324E-04 1.58621E-04 + 0.36960E+01 0.39270E+01 0.00000E+00 0.00000E+00 1 4.55426E+00 -4.86854E+01 3.00669E+00 -3.42068E+00 + 0.36960E+01 0.39270E+01 0.00000E+00 0.00000E+00 3 3.59588E+00 -4.64163E+00 3.58409E+00 -2.90990E-01 + 0.36960E+01 0.39270E+01 0.00000E+00 0.00000E+00 5 5.38515E+01 5.66492E+01 2.96056E+01 4.49833E+01 + 0.36960E+01 0.39270E+01 0.00000E+00 0.00000E+00 2 4.16072E-06 -1.09874E+02 -1.41446E-06 -3.91292E-06 + 0.36960E+01 0.39270E+01 0.00000E+00 0.00000E+00 4 7.36726E-06 -1.06435E+02 -2.08443E-06 -7.06623E-06 + 0.36960E+01 0.39270E+01 0.00000E+00 0.00000E+00 6 6.91944E-04 8.97603E+01 2.89444E-06 6.91938E-04 + 0.35904E+01 0.39270E+01 0.00000E+00 0.00000E+00 1 4.78322E+00 -1.06367E+02 -1.34784E+00 -4.58939E+00 + 0.35904E+01 0.39270E+01 0.00000E+00 0.00000E+00 3 5.16246E+00 -8.36609E+00 5.10752E+00 -7.51125E-01 + 0.35904E+01 0.39270E+01 0.00000E+00 0.00000E+00 5 1.12989E+02 8.07107E+01 1.82386E+01 1.11508E+02 + 0.35904E+01 0.39270E+01 0.00000E+00 0.00000E+00 2 2.24570E-06 -1.27534E+02 -1.36816E-06 -1.78082E-06 + 0.35904E+01 0.39270E+01 0.00000E+00 0.00000E+00 4 2.16859E-05 -1.68594E+02 -2.12576E-05 -4.28875E-06 + 0.35904E+01 0.39270E+01 0.00000E+00 0.00000E+00 6 5.53611E-05 1.42316E+02 -4.38124E-05 3.38427E-05 + 0.34907E+01 0.39270E+01 0.00000E+00 0.00000E+00 1 9.29871E+00 -1.64521E+02 -8.96143E+00 -2.48169E+00 + 0.34907E+01 0.39270E+01 0.00000E+00 0.00000E+00 3 4.81725E+00 -1.84280E+01 4.57022E+00 -1.52280E+00 + 0.34907E+01 0.39270E+01 0.00000E+00 0.00000E+00 5 1.22602E+02 8.59623E+01 8.63285E+00 1.22298E+02 + 0.34907E+01 0.39270E+01 0.00000E+00 0.00000E+00 2 3.11414E-06 -1.73012E+00 3.11272E-06 -9.40210E-08 + 0.34907E+01 0.39270E+01 0.00000E+00 0.00000E+00 4 7.75881E-06 1.33534E+02 -5.34412E-06 5.62491E-06 + 0.34907E+01 0.39270E+01 0.00000E+00 0.00000E+00 6 2.07784E-04 4.13789E+00 2.07243E-04 1.49931E-05 + 0.33963E+01 0.39270E+01 0.00000E+00 0.00000E+00 1 1.14072E+01 1.78364E+02 -1.14026E+01 3.25728E-01 + 0.33963E+01 0.39270E+01 0.00000E+00 0.00000E+00 3 5.85742E+00 -6.37260E+01 2.59287E+00 -5.25227E+00 + 0.33963E+01 0.39270E+01 0.00000E+00 0.00000E+00 5 9.24102E+01 8.15626E+01 1.35592E+01 9.14100E+01 + 0.33963E+01 0.39270E+01 0.00000E+00 0.00000E+00 2 4.03316E-06 -7.76748E+01 8.60920E-07 -3.94020E-06 + 0.33963E+01 0.39270E+01 0.00000E+00 0.00000E+00 4 4.91030E-06 1.35080E+02 -3.47695E-06 3.46726E-06 + 0.33963E+01 0.39270E+01 0.00000E+00 0.00000E+00 6 7.78143E-05 9.23662E+01 -3.21262E-06 7.77479E-05 + 0.33069E+01 0.39270E+01 0.00000E+00 0.00000E+00 1 9.46884E+00 1.74563E+02 -9.42624E+00 8.97167E-01 + 0.33069E+01 0.39270E+01 0.00000E+00 0.00000E+00 3 8.03183E+00 -9.20195E+01 -2.83036E-01 -8.02684E+00 + 0.33069E+01 0.39270E+01 0.00000E+00 0.00000E+00 5 5.17540E+01 5.30725E+01 3.10940E+01 4.13719E+01 + 0.33069E+01 0.39270E+01 0.00000E+00 0.00000E+00 2 6.53168E-06 1.72632E+00 6.52871E-06 1.96769E-07 + 0.33069E+01 0.39270E+01 0.00000E+00 0.00000E+00 4 6.75062E-06 -1.56954E+02 -6.21185E-06 -2.64267E-06 + 0.33069E+01 0.39270E+01 0.00000E+00 0.00000E+00 6 4.57647E-04 1.79476E+02 -4.57628E-04 4.18583E-06 + 0.32221E+01 0.39270E+01 0.00000E+00 0.00000E+00 1 2.53142E+00 1.26442E+02 -1.50369E+00 2.03642E+00 + 0.32221E+01 0.39270E+01 0.00000E+00 0.00000E+00 3 7.53193E+00 -9.75613E+01 -9.91103E-01 -7.46644E+00 + 0.32221E+01 0.39270E+01 0.00000E+00 0.00000E+00 5 4.73154E+01 2.39350E+01 4.32466E+01 1.91959E+01 + 0.32221E+01 0.39270E+01 0.00000E+00 0.00000E+00 2 2.80775E-06 1.61606E+02 -2.66429E-06 8.86003E-07 + 0.32221E+01 0.39270E+01 0.00000E+00 0.00000E+00 4 1.53331E-05 1.78531E+02 -1.53281E-05 3.93050E-07 + 0.32221E+01 0.39270E+01 0.00000E+00 0.00000E+00 6 3.08403E-04 -2.18880E+01 2.86171E-04 -1.14970E-04 + 0.31416E+01 0.39270E+01 0.00000E+00 0.00000E+00 1 1.37951E+01 3.73890E+01 1.09606E+01 8.37672E+00 + 0.31416E+01 0.39270E+01 0.00000E+00 0.00000E+00 3 7.10821E+00 -9.54368E+01 -6.73481E-01 -7.07624E+00 + 0.31416E+01 0.39270E+01 0.00000E+00 0.00000E+00 5 4.60674E+01 1.13559E+01 4.51656E+01 9.07082E+00 + 0.31416E+01 0.39270E+01 0.00000E+00 0.00000E+00 2 2.11294E-06 1.47671E+02 -1.78541E-06 1.12996E-06 + 0.31416E+01 0.39270E+01 0.00000E+00 0.00000E+00 4 5.09138E-06 5.93204E+01 2.59781E-06 4.37876E-06 + 0.31416E+01 0.39270E+01 0.00000E+00 0.00000E+00 6 3.04481E-04 8.76982E+01 1.22288E-05 3.04235E-04 + 0.30650E+01 0.39270E+01 0.00000E+00 0.00000E+00 1 2.06973E+01 2.16240E+01 1.92407E+01 7.62726E+00 + 0.30650E+01 0.39270E+01 0.00000E+00 0.00000E+00 3 4.33203E+00 -1.33315E+02 -2.97179E+00 -3.15197E+00 + 0.30650E+01 0.39270E+01 0.00000E+00 0.00000E+00 5 1.64332E+01 6.09630E+01 7.97624E+00 1.43676E+01 + 0.30650E+01 0.39270E+01 0.00000E+00 0.00000E+00 2 1.49095E-06 4.99536E+01 9.59290E-07 1.14136E-06 + 0.30650E+01 0.39270E+01 0.00000E+00 0.00000E+00 4 9.13046E-06 -1.76711E+02 -9.11543E-06 -5.23776E-07 + 0.30650E+01 0.39270E+01 0.00000E+00 0.00000E+00 6 1.19853E-04 9.74692E+01 -1.55802E-05 1.18836E-04 + 0.29920E+01 0.39270E+01 0.00000E+00 0.00000E+00 1 1.53907E+01 -2.57512E+00 1.53752E+01 -6.91494E-01 + 0.29920E+01 0.39270E+01 0.00000E+00 0.00000E+00 3 4.50954E+00 1.70358E+02 -4.44583E+00 7.55339E-01 + 0.29920E+01 0.39270E+01 0.00000E+00 0.00000E+00 5 6.06447E+01 1.10512E+02 -2.12500E+01 5.67998E+01 + 0.29920E+01 0.39270E+01 0.00000E+00 0.00000E+00 2 1.83359E-06 -8.70093E+00 1.81248E-06 -2.77379E-07 + 0.29920E+01 0.39270E+01 0.00000E+00 0.00000E+00 4 6.65789E-06 4.64500E+01 4.58720E-06 4.82546E-06 + 0.29920E+01 0.39270E+01 0.00000E+00 0.00000E+00 6 7.32309E-05 -9.09923E+01 -1.26822E-06 -7.32199E-05 + 0.29224E+01 0.39270E+01 0.00000E+00 0.00000E+00 1 2.00734E+01 -7.33543E+01 5.75008E+00 -1.92322E+01 + 0.29224E+01 0.39270E+01 0.00000E+00 0.00000E+00 3 5.61251E+00 1.44905E+02 -4.59218E+00 3.22679E+00 + 0.29224E+01 0.39270E+01 0.00000E+00 0.00000E+00 5 1.28565E+02 9.73511E+01 -1.64498E+01 1.27508E+02 + 0.29224E+01 0.39270E+01 0.00000E+00 0.00000E+00 2 6.01435E-06 4.67140E+01 4.12368E-06 4.37809E-06 + 0.29224E+01 0.39270E+01 0.00000E+00 0.00000E+00 4 7.73089E-06 -1.35214E+02 -5.48692E-06 -5.44613E-06 + 0.29224E+01 0.39270E+01 0.00000E+00 0.00000E+00 6 6.50515E-04 9.39339E+01 -4.46290E-05 6.48982E-04 + 0.28560E+01 0.39270E+01 0.00000E+00 0.00000E+00 1 3.14168E+01 -1.00254E+02 -5.59279E+00 -3.09150E+01 + 0.28560E+01 0.39270E+01 0.00000E+00 0.00000E+00 3 2.74866E+00 1.25929E+02 -1.61286E+00 2.22572E+00 + 0.28560E+01 0.39270E+01 0.00000E+00 0.00000E+00 5 1.08048E+02 7.31170E+01 3.13792E+01 1.03391E+02 + 0.28560E+01 0.39270E+01 0.00000E+00 0.00000E+00 2 1.45471E-06 -1.79609E+02 -1.45467E-06 -9.92739E-09 + 0.28560E+01 0.39270E+01 0.00000E+00 0.00000E+00 4 2.17990E-06 1.47975E+01 2.10760E-06 5.56752E-07 + 0.28560E+01 0.39270E+01 0.00000E+00 0.00000E+00 6 1.38013E-04 7.32373E+01 3.98040E-05 1.32148E-04 + 0.27925E+01 0.39270E+01 0.00000E+00 0.00000E+00 1 2.77484E+01 -1.01815E+02 -5.68138E+00 -2.71606E+01 + 0.27925E+01 0.39270E+01 0.00000E+00 0.00000E+00 3 1.03508E+00 -9.60789E+01 -1.09612E-01 -1.02926E+00 + 0.27925E+01 0.39270E+01 0.00000E+00 0.00000E+00 5 5.98032E+01 5.88444E+01 3.09400E+01 5.11775E+01 + 0.27925E+01 0.39270E+01 0.00000E+00 0.00000E+00 2 2.22070E-06 7.17312E+01 6.96132E-07 2.10877E-06 + 0.27925E+01 0.39270E+01 0.00000E+00 0.00000E+00 4 7.75861E-06 -1.75509E+01 7.39744E-06 -2.33963E-06 + 0.27925E+01 0.39270E+01 0.00000E+00 0.00000E+00 6 3.36037E-04 5.14940E+01 2.09216E-04 2.62964E-04 + 0.27318E+01 0.39270E+01 0.00000E+00 0.00000E+00 1 1.55419E+01 -1.31490E+02 -1.02964E+01 -1.16419E+01 + 0.27318E+01 0.39270E+01 0.00000E+00 0.00000E+00 3 1.92910E+00 -6.15355E+01 9.19439E-01 -1.69590E+00 + 0.27318E+01 0.39270E+01 0.00000E+00 0.00000E+00 5 9.10482E+01 2.68959E+01 8.11995E+01 4.11875E+01 + 0.27318E+01 0.39270E+01 0.00000E+00 0.00000E+00 2 1.76682E-06 7.12005E+01 5.69371E-07 1.67256E-06 + 0.27318E+01 0.39270E+01 0.00000E+00 0.00000E+00 4 1.84175E-06 -1.48596E+01 1.78016E-06 -4.72321E-07 + 0.27318E+01 0.39270E+01 0.00000E+00 0.00000E+00 6 8.43707E-04 2.49888E+00 8.42904E-04 3.67854E-05 + 0.26737E+01 0.39270E+01 0.00000E+00 0.00000E+00 1 1.98573E+01 1.62400E+02 -1.89277E+01 6.00431E+00 + 0.26737E+01 0.39270E+01 0.00000E+00 0.00000E+00 3 1.89666E+00 -4.22071E+01 1.40490E+00 -1.27420E+00 + 0.26737E+01 0.39270E+01 0.00000E+00 0.00000E+00 5 1.43260E+02 1.80333E+01 1.36223E+02 4.43490E+01 + 0.26737E+01 0.39270E+01 0.00000E+00 0.00000E+00 2 1.80687E-06 -3.04853E+01 1.55709E-06 -9.16657E-07 + 0.26737E+01 0.39270E+01 0.00000E+00 0.00000E+00 4 7.99226E-06 -8.98446E+01 2.16815E-08 -7.99223E-06 + 0.26737E+01 0.39270E+01 0.00000E+00 0.00000E+00 6 1.50868E-04 -3.59384E+01 1.22150E-04 -8.85469E-05 + 0.26180E+01 0.39270E+01 0.00000E+00 0.00000E+00 1 2.57182E+01 1.56427E+02 -2.35720E+01 1.02852E+01 + 0.26180E+01 0.39270E+01 0.00000E+00 0.00000E+00 3 2.53826E-01 -1.42539E+01 2.46011E-01 -6.24969E-02 + 0.26180E+01 0.39270E+01 0.00000E+00 0.00000E+00 5 1.62636E+02 2.42405E+01 1.48297E+02 6.67732E+01 + 0.26180E+01 0.39270E+01 0.00000E+00 0.00000E+00 2 6.28234E-06 -4.73551E+00 6.26089E-06 -5.18645E-07 + 0.26180E+01 0.39270E+01 0.00000E+00 0.00000E+00 4 5.54510E-06 8.38217E+01 5.96780E-07 5.51289E-06 + 0.26180E+01 0.39270E+01 0.00000E+00 0.00000E+00 6 5.09620E-05 1.36622E+02 -3.70412E-05 3.50011E-05 + 0.25646E+01 0.39270E+01 0.00000E+00 0.00000E+00 1 1.05578E+01 1.58984E+02 -9.85549E+00 3.78631E+00 + 0.25646E+01 0.39270E+01 0.00000E+00 0.00000E+00 3 8.00554E-01 5.48695E+01 4.60672E-01 6.54728E-01 + 0.25646E+01 0.39270E+01 0.00000E+00 0.00000E+00 5 7.18111E+01 3.26711E+01 6.04493E+01 3.87648E+01 + 0.25646E+01 0.39270E+01 0.00000E+00 0.00000E+00 2 3.77966E-06 1.28409E+02 -2.34819E-06 2.96172E-06 + 0.25646E+01 0.39270E+01 0.00000E+00 0.00000E+00 4 3.59951E-06 -2.20798E+01 3.33553E-06 -1.35305E-06 + 0.25646E+01 0.39270E+01 0.00000E+00 0.00000E+00 6 4.11313E-04 -1.13026E+02 -1.60886E-04 -3.78542E-04 + 0.25133E+01 0.39270E+01 0.00000E+00 0.00000E+00 1 9.37247E+00 1.90421E+01 8.85960E+00 3.05789E+00 + 0.25133E+01 0.39270E+01 0.00000E+00 0.00000E+00 3 1.81260E+00 -3.75849E+01 1.43640E+00 -1.10557E+00 + 0.25133E+01 0.39270E+01 0.00000E+00 0.00000E+00 5 6.40054E+01 -1.49472E+02 -5.51329E+01 -3.25124E+01 + 0.25133E+01 0.39270E+01 0.00000E+00 0.00000E+00 2 4.32562E-06 9.83122E+01 -6.25345E-07 4.28018E-06 + 0.25133E+01 0.39270E+01 0.00000E+00 0.00000E+00 4 7.95340E-07 9.50777E+01 -7.03924E-08 7.92219E-07 + 0.25133E+01 0.39270E+01 0.00000E+00 0.00000E+00 6 2.27357E-04 -1.06640E+02 -6.51045E-05 -2.17836E-04 + 0.24640E+01 0.39270E+01 0.00000E+00 0.00000E+00 1 1.81519E+01 1.85341E+01 1.72105E+01 5.76994E+00 + 0.24640E+01 0.39270E+01 0.00000E+00 0.00000E+00 3 2.09010E+00 -1.12425E+02 -7.97305E-01 -1.93205E+00 + 0.24640E+01 0.39270E+01 0.00000E+00 0.00000E+00 5 9.13374E+01 -1.25000E+02 -5.23885E+01 -7.48196E+01 + 0.24640E+01 0.39270E+01 0.00000E+00 0.00000E+00 2 2.86324E-06 8.88543E+01 5.72522E-08 2.86267E-06 + 0.24640E+01 0.39270E+01 0.00000E+00 0.00000E+00 4 8.26697E-07 5.86213E+01 4.30455E-07 7.05787E-07 + 0.24640E+01 0.39270E+01 0.00000E+00 0.00000E+00 6 3.16196E-04 1.08103E+02 -9.82509E-05 3.00544E-04 + 0.24166E+01 0.39270E+01 0.00000E+00 0.00000E+00 1 1.08834E+01 9.69552E+00 1.07279E+01 1.83289E+00 + 0.24166E+01 0.39270E+01 0.00000E+00 0.00000E+00 3 1.86876E+00 8.19560E+01 2.61503E-01 1.85037E+00 + 0.24166E+01 0.39270E+01 0.00000E+00 0.00000E+00 5 3.73789E+01 -1.00799E+02 -7.00336E+00 -3.67170E+01 + 0.24166E+01 0.39270E+01 0.00000E+00 0.00000E+00 2 1.81127E-06 -1.69164E+02 -1.77897E-06 -3.40521E-07 + 0.24166E+01 0.39270E+01 0.00000E+00 0.00000E+00 4 3.33714E-06 -1.78467E+02 -3.33594E-06 -8.92939E-08 + 0.24166E+01 0.39270E+01 0.00000E+00 0.00000E+00 6 2.48614E-04 7.24757E+00 2.46628E-04 3.13644E-05 + 0.23710E+01 0.39270E+01 0.00000E+00 0.00000E+00 1 1.33299E+01 -7.91176E+01 2.51658E+00 -1.30901E+01 + 0.23710E+01 0.39270E+01 0.00000E+00 0.00000E+00 3 2.05113E+00 8.55635E+01 1.58662E-01 2.04498E+00 + 0.23710E+01 0.39270E+01 0.00000E+00 0.00000E+00 5 4.97394E+01 7.47447E+01 1.30875E+01 4.79867E+01 + 0.23710E+01 0.39270E+01 0.00000E+00 0.00000E+00 2 2.46364E-06 1.34986E+02 -1.74165E-06 1.74247E-06 + 0.23710E+01 0.39270E+01 0.00000E+00 0.00000E+00 4 2.77462E-06 4.66372E+00 2.76544E-06 2.25597E-07 + 0.23710E+01 0.39270E+01 0.00000E+00 0.00000E+00 6 5.74961E-05 9.27022E+01 -2.71060E-06 5.74322E-05 + 0.23271E+01 0.39270E+01 0.00000E+00 0.00000E+00 1 2.23353E+01 -8.25837E+01 2.88300E+00 -2.21485E+01 + 0.23271E+01 0.39270E+01 0.00000E+00 0.00000E+00 3 1.07766E+00 6.18588E+01 5.08276E-01 9.50271E-01 + 0.23271E+01 0.39270E+01 0.00000E+00 0.00000E+00 5 7.10590E+01 1.05192E+02 -1.86210E+01 6.85758E+01 + 0.23271E+01 0.39270E+01 0.00000E+00 0.00000E+00 2 1.57761E-06 -1.71526E+02 -1.56039E-06 -2.32473E-07 + 0.23271E+01 0.39270E+01 0.00000E+00 0.00000E+00 4 4.79831E-06 1.01168E+02 -9.29396E-07 4.70744E-06 + 0.23271E+01 0.39270E+01 0.00000E+00 0.00000E+00 6 2.29816E-04 9.76337E+01 -3.05287E-05 2.27780E-04 + 0.22848E+01 0.39270E+01 0.00000E+00 0.00000E+00 1 1.37269E+01 -9.19623E+01 -4.70031E-01 -1.37189E+01 + 0.22848E+01 0.39270E+01 0.00000E+00 0.00000E+00 3 1.63237E+00 -1.03635E+02 -3.84796E-01 -1.58637E+00 + 0.22848E+01 0.39270E+01 0.00000E+00 0.00000E+00 5 2.74801E+01 1.21451E+02 -1.43383E+01 2.34429E+01 + 0.22848E+01 0.39270E+01 0.00000E+00 0.00000E+00 2 1.53783E-06 -4.76619E+01 1.03573E-06 -1.13674E-06 + 0.22848E+01 0.39270E+01 0.00000E+00 0.00000E+00 4 8.92184E-07 -8.77174E+01 3.55337E-08 -8.91476E-07 + 0.22848E+01 0.39270E+01 0.00000E+00 0.00000E+00 6 2.91466E-04 1.21813E+02 -1.53645E-04 2.47680E-04 + 0.22440E+01 0.39270E+01 0.00000E+00 0.00000E+00 1 1.07913E+01 -1.38581E+02 -8.09236E+00 -7.13911E+00 + 0.22440E+01 0.39270E+01 0.00000E+00 0.00000E+00 3 1.83163E+00 -1.16683E+02 -8.22494E-01 -1.63658E+00 + 0.22440E+01 0.39270E+01 0.00000E+00 0.00000E+00 5 3.65306E+01 2.65619E+00 3.64914E+01 1.69292E+00 + 0.22440E+01 0.39270E+01 0.00000E+00 0.00000E+00 2 1.64236E-06 8.18476E+01 2.32897E-07 1.62576E-06 + 0.22440E+01 0.39270E+01 0.00000E+00 0.00000E+00 4 3.50488E-06 -6.76159E+01 1.33470E-06 -3.24079E-06 + 0.22440E+01 0.39270E+01 0.00000E+00 0.00000E+00 6 5.50992E-05 -3.74689E+01 4.37313E-05 -3.35185E-05 + 0.22046E+01 0.39270E+01 0.00000E+00 0.00000E+00 1 1.10612E+01 -1.46190E+02 -9.19062E+00 -6.15486E+00 + 0.22046E+01 0.39270E+01 0.00000E+00 0.00000E+00 3 1.05408E+00 -9.77374E+01 -1.41914E-01 -1.04448E+00 + 0.22046E+01 0.39270E+01 0.00000E+00 0.00000E+00 5 5.42936E+01 3.24568E+01 4.58128E+01 2.91374E+01 + 0.22046E+01 0.39270E+01 0.00000E+00 0.00000E+00 2 4.38498E-07 -1.78813E+02 -4.38403E-07 -9.08696E-09 + 0.22046E+01 0.39270E+01 0.00000E+00 0.00000E+00 4 1.24013E-06 -7.09965E+01 4.03818E-07 -1.17254E-06 + 0.22046E+01 0.39270E+01 0.00000E+00 0.00000E+00 6 1.07228E-04 9.53778E+01 -1.00497E-05 1.06756E-04 + 0.21666E+01 0.39270E+01 0.00000E+00 0.00000E+00 1 4.97988E+00 -1.29855E+02 -3.19131E+00 -3.82292E+00 + 0.21666E+01 0.39270E+01 0.00000E+00 0.00000E+00 3 7.86046E-01 1.13887E+02 -3.18292E-01 7.18720E-01 + 0.21666E+01 0.39270E+01 0.00000E+00 0.00000E+00 5 4.20836E+01 4.63614E+01 2.90422E+01 3.04562E+01 + 0.21666E+01 0.39270E+01 0.00000E+00 0.00000E+00 2 4.42144E-07 1.12044E+02 -1.65943E-07 4.09823E-07 + 0.21666E+01 0.39270E+01 0.00000E+00 0.00000E+00 4 4.06719E-07 -1.26643E+02 -2.42743E-07 -3.26338E-07 + 0.21666E+01 0.39270E+01 0.00000E+00 0.00000E+00 6 2.07180E-04 1.05701E+02 -5.60658E-05 1.99450E-04 + 0.21299E+01 0.39270E+01 0.00000E+00 0.00000E+00 1 5.81173E+00 8.42230E+01 5.84994E-01 5.78222E+00 + 0.21299E+01 0.39270E+01 0.00000E+00 0.00000E+00 3 6.75645E-01 1.38692E+02 -5.07527E-01 4.45997E-01 + 0.21299E+01 0.39270E+01 0.00000E+00 0.00000E+00 5 1.54437E+01 -1.11477E+02 -5.65443E+00 -1.43713E+01 + 0.21299E+01 0.39270E+01 0.00000E+00 0.00000E+00 2 1.24572E-06 1.04767E+01 1.22495E-06 2.26516E-07 + 0.21299E+01 0.39270E+01 0.00000E+00 0.00000E+00 4 3.53212E-06 -1.53961E+02 -3.17361E-06 -1.55052E-06 + 0.21299E+01 0.39270E+01 0.00000E+00 0.00000E+00 6 3.34620E-05 1.21226E+02 -1.73472E-05 2.86144E-05 + 0.20944E+01 0.39270E+01 0.00000E+00 0.00000E+00 1 6.42419E+00 8.29496E+01 7.88516E-01 6.37562E+00 + 0.20944E+01 0.39270E+01 0.00000E+00 0.00000E+00 3 4.73786E-01 1.39861E+02 -3.62202E-01 3.05423E-01 + 0.20944E+01 0.39270E+01 0.00000E+00 0.00000E+00 5 4.04195E+01 -1.03092E+02 -9.15571E+00 -3.93688E+01 + 0.20944E+01 0.39270E+01 0.00000E+00 0.00000E+00 2 7.15378E-07 -6.99627E+01 2.45111E-07 -6.72076E-07 + 0.20944E+01 0.39270E+01 0.00000E+00 0.00000E+00 4 1.69044E-06 6.99411E+01 5.79798E-07 1.58790E-06 + 0.20944E+01 0.39270E+01 0.00000E+00 0.00000E+00 6 5.72112E-05 9.59090E+01 -5.88977E-06 5.69072E-05 + 0.38080E+01 0.38080E+01 0.00000E+00 0.00000E+00 1 6.43911E+00 0.00000E+00 6.43911E+00 0.00000E+00 + 0.38080E+01 0.38080E+01 0.00000E+00 0.00000E+00 3 2.54237E-01 0.00000E+00 2.54237E-01 0.00000E+00 + 0.38080E+01 0.38080E+01 0.00000E+00 0.00000E+00 5 3.40127E+01 0.00000E+00 3.40127E+01 0.00000E+00 + 0.38080E+01 0.38080E+01 0.00000E+00 0.00000E+00 2 1.39889E-06 1.80000E+02 -1.39889E-06 0.00000E+00 + 0.38080E+01 0.38080E+01 0.00000E+00 0.00000E+00 4 5.69461E-05 0.00000E+00 5.69461E-05 0.00000E+00 + 0.38080E+01 0.38080E+01 0.00000E+00 0.00000E+00 6 5.80247E-05 1.80000E+02 -5.80247E-05 0.00000E+00 + 0.36960E+01 0.38080E+01 0.00000E+00 0.00000E+00 1 5.60322E+00 -1.79845E+01 5.32945E+00 -1.73005E+00 + 0.36960E+01 0.38080E+01 0.00000E+00 0.00000E+00 3 8.66322E-01 -4.52346E+00 8.63623E-01 -6.83244E-02 + 0.36960E+01 0.38080E+01 0.00000E+00 0.00000E+00 5 3.59015E+01 4.13246E+00 3.58081E+01 2.58715E+00 + 0.36960E+01 0.38080E+01 0.00000E+00 0.00000E+00 2 3.92311E-06 -2.71497E+01 3.49085E-06 -1.79018E-06 + 0.36960E+01 0.38080E+01 0.00000E+00 0.00000E+00 4 4.51577E-06 -1.48832E+02 -3.86392E-06 -2.33715E-06 + 0.36960E+01 0.38080E+01 0.00000E+00 0.00000E+00 6 1.56999E-04 -8.15360E+01 2.31085E-05 -1.55289E-04 + 0.35904E+01 0.38080E+01 0.00000E+00 0.00000E+00 1 4.53226E+00 -6.37168E+01 2.00693E+00 -4.06370E+00 + 0.35904E+01 0.38080E+01 0.00000E+00 0.00000E+00 3 3.73062E+00 -6.08321E+00 3.70962E+00 -3.95344E-01 + 0.35904E+01 0.38080E+01 0.00000E+00 0.00000E+00 5 5.86855E+01 5.26503E+01 3.56032E+01 4.66519E+01 + 0.35904E+01 0.38080E+01 0.00000E+00 0.00000E+00 2 2.88152E-06 1.66615E+02 -2.80325E-06 6.67071E-07 + 0.35904E+01 0.38080E+01 0.00000E+00 0.00000E+00 4 3.38459E-06 1.31674E+01 3.29560E-06 7.70998E-07 + 0.35904E+01 0.38080E+01 0.00000E+00 0.00000E+00 6 2.47352E-04 1.33090E+02 -1.68977E-04 1.80638E-04 + 0.34907E+01 0.38080E+01 0.00000E+00 0.00000E+00 1 5.83463E+00 -1.33178E+02 -3.99246E+00 -4.25478E+00 + 0.34907E+01 0.38080E+01 0.00000E+00 0.00000E+00 3 4.45530E+00 -2.43911E-01 4.45526E+00 -1.89664E-02 + 0.34907E+01 0.38080E+01 0.00000E+00 0.00000E+00 5 1.03064E+02 8.17905E+01 1.47168E+01 1.02008E+02 + 0.34907E+01 0.38080E+01 0.00000E+00 0.00000E+00 2 2.35490E-06 -1.25137E+02 -1.35534E-06 -1.92578E-06 + 0.34907E+01 0.38080E+01 0.00000E+00 0.00000E+00 4 1.82189E-05 1.68336E+02 -1.78427E-05 3.68339E-06 + 0.34907E+01 0.38080E+01 0.00000E+00 0.00000E+00 6 4.18680E-04 1.64472E+02 -4.03398E-04 1.12083E-04 + 0.33963E+01 0.38080E+01 0.00000E+00 0.00000E+00 1 8.95034E+00 -1.68137E+02 -8.75919E+00 -1.83991E+00 + 0.33963E+01 0.38080E+01 0.00000E+00 0.00000E+00 3 4.93822E+00 -2.43191E+01 4.50003E+00 -2.03365E+00 + 0.33963E+01 0.38080E+01 0.00000E+00 0.00000E+00 5 1.18126E+02 8.73067E+01 5.55067E+00 1.17995E+02 + 0.33963E+01 0.38080E+01 0.00000E+00 0.00000E+00 2 2.46287E-06 1.69711E+02 -2.42326E-06 4.39904E-07 + 0.33963E+01 0.38080E+01 0.00000E+00 0.00000E+00 4 8.01302E-06 1.58063E+02 -7.43282E-06 2.99361E-06 + 0.33963E+01 0.38080E+01 0.00000E+00 0.00000E+00 6 2.52663E-04 1.47065E+02 -2.12058E-04 1.37368E-04 + 0.33069E+01 0.38080E+01 0.00000E+00 0.00000E+00 1 1.24098E+01 1.79994E+02 -1.24098E+01 1.38998E-03 + 0.33069E+01 0.38080E+01 0.00000E+00 0.00000E+00 3 6.04254E+00 -7.49361E+01 1.57043E+00 -5.83490E+00 + 0.33069E+01 0.38080E+01 0.00000E+00 0.00000E+00 5 6.98709E+01 8.28008E+01 8.75622E+00 6.93201E+01 + 0.33069E+01 0.38080E+01 0.00000E+00 0.00000E+00 2 4.73191E-06 -8.24612E+01 6.20817E-07 -4.69101E-06 + 0.33069E+01 0.38080E+01 0.00000E+00 0.00000E+00 4 8.33356E-06 -5.47375E+01 4.81115E-06 -6.80448E-06 + 0.33069E+01 0.38080E+01 0.00000E+00 0.00000E+00 6 8.04129E-05 1.77510E+02 -8.03370E-05 3.49306E-06 + 0.32221E+01 0.38080E+01 0.00000E+00 0.00000E+00 1 9.90929E+00 1.75351E+02 -9.87669E+00 8.03138E-01 + 0.32221E+01 0.38080E+01 0.00000E+00 0.00000E+00 3 7.02504E+00 -9.78833E+01 -9.63530E-01 -6.95865E+00 + 0.32221E+01 0.38080E+01 0.00000E+00 0.00000E+00 5 4.57200E+01 6.23663E+01 2.12057E+01 4.05048E+01 + 0.32221E+01 0.38080E+01 0.00000E+00 0.00000E+00 2 1.39081E-05 -1.56710E+01 1.33912E-05 -3.75678E-06 + 0.32221E+01 0.38080E+01 0.00000E+00 0.00000E+00 4 4.99523E-06 -8.63289E+00 4.93863E-06 -7.49798E-07 + 0.32221E+01 0.38080E+01 0.00000E+00 0.00000E+00 6 2.30092E-04 -1.72799E+02 -2.28278E-04 -2.88410E-05 + 0.31416E+01 0.38080E+01 0.00000E+00 0.00000E+00 1 5.95840E+00 9.25701E+01 -2.67181E-01 5.95240E+00 + 0.31416E+01 0.38080E+01 0.00000E+00 0.00000E+00 3 7.77472E+00 -8.72740E+01 3.69769E-01 -7.76592E+00 + 0.31416E+01 0.38080E+01 0.00000E+00 0.00000E+00 5 6.16449E+01 9.70054E+00 6.07635E+01 1.03871E+01 + 0.31416E+01 0.38080E+01 0.00000E+00 0.00000E+00 2 1.23374E-06 -6.56049E+01 5.09567E-07 -1.12359E-06 + 0.31416E+01 0.38080E+01 0.00000E+00 0.00000E+00 4 7.59280E-06 1.88814E+01 7.18423E-06 2.45711E-06 + 0.31416E+01 0.38080E+01 0.00000E+00 0.00000E+00 6 4.84952E-04 -1.62740E+02 -4.63113E-04 -1.43892E-04 + 0.30650E+01 0.38080E+01 0.00000E+00 0.00000E+00 1 1.63450E+01 3.19993E+01 1.38614E+01 8.66134E+00 + 0.30650E+01 0.38080E+01 0.00000E+00 0.00000E+00 3 6.60426E+00 -1.04629E+02 -1.66793E+00 -6.39017E+00 + 0.30650E+01 0.38080E+01 0.00000E+00 0.00000E+00 5 3.99039E+01 -1.09293E+01 3.91801E+01 -7.56570E+00 + 0.30650E+01 0.38080E+01 0.00000E+00 0.00000E+00 2 2.17365E-06 1.59800E+02 -2.03995E-06 7.50573E-07 + 0.30650E+01 0.38080E+01 0.00000E+00 0.00000E+00 4 6.43325E-06 1.04512E+02 -1.61208E-06 6.22799E-06 + 0.30650E+01 0.38080E+01 0.00000E+00 0.00000E+00 6 7.83761E-04 1.05261E+02 -2.06304E-04 7.56122E-04 + 0.29920E+01 0.38080E+01 0.00000E+00 0.00000E+00 1 2.04397E+01 2.28866E+01 1.88306E+01 7.94917E+00 + 0.29920E+01 0.38080E+01 0.00000E+00 0.00000E+00 3 3.96659E+00 -1.48169E+02 -3.37003E+00 -2.09206E+00 + 0.29920E+01 0.38080E+01 0.00000E+00 0.00000E+00 5 1.08372E+01 1.05159E+02 -2.83394E+00 1.04601E+01 + 0.29920E+01 0.38080E+01 0.00000E+00 0.00000E+00 2 4.02827E-06 2.06041E+01 3.77060E-06 1.41758E-06 + 0.29920E+01 0.38080E+01 0.00000E+00 0.00000E+00 4 3.15146E-06 4.77181E+00 3.14054E-06 2.62162E-07 + 0.29920E+01 0.38080E+01 0.00000E+00 0.00000E+00 6 4.83580E-05 3.78973E+01 3.81600E-05 2.97038E-05 + 0.29224E+01 0.38080E+01 0.00000E+00 0.00000E+00 1 1.56085E+01 -1.42044E+01 1.51313E+01 -3.83005E+00 + 0.29224E+01 0.38080E+01 0.00000E+00 0.00000E+00 3 4.70734E+00 1.63822E+02 -4.52093E+00 1.31158E+00 + 0.29224E+01 0.38080E+01 0.00000E+00 0.00000E+00 5 8.10813E+01 1.12823E+02 -3.14502E+01 7.47333E+01 + 0.29224E+01 0.38080E+01 0.00000E+00 0.00000E+00 2 3.08578E-06 3.38530E+01 2.56264E-06 1.71898E-06 + 0.29224E+01 0.38080E+01 0.00000E+00 0.00000E+00 4 8.44908E-06 1.00557E+01 8.31929E-06 1.47526E-06 + 0.29224E+01 0.38080E+01 0.00000E+00 0.00000E+00 6 4.54254E-04 -7.91482E+01 8.55217E-05 -4.46131E-04 + 0.28560E+01 0.38080E+01 0.00000E+00 0.00000E+00 1 2.18243E+01 -8.71371E+01 1.09005E+00 -2.17971E+01 + 0.28560E+01 0.38080E+01 0.00000E+00 0.00000E+00 3 5.30671E+00 1.41605E+02 -4.15911E+00 3.29590E+00 + 0.28560E+01 0.38080E+01 0.00000E+00 0.00000E+00 5 1.08074E+02 8.74282E+01 4.84932E+00 1.07965E+02 + 0.28560E+01 0.38080E+01 0.00000E+00 0.00000E+00 2 4.08090E-06 1.01093E+02 -7.85196E-07 4.00465E-06 + 0.28560E+01 0.38080E+01 0.00000E+00 0.00000E+00 4 3.36374E-06 -2.67972E+01 3.00250E-06 -1.51649E-06 + 0.28560E+01 0.38080E+01 0.00000E+00 0.00000E+00 6 2.51581E-04 -7.36211E+01 7.09432E-05 -2.41372E-04 + 0.27925E+01 0.38080E+01 0.00000E+00 0.00000E+00 1 3.01515E+01 -9.66500E+01 -3.49169E+00 -2.99486E+01 + 0.27925E+01 0.38080E+01 0.00000E+00 0.00000E+00 3 1.97373E+00 1.41556E+02 -1.54586E+00 1.22717E+00 + 0.27925E+01 0.38080E+01 0.00000E+00 0.00000E+00 5 9.13256E+01 8.73337E+01 4.24841E+00 9.12267E+01 + 0.27925E+01 0.38080E+01 0.00000E+00 0.00000E+00 2 6.22606E-06 -9.03079E+01 -3.34599E-08 -6.22597E-06 + 0.27925E+01 0.38080E+01 0.00000E+00 0.00000E+00 4 5.66991E-06 -3.37581E+01 4.71391E-06 -3.15070E-06 + 0.27925E+01 0.38080E+01 0.00000E+00 0.00000E+00 6 2.54315E-04 1.11288E+02 -9.23320E-05 2.36962E-04 + 0.27318E+01 0.38080E+01 0.00000E+00 0.00000E+00 1 2.51794E+01 -1.01877E+02 -5.18215E+00 -2.46403E+01 + 0.27318E+01 0.38080E+01 0.00000E+00 0.00000E+00 3 9.70123E-01 -8.54652E+01 7.67025E-02 -9.67086E-01 + 0.27318E+01 0.38080E+01 0.00000E+00 0.00000E+00 5 7.55021E+01 5.63464E+01 4.18410E+01 6.28482E+01 + 0.27318E+01 0.38080E+01 0.00000E+00 0.00000E+00 2 1.17946E-06 8.88947E+01 2.27508E-08 1.17924E-06 + 0.27318E+01 0.38080E+01 0.00000E+00 0.00000E+00 4 4.99005E-06 2.21205E+01 4.62275E-06 1.87903E-06 + 0.27318E+01 0.38080E+01 0.00000E+00 0.00000E+00 6 1.62443E-04 -1.14034E+02 -6.61608E-05 -1.48359E-04 + 0.26737E+01 0.38080E+01 0.00000E+00 0.00000E+00 1 1.29673E+01 -1.51468E+02 -1.13924E+01 -6.19390E+00 + 0.26737E+01 0.38080E+01 0.00000E+00 0.00000E+00 3 2.00604E+00 -2.82521E+01 1.76707E+00 -9.49565E-01 + 0.26737E+01 0.38080E+01 0.00000E+00 0.00000E+00 5 9.42523E+01 8.60689E+00 9.31908E+01 1.41053E+01 + 0.26737E+01 0.38080E+01 0.00000E+00 0.00000E+00 2 5.01505E-07 -7.11905E+00 4.97638E-07 -6.21521E-08 + 0.26737E+01 0.38080E+01 0.00000E+00 0.00000E+00 4 5.32416E-06 7.75451E+01 1.14827E-06 5.19886E-06 + 0.26737E+01 0.38080E+01 0.00000E+00 0.00000E+00 6 4.65726E-04 -2.99213E+00 4.65091E-04 -2.43104E-05 + 0.26180E+01 0.38080E+01 0.00000E+00 0.00000E+00 1 2.24523E+01 1.61656E+02 -2.13114E+01 7.06615E+00 + 0.26180E+01 0.38080E+01 0.00000E+00 0.00000E+00 3 2.07107E+00 -3.43555E+01 1.70978E+00 -1.16876E+00 + 0.26180E+01 0.38080E+01 0.00000E+00 0.00000E+00 5 1.37683E+02 2.02962E+01 1.29134E+02 4.77585E+01 + 0.26180E+01 0.38080E+01 0.00000E+00 0.00000E+00 2 3.96456E-06 7.32784E+01 1.14069E-06 3.79691E-06 + 0.26180E+01 0.38080E+01 0.00000E+00 0.00000E+00 4 3.03358E-06 9.61088E+01 -3.22822E-07 3.01636E-06 + 0.26180E+01 0.38080E+01 0.00000E+00 0.00000E+00 6 3.38584E-04 -3.69426E-01 3.38577E-04 -2.18307E-06 + 0.25646E+01 0.38080E+01 0.00000E+00 0.00000E+00 1 2.13002E+01 1.63555E+02 -2.04289E+01 6.03003E+00 + 0.25646E+01 0.38080E+01 0.00000E+00 0.00000E+00 3 1.87387E-01 6.71697E+01 7.27067E-02 1.72707E-01 + 0.25646E+01 0.38080E+01 0.00000E+00 0.00000E+00 5 1.34604E+02 3.46124E+01 1.10781E+02 7.64582E+01 + 0.25646E+01 0.38080E+01 0.00000E+00 0.00000E+00 2 4.10720E-06 1.13129E+02 -1.61334E-06 3.77707E-06 + 0.25646E+01 0.38080E+01 0.00000E+00 0.00000E+00 4 7.64773E-06 1.21608E+02 -4.00824E-06 6.51320E-06 + 0.25646E+01 0.38080E+01 0.00000E+00 0.00000E+00 6 1.73684E-04 -1.07166E+02 -5.12621E-05 -1.65947E-04 + 0.25133E+01 0.38080E+01 0.00000E+00 0.00000E+00 1 6.90134E+00 1.50668E+02 -6.01655E+00 3.38078E+00 + 0.25133E+01 0.38080E+01 0.00000E+00 0.00000E+00 3 1.06041E+00 6.61527E+01 4.28726E-01 9.69881E-01 + 0.25133E+01 0.38080E+01 0.00000E+00 0.00000E+00 5 1.36008E+01 8.77252E+01 5.39851E-01 1.35901E+01 + 0.25133E+01 0.38080E+01 0.00000E+00 0.00000E+00 2 1.51050E-06 2.76734E+00 1.50874E-06 7.29279E-08 + 0.25133E+01 0.38080E+01 0.00000E+00 0.00000E+00 4 1.07233E-06 -8.45031E+01 1.02720E-07 -1.06740E-06 + 0.25133E+01 0.38080E+01 0.00000E+00 0.00000E+00 6 7.18722E-05 -1.29001E+02 -4.52316E-05 -5.58544E-05 + 0.24640E+01 0.38080E+01 0.00000E+00 0.00000E+00 1 1.38797E+01 2.47708E+01 1.26027E+01 5.81546E+00 + 0.24640E+01 0.38080E+01 0.00000E+00 0.00000E+00 3 1.52991E+00 -4.35951E+01 1.10801E+00 -1.05496E+00 + 0.24640E+01 0.38080E+01 0.00000E+00 0.00000E+00 5 8.30643E+01 -1.34402E+02 -5.81194E+01 -5.93449E+01 + 0.24640E+01 0.38080E+01 0.00000E+00 0.00000E+00 2 1.78241E-06 9.15028E+01 -4.67446E-08 1.78180E-06 + 0.24640E+01 0.38080E+01 0.00000E+00 0.00000E+00 4 2.85284E-07 -1.70646E+02 -2.81491E-07 -4.63664E-08 + 0.24640E+01 0.38080E+01 0.00000E+00 0.00000E+00 6 6.83749E-05 1.03811E+02 -1.63222E-05 6.63982E-05 + 0.24166E+01 0.38080E+01 0.00000E+00 0.00000E+00 1 1.81368E+01 2.79189E+01 1.60258E+01 8.49203E+00 + 0.24166E+01 0.38080E+01 0.00000E+00 0.00000E+00 3 9.33288E-01 -1.23270E+02 -5.11990E-01 -7.80316E-01 + 0.24166E+01 0.38080E+01 0.00000E+00 0.00000E+00 5 8.63875E+01 -1.13335E+02 -3.42182E+01 -7.93216E+01 + 0.24166E+01 0.38080E+01 0.00000E+00 0.00000E+00 2 1.30795E-06 1.53220E+02 -1.16767E-06 5.89322E-07 + 0.24166E+01 0.38080E+01 0.00000E+00 0.00000E+00 4 1.27791E-05 2.43481E+00 1.27676E-05 5.42892E-07 + 0.24166E+01 0.38080E+01 0.00000E+00 0.00000E+00 6 2.50268E-04 9.47470E+01 -2.07113E-05 2.49409E-04 + 0.23710E+01 0.38080E+01 0.00000E+00 0.00000E+00 1 8.43164E+00 -1.28053E+01 8.22194E+00 -1.86877E+00 + 0.23710E+01 0.38080E+01 0.00000E+00 0.00000E+00 3 1.07458E+00 1.07912E+02 -3.30486E-01 1.02249E+00 + 0.23710E+01 0.38080E+01 0.00000E+00 0.00000E+00 5 5.04909E+00 -2.24614E-01 5.04905E+00 -1.97937E-02 + 0.23710E+01 0.38080E+01 0.00000E+00 0.00000E+00 2 1.78944E-06 1.67644E+01 1.71338E-06 5.16141E-07 + 0.23710E+01 0.38080E+01 0.00000E+00 0.00000E+00 4 9.98860E-07 -1.60739E+02 -9.42950E-07 -3.29494E-07 + 0.23710E+01 0.38080E+01 0.00000E+00 0.00000E+00 6 1.26299E-04 3.15709E+01 1.07606E-04 6.61245E-05 + 0.23271E+01 0.38080E+01 0.00000E+00 0.00000E+00 1 1.91658E+01 -7.14724E+01 6.09017E+00 -1.81725E+01 + 0.23271E+01 0.38080E+01 0.00000E+00 0.00000E+00 3 2.27123E+00 9.15826E+01 -6.27252E-02 2.27036E+00 + 0.23271E+01 0.38080E+01 0.00000E+00 0.00000E+00 5 6.11021E+01 9.47907E+01 -5.10300E+00 6.08886E+01 + 0.23271E+01 0.38080E+01 0.00000E+00 0.00000E+00 2 1.07428E-06 -1.47240E+02 -9.03406E-07 -5.81319E-07 + 0.23271E+01 0.38080E+01 0.00000E+00 0.00000E+00 4 1.48557E-06 -1.41927E+02 -1.16947E-06 -9.16102E-07 + 0.23271E+01 0.38080E+01 0.00000E+00 0.00000E+00 6 3.96754E-04 3.95668E+01 3.05850E-04 2.52723E-04 + 0.22848E+01 0.38080E+01 0.00000E+00 0.00000E+00 1 2.08793E+01 -7.89416E+01 4.00485E+00 -2.04916E+01 + 0.22848E+01 0.38080E+01 0.00000E+00 0.00000E+00 3 9.80455E-02 1.70043E+02 -9.65688E-02 1.69523E-02 + 0.22848E+01 0.38080E+01 0.00000E+00 0.00000E+00 5 6.38089E+01 1.22003E+02 -3.38166E+01 5.41112E+01 + 0.22848E+01 0.38080E+01 0.00000E+00 0.00000E+00 2 5.84996E-07 9.45027E+01 -4.59259E-08 5.83191E-07 + 0.22848E+01 0.38080E+01 0.00000E+00 0.00000E+00 4 3.99024E-06 7.53045E+01 1.01225E-06 3.85971E-06 + 0.22848E+01 0.38080E+01 0.00000E+00 0.00000E+00 6 8.79664E-05 1.57145E+02 -8.10602E-05 3.41663E-05 + 0.22440E+01 0.38080E+01 0.00000E+00 0.00000E+00 1 1.31042E+01 -9.91250E+01 -2.07819E+00 -1.29384E+01 + 0.22440E+01 0.38080E+01 0.00000E+00 0.00000E+00 3 1.77803E+00 -1.09510E+02 -5.93820E-01 -1.67593E+00 + 0.22440E+01 0.38080E+01 0.00000E+00 0.00000E+00 5 1.77209E+01 6.48888E+01 7.52034E+00 1.60460E+01 + 0.22440E+01 0.38080E+01 0.00000E+00 0.00000E+00 2 1.25898E-06 -8.85281E+01 3.23395E-08 -1.25856E-06 + 0.22440E+01 0.38080E+01 0.00000E+00 0.00000E+00 4 1.82848E-06 -6.59886E+01 7.44042E-07 -1.67025E-06 + 0.22440E+01 0.38080E+01 0.00000E+00 0.00000E+00 6 1.51325E-04 -1.66577E+02 -1.47191E-04 -3.51294E-05 + 0.22046E+01 0.38080E+01 0.00000E+00 0.00000E+00 1 1.27599E+01 -1.48706E+02 -1.09035E+01 -6.62794E+00 + 0.22046E+01 0.38080E+01 0.00000E+00 0.00000E+00 3 1.32153E+00 -8.84584E+01 3.55534E-02 -1.32105E+00 + 0.22046E+01 0.38080E+01 0.00000E+00 0.00000E+00 5 4.68669E+01 1.54446E+01 4.51745E+01 1.24810E+01 + 0.22046E+01 0.38080E+01 0.00000E+00 0.00000E+00 2 1.90339E-07 9.53260E+01 -1.76676E-08 1.89517E-07 + 0.22046E+01 0.38080E+01 0.00000E+00 0.00000E+00 4 6.96000E-07 -6.08807E+00 6.92075E-07 -7.38157E-08 + 0.22046E+01 0.38080E+01 0.00000E+00 0.00000E+00 6 2.83436E-04 -1.33587E+02 -1.95418E-04 -2.05299E-04 + 0.21666E+01 0.38080E+01 0.00000E+00 0.00000E+00 1 1.01734E+01 -1.41949E+02 -8.01112E+00 -6.27057E+00 + 0.21666E+01 0.38080E+01 0.00000E+00 0.00000E+00 3 1.55728E-01 -8.13422E+01 2.34422E-02 -1.53954E-01 + 0.21666E+01 0.38080E+01 0.00000E+00 0.00000E+00 5 5.57225E+01 4.95871E+01 3.61245E+01 4.24267E+01 + 0.21666E+01 0.38080E+01 0.00000E+00 0.00000E+00 2 1.90714E-06 -3.03955E+01 1.64501E-06 -9.64950E-07 + 0.21666E+01 0.38080E+01 0.00000E+00 0.00000E+00 4 1.15605E-06 -1.50038E+02 -1.00155E-06 -5.77361E-07 + 0.21666E+01 0.38080E+01 0.00000E+00 0.00000E+00 6 1.72197E-04 -4.12734E+00 1.71751E-04 -1.23936E-05 + 0.21299E+01 0.38080E+01 0.00000E+00 0.00000E+00 1 2.62843E+00 1.40289E+02 -2.02199E+00 1.67935E+00 + 0.21299E+01 0.38080E+01 0.00000E+00 0.00000E+00 3 7.17172E-01 9.38050E+01 -4.75925E-02 7.15591E-01 + 0.21299E+01 0.38080E+01 0.00000E+00 0.00000E+00 5 7.60459E+00 9.55897E+01 -7.40711E-01 7.56843E+00 + 0.21299E+01 0.38080E+01 0.00000E+00 0.00000E+00 2 1.30196E-06 1.01577E+02 -2.61289E-07 1.27547E-06 + 0.21299E+01 0.38080E+01 0.00000E+00 0.00000E+00 4 4.64990E-07 -2.83127E+01 4.09365E-07 -2.20537E-07 + 0.21299E+01 0.38080E+01 0.00000E+00 0.00000E+00 6 3.70646E-04 2.13240E+01 3.45271E-04 1.34783E-04 + 0.20944E+01 0.38080E+01 0.00000E+00 0.00000E+00 1 8.08681E+00 8.71328E+01 4.04510E-01 8.07669E+00 + 0.20944E+01 0.38080E+01 0.00000E+00 0.00000E+00 3 8.03200E-01 1.44810E+02 -6.56414E-01 4.62872E-01 + 0.20944E+01 0.38080E+01 0.00000E+00 0.00000E+00 5 3.58620E+01 -8.93681E+01 3.95496E-01 -3.58599E+01 + 0.20944E+01 0.38080E+01 0.00000E+00 0.00000E+00 2 1.69334E-07 1.13442E+01 1.66026E-07 3.33086E-08 + 0.20944E+01 0.38080E+01 0.00000E+00 0.00000E+00 4 6.12367E-07 -7.64212E+01 1.43773E-07 -5.95250E-07 + 0.20944E+01 0.38080E+01 0.00000E+00 0.00000E+00 6 6.40549E-05 1.32272E+02 -4.30866E-05 4.73981E-05 + 0.36960E+01 0.36960E+01 0.00000E+00 0.00000E+00 1 6.24009E+00 0.00000E+00 6.24009E+00 0.00000E+00 + 0.36960E+01 0.36960E+01 0.00000E+00 0.00000E+00 3 1.69007E-01 0.00000E+00 1.69007E-01 0.00000E+00 + 0.36960E+01 0.36960E+01 0.00000E+00 0.00000E+00 5 3.61340E+01 0.00000E+00 3.61340E+01 0.00000E+00 + 0.36960E+01 0.36960E+01 0.00000E+00 0.00000E+00 2 1.31414E-05 1.80000E+02 -1.31414E-05 0.00000E+00 + 0.36960E+01 0.36960E+01 0.00000E+00 0.00000E+00 4 4.49888E-05 1.80000E+02 -4.49888E-05 0.00000E+00 + 0.36960E+01 0.36960E+01 0.00000E+00 0.00000E+00 6 1.82035E-04 1.80000E+02 -1.82035E-04 0.00000E+00 + 0.35904E+01 0.36960E+01 0.00000E+00 0.00000E+00 1 4.97807E+00 -1.72864E+01 4.75321E+00 -1.47923E+00 + 0.35904E+01 0.36960E+01 0.00000E+00 0.00000E+00 3 1.02401E+00 -1.47753E+01 9.90152E-01 -2.61152E-01 + 0.35904E+01 0.36960E+01 0.00000E+00 0.00000E+00 5 4.17595E+01 9.72371E+00 4.11596E+01 7.05308E+00 + 0.35904E+01 0.36960E+01 0.00000E+00 0.00000E+00 2 4.85400E-06 -1.15338E+02 -2.07730E-06 -4.38704E-06 + 0.35904E+01 0.36960E+01 0.00000E+00 0.00000E+00 4 3.65665E-05 1.74892E+02 -3.64213E-05 3.25555E-06 + 0.35904E+01 0.36960E+01 0.00000E+00 0.00000E+00 6 1.55130E-04 -1.68568E+02 -1.52052E-04 -3.07462E-05 + 0.34907E+01 0.36960E+01 0.00000E+00 0.00000E+00 1 4.61364E+00 -7.71403E+01 1.02683E+00 -4.49792E+00 + 0.34907E+01 0.36960E+01 0.00000E+00 0.00000E+00 3 3.09666E+00 -9.99888E+00 3.04962E+00 -5.37670E-01 + 0.34907E+01 0.36960E+01 0.00000E+00 0.00000E+00 5 5.77364E+01 5.80292E+01 3.05707E+01 4.89788E+01 + 0.34907E+01 0.36960E+01 0.00000E+00 0.00000E+00 2 1.74920E-06 -8.59499E+01 1.23543E-07 -1.74483E-06 + 0.34907E+01 0.36960E+01 0.00000E+00 0.00000E+00 4 3.27006E-05 8.06498E+01 5.31281E-06 3.22661E-05 + 0.34907E+01 0.36960E+01 0.00000E+00 0.00000E+00 6 4.09571E-04 -6.45761E+01 1.75834E-04 -3.69907E-04 + 0.33963E+01 0.36960E+01 0.00000E+00 0.00000E+00 1 5.43278E+00 -1.34137E+02 -3.78328E+00 -3.89896E+00 + 0.33963E+01 0.36960E+01 0.00000E+00 0.00000E+00 3 4.91538E+00 -8.34077E+00 4.86338E+00 -7.13026E-01 + 0.33963E+01 0.36960E+01 0.00000E+00 0.00000E+00 5 1.13022E+02 7.71309E+01 2.51726E+01 1.10183E+02 + 0.33963E+01 0.36960E+01 0.00000E+00 0.00000E+00 2 3.13687E-06 -1.17891E+01 3.07071E-06 -6.40893E-07 + 0.33963E+01 0.36960E+01 0.00000E+00 0.00000E+00 4 6.57871E-06 -1.52477E+02 -5.83419E-06 -3.04001E-06 + 0.33963E+01 0.36960E+01 0.00000E+00 0.00000E+00 6 3.62995E-04 -6.05095E+01 1.78695E-04 -3.15964E-04 + 0.33069E+01 0.36960E+01 0.00000E+00 0.00000E+00 1 9.73650E+00 -1.66862E+02 -9.48167E+00 -2.21300E+00 + 0.33069E+01 0.36960E+01 0.00000E+00 0.00000E+00 3 5.19509E+00 -4.07590E+01 3.93508E+00 -3.39176E+00 + 0.33069E+01 0.36960E+01 0.00000E+00 0.00000E+00 5 1.05203E+02 7.90772E+01 1.99346E+01 1.03297E+02 + 0.33069E+01 0.36960E+01 0.00000E+00 0.00000E+00 2 7.61585E-06 1.45650E+02 -6.28769E-06 4.29723E-06 + 0.33069E+01 0.36960E+01 0.00000E+00 0.00000E+00 4 1.02578E-05 -6.82568E+01 3.79996E-06 -9.52796E-06 + 0.33069E+01 0.36960E+01 0.00000E+00 0.00000E+00 6 1.53322E-04 6.97993E+01 5.29435E-05 1.43891E-04 + 0.32221E+01 0.36960E+01 0.00000E+00 0.00000E+00 1 1.35112E+01 -1.76909E+02 -1.34915E+01 -7.28630E-01 + 0.32221E+01 0.36960E+01 0.00000E+00 0.00000E+00 3 6.36759E+00 -8.62100E+01 4.20898E-01 -6.35367E+00 + 0.32221E+01 0.36960E+01 0.00000E+00 0.00000E+00 5 7.87993E+01 7.14171E+01 2.51115E+01 7.46910E+01 + 0.32221E+01 0.36960E+01 0.00000E+00 0.00000E+00 2 1.00793E-06 -1.47302E+02 -8.48200E-07 -5.44499E-07 + 0.32221E+01 0.36960E+01 0.00000E+00 0.00000E+00 4 1.35696E-05 9.64410E+01 -1.52223E-06 1.34839E-05 + 0.32221E+01 0.36960E+01 0.00000E+00 0.00000E+00 6 3.78144E-05 -1.28492E+02 -2.35358E-05 -2.95971E-05 + 0.31416E+01 0.36960E+01 0.00000E+00 0.00000E+00 1 1.14358E+01 1.60182E+02 -1.07585E+01 3.87708E+00 + 0.31416E+01 0.36960E+01 0.00000E+00 0.00000E+00 3 7.30477E+00 -8.95820E+01 5.32892E-02 -7.30458E+00 + 0.31416E+01 0.36960E+01 0.00000E+00 0.00000E+00 5 7.40207E+01 2.18987E+01 6.86797E+01 2.76073E+01 + 0.31416E+01 0.36960E+01 0.00000E+00 0.00000E+00 2 8.60801E-06 1.70924E+01 8.22782E-06 2.53001E-06 + 0.31416E+01 0.36960E+01 0.00000E+00 0.00000E+00 4 9.24637E-06 3.64192E+01 7.44050E-06 5.48947E-06 + 0.31416E+01 0.36960E+01 0.00000E+00 0.00000E+00 6 1.02439E-04 3.28953E+00 1.02270E-04 5.87809E-06 + 0.30650E+01 0.36960E+01 0.00000E+00 0.00000E+00 1 6.80477E+00 6.58871E+01 2.77999E+00 6.21100E+00 + 0.30650E+01 0.36960E+01 0.00000E+00 0.00000E+00 3 8.60283E+00 -9.64634E+01 -9.68407E-01 -8.54815E+00 + 0.30650E+01 0.36960E+01 0.00000E+00 0.00000E+00 5 7.36694E+01 -2.27539E-01 7.36688E+01 -2.92563E-01 + 0.30650E+01 0.36960E+01 0.00000E+00 0.00000E+00 2 4.39106E-06 -1.71550E+02 -4.34339E-06 -6.45281E-07 + 0.30650E+01 0.36960E+01 0.00000E+00 0.00000E+00 4 9.11761E-06 3.03047E+00 9.10486E-06 4.82021E-07 + 0.30650E+01 0.36960E+01 0.00000E+00 0.00000E+00 6 1.47274E-04 1.16154E+02 -6.49172E-05 1.32194E-04 + 0.29920E+01 0.36960E+01 0.00000E+00 0.00000E+00 1 1.63202E+01 3.54394E+01 1.32966E+01 9.46315E+00 + 0.29920E+01 0.36960E+01 0.00000E+00 0.00000E+00 3 6.10731E+00 -1.18730E+02 -2.93566E+00 -5.35548E+00 + 0.29920E+01 0.36960E+01 0.00000E+00 0.00000E+00 5 4.93291E+01 -9.35502E+00 4.86730E+01 -8.01852E+00 + 0.29920E+01 0.36960E+01 0.00000E+00 0.00000E+00 2 1.08615E-06 -1.65294E+02 -1.05057E-06 -2.75724E-07 + 0.29920E+01 0.36960E+01 0.00000E+00 0.00000E+00 4 8.04097E-06 4.07048E+01 6.09570E-06 5.24401E-06 + 0.29920E+01 0.36960E+01 0.00000E+00 0.00000E+00 6 2.76944E-04 4.28307E+00 2.76171E-04 2.06833E-05 + 0.29224E+01 0.36960E+01 0.00000E+00 0.00000E+00 1 1.96243E+01 2.53528E+01 1.77342E+01 8.40292E+00 + 0.29224E+01 0.36960E+01 0.00000E+00 0.00000E+00 3 4.11336E+00 -1.65989E+02 -3.99099E+00 -9.95854E-01 + 0.29224E+01 0.36960E+01 0.00000E+00 0.00000E+00 5 6.72281E+00 9.79671E+01 -9.31814E-01 6.65792E+00 + 0.29224E+01 0.36960E+01 0.00000E+00 0.00000E+00 2 1.04169E-05 -1.44142E+01 1.00890E-05 -2.59308E-06 + 0.29224E+01 0.36960E+01 0.00000E+00 0.00000E+00 4 2.54881E-06 1.62311E+02 -2.42830E-06 7.74457E-07 + 0.29224E+01 0.36960E+01 0.00000E+00 0.00000E+00 6 2.15818E-04 2.35126E+01 1.97899E-04 8.61005E-05 + 0.28560E+01 0.36960E+01 0.00000E+00 0.00000E+00 1 1.12593E+01 -3.33405E+01 9.40623E+00 -6.18825E+00 + 0.28560E+01 0.36960E+01 0.00000E+00 0.00000E+00 3 5.69041E+00 1.60229E+02 -5.35496E+00 1.92488E+00 + 0.28560E+01 0.36960E+01 0.00000E+00 0.00000E+00 5 5.75484E+01 9.98378E+01 -9.83266E+00 5.67022E+01 + 0.28560E+01 0.36960E+01 0.00000E+00 0.00000E+00 2 1.58706E-06 -7.44117E+01 4.26480E-07 -1.52869E-06 + 0.28560E+01 0.36960E+01 0.00000E+00 0.00000E+00 4 5.62129E-06 -1.34183E+01 5.46784E-06 -1.30446E-06 + 0.28560E+01 0.36960E+01 0.00000E+00 0.00000E+00 6 2.26324E-04 -5.27805E+01 1.36897E-04 -1.80228E-04 + 0.27925E+01 0.36960E+01 0.00000E+00 0.00000E+00 1 2.20500E+01 -9.03930E+01 -1.51231E-01 -2.20495E+01 + 0.27925E+01 0.36960E+01 0.00000E+00 0.00000E+00 3 4.67170E+00 1.45480E+02 -3.84916E+00 2.64741E+00 + 0.27925E+01 0.36960E+01 0.00000E+00 0.00000E+00 5 8.35202E+01 9.53243E+01 -7.75011E+00 8.31598E+01 + 0.27925E+01 0.36960E+01 0.00000E+00 0.00000E+00 2 3.25001E-06 1.78742E+02 -3.24923E-06 7.13752E-08 + 0.27925E+01 0.36960E+01 0.00000E+00 0.00000E+00 4 2.18307E-07 4.10459E+01 1.64643E-07 1.43354E-07 + 0.27925E+01 0.36960E+01 0.00000E+00 0.00000E+00 6 3.61472E-04 -1.69043E+02 -3.54883E-04 -6.87041E-05 + 0.27318E+01 0.36960E+01 0.00000E+00 0.00000E+00 1 2.94735E+01 -9.73090E+01 -3.74964E+00 -2.92340E+01 + 0.27318E+01 0.36960E+01 0.00000E+00 0.00000E+00 3 1.34710E+00 1.65682E+02 -1.30526E+00 3.33149E-01 + 0.27318E+01 0.36960E+01 0.00000E+00 0.00000E+00 5 8.12051E+01 7.79854E+01 1.69037E+01 7.94262E+01 + 0.27318E+01 0.36960E+01 0.00000E+00 0.00000E+00 2 5.29094E-06 -1.21237E+02 -2.74377E-06 -4.52392E-06 + 0.27318E+01 0.36960E+01 0.00000E+00 0.00000E+00 4 8.64338E-06 -8.91742E+01 1.24568E-07 -8.64249E-06 + 0.27318E+01 0.36960E+01 0.00000E+00 0.00000E+00 6 7.27328E-05 -7.60304E+01 1.75582E-05 -7.05817E-05 + 0.26737E+01 0.36960E+01 0.00000E+00 0.00000E+00 1 1.93350E+01 -1.06936E+02 -5.63245E+00 -1.84965E+01 + 0.26737E+01 0.36960E+01 0.00000E+00 0.00000E+00 3 5.50637E-01 -7.62398E+01 1.30973E-01 -5.34834E-01 + 0.26737E+01 0.36960E+01 0.00000E+00 0.00000E+00 5 7.85262E+01 2.74139E+01 6.97080E+01 3.61546E+01 + 0.26737E+01 0.36960E+01 0.00000E+00 0.00000E+00 2 2.30336E-06 -8.85063E+01 6.00402E-08 -2.30258E-06 + 0.26737E+01 0.36960E+01 0.00000E+00 0.00000E+00 4 6.86599E-06 8.96124E+01 4.64533E-08 6.86584E-06 + 0.26737E+01 0.36960E+01 0.00000E+00 0.00000E+00 6 2.08370E-04 -1.34103E+02 -1.45015E-04 -1.49629E-04 + 0.26180E+01 0.36960E+01 0.00000E+00 0.00000E+00 1 1.34971E+01 1.79503E+02 -1.34965E+01 1.17077E-01 + 0.26180E+01 0.36960E+01 0.00000E+00 0.00000E+00 3 2.16423E+00 -1.70510E+01 2.06910E+00 -6.34600E-01 + 0.26180E+01 0.36960E+01 0.00000E+00 0.00000E+00 5 1.10202E+02 3.23945E+00 1.10026E+02 6.22741E+00 + 0.26180E+01 0.36960E+01 0.00000E+00 0.00000E+00 2 1.64211E-06 -2.92429E+00 1.63997E-06 -8.37744E-08 + 0.26180E+01 0.36960E+01 0.00000E+00 0.00000E+00 4 2.70806E-06 -1.41822E+01 2.62552E-06 -6.63492E-07 + 0.26180E+01 0.36960E+01 0.00000E+00 0.00000E+00 6 1.84199E-04 -3.15275E+01 1.57010E-04 -9.63194E-05 + 0.25646E+01 0.36960E+01 0.00000E+00 0.00000E+00 1 2.26931E+01 1.62830E+02 -2.16818E+01 6.69903E+00 + 0.25646E+01 0.36960E+01 0.00000E+00 0.00000E+00 3 1.34165E+00 -1.51392E+01 1.29509E+00 -3.50394E-01 + 0.25646E+01 0.36960E+01 0.00000E+00 0.00000E+00 5 1.33322E+02 2.54158E+01 1.20419E+02 5.72197E+01 + 0.25646E+01 0.36960E+01 0.00000E+00 0.00000E+00 2 5.76476E-06 9.57643E+01 -5.78992E-07 5.73562E-06 + 0.25646E+01 0.36960E+01 0.00000E+00 0.00000E+00 4 3.29302E-06 8.16781E+01 4.76615E-07 3.25835E-06 + 0.25646E+01 0.36960E+01 0.00000E+00 0.00000E+00 6 1.12508E-04 -2.49652E+01 1.01996E-04 -4.74860E-05 + 0.25133E+01 0.36960E+01 0.00000E+00 0.00000E+00 1 1.92713E+01 1.69416E+02 -1.89434E+01 3.53969E+00 + 0.25133E+01 0.36960E+01 0.00000E+00 0.00000E+00 3 8.81969E-01 9.92856E+01 -1.42311E-01 8.70412E-01 + 0.25133E+01 0.36960E+01 0.00000E+00 0.00000E+00 5 7.67560E+01 3.63330E+01 6.18337E+01 4.54762E+01 + 0.25133E+01 0.36960E+01 0.00000E+00 0.00000E+00 2 5.93615E-06 9.64469E+01 -6.66521E-07 5.89862E-06 + 0.25133E+01 0.36960E+01 0.00000E+00 0.00000E+00 4 4.66872E-06 -1.42262E+02 -3.69213E-06 -2.85747E-06 + 0.25133E+01 0.36960E+01 0.00000E+00 0.00000E+00 6 1.61258E-04 -1.38327E+02 -1.20451E-04 -1.07217E-04 + 0.24640E+01 0.36960E+01 0.00000E+00 0.00000E+00 1 3.27075E+00 1.16977E+02 -1.48371E+00 2.91486E+00 + 0.24640E+01 0.36960E+01 0.00000E+00 0.00000E+00 3 6.24336E-01 4.91177E+01 4.08633E-01 4.72033E-01 + 0.24640E+01 0.36960E+01 0.00000E+00 0.00000E+00 5 2.86205E+01 -1.29434E+02 -1.81793E+01 -2.21053E+01 + 0.24640E+01 0.36960E+01 0.00000E+00 0.00000E+00 2 1.62883E-06 1.38018E+02 -1.21080E-06 1.08952E-06 + 0.24640E+01 0.36960E+01 0.00000E+00 0.00000E+00 4 2.13961E-06 6.80358E+01 8.00273E-07 1.98432E-06 + 0.24640E+01 0.36960E+01 0.00000E+00 0.00000E+00 6 2.46130E-04 -8.47400E+01 2.25642E-05 -2.45094E-04 + 0.24166E+01 0.36960E+01 0.00000E+00 0.00000E+00 1 1.62577E+01 3.40348E+01 1.34727E+01 9.09938E+00 + 0.24166E+01 0.36960E+01 0.00000E+00 0.00000E+00 3 8.51536E-01 -8.41336E+01 8.70351E-02 -8.47076E-01 + 0.24166E+01 0.36960E+01 0.00000E+00 0.00000E+00 5 1.00616E+02 -1.21307E+02 -5.22820E+01 -8.59663E+01 + 0.24166E+01 0.36960E+01 0.00000E+00 0.00000E+00 2 1.36579E-06 1.44240E+02 -1.10831E-06 7.98157E-07 + 0.24166E+01 0.36960E+01 0.00000E+00 0.00000E+00 4 2.83432E-06 -1.74242E+02 -2.82002E-06 -2.84357E-07 + 0.24166E+01 0.36960E+01 0.00000E+00 0.00000E+00 6 1.68226E-04 9.99877E+01 -2.91766E-05 1.65677E-04 + 0.23710E+01 0.36960E+01 0.00000E+00 0.00000E+00 1 1.26292E+01 3.94377E+01 9.75375E+00 8.02258E+00 + 0.23710E+01 0.36960E+01 0.00000E+00 0.00000E+00 3 5.10776E-01 4.36184E+01 3.69776E-01 3.52360E-01 + 0.23710E+01 0.36960E+01 0.00000E+00 0.00000E+00 5 6.42363E+01 -9.69890E+01 -7.81619E+00 -6.37590E+01 + 0.23710E+01 0.36960E+01 0.00000E+00 0.00000E+00 2 1.91788E-06 3.13962E+01 1.63707E-06 9.99125E-07 + 0.23710E+01 0.36960E+01 0.00000E+00 0.00000E+00 4 3.04545E-06 -1.49940E+02 -2.63584E-06 -1.52548E-06 + 0.23710E+01 0.36960E+01 0.00000E+00 0.00000E+00 6 3.40219E-04 -1.72822E+02 -3.37553E-04 -4.25117E-05 + 0.23271E+01 0.36960E+01 0.00000E+00 0.00000E+00 1 8.74456E+00 -4.12437E+01 6.57514E+00 -5.76496E+00 + 0.23271E+01 0.36960E+01 0.00000E+00 0.00000E+00 3 1.62252E+00 1.10429E+02 -5.66328E-01 1.52047E+00 + 0.23271E+01 0.36960E+01 0.00000E+00 0.00000E+00 5 2.21287E+01 6.66844E+01 8.75846E+00 2.03217E+01 + 0.23271E+01 0.36960E+01 0.00000E+00 0.00000E+00 2 1.37427E-06 1.30881E+02 -8.99438E-07 1.03905E-06 + 0.23271E+01 0.36960E+01 0.00000E+00 0.00000E+00 4 1.73636E-06 1.45628E+02 -1.43318E-06 9.80284E-07 + 0.23271E+01 0.36960E+01 0.00000E+00 0.00000E+00 6 8.15614E-05 -2.49581E+01 7.39449E-05 -3.44152E-05 + 0.22848E+01 0.36960E+01 0.00000E+00 0.00000E+00 1 1.87097E+01 -7.27889E+01 5.53607E+00 -1.78719E+01 + 0.22848E+01 0.36960E+01 0.00000E+00 0.00000E+00 3 1.37988E+00 1.10583E+02 -4.85112E-01 1.29179E+00 + 0.22848E+01 0.36960E+01 0.00000E+00 0.00000E+00 5 6.11878E+01 1.13673E+02 -2.45678E+01 5.60390E+01 + 0.22848E+01 0.36960E+01 0.00000E+00 0.00000E+00 2 9.32309E-07 -1.55396E+02 -8.47664E-07 -3.88157E-07 + 0.22848E+01 0.36960E+01 0.00000E+00 0.00000E+00 4 8.53878E-07 -1.79968E+02 -8.53878E-07 -4.75473E-10 + 0.22848E+01 0.36960E+01 0.00000E+00 0.00000E+00 6 3.48604E-04 -6.55259E+00 3.46327E-04 -3.97810E-05 + 0.22440E+01 0.36960E+01 0.00000E+00 0.00000E+00 1 1.65298E+01 -7.37101E+01 4.63657E+00 -1.58662E+01 + 0.22440E+01 0.36960E+01 0.00000E+00 0.00000E+00 3 1.14350E+00 -1.38193E+02 -8.52360E-01 -7.62279E-01 + 0.22440E+01 0.36960E+01 0.00000E+00 0.00000E+00 5 4.25474E+01 1.29574E+02 -2.71059E+01 3.27956E+01 + 0.22440E+01 0.36960E+01 0.00000E+00 0.00000E+00 2 1.65589E-06 8.08069E+01 2.64548E-07 1.63462E-06 + 0.22440E+01 0.36960E+01 0.00000E+00 0.00000E+00 4 8.79494E-07 -9.14556E+01 -2.23415E-08 -8.79210E-07 + 0.22440E+01 0.36960E+01 0.00000E+00 0.00000E+00 6 1.42024E-04 1.20709E+02 -7.25280E-05 1.22109E-04 + 0.22046E+01 0.36960E+01 0.00000E+00 0.00000E+00 1 1.12916E+01 -1.22948E+02 -6.14119E+00 -9.47560E+00 + 0.22046E+01 0.36960E+01 0.00000E+00 0.00000E+00 3 1.60214E+00 -1.01255E+02 -3.12696E-01 -1.57133E+00 + 0.22046E+01 0.36960E+01 0.00000E+00 0.00000E+00 5 1.91892E+01 2.72903E+01 1.70533E+01 8.79824E+00 + 0.22046E+01 0.36960E+01 0.00000E+00 0.00000E+00 2 1.62837E-06 -7.58143E-01 1.62823E-06 -2.15462E-08 + 0.22046E+01 0.36960E+01 0.00000E+00 0.00000E+00 4 3.39032E-07 1.37919E+01 3.29257E-07 8.08237E-08 + 0.22046E+01 0.36960E+01 0.00000E+00 0.00000E+00 6 3.58832E-04 -9.24660E+01 -1.54390E-05 -3.58500E-04 + 0.21666E+01 0.36960E+01 0.00000E+00 0.00000E+00 1 1.28786E+01 -1.47164E+02 -1.08210E+01 -6.98325E+00 + 0.21666E+01 0.36960E+01 0.00000E+00 0.00000E+00 3 5.71868E-01 -4.24039E+01 4.22273E-01 -3.85641E-01 + 0.21666E+01 0.36960E+01 0.00000E+00 0.00000E+00 5 5.27563E+01 2.48830E+01 4.78589E+01 2.21981E+01 + 0.21666E+01 0.36960E+01 0.00000E+00 0.00000E+00 2 8.17549E-07 9.54869E+01 -7.81728E-08 8.13803E-07 + 0.21666E+01 0.36960E+01 0.00000E+00 0.00000E+00 4 5.12085E-07 -4.39467E+01 3.68693E-07 -3.55381E-07 + 0.21666E+01 0.36960E+01 0.00000E+00 0.00000E+00 6 2.44034E-04 -2.35564E+01 2.23698E-04 -9.75286E-05 + 0.21299E+01 0.36960E+01 0.00000E+00 0.00000E+00 1 7.41319E+00 -1.47895E+02 -6.27951E+00 -3.93994E+00 + 0.21299E+01 0.36960E+01 0.00000E+00 0.00000E+00 3 5.87111E-01 1.10717E+02 -2.07692E-01 5.49147E-01 + 0.21299E+01 0.36960E+01 0.00000E+00 0.00000E+00 5 3.72238E+01 5.72406E+01 2.01423E+01 3.13034E+01 + 0.21299E+01 0.36960E+01 0.00000E+00 0.00000E+00 2 1.03706E-06 1.03289E+02 -2.38386E-07 1.00929E-06 + 0.21299E+01 0.36960E+01 0.00000E+00 0.00000E+00 4 1.16955E-06 1.01308E+01 1.15132E-06 2.05720E-07 + 0.21299E+01 0.36960E+01 0.00000E+00 0.00000E+00 6 5.84978E-05 1.13776E+02 -2.35837E-05 5.35332E-05 + 0.20944E+01 0.36960E+01 0.00000E+00 0.00000E+00 1 5.22604E+00 1.06897E+02 -1.51894E+00 5.00043E+00 + 0.20944E+01 0.36960E+01 0.00000E+00 0.00000E+00 3 6.52694E-01 1.12530E+02 -2.50096E-01 6.02878E-01 + 0.20944E+01 0.36960E+01 0.00000E+00 0.00000E+00 5 9.70292E+00 -8.49810E+01 8.48867E-01 -9.66572E+00 + 0.20944E+01 0.36960E+01 0.00000E+00 0.00000E+00 2 7.53893E-07 1.18591E+02 -3.60773E-07 6.61964E-07 + 0.20944E+01 0.36960E+01 0.00000E+00 0.00000E+00 4 3.51323E-07 -1.04860E+02 -9.01023E-08 -3.39573E-07 + 0.20944E+01 0.36960E+01 0.00000E+00 0.00000E+00 6 6.75275E-05 8.19021E+01 9.51224E-06 6.68542E-05 + 0.35904E+01 0.35904E+01 0.00000E+00 0.00000E+00 1 5.44726E+00 0.00000E+00 5.44726E+00 0.00000E+00 + 0.35904E+01 0.35904E+01 0.00000E+00 0.00000E+00 3 1.56030E-01 0.00000E+00 1.56030E-01 0.00000E+00 + 0.35904E+01 0.35904E+01 0.00000E+00 0.00000E+00 5 3.40813E+01 0.00000E+00 3.40813E+01 0.00000E+00 + 0.35904E+01 0.35904E+01 0.00000E+00 0.00000E+00 2 6.77453E-06 1.80000E+02 -6.77453E-06 0.00000E+00 + 0.35904E+01 0.35904E+01 0.00000E+00 0.00000E+00 4 3.19901E-05 0.00000E+00 3.19901E-05 0.00000E+00 + 0.35904E+01 0.35904E+01 0.00000E+00 0.00000E+00 6 5.53752E-05 0.00000E+00 5.53752E-05 0.00000E+00 + 0.34907E+01 0.35904E+01 0.00000E+00 0.00000E+00 1 4.32894E+00 -2.64906E+01 3.87444E+00 -1.93093E+00 + 0.34907E+01 0.35904E+01 0.00000E+00 0.00000E+00 3 9.31184E-01 -1.87646E+01 8.81690E-01 -2.99544E-01 + 0.34907E+01 0.35904E+01 0.00000E+00 0.00000E+00 5 3.36547E+01 8.36794E+00 3.32964E+01 4.89775E+00 + 0.34907E+01 0.35904E+01 0.00000E+00 0.00000E+00 2 6.61501E-06 -1.03955E+02 -1.59528E-06 -6.41977E-06 + 0.34907E+01 0.35904E+01 0.00000E+00 0.00000E+00 4 2.93683E-05 1.08073E+02 -9.11063E-06 2.79194E-05 + 0.34907E+01 0.35904E+01 0.00000E+00 0.00000E+00 6 1.27436E-04 1.12839E+02 -4.94637E-05 1.17445E-04 + 0.33963E+01 0.35904E+01 0.00000E+00 0.00000E+00 1 3.81757E+00 -7.52632E+01 9.71109E-01 -3.69199E+00 + 0.33963E+01 0.35904E+01 0.00000E+00 0.00000E+00 3 3.87253E+00 -2.23501E+00 3.86959E+00 -1.51023E-01 + 0.33963E+01 0.35904E+01 0.00000E+00 0.00000E+00 5 6.82342E+01 5.83746E+01 3.57795E+01 5.81010E+01 + 0.33963E+01 0.35904E+01 0.00000E+00 0.00000E+00 2 3.34876E-06 2.31621E+01 3.07883E-06 1.31718E-06 + 0.33963E+01 0.35904E+01 0.00000E+00 0.00000E+00 4 9.87033E-06 -4.42251E+01 7.07313E-06 -6.88435E-06 + 0.33963E+01 0.35904E+01 0.00000E+00 0.00000E+00 6 5.05085E-04 5.89584E+01 2.60452E-04 4.32753E-04 + 0.33069E+01 0.35904E+01 0.00000E+00 0.00000E+00 1 4.89508E+00 -1.26694E+02 -2.92502E+00 -3.92506E+00 + 0.33069E+01 0.35904E+01 0.00000E+00 0.00000E+00 3 5.25709E+00 -5.98755E+00 5.22841E+00 -5.48379E-01 + 0.33069E+01 0.35904E+01 0.00000E+00 0.00000E+00 5 1.10783E+02 8.00190E+01 1.92010E+01 1.09106E+02 + 0.33069E+01 0.35904E+01 0.00000E+00 0.00000E+00 2 5.26589E-06 1.63671E+02 -5.05348E-06 1.48051E-06 + 0.33069E+01 0.35904E+01 0.00000E+00 0.00000E+00 4 1.47550E-05 1.64012E+02 -1.41843E-05 4.06394E-06 + 0.33069E+01 0.35904E+01 0.00000E+00 0.00000E+00 6 4.34988E-04 1.17159E+02 -1.98556E-04 3.87027E-04 + 0.32221E+01 0.35904E+01 0.00000E+00 0.00000E+00 1 9.82452E+00 -1.58805E+02 -9.15997E+00 -3.55193E+00 + 0.32221E+01 0.35904E+01 0.00000E+00 0.00000E+00 3 5.15193E+00 -3.29410E+01 4.32366E+00 -2.80149E+00 + 0.32221E+01 0.35904E+01 0.00000E+00 0.00000E+00 5 1.35483E+02 8.86850E+01 3.10925E+00 1.35447E+02 + 0.32221E+01 0.35904E+01 0.00000E+00 0.00000E+00 2 3.63844E-06 1.21208E+02 -1.88525E-06 3.11193E-06 + 0.32221E+01 0.35904E+01 0.00000E+00 0.00000E+00 4 9.68673E-06 2.84371E+01 8.51793E-06 4.61276E-06 + 0.32221E+01 0.35904E+01 0.00000E+00 0.00000E+00 6 9.48166E-05 -5.94844E+00 9.43060E-05 -9.82617E-06 + 0.31416E+01 0.35904E+01 0.00000E+00 0.00000E+00 1 1.46222E+01 1.75985E+02 -1.45863E+01 1.02380E+00 + 0.31416E+01 0.35904E+01 0.00000E+00 0.00000E+00 3 5.55462E+00 -7.45165E+01 1.48287E+00 -5.35303E+00 + 0.31416E+01 0.35904E+01 0.00000E+00 0.00000E+00 5 7.98799E+01 6.72002E+01 3.09544E+01 7.36385E+01 + 0.31416E+01 0.35904E+01 0.00000E+00 0.00000E+00 2 6.80363E-06 9.89979E+01 -1.06408E-06 6.71991E-06 + 0.31416E+01 0.35904E+01 0.00000E+00 0.00000E+00 4 2.32145E-05 9.61573E+01 -2.48995E-06 2.30805E-05 + 0.31416E+01 0.35904E+01 0.00000E+00 0.00000E+00 6 5.91467E-05 4.28810E+01 4.33408E-05 4.02480E-05 + 0.30650E+01 0.35904E+01 0.00000E+00 0.00000E+00 1 7.24378E+00 1.64008E+02 -6.96343E+00 1.99574E+00 + 0.30650E+01 0.35904E+01 0.00000E+00 0.00000E+00 3 7.94208E+00 -8.51541E+01 6.70917E-01 -7.91369E+00 + 0.30650E+01 0.35904E+01 0.00000E+00 0.00000E+00 5 4.90114E+01 4.71128E+01 3.33551E+01 3.59104E+01 + 0.30650E+01 0.35904E+01 0.00000E+00 0.00000E+00 2 3.81241E-06 -1.47168E+02 -3.20344E-06 -2.06700E-06 + 0.30650E+01 0.35904E+01 0.00000E+00 0.00000E+00 4 1.93546E-05 1.71663E+02 -1.91500E-05 2.80636E-06 + 0.30650E+01 0.35904E+01 0.00000E+00 0.00000E+00 6 6.46597E-04 -1.19591E+01 6.32563E-04 -1.33984E-04 + 0.29920E+01 0.35904E+01 0.00000E+00 0.00000E+00 1 4.41920E+00 3.62502E+01 3.56383E+00 2.61312E+00 + 0.29920E+01 0.35904E+01 0.00000E+00 0.00000E+00 3 8.25724E+00 -9.39132E+01 -5.63512E-01 -8.23798E+00 + 0.29920E+01 0.35904E+01 0.00000E+00 0.00000E+00 5 5.61569E+01 3.18291E+01 4.77123E+01 2.96164E+01 + 0.29920E+01 0.35904E+01 0.00000E+00 0.00000E+00 2 3.22521E-06 -9.17471E+01 -9.83297E-08 -3.22371E-06 + 0.29920E+01 0.35904E+01 0.00000E+00 0.00000E+00 4 2.21052E-06 1.37160E+02 -1.62088E-06 1.50304E-06 + 0.29920E+01 0.35904E+01 0.00000E+00 0.00000E+00 6 9.37673E-04 2.34878E+01 8.59982E-04 3.73713E-04 + 0.29224E+01 0.35904E+01 0.00000E+00 0.00000E+00 1 1.40881E+01 2.70366E+01 1.25485E+01 6.40388E+00 + 0.29224E+01 0.35904E+01 0.00000E+00 0.00000E+00 3 5.63781E+00 -1.09900E+02 -1.91900E+00 -5.30116E+00 + 0.29224E+01 0.35904E+01 0.00000E+00 0.00000E+00 5 4.20596E+01 2.21434E+01 3.89575E+01 1.58534E+01 + 0.29224E+01 0.35904E+01 0.00000E+00 0.00000E+00 2 4.74311E-06 1.18623E+02 -2.27213E-06 4.16347E-06 + 0.29224E+01 0.35904E+01 0.00000E+00 0.00000E+00 4 4.58866E-06 -1.61371E+01 4.40787E-06 -1.27536E-06 + 0.29224E+01 0.35904E+01 0.00000E+00 0.00000E+00 6 1.54095E-04 -4.30002E+01 1.12698E-04 -1.05093E-04 + 0.28560E+01 0.35904E+01 0.00000E+00 0.00000E+00 1 1.34128E+01 1.70766E+01 1.28215E+01 3.93869E+00 + 0.28560E+01 0.35904E+01 0.00000E+00 0.00000E+00 3 4.05348E+00 -1.57623E+02 -3.74825E+00 -1.54316E+00 + 0.28560E+01 0.35904E+01 0.00000E+00 0.00000E+00 5 3.70926E+01 7.25901E+01 1.10983E+01 3.53934E+01 + 0.28560E+01 0.35904E+01 0.00000E+00 0.00000E+00 2 1.22343E-06 -9.55982E+01 -1.19346E-07 -1.21759E-06 + 0.28560E+01 0.35904E+01 0.00000E+00 0.00000E+00 4 1.07162E-05 -6.87563E+00 1.06391E-05 -1.28289E-06 + 0.28560E+01 0.35904E+01 0.00000E+00 0.00000E+00 6 7.60807E-05 1.66078E+02 -7.38459E-05 1.83045E-05 + 0.27925E+01 0.35904E+01 0.00000E+00 0.00000E+00 1 1.03250E+01 -6.04571E+01 5.09101E+00 -8.98262E+00 + 0.27925E+01 0.35904E+01 0.00000E+00 0.00000E+00 3 4.83705E+00 1.67120E+02 -4.71535E+00 1.07821E+00 + 0.27925E+01 0.35904E+01 0.00000E+00 0.00000E+00 5 8.33332E+01 8.92284E+01 1.12214E+00 8.33256E+01 + 0.27925E+01 0.35904E+01 0.00000E+00 0.00000E+00 2 2.53337E-06 9.00341E+01 -1.50591E-09 2.53337E-06 + 0.27925E+01 0.35904E+01 0.00000E+00 0.00000E+00 4 4.93632E-07 -9.06779E+00 4.87462E-07 -7.77978E-08 + 0.27925E+01 0.35904E+01 0.00000E+00 0.00000E+00 6 1.43341E-04 -9.06102E+01 -1.52643E-06 -1.43333E-04 + 0.27318E+01 0.35904E+01 0.00000E+00 0.00000E+00 1 2.49429E+01 -9.79804E+01 -3.46294E+00 -2.47014E+01 + 0.27318E+01 0.35904E+01 0.00000E+00 0.00000E+00 3 4.14697E+00 1.58072E+02 -3.84695E+00 1.54864E+00 + 0.27318E+01 0.35904E+01 0.00000E+00 0.00000E+00 5 1.08955E+02 7.79231E+01 2.27959E+01 1.06543E+02 + 0.27318E+01 0.35904E+01 0.00000E+00 0.00000E+00 2 4.68500E-06 4.54791E+00 4.67025E-06 3.71486E-07 + 0.27318E+01 0.35904E+01 0.00000E+00 0.00000E+00 4 3.74885E-06 -1.97390E+01 3.52857E-06 -1.26612E-06 + 0.27318E+01 0.35904E+01 0.00000E+00 0.00000E+00 6 3.16689E-04 -7.89308E+01 6.08024E-05 -3.10797E-04 + 0.26737E+01 0.35904E+01 0.00000E+00 0.00000E+00 1 2.78605E+01 -9.75644E+01 -3.66758E+00 -2.76181E+01 + 0.26737E+01 0.35904E+01 0.00000E+00 0.00000E+00 3 1.48470E+00 1.73805E+02 -1.47603E+00 1.60221E-01 + 0.26737E+01 0.35904E+01 0.00000E+00 0.00000E+00 5 9.52272E+01 6.80003E+01 3.56722E+01 8.82933E+01 + 0.26737E+01 0.35904E+01 0.00000E+00 0.00000E+00 2 1.30532E-06 6.63353E+01 5.23932E-07 1.19555E-06 + 0.26737E+01 0.35904E+01 0.00000E+00 0.00000E+00 4 4.20585E-06 -1.03725E+01 4.13712E-06 -7.57249E-07 + 0.26737E+01 0.35904E+01 0.00000E+00 0.00000E+00 6 6.02031E-05 -8.17168E+01 8.67323E-06 -5.95751E-05 + 0.26180E+01 0.35904E+01 0.00000E+00 0.00000E+00 1 1.54656E+01 -1.18966E+02 -7.48978E+00 -1.35310E+01 + 0.26180E+01 0.35904E+01 0.00000E+00 0.00000E+00 3 1.35164E+00 -3.70296E+01 1.07905E+00 -8.13993E-01 + 0.26180E+01 0.35904E+01 0.00000E+00 0.00000E+00 5 9.78374E+01 1.76557E+01 9.32289E+01 2.96737E+01 + 0.26180E+01 0.35904E+01 0.00000E+00 0.00000E+00 2 3.18417E-06 -1.64936E+01 3.05315E-06 -9.04013E-07 + 0.26180E+01 0.35904E+01 0.00000E+00 0.00000E+00 4 4.81121E-06 -1.07912E+02 -1.47972E-06 -4.57800E-06 + 0.26180E+01 0.35904E+01 0.00000E+00 0.00000E+00 6 1.46766E-04 4.07815E+01 1.11132E-04 9.58639E-05 + 0.25646E+01 0.35904E+01 0.00000E+00 0.00000E+00 1 1.54775E+01 1.73728E+02 -1.53849E+01 1.69077E+00 + 0.25646E+01 0.35904E+01 0.00000E+00 0.00000E+00 3 1.77979E+00 -1.98574E+01 1.67397E+00 -6.04560E-01 + 0.25646E+01 0.35904E+01 0.00000E+00 0.00000E+00 5 1.12600E+02 1.82907E+01 1.06911E+02 3.53383E+01 + 0.25646E+01 0.35904E+01 0.00000E+00 0.00000E+00 2 4.08848E-06 5.96838E+00 4.06632E-06 4.25119E-07 + 0.25646E+01 0.35904E+01 0.00000E+00 0.00000E+00 4 7.40675E-07 -1.24259E+02 -4.16952E-07 -6.12168E-07 + 0.25646E+01 0.35904E+01 0.00000E+00 0.00000E+00 6 3.08774E-04 1.40125E+00 3.08681E-04 7.55076E-06 + 0.25133E+01 0.35904E+01 0.00000E+00 0.00000E+00 1 2.30638E+01 1.67793E+02 -2.25423E+01 4.87659E+00 + 0.25133E+01 0.35904E+01 0.00000E+00 0.00000E+00 3 7.99251E-01 2.44702E+01 7.27460E-01 3.31066E-01 + 0.25133E+01 0.35904E+01 0.00000E+00 0.00000E+00 5 1.30823E+02 3.50241E+01 1.07133E+02 7.50823E+01 + 0.25133E+01 0.35904E+01 0.00000E+00 0.00000E+00 2 5.16629E-06 5.57995E+01 2.90393E-06 4.27291E-06 + 0.25133E+01 0.35904E+01 0.00000E+00 0.00000E+00 4 3.31008E-06 -4.75631E+01 2.23357E-06 -2.44291E-06 + 0.25133E+01 0.35904E+01 0.00000E+00 0.00000E+00 6 1.15785E-04 -1.72207E+02 -1.14715E-04 -1.56996E-05 + 0.24640E+01 0.35904E+01 0.00000E+00 0.00000E+00 1 1.41541E+01 1.79290E+02 -1.41530E+01 1.75443E-01 + 0.24640E+01 0.35904E+01 0.00000E+00 0.00000E+00 3 9.85106E-01 8.93968E+01 1.03704E-02 9.85052E-01 + 0.24640E+01 0.35904E+01 0.00000E+00 0.00000E+00 5 7.23350E+01 4.28705E+01 5.30139E+01 4.92127E+01 + 0.24640E+01 0.35904E+01 0.00000E+00 0.00000E+00 2 3.04411E-06 -1.78310E+02 -3.04279E-06 -8.97947E-08 + 0.24640E+01 0.35904E+01 0.00000E+00 0.00000E+00 4 2.70613E-06 5.10806E+01 1.70006E-06 2.10545E-06 + 0.24640E+01 0.35904E+01 0.00000E+00 0.00000E+00 6 2.73286E-04 -1.49314E+02 -2.35020E-04 -1.39466E-04 + 0.24166E+01 0.35904E+01 0.00000E+00 0.00000E+00 1 6.33852E+00 1.70415E+01 6.06021E+00 1.85759E+00 + 0.24166E+01 0.35904E+01 0.00000E+00 0.00000E+00 3 1.81533E-01 -5.49498E+01 1.04253E-01 -1.48612E-01 + 0.24166E+01 0.35904E+01 0.00000E+00 0.00000E+00 5 5.98280E+01 -1.38814E+02 -4.50249E+01 -3.93973E+01 + 0.24166E+01 0.35904E+01 0.00000E+00 0.00000E+00 2 2.67949E-06 1.53864E+02 -2.40550E-06 1.18034E-06 + 0.24166E+01 0.35904E+01 0.00000E+00 0.00000E+00 4 2.76242E-06 -3.42005E+01 2.28473E-06 -1.55273E-06 + 0.24166E+01 0.35904E+01 0.00000E+00 0.00000E+00 6 1.35922E-04 1.78668E+02 -1.35885E-04 3.15999E-06 + 0.23710E+01 0.35904E+01 0.00000E+00 0.00000E+00 1 1.34109E+01 2.38308E+01 1.22675E+01 5.41850E+00 + 0.23710E+01 0.35904E+01 0.00000E+00 0.00000E+00 3 2.56592E-01 -1.41291E+02 -2.00227E-01 -1.60463E-01 + 0.23710E+01 0.35904E+01 0.00000E+00 0.00000E+00 5 8.31747E+01 -1.05723E+02 -2.25388E+01 -8.00627E+01 + 0.23710E+01 0.35904E+01 0.00000E+00 0.00000E+00 2 1.19361E-06 1.38519E+02 -8.94224E-07 7.90619E-07 + 0.23710E+01 0.35904E+01 0.00000E+00 0.00000E+00 4 1.55523E-06 -1.71742E+02 -1.53910E-06 -2.23381E-07 + 0.23710E+01 0.35904E+01 0.00000E+00 0.00000E+00 6 9.10587E-05 6.69761E+01 3.56144E-05 8.38051E-05 + 0.23271E+01 0.35904E+01 0.00000E+00 0.00000E+00 1 8.35958E+00 1.71195E+01 7.98919E+00 2.46077E+00 + 0.23271E+01 0.35904E+01 0.00000E+00 0.00000E+00 3 7.68446E-01 1.28445E+02 -4.77795E-01 6.01848E-01 + 0.23271E+01 0.35904E+01 0.00000E+00 0.00000E+00 5 4.07242E+01 -6.53443E+01 1.69887E+01 -3.70115E+01 + 0.23271E+01 0.35904E+01 0.00000E+00 0.00000E+00 2 2.04969E-06 2.26069E+01 1.89220E-06 7.87917E-07 + 0.23271E+01 0.35904E+01 0.00000E+00 0.00000E+00 4 1.80485E-06 1.53161E+02 -1.61043E-06 8.14855E-07 + 0.23271E+01 0.35904E+01 0.00000E+00 0.00000E+00 6 6.85168E-05 4.02919E+01 5.22618E-05 4.43086E-05 + 0.22848E+01 0.35904E+01 0.00000E+00 0.00000E+00 1 1.26786E+01 -8.07305E+01 2.04224E+00 -1.25130E+01 + 0.22848E+01 0.35904E+01 0.00000E+00 0.00000E+00 3 1.78391E+00 1.25396E+02 -1.03328E+00 1.45419E+00 + 0.22848E+01 0.35904E+01 0.00000E+00 0.00000E+00 5 5.26654E+01 6.77285E+01 1.99600E+01 4.87365E+01 + 0.22848E+01 0.35904E+01 0.00000E+00 0.00000E+00 2 2.30878E-06 1.65294E+02 -2.23315E-06 5.86105E-07 + 0.22848E+01 0.35904E+01 0.00000E+00 0.00000E+00 4 7.35461E-07 4.11326E+00 7.33567E-07 5.27534E-08 + 0.22848E+01 0.35904E+01 0.00000E+00 0.00000E+00 6 3.19628E-04 2.38530E+01 2.92327E-04 1.29255E-04 + 0.22440E+01 0.35904E+01 0.00000E+00 0.00000E+00 1 1.99504E+01 -7.62385E+01 4.74581E+00 -1.93777E+01 + 0.22440E+01 0.35904E+01 0.00000E+00 0.00000E+00 3 1.15423E+00 1.74530E+02 -1.14897E+00 1.10017E-01 + 0.22440E+01 0.35904E+01 0.00000E+00 0.00000E+00 5 5.50418E+01 1.14436E+02 -2.27693E+01 5.01115E+01 + 0.22440E+01 0.35904E+01 0.00000E+00 0.00000E+00 2 7.33674E-07 1.24830E+02 -4.19030E-07 6.02238E-07 + 0.22440E+01 0.35904E+01 0.00000E+00 0.00000E+00 4 5.24925E-06 -1.01132E+02 -1.01344E-06 -5.15049E-06 + 0.22440E+01 0.35904E+01 0.00000E+00 0.00000E+00 6 9.25885E-05 -1.22985E+02 -5.04063E-05 -7.76649E-05 + 0.22046E+01 0.35904E+01 0.00000E+00 0.00000E+00 1 1.51630E+01 -8.65921E+01 9.01353E-01 -1.51362E+01 + 0.22046E+01 0.35904E+01 0.00000E+00 0.00000E+00 3 1.37228E+00 -1.12134E+02 -5.17033E-01 -1.27115E+00 + 0.22046E+01 0.35904E+01 0.00000E+00 0.00000E+00 5 2.32849E+01 1.20166E+02 -1.17009E+01 2.01315E+01 + 0.22046E+01 0.35904E+01 0.00000E+00 0.00000E+00 2 8.62302E-07 -7.00945E+01 2.93589E-07 -8.10784E-07 + 0.22046E+01 0.35904E+01 0.00000E+00 0.00000E+00 4 5.25166E-07 -1.61524E+02 -4.98096E-07 -1.66432E-07 + 0.22046E+01 0.35904E+01 0.00000E+00 0.00000E+00 6 4.82153E-05 -1.35546E+02 -3.44170E-05 -3.37666E-05 + 0.21666E+01 0.35904E+01 0.00000E+00 0.00000E+00 1 1.19841E+01 -1.38592E+02 -8.98833E+00 -7.92650E+00 + 0.21666E+01 0.35904E+01 0.00000E+00 0.00000E+00 3 1.04466E+00 -9.64656E+01 -1.17635E-01 -1.03801E+00 + 0.21666E+01 0.35904E+01 0.00000E+00 0.00000E+00 5 4.20678E+01 1.65775E+01 4.03193E+01 1.20025E+01 + 0.21666E+01 0.35904E+01 0.00000E+00 0.00000E+00 2 9.83892E-07 1.23803E+02 -5.47382E-07 8.17568E-07 + 0.21666E+01 0.35904E+01 0.00000E+00 0.00000E+00 4 1.22210E-06 1.41056E+02 -9.50509E-07 7.68160E-07 + 0.21666E+01 0.35904E+01 0.00000E+00 0.00000E+00 6 2.49820E-04 6.23350E+01 1.15992E-04 2.21260E-04 + 0.21299E+01 0.35904E+01 0.00000E+00 0.00000E+00 1 1.22417E+01 -1.44526E+02 -9.96936E+00 -7.10424E+00 + 0.21299E+01 0.35904E+01 0.00000E+00 0.00000E+00 3 6.69054E-01 8.86796E+00 6.61057E-01 1.03140E-01 + 0.21299E+01 0.35904E+01 0.00000E+00 0.00000E+00 5 4.71893E+01 4.29684E+01 3.45299E+01 3.21640E+01 + 0.21299E+01 0.35904E+01 0.00000E+00 0.00000E+00 2 2.56949E-06 -1.27995E+02 -1.58177E-06 -2.02492E-06 + 0.21299E+01 0.35904E+01 0.00000E+00 0.00000E+00 4 1.80771E-06 -1.14991E+02 -7.63720E-07 -1.63846E-06 + 0.21299E+01 0.35904E+01 0.00000E+00 0.00000E+00 6 1.20278E-04 8.61651E+01 8.04434E-06 1.20009E-04 + 0.20944E+01 0.35904E+01 0.00000E+00 0.00000E+00 1 3.94326E+00 -1.41140E+02 -3.07054E+00 -2.47408E+00 + 0.20944E+01 0.35904E+01 0.00000E+00 0.00000E+00 3 1.29991E+00 9.91107E+01 -2.05831E-01 1.28351E+00 + 0.20944E+01 0.35904E+01 0.00000E+00 0.00000E+00 5 1.79422E+01 5.56383E+01 1.01269E+01 1.48111E+01 + 0.20944E+01 0.35904E+01 0.00000E+00 0.00000E+00 2 3.80410E-06 8.64551E+01 2.35211E-07 3.79682E-06 + 0.20944E+01 0.35904E+01 0.00000E+00 0.00000E+00 4 1.90617E-07 2.54980E+01 1.72051E-07 8.20566E-08 + 0.20944E+01 0.35904E+01 0.00000E+00 0.00000E+00 6 2.83640E-04 1.78819E+02 -2.83580E-04 5.84444E-06 + 0.34907E+01 0.34907E+01 0.00000E+00 0.00000E+00 1 4.89937E+00 0.00000E+00 4.89937E+00 0.00000E+00 + 0.34907E+01 0.34907E+01 0.00000E+00 0.00000E+00 3 8.78570E-02 0.00000E+00 8.78570E-02 0.00000E+00 + 0.34907E+01 0.34907E+01 0.00000E+00 0.00000E+00 5 2.63956E+01 0.00000E+00 2.63956E+01 0.00000E+00 + 0.34907E+01 0.34907E+01 0.00000E+00 0.00000E+00 2 4.26256E-06 1.80000E+02 -4.26256E-06 0.00000E+00 + 0.34907E+01 0.34907E+01 0.00000E+00 0.00000E+00 4 1.74899E-05 0.00000E+00 1.74899E-05 0.00000E+00 + 0.34907E+01 0.34907E+01 0.00000E+00 0.00000E+00 6 1.59743E-04 1.80000E+02 -1.59743E-04 0.00000E+00 + 0.33963E+01 0.34907E+01 0.00000E+00 0.00000E+00 1 3.90020E+00 -2.20805E+01 3.61415E+00 -1.46612E+00 + 0.33963E+01 0.34907E+01 0.00000E+00 0.00000E+00 3 1.01809E+00 -1.03198E+01 1.00162E+00 -1.82382E-01 + 0.33963E+01 0.34907E+01 0.00000E+00 0.00000E+00 5 3.61211E+01 2.51110E+01 3.27072E+01 1.53288E+01 + 0.33963E+01 0.34907E+01 0.00000E+00 0.00000E+00 2 7.33688E-06 -5.83056E+01 3.85471E-06 -6.24268E-06 + 0.33963E+01 0.34907E+01 0.00000E+00 0.00000E+00 4 1.29549E-05 4.94960E+01 8.41423E-06 9.85040E-06 + 0.33963E+01 0.34907E+01 0.00000E+00 0.00000E+00 6 2.17375E-04 1.45002E+02 -1.78067E-04 1.24676E-04 + 0.33069E+01 0.34907E+01 0.00000E+00 0.00000E+00 1 4.04001E+00 -7.66444E+01 9.33220E-01 -3.93075E+00 + 0.33069E+01 0.34907E+01 0.00000E+00 0.00000E+00 3 3.60790E+00 -1.24993E+01 3.52239E+00 -7.80853E-01 + 0.33069E+01 0.34907E+01 0.00000E+00 0.00000E+00 5 6.81824E+01 6.22700E+01 3.17257E+01 6.03517E+01 + 0.33069E+01 0.34907E+01 0.00000E+00 0.00000E+00 2 8.43287E-06 8.71153E+01 4.24394E-07 8.42218E-06 + 0.33069E+01 0.34907E+01 0.00000E+00 0.00000E+00 4 2.29072E-05 9.39112E+01 -1.56251E-06 2.28539E-05 + 0.33069E+01 0.34907E+01 0.00000E+00 0.00000E+00 6 7.32304E-05 -9.56861E+00 7.22116E-05 -1.21730E-05 + 0.32221E+01 0.34907E+01 0.00000E+00 0.00000E+00 1 6.13620E+00 -1.33824E+02 -4.24897E+00 -4.42710E+00 + 0.32221E+01 0.34907E+01 0.00000E+00 0.00000E+00 3 3.98556E+00 -9.64793E+00 3.92919E+00 -6.67954E-01 + 0.32221E+01 0.34907E+01 0.00000E+00 0.00000E+00 5 1.32492E+02 8.38175E+01 1.42688E+01 1.31722E+02 + 0.32221E+01 0.34907E+01 0.00000E+00 0.00000E+00 2 5.45527E-06 -1.15443E+02 -2.34363E-06 -4.92620E-06 + 0.32221E+01 0.34907E+01 0.00000E+00 0.00000E+00 4 1.28213E-06 1.35781E+02 -9.18880E-07 8.94158E-07 + 0.32221E+01 0.34907E+01 0.00000E+00 0.00000E+00 6 1.46122E-04 3.93979E+01 1.12917E-04 9.27441E-05 + 0.31416E+01 0.34907E+01 0.00000E+00 0.00000E+00 1 1.30162E+01 -1.79872E+02 -1.30162E+01 -2.91708E-02 + 0.31416E+01 0.34907E+01 0.00000E+00 0.00000E+00 3 4.56297E+00 -4.57833E+01 3.18210E+00 -3.27031E+00 + 0.31416E+01 0.34907E+01 0.00000E+00 0.00000E+00 5 1.10272E+02 6.96400E+01 3.83654E+01 1.03383E+02 + 0.31416E+01 0.34907E+01 0.00000E+00 0.00000E+00 2 2.78577E-06 -1.55626E+02 -2.53747E-06 -1.14968E-06 + 0.31416E+01 0.34907E+01 0.00000E+00 0.00000E+00 4 3.28109E-06 -1.50868E+02 -2.86602E-06 -1.59733E-06 + 0.31416E+01 0.34907E+01 0.00000E+00 0.00000E+00 6 5.91263E-05 4.90397E+01 3.87594E-05 4.46500E-05 + 0.30650E+01 0.34907E+01 0.00000E+00 0.00000E+00 1 1.22406E+01 1.61306E+02 -1.15948E+01 3.92334E+00 + 0.30650E+01 0.34907E+01 0.00000E+00 0.00000E+00 3 6.59796E+00 -8.96322E+01 4.23521E-02 -6.59783E+00 + 0.30650E+01 0.34907E+01 0.00000E+00 0.00000E+00 5 4.96195E+01 4.30828E+01 3.62405E+01 3.38928E+01 + 0.30650E+01 0.34907E+01 0.00000E+00 0.00000E+00 2 4.12615E-06 4.23577E+01 3.04904E-06 2.78002E-06 + 0.30650E+01 0.34907E+01 0.00000E+00 0.00000E+00 4 2.74071E-05 2.55550E+01 2.47259E-05 1.18228E-05 + 0.30650E+01 0.34907E+01 0.00000E+00 0.00000E+00 6 1.71292E-04 9.67352E+01 -2.00892E-05 1.70110E-04 + 0.29920E+01 0.34907E+01 0.00000E+00 0.00000E+00 1 4.28889E+00 1.26719E+02 -2.56427E+00 3.43789E+00 + 0.29920E+01 0.34907E+01 0.00000E+00 0.00000E+00 3 7.69249E+00 -1.00245E+02 -1.36814E+00 -7.56985E+00 + 0.29920E+01 0.34907E+01 0.00000E+00 0.00000E+00 5 4.51367E+01 7.48470E+00 4.47521E+01 5.87956E+00 + 0.29920E+01 0.34907E+01 0.00000E+00 0.00000E+00 2 8.45645E-06 -7.04869E+00 8.39254E-06 -1.03771E-06 + 0.29920E+01 0.34907E+01 0.00000E+00 0.00000E+00 4 4.25959E-06 1.56783E+02 -3.91464E-06 1.67921E-06 + 0.29920E+01 0.34907E+01 0.00000E+00 0.00000E+00 6 4.79873E-04 4.63665E+01 3.31133E-04 3.47317E-04 + 0.29224E+01 0.34907E+01 0.00000E+00 0.00000E+00 1 1.10328E+01 1.58513E+01 1.06132E+01 3.01351E+00 + 0.29224E+01 0.34907E+01 0.00000E+00 0.00000E+00 3 6.45045E+00 -1.01690E+02 -1.30692E+00 -6.31667E+00 + 0.29224E+01 0.34907E+01 0.00000E+00 0.00000E+00 5 5.00038E+01 -2.85865E+00 4.99416E+01 -2.49380E+00 + 0.29224E+01 0.34907E+01 0.00000E+00 0.00000E+00 2 1.88124E-06 -2.97090E+01 1.63396E-06 -9.32335E-07 + 0.29224E+01 0.34907E+01 0.00000E+00 0.00000E+00 4 1.18487E-05 1.72788E+02 -1.17550E-05 1.48749E-06 + 0.29224E+01 0.34907E+01 0.00000E+00 0.00000E+00 6 3.88597E-04 -1.95261E+01 3.66249E-04 -1.29883E-04 + 0.28560E+01 0.34907E+01 0.00000E+00 0.00000E+00 1 1.73965E+01 1.50628E+01 1.67988E+01 4.52095E+00 + 0.28560E+01 0.34907E+01 0.00000E+00 0.00000E+00 3 3.86072E+00 -1.30768E+02 -2.52102E+00 -2.92397E+00 + 0.28560E+01 0.34907E+01 0.00000E+00 0.00000E+00 5 2.43044E+01 -7.51238E+00 2.40958E+01 -3.17756E+00 + 0.28560E+01 0.34907E+01 0.00000E+00 0.00000E+00 2 1.36988E-06 4.42232E+01 9.81692E-07 9.55426E-07 + 0.28560E+01 0.34907E+01 0.00000E+00 0.00000E+00 4 5.86784E-07 1.24825E+01 5.72913E-07 1.26829E-07 + 0.28560E+01 0.34907E+01 0.00000E+00 0.00000E+00 6 4.46142E-04 -3.63199E+01 3.59467E-04 -2.64247E-04 + 0.27925E+01 0.34907E+01 0.00000E+00 0.00000E+00 1 1.33593E+01 -1.94795E+00 1.33516E+01 -4.54103E-01 + 0.27925E+01 0.34907E+01 0.00000E+00 0.00000E+00 3 3.29344E+00 1.68310E+02 -3.22513E+00 6.67304E-01 + 0.27925E+01 0.34907E+01 0.00000E+00 0.00000E+00 5 3.90154E+01 1.23065E+02 -2.12864E+01 3.26969E+01 + 0.27925E+01 0.34907E+01 0.00000E+00 0.00000E+00 2 3.54260E-06 1.46988E+02 -2.97067E-06 1.93006E-06 + 0.27925E+01 0.34907E+01 0.00000E+00 0.00000E+00 4 3.55783E-06 5.98973E+01 1.78444E-06 3.07798E-06 + 0.27925E+01 0.34907E+01 0.00000E+00 0.00000E+00 6 1.52822E-04 1.73529E+02 -1.51848E-04 1.72242E-05 + 0.27318E+01 0.34907E+01 0.00000E+00 0.00000E+00 1 1.56322E+01 -8.36129E+01 1.73900E+00 -1.55352E+01 + 0.27318E+01 0.34907E+01 0.00000E+00 0.00000E+00 3 4.07150E+00 1.57930E+02 -3.77316E+00 1.52983E+00 + 0.27318E+01 0.34907E+01 0.00000E+00 0.00000E+00 5 9.05610E+01 1.03003E+02 -2.03766E+01 8.82388E+01 + 0.27318E+01 0.34907E+01 0.00000E+00 0.00000E+00 2 5.72665E-06 1.16282E+02 -2.53573E-06 5.13465E-06 + 0.27318E+01 0.34907E+01 0.00000E+00 0.00000E+00 4 3.50008E-06 1.58997E+02 -3.26754E-06 1.25447E-06 + 0.27318E+01 0.34907E+01 0.00000E+00 0.00000E+00 6 2.26893E-04 4.72443E+01 1.54032E-04 1.66597E-04 + 0.26737E+01 0.34907E+01 0.00000E+00 0.00000E+00 1 2.73729E+01 -1.00516E+02 -4.99578E+00 -2.69131E+01 + 0.26737E+01 0.34907E+01 0.00000E+00 0.00000E+00 3 2.76745E+00 1.64440E+02 -2.66603E+00 7.42343E-01 + 0.26737E+01 0.34907E+01 0.00000E+00 0.00000E+00 5 1.06736E+02 9.16146E+01 -3.00736E+00 1.06694E+02 + 0.26737E+01 0.34907E+01 0.00000E+00 0.00000E+00 2 1.30035E-06 1.66035E+02 -1.26192E-06 3.13818E-07 + 0.26737E+01 0.34907E+01 0.00000E+00 0.00000E+00 4 1.13568E-05 1.65891E+01 1.08841E-05 3.24243E-06 + 0.26737E+01 0.34907E+01 0.00000E+00 0.00000E+00 6 4.38013E-04 6.05023E+01 2.15673E-04 3.81236E-04 + 0.26180E+01 0.34907E+01 0.00000E+00 0.00000E+00 1 2.47623E+01 -1.01672E+02 -5.00964E+00 -2.42502E+01 + 0.26180E+01 0.34907E+01 0.00000E+00 0.00000E+00 3 9.69318E-01 -9.86670E+01 -1.46067E-01 -9.58250E-01 + 0.26180E+01 0.34907E+01 0.00000E+00 0.00000E+00 5 8.13979E+01 6.16838E+01 3.86100E+01 7.16581E+01 + 0.26180E+01 0.34907E+01 0.00000E+00 0.00000E+00 2 8.20941E-06 -1.07543E+02 -2.47453E-06 -7.82758E-06 + 0.26180E+01 0.34907E+01 0.00000E+00 0.00000E+00 4 3.24656E-06 -1.12459E+02 -1.24028E-06 -3.00031E-06 + 0.26180E+01 0.34907E+01 0.00000E+00 0.00000E+00 6 1.49471E-04 -7.72814E+00 1.48113E-04 -2.00997E-05 + 0.25646E+01 0.34907E+01 0.00000E+00 0.00000E+00 1 1.21293E+01 -1.36319E+02 -8.77192E+00 -8.37694E+00 + 0.25646E+01 0.34907E+01 0.00000E+00 0.00000E+00 3 1.79275E+00 -5.29544E+01 1.08004E+00 -1.43089E+00 + 0.25646E+01 0.34907E+01 0.00000E+00 0.00000E+00 5 8.45352E+01 2.53162E+01 7.64166E+01 3.61484E+01 + 0.25646E+01 0.34907E+01 0.00000E+00 0.00000E+00 2 3.09971E-06 -8.30815E+01 3.73384E-07 -3.07714E-06 + 0.25646E+01 0.34907E+01 0.00000E+00 0.00000E+00 4 2.90283E-07 -1.13308E+02 -1.14856E-07 -2.66594E-07 + 0.25646E+01 0.34907E+01 0.00000E+00 0.00000E+00 6 1.38213E-04 -3.05525E+01 1.19024E-04 -7.02576E-05 + 0.25133E+01 0.34907E+01 0.00000E+00 0.00000E+00 1 1.86086E+01 1.58369E+02 -1.72981E+01 6.85968E+00 + 0.25133E+01 0.34907E+01 0.00000E+00 0.00000E+00 3 1.35126E+00 -6.31653E+00 1.34306E+00 -1.48667E-01 + 0.25133E+01 0.34907E+01 0.00000E+00 0.00000E+00 5 9.80649E+01 2.56184E+01 8.84245E+01 4.24009E+01 + 0.25133E+01 0.34907E+01 0.00000E+00 0.00000E+00 2 1.82697E-06 -5.95030E+01 9.27175E-07 -1.57422E-06 + 0.25133E+01 0.34907E+01 0.00000E+00 0.00000E+00 4 7.25419E-06 -9.19955E+01 -2.52603E-07 -7.24979E-06 + 0.25133E+01 0.34907E+01 0.00000E+00 0.00000E+00 6 1.85973E-04 -1.51808E+02 -1.63911E-04 -8.78595E-05 + 0.24640E+01 0.34907E+01 0.00000E+00 0.00000E+00 1 2.20501E+01 1.66144E+02 -2.14085E+01 5.28068E+00 + 0.24640E+01 0.34907E+01 0.00000E+00 0.00000E+00 3 6.37367E-01 8.79494E+01 2.28065E-02 6.36959E-01 + 0.24640E+01 0.34907E+01 0.00000E+00 0.00000E+00 5 1.19909E+02 4.33972E+01 8.71267E+01 8.23835E+01 + 0.24640E+01 0.34907E+01 0.00000E+00 0.00000E+00 2 6.02185E-06 1.66629E+02 -5.85862E-06 1.39259E-06 + 0.24640E+01 0.34907E+01 0.00000E+00 0.00000E+00 4 2.71501E-06 -1.11613E+02 -1.00003E-06 -2.52413E-06 + 0.24640E+01 0.34907E+01 0.00000E+00 0.00000E+00 6 2.06210E-04 -1.72349E+02 -2.04374E-04 -2.74531E-05 + 0.24166E+01 0.34907E+01 0.00000E+00 0.00000E+00 1 5.59178E+00 1.49409E+02 -4.81351E+00 2.84572E+00 + 0.24166E+01 0.34907E+01 0.00000E+00 0.00000E+00 3 8.11767E-01 1.05760E+02 -2.20479E-01 7.81252E-01 + 0.24166E+01 0.34907E+01 0.00000E+00 0.00000E+00 5 1.04273E+01 3.65340E+01 8.37837E+00 6.20737E+00 + 0.24166E+01 0.34907E+01 0.00000E+00 0.00000E+00 2 1.17900E-06 -1.38989E+02 -8.89656E-07 -7.73666E-07 + 0.24166E+01 0.34907E+01 0.00000E+00 0.00000E+00 4 5.39936E-06 1.71339E+02 -5.33779E-06 8.13056E-07 + 0.24166E+01 0.34907E+01 0.00000E+00 0.00000E+00 6 3.56118E-04 -9.51917E+01 -3.22242E-05 -3.54657E-04 + 0.23710E+01 0.34907E+01 0.00000E+00 0.00000E+00 1 1.42906E+01 1.49517E+01 1.38067E+01 3.68702E+00 + 0.23710E+01 0.34907E+01 0.00000E+00 0.00000E+00 3 5.27914E-01 -1.18476E+02 -2.51703E-01 -4.64046E-01 + 0.23710E+01 0.34907E+01 0.00000E+00 0.00000E+00 5 7.83899E+01 -1.26780E+02 -4.69359E+01 -6.27853E+01 + 0.23710E+01 0.34907E+01 0.00000E+00 0.00000E+00 2 6.94435E-07 -4.70639E+01 4.73036E-07 -5.08405E-07 + 0.23710E+01 0.34907E+01 0.00000E+00 0.00000E+00 4 7.40051E-07 4.72785E+01 5.02076E-07 5.43686E-07 + 0.23710E+01 0.34907E+01 0.00000E+00 0.00000E+00 6 7.29766E-05 1.77711E+02 -7.29184E-05 2.91436E-06 + 0.23271E+01 0.34907E+01 0.00000E+00 0.00000E+00 1 1.69898E+01 2.39227E+01 1.55302E+01 6.88942E+00 + 0.23271E+01 0.34907E+01 0.00000E+00 0.00000E+00 3 7.28176E-01 -1.67026E+02 -7.09588E-01 -1.63481E-01 + 0.23271E+01 0.34907E+01 0.00000E+00 0.00000E+00 5 8.28559E+01 -1.02136E+02 -1.74186E+01 -8.10043E+01 + 0.23271E+01 0.34907E+01 0.00000E+00 0.00000E+00 2 2.07277E-06 8.84556E+01 5.58654E-08 2.07202E-06 + 0.23271E+01 0.34907E+01 0.00000E+00 0.00000E+00 4 3.34995E-06 8.82068E+01 1.04828E-07 3.34831E-06 + 0.23271E+01 0.34907E+01 0.00000E+00 0.00000E+00 6 9.38303E-05 1.17135E+02 -4.27952E-05 8.35027E-05 + 0.22848E+01 0.34907E+01 0.00000E+00 0.00000E+00 1 6.29749E+00 -3.25927E+01 5.30576E+00 -3.39223E+00 + 0.22848E+01 0.34907E+01 0.00000E+00 0.00000E+00 3 1.56981E+00 1.27699E+02 -9.59958E-01 1.24209E+00 + 0.22848E+01 0.34907E+01 0.00000E+00 0.00000E+00 5 1.90022E+01 4.22115E+01 1.40743E+01 1.27670E+01 + 0.22848E+01 0.34907E+01 0.00000E+00 0.00000E+00 2 1.69050E-06 1.61461E+02 -1.60277E-06 5.37497E-07 + 0.22848E+01 0.34907E+01 0.00000E+00 0.00000E+00 4 2.46733E-06 5.79388E+01 1.30972E-06 2.09102E-06 + 0.22848E+01 0.34907E+01 0.00000E+00 0.00000E+00 6 2.90604E-05 6.99402E+01 9.96776E-06 2.72975E-05 + 0.22440E+01 0.34907E+01 0.00000E+00 0.00000E+00 1 1.66296E+01 -7.76859E+01 3.54660E+00 -1.62470E+01 + 0.22440E+01 0.34907E+01 0.00000E+00 0.00000E+00 3 1.12716E+00 1.22933E+02 -6.12789E-01 9.46028E-01 + 0.22440E+01 0.34907E+01 0.00000E+00 0.00000E+00 5 6.88590E+01 9.00746E+01 -8.96440E-02 6.88590E+01 + 0.22440E+01 0.34907E+01 0.00000E+00 0.00000E+00 2 1.44272E-06 -1.54794E+01 1.39038E-06 -3.85049E-07 + 0.22440E+01 0.34907E+01 0.00000E+00 0.00000E+00 4 3.62337E-06 -6.14609E+00 3.60255E-06 -3.87933E-07 + 0.22440E+01 0.34907E+01 0.00000E+00 0.00000E+00 6 1.82732E-04 -1.23799E+01 1.78484E-04 -3.91765E-05 + 0.22046E+01 0.34907E+01 0.00000E+00 0.00000E+00 1 2.02509E+01 -6.81308E+01 7.54325E+00 -1.87936E+01 + 0.22046E+01 0.34907E+01 0.00000E+00 0.00000E+00 3 9.40762E-01 -8.50258E+01 8.15710E-02 -9.37219E-01 + 0.22046E+01 0.34907E+01 0.00000E+00 0.00000E+00 5 6.19560E+01 1.15654E+02 -2.68233E+01 5.58486E+01 + 0.22046E+01 0.34907E+01 0.00000E+00 0.00000E+00 2 1.81381E-06 1.20181E+02 -9.11854E-07 1.56794E-06 + 0.22046E+01 0.34907E+01 0.00000E+00 0.00000E+00 4 1.67424E-06 1.62325E+01 1.60749E-06 4.68009E-07 + 0.22046E+01 0.34907E+01 0.00000E+00 0.00000E+00 6 5.88659E-05 1.35570E+02 -4.20366E-05 4.12083E-05 + 0.21666E+01 0.34907E+01 0.00000E+00 0.00000E+00 1 9.84888E+00 -1.02533E+02 -2.13726E+00 -9.61418E+00 + 0.21666E+01 0.34907E+01 0.00000E+00 0.00000E+00 3 2.10307E+00 -1.04839E+02 -5.38605E-01 -2.03293E+00 + 0.21666E+01 0.34907E+01 0.00000E+00 0.00000E+00 5 1.41163E+01 3.97967E+01 1.08459E+01 9.03538E+00 + 0.21666E+01 0.34907E+01 0.00000E+00 0.00000E+00 2 2.00371E-06 6.10759E+01 9.69098E-07 1.75377E-06 + 0.21666E+01 0.34907E+01 0.00000E+00 0.00000E+00 4 1.81622E-06 6.58801E+01 7.42192E-07 1.65765E-06 + 0.21666E+01 0.34907E+01 0.00000E+00 0.00000E+00 6 1.16758E-04 -1.53749E+02 -1.04716E-04 -5.16431E-05 + 0.21299E+01 0.34907E+01 0.00000E+00 0.00000E+00 1 1.15527E+01 -1.44497E+02 -9.40492E+00 -6.70911E+00 + 0.21299E+01 0.34907E+01 0.00000E+00 0.00000E+00 3 6.83226E-01 -9.93710E+01 -1.11248E-01 -6.74109E-01 + 0.21299E+01 0.34907E+01 0.00000E+00 0.00000E+00 5 4.48875E+01 2.46813E+01 4.07868E+01 1.87437E+01 + 0.21299E+01 0.34907E+01 0.00000E+00 0.00000E+00 2 2.06111E-07 1.78895E+02 -2.06073E-07 3.97391E-09 + 0.21299E+01 0.34907E+01 0.00000E+00 0.00000E+00 4 4.13515E-07 1.03563E+02 -9.69772E-08 4.01983E-07 + 0.21299E+01 0.34907E+01 0.00000E+00 0.00000E+00 6 7.48135E-05 1.87519E+01 7.08424E-05 2.40503E-05 + 0.20944E+01 0.34907E+01 0.00000E+00 0.00000E+00 1 6.36569E+00 -1.13586E+02 -2.54709E+00 -5.83390E+00 + 0.20944E+01 0.34907E+01 0.00000E+00 0.00000E+00 3 8.47078E-01 1.25270E+02 -4.89129E-01 6.91588E-01 + 0.20944E+01 0.34907E+01 0.00000E+00 0.00000E+00 5 3.85679E+01 6.25802E+01 1.77607E+01 3.42350E+01 + 0.20944E+01 0.34907E+01 0.00000E+00 0.00000E+00 2 2.10298E-06 -7.00757E+01 7.16649E-07 -1.97710E-06 + 0.20944E+01 0.34907E+01 0.00000E+00 0.00000E+00 4 1.15195E-06 -1.43654E+01 1.11593E-06 -2.85805E-07 + 0.20944E+01 0.34907E+01 0.00000E+00 0.00000E+00 6 2.45195E-04 1.65577E+02 -2.37467E-04 6.10742E-05 + 0.33963E+01 0.33963E+01 0.00000E+00 0.00000E+00 1 5.15467E+00 0.00000E+00 5.15467E+00 0.00000E+00 + 0.33963E+01 0.33963E+01 0.00000E+00 0.00000E+00 3 5.28011E-02 0.00000E+00 5.28011E-02 0.00000E+00 + 0.33963E+01 0.33963E+01 0.00000E+00 0.00000E+00 5 2.46129E+01 0.00000E+00 2.46129E+01 0.00000E+00 + 0.33963E+01 0.33963E+01 0.00000E+00 0.00000E+00 2 6.46995E-06 0.00000E+00 6.46995E-06 0.00000E+00 + 0.33963E+01 0.33963E+01 0.00000E+00 0.00000E+00 4 3.42233E-06 1.80000E+02 -3.42233E-06 0.00000E+00 + 0.33963E+01 0.33963E+01 0.00000E+00 0.00000E+00 6 1.14384E-04 0.00000E+00 1.14384E-04 0.00000E+00 + 0.33069E+01 0.33963E+01 0.00000E+00 0.00000E+00 1 4.95912E+00 -2.92725E+01 4.32586E+00 -2.42483E+00 + 0.33069E+01 0.33963E+01 0.00000E+00 0.00000E+00 3 1.13323E+00 -1.07424E+01 1.11337E+00 -2.11227E-01 + 0.33069E+01 0.33963E+01 0.00000E+00 0.00000E+00 5 3.02560E+01 1.65942E+01 2.89959E+01 8.64087E+00 + 0.33069E+01 0.33963E+01 0.00000E+00 0.00000E+00 2 6.69787E-06 1.71986E+02 -6.63247E-06 9.33727E-07 + 0.33069E+01 0.33963E+01 0.00000E+00 0.00000E+00 4 2.64338E-05 8.59740E+01 1.85589E-06 2.63685E-05 + 0.33069E+01 0.33963E+01 0.00000E+00 0.00000E+00 6 1.08108E-04 1.43506E+02 -8.69102E-05 6.42957E-05 + 0.32221E+01 0.33963E+01 0.00000E+00 0.00000E+00 1 5.88421E+00 -8.30042E+01 7.16680E-01 -5.84040E+00 + 0.32221E+01 0.33963E+01 0.00000E+00 0.00000E+00 3 3.95735E+00 -9.93195E+00 3.89804E+00 -6.82558E-01 + 0.32221E+01 0.33963E+01 0.00000E+00 0.00000E+00 5 7.61073E+01 7.35844E+01 2.15081E+01 7.30050E+01 + 0.32221E+01 0.33963E+01 0.00000E+00 0.00000E+00 2 3.67340E-06 8.23373E+01 4.89816E-07 3.64059E-06 + 0.32221E+01 0.33963E+01 0.00000E+00 0.00000E+00 4 5.05545E-06 1.01581E+02 -1.01492E-06 4.95252E-06 + 0.32221E+01 0.33963E+01 0.00000E+00 0.00000E+00 6 3.88665E-04 1.67126E+02 -3.78896E-04 8.65950E-05 + 0.31416E+01 0.33963E+01 0.00000E+00 0.00000E+00 1 8.40841E+00 -1.51574E+02 -7.39460E+00 -4.00265E+00 + 0.31416E+01 0.33963E+01 0.00000E+00 0.00000E+00 3 4.62713E+00 -8.27236E+00 4.57898E+00 -6.65745E-01 + 0.31416E+01 0.33963E+01 0.00000E+00 0.00000E+00 5 1.29817E+02 7.66582E+01 2.99565E+01 1.26313E+02 + 0.31416E+01 0.33963E+01 0.00000E+00 0.00000E+00 2 7.38938E-06 9.97136E+01 -1.24676E-06 7.28344E-06 + 0.31416E+01 0.33963E+01 0.00000E+00 0.00000E+00 4 7.74377E-06 8.41441E+01 7.90078E-07 7.70336E-06 + 0.31416E+01 0.33963E+01 0.00000E+00 0.00000E+00 6 1.16553E-04 2.82287E+01 1.02691E-04 5.51284E-05 + 0.30650E+01 0.33963E+01 0.00000E+00 0.00000E+00 1 1.20743E+01 1.75548E+02 -1.20379E+01 9.37166E-01 + 0.30650E+01 0.33963E+01 0.00000E+00 0.00000E+00 3 5.15235E+00 -4.74789E+01 3.48228E+00 -3.79744E+00 + 0.30650E+01 0.33963E+01 0.00000E+00 0.00000E+00 5 1.07653E+02 7.81291E+01 2.21450E+01 1.05350E+02 + 0.30650E+01 0.33963E+01 0.00000E+00 0.00000E+00 2 6.64600E-06 1.26055E+02 -3.91155E-06 5.37300E-06 + 0.30650E+01 0.33963E+01 0.00000E+00 0.00000E+00 4 1.17951E-05 9.08463E+01 -1.74221E-07 1.17939E-05 + 0.30650E+01 0.33963E+01 0.00000E+00 0.00000E+00 6 4.12543E-04 -1.85364E+01 3.91141E-04 -1.31151E-04 + 0.29920E+01 0.33963E+01 0.00000E+00 0.00000E+00 1 1.22694E+01 1.63840E+02 -1.17846E+01 3.41481E+00 + 0.29920E+01 0.33963E+01 0.00000E+00 0.00000E+00 3 7.27367E+00 -8.77553E+01 2.84894E-01 -7.26808E+00 + 0.29920E+01 0.33963E+01 0.00000E+00 0.00000E+00 5 5.94843E+01 5.99024E+01 2.98298E+01 5.14641E+01 + 0.29920E+01 0.33963E+01 0.00000E+00 0.00000E+00 2 8.65200E-06 7.44932E+01 2.31314E-06 8.33705E-06 + 0.29920E+01 0.33963E+01 0.00000E+00 0.00000E+00 4 1.01674E-05 3.49904E+01 8.32960E-06 5.83037E-06 + 0.29920E+01 0.33963E+01 0.00000E+00 0.00000E+00 6 1.64572E-04 -2.77760E+00 1.64379E-04 -7.97504E-06 + 0.29224E+01 0.33963E+01 0.00000E+00 0.00000E+00 1 4.48946E+00 1.14601E+02 -1.86895E+00 4.08195E+00 + 0.29224E+01 0.33963E+01 0.00000E+00 0.00000E+00 3 7.76275E+00 -9.85133E+01 -1.14919E+00 -7.67722E+00 + 0.29224E+01 0.33963E+01 0.00000E+00 0.00000E+00 5 5.46931E+01 2.41356E+01 4.99118E+01 2.23639E+01 + 0.29224E+01 0.33963E+01 0.00000E+00 0.00000E+00 2 1.11929E-05 7.37052E+00 1.11004E-05 1.43588E-06 + 0.29224E+01 0.33963E+01 0.00000E+00 0.00000E+00 4 1.16881E-05 2.59504E+01 1.05097E-05 5.11464E-06 + 0.29224E+01 0.33963E+01 0.00000E+00 0.00000E+00 6 1.12673E-03 -1.36554E+01 1.09488E-03 -2.66002E-04 + 0.28560E+01 0.33963E+01 0.00000E+00 0.00000E+00 1 1.18516E+01 2.39278E+01 1.08330E+01 4.80682E+00 + 0.28560E+01 0.33963E+01 0.00000E+00 0.00000E+00 3 6.72829E+00 -1.03906E+02 -1.61705E+00 -6.53109E+00 + 0.28560E+01 0.33963E+01 0.00000E+00 0.00000E+00 5 5.62626E+01 3.43462E+00 5.61616E+01 3.37067E+00 + 0.28560E+01 0.33963E+01 0.00000E+00 0.00000E+00 2 3.95408E-06 -1.77093E+02 -3.94899E-06 -2.00560E-07 + 0.28560E+01 0.33963E+01 0.00000E+00 0.00000E+00 4 4.74251E-06 -1.21628E+02 -2.48701E-06 -4.03809E-06 + 0.28560E+01 0.33963E+01 0.00000E+00 0.00000E+00 6 5.51028E-04 -7.90271E+01 1.04885E-04 -5.40953E-04 + 0.27925E+01 0.33963E+01 0.00000E+00 0.00000E+00 1 1.87460E+01 1.55618E+01 1.80588E+01 5.02912E+00 + 0.27925E+01 0.33963E+01 0.00000E+00 0.00000E+00 3 3.73911E+00 -1.36030E+02 -2.69104E+00 -2.59601E+00 + 0.27925E+01 0.33963E+01 0.00000E+00 0.00000E+00 5 1.48338E+01 -4.48601E-01 1.48333E+01 -1.16141E-01 + 0.27925E+01 0.33963E+01 0.00000E+00 0.00000E+00 2 6.92552E-06 1.72416E+02 -6.86493E-06 9.14045E-07 + 0.27925E+01 0.33963E+01 0.00000E+00 0.00000E+00 4 5.07705E-06 -5.03216E+01 3.24159E-06 -3.90750E-06 + 0.27925E+01 0.33963E+01 0.00000E+00 0.00000E+00 6 8.14990E-05 -2.86418E+01 7.15263E-05 -3.90651E-05 + 0.27318E+01 0.33963E+01 0.00000E+00 0.00000E+00 1 1.18536E+01 -1.27977E+01 1.15592E+01 -2.62568E+00 + 0.27318E+01 0.33963E+01 0.00000E+00 0.00000E+00 3 3.79106E+00 1.72440E+02 -3.75811E+00 4.98739E-01 + 0.27318E+01 0.33963E+01 0.00000E+00 0.00000E+00 5 4.10490E+01 1.03112E+02 -9.31234E+00 3.99788E+01 + 0.27318E+01 0.33963E+01 0.00000E+00 0.00000E+00 2 2.10781E-06 1.16267E+02 -9.32819E-07 1.89016E-06 + 0.27318E+01 0.33963E+01 0.00000E+00 0.00000E+00 4 4.04804E-06 -2.21874E+01 3.74830E-06 -1.52869E-06 + 0.27318E+01 0.33963E+01 0.00000E+00 0.00000E+00 6 1.83710E-04 1.65278E+02 -1.77679E-04 4.66856E-05 + 0.26737E+01 0.33963E+01 0.00000E+00 0.00000E+00 1 1.86456E+01 -8.87989E+01 3.90832E-01 -1.86415E+01 + 0.26737E+01 0.33963E+01 0.00000E+00 0.00000E+00 3 4.16196E+00 1.59076E+02 -3.88749E+00 1.48638E+00 + 0.26737E+01 0.33963E+01 0.00000E+00 0.00000E+00 5 9.17862E+01 9.57653E+01 -9.22023E+00 9.13219E+01 + 0.26737E+01 0.33963E+01 0.00000E+00 0.00000E+00 2 8.60085E-07 -1.68486E+02 -8.42778E-07 -1.71673E-07 + 0.26737E+01 0.33963E+01 0.00000E+00 0.00000E+00 4 1.06177E-06 -8.84937E+01 2.79107E-08 -1.06140E-06 + 0.26737E+01 0.33963E+01 0.00000E+00 0.00000E+00 6 2.38172E-04 4.27541E+01 1.74883E-04 1.61684E-04 + 0.26180E+01 0.33963E+01 0.00000E+00 0.00000E+00 1 2.80356E+01 -1.01123E+02 -5.40858E+00 -2.75089E+01 + 0.26180E+01 0.33963E+01 0.00000E+00 0.00000E+00 3 1.79450E+00 1.54906E+02 -1.62513E+00 7.61053E-01 + 0.26180E+01 0.33963E+01 0.00000E+00 0.00000E+00 5 8.92749E+01 8.42394E+01 8.96071E+00 8.88241E+01 + 0.26180E+01 0.33963E+01 0.00000E+00 0.00000E+00 2 1.34176E-06 1.48190E+02 -1.14023E-06 7.07247E-07 + 0.26180E+01 0.33963E+01 0.00000E+00 0.00000E+00 4 1.83702E-06 1.57199E+01 1.76831E-06 4.97711E-07 + 0.26180E+01 0.33963E+01 0.00000E+00 0.00000E+00 6 2.83223E-04 6.11287E+01 1.36753E-04 2.48020E-04 + 0.25646E+01 0.33963E+01 0.00000E+00 0.00000E+00 1 2.27331E+01 -1.00165E+02 -4.01191E+00 -2.23763E+01 + 0.25646E+01 0.33963E+01 0.00000E+00 0.00000E+00 3 1.15975E+00 -7.58306E+01 2.83894E-01 -1.12447E+00 + 0.25646E+01 0.33963E+01 0.00000E+00 0.00000E+00 5 7.39093E+01 6.58592E+01 3.02275E+01 6.74455E+01 + 0.25646E+01 0.33963E+01 0.00000E+00 0.00000E+00 2 1.82334E-06 5.01768E+01 1.16771E-06 1.40037E-06 + 0.25646E+01 0.33963E+01 0.00000E+00 0.00000E+00 4 8.53838E-06 -8.66808E+01 4.94359E-07 -8.52405E-06 + 0.25646E+01 0.33963E+01 0.00000E+00 0.00000E+00 6 1.55734E-04 1.07103E+01 1.53021E-04 2.89421E-05 + 0.25133E+01 0.33963E+01 0.00000E+00 0.00000E+00 1 1.14651E+01 -1.65769E+02 -1.11133E+01 -2.81847E+00 + 0.25133E+01 0.33963E+01 0.00000E+00 0.00000E+00 3 1.84324E+00 -1.75882E+01 1.75707E+00 -5.56976E-01 + 0.25133E+01 0.33963E+01 0.00000E+00 0.00000E+00 5 8.52253E+01 1.35586E+01 8.28501E+01 1.99802E+01 + 0.25133E+01 0.33963E+01 0.00000E+00 0.00000E+00 2 2.59129E-06 1.57877E+01 2.49353E-06 7.05020E-07 + 0.25133E+01 0.33963E+01 0.00000E+00 0.00000E+00 4 3.76558E-06 1.47316E+02 -3.16935E-06 2.03342E-06 + 0.25133E+01 0.33963E+01 0.00000E+00 0.00000E+00 6 2.26624E-04 -8.58864E+00 2.24083E-04 -3.38439E-05 + 0.24640E+01 0.33963E+01 0.00000E+00 0.00000E+00 1 2.19949E+01 1.66756E+02 -2.14099E+01 5.03908E+00 + 0.24640E+01 0.33963E+01 0.00000E+00 0.00000E+00 3 1.70180E+00 -2.38956E+01 1.55593E+00 -6.89349E-01 + 0.24640E+01 0.33963E+01 0.00000E+00 0.00000E+00 5 1.18127E+02 3.39846E+01 9.79499E+01 6.60297E+01 + 0.24640E+01 0.33963E+01 0.00000E+00 0.00000E+00 2 1.06880E-06 -1.30878E+02 -6.99472E-07 -8.08126E-07 + 0.24640E+01 0.33963E+01 0.00000E+00 0.00000E+00 4 1.38634E-06 7.87801E+01 2.69747E-07 1.35984E-06 + 0.24640E+01 0.33963E+01 0.00000E+00 0.00000E+00 6 1.49973E-04 -2.29408E+01 1.38111E-04 -5.84562E-05 + 0.24166E+01 0.33963E+01 0.00000E+00 0.00000E+00 1 1.91004E+01 1.70448E+02 -1.88356E+01 3.16972E+00 + 0.24166E+01 0.33963E+01 0.00000E+00 0.00000E+00 3 1.00020E+00 1.04124E+02 -2.44061E-01 9.69964E-01 + 0.24166E+01 0.33963E+01 0.00000E+00 0.00000E+00 5 8.93730E+01 4.82726E+01 5.94855E+01 6.67009E+01 + 0.24166E+01 0.33963E+01 0.00000E+00 0.00000E+00 2 5.53196E-06 1.64375E+02 -5.32754E-06 1.48995E-06 + 0.24166E+01 0.33963E+01 0.00000E+00 0.00000E+00 4 7.27482E-06 1.76315E+02 -7.25978E-06 4.67551E-07 + 0.24166E+01 0.33963E+01 0.00000E+00 0.00000E+00 6 1.62418E-04 -1.28381E+02 -1.00843E-04 -1.27320E-04 + 0.23710E+01 0.33963E+01 0.00000E+00 0.00000E+00 1 1.94143E+00 9.69086E+01 -2.33527E-01 1.92733E+00 + 0.23710E+01 0.33963E+01 0.00000E+00 0.00000E+00 3 4.29885E-01 1.24301E+02 -2.42255E-01 3.55125E-01 + 0.23710E+01 0.33963E+01 0.00000E+00 0.00000E+00 5 2.55488E+01 -1.33750E+02 -1.76672E+01 -1.84557E+01 + 0.23710E+01 0.33963E+01 0.00000E+00 0.00000E+00 2 1.74492E-06 1.10858E+02 -6.21274E-07 1.63057E-06 + 0.23710E+01 0.33963E+01 0.00000E+00 0.00000E+00 4 1.06113E-06 7.97622E+01 1.88600E-07 1.04424E-06 + 0.23710E+01 0.33963E+01 0.00000E+00 0.00000E+00 6 6.56564E-05 1.57326E+02 -6.05821E-05 2.53096E-05 + 0.23271E+01 0.33963E+01 0.00000E+00 0.00000E+00 1 1.77382E+01 2.50359E+01 1.60716E+01 7.50656E+00 + 0.23271E+01 0.33963E+01 0.00000E+00 0.00000E+00 3 7.85317E-01 -1.41065E+02 -6.10865E-01 -4.93525E-01 + 0.23271E+01 0.33963E+01 0.00000E+00 0.00000E+00 5 9.40343E+01 -1.11641E+02 -3.46782E+01 -8.74064E+01 + 0.23271E+01 0.33963E+01 0.00000E+00 0.00000E+00 2 2.08766E-06 -6.89208E+01 7.50845E-07 -1.94796E-06 + 0.23271E+01 0.33963E+01 0.00000E+00 0.00000E+00 4 1.29790E-06 7.49519E+01 3.36974E-07 1.25339E-06 + 0.23271E+01 0.33963E+01 0.00000E+00 0.00000E+00 6 2.09799E-04 9.77365E+01 -2.82427E-05 2.07889E-04 + 0.22848E+01 0.33963E+01 0.00000E+00 0.00000E+00 1 1.26862E+01 2.84425E+01 1.11549E+01 6.04213E+00 + 0.22848E+01 0.33963E+01 0.00000E+00 0.00000E+00 3 5.42619E-01 -1.69420E+02 -5.33394E-01 -9.96306E-02 + 0.22848E+01 0.33963E+01 0.00000E+00 0.00000E+00 5 6.15089E+01 -8.68811E+01 3.34656E+00 -6.14178E+01 + 0.22848E+01 0.33963E+01 0.00000E+00 0.00000E+00 2 1.22097E-06 1.38396E+02 -9.12989E-07 8.10692E-07 + 0.22848E+01 0.33963E+01 0.00000E+00 0.00000E+00 4 2.32639E-06 -9.06783E+01 -2.75410E-08 -2.32622E-06 + 0.22848E+01 0.33963E+01 0.00000E+00 0.00000E+00 6 1.07363E-04 1.51010E+02 -9.39112E-05 5.20335E-05 + 0.22440E+01 0.33963E+01 0.00000E+00 0.00000E+00 1 8.65650E+00 -6.18114E+01 4.08912E+00 -7.62982E+00 + 0.22440E+01 0.33963E+01 0.00000E+00 0.00000E+00 3 1.36191E+00 1.63145E+02 -1.30341E+00 3.94895E-01 + 0.22440E+01 0.33963E+01 0.00000E+00 0.00000E+00 5 3.50128E+01 7.22812E+01 1.06560E+01 3.33519E+01 + 0.22440E+01 0.33963E+01 0.00000E+00 0.00000E+00 2 1.10469E-07 2.41112E+01 1.00831E-07 4.51278E-08 + 0.22440E+01 0.33963E+01 0.00000E+00 0.00000E+00 4 2.14824E-06 2.81106E+01 1.89484E-06 1.01220E-06 + 0.22440E+01 0.33963E+01 0.00000E+00 0.00000E+00 6 1.32942E-05 5.90520E+01 6.83667E-06 1.14016E-05 + 0.22046E+01 0.33963E+01 0.00000E+00 0.00000E+00 1 2.13205E+01 -6.97695E+01 7.37259E+00 -2.00052E+01 + 0.22046E+01 0.33963E+01 0.00000E+00 0.00000E+00 3 1.44380E+00 1.00983E+02 -2.75059E-01 1.41735E+00 + 0.22046E+01 0.33963E+01 0.00000E+00 0.00000E+00 5 8.03566E+01 1.05543E+02 -2.15329E+01 7.74178E+01 + 0.22046E+01 0.33963E+01 0.00000E+00 0.00000E+00 2 2.05925E-06 -1.46721E+02 -1.72154E-06 -1.12996E-06 + 0.22046E+01 0.33963E+01 0.00000E+00 0.00000E+00 4 2.35100E-06 -1.76088E+02 -2.34552E-06 -1.60402E-07 + 0.22046E+01 0.33963E+01 0.00000E+00 0.00000E+00 6 3.80186E-04 1.39880E+01 3.68912E-04 9.18979E-05 + 0.21666E+01 0.33963E+01 0.00000E+00 0.00000E+00 1 1.70010E+01 -7.51654E+01 4.35278E+00 -1.64344E+01 + 0.21666E+01 0.33963E+01 0.00000E+00 0.00000E+00 3 2.08650E+00 -9.81901E+01 -2.97237E-01 -2.06522E+00 + 0.21666E+01 0.33963E+01 0.00000E+00 0.00000E+00 5 4.46627E+01 1.19883E+02 -2.22523E+01 3.87245E+01 + 0.21666E+01 0.33963E+01 0.00000E+00 0.00000E+00 2 1.24282E-06 6.23046E+01 5.77625E-07 1.10043E-06 + 0.21666E+01 0.33963E+01 0.00000E+00 0.00000E+00 4 1.13529E-06 -6.57150E+01 4.66917E-07 -1.03483E-06 + 0.21666E+01 0.33963E+01 0.00000E+00 0.00000E+00 6 4.79249E-05 -1.16695E+02 -2.15295E-05 -4.28167E-05 + 0.21299E+01 0.33963E+01 0.00000E+00 0.00000E+00 1 1.01394E+01 -1.29206E+02 -6.40929E+00 -7.85676E+00 + 0.21299E+01 0.33963E+01 0.00000E+00 0.00000E+00 3 1.66309E+00 -8.42840E+01 1.65641E-01 -1.65483E+00 + 0.21299E+01 0.33963E+01 0.00000E+00 0.00000E+00 5 2.64300E+01 2.92071E+01 2.30697E+01 1.28970E+01 + 0.21299E+01 0.33963E+01 0.00000E+00 0.00000E+00 2 1.12788E-06 7.15798E+01 3.56393E-07 1.07009E-06 + 0.21299E+01 0.33963E+01 0.00000E+00 0.00000E+00 4 1.43626E-06 -1.54139E+02 -1.29242E-06 -6.26489E-07 + 0.21299E+01 0.33963E+01 0.00000E+00 0.00000E+00 6 1.89029E-04 -7.58380E+01 4.62487E-05 -1.83284E-04 + 0.20944E+01 0.33963E+01 0.00000E+00 0.00000E+00 1 9.28391E+00 -1.48828E+02 -7.94348E+00 -4.80542E+00 + 0.20944E+01 0.33963E+01 0.00000E+00 0.00000E+00 3 1.96013E-01 -1.12734E+02 -7.57504E-02 -1.80784E-01 + 0.20944E+01 0.33963E+01 0.00000E+00 0.00000E+00 5 3.55291E+01 3.59627E+01 2.87573E+01 2.08648E+01 + 0.20944E+01 0.33963E+01 0.00000E+00 0.00000E+00 2 2.35259E-06 -7.19113E+01 7.30450E-07 -2.23632E-06 + 0.20944E+01 0.33963E+01 0.00000E+00 0.00000E+00 4 2.75521E-06 1.02615E+02 -6.01745E-07 2.68870E-06 + 0.20944E+01 0.33963E+01 0.00000E+00 0.00000E+00 6 2.77485E-04 1.69458E+02 -2.72801E-04 5.07678E-05 + 0.33069E+01 0.33069E+01 0.00000E+00 0.00000E+00 1 5.97903E+00 0.00000E+00 5.97903E+00 0.00000E+00 + 0.33069E+01 0.33069E+01 0.00000E+00 0.00000E+00 3 3.66250E-02 0.00000E+00 3.66250E-02 0.00000E+00 + 0.33069E+01 0.33069E+01 0.00000E+00 0.00000E+00 5 2.52209E+01 0.00000E+00 2.52209E+01 0.00000E+00 + 0.33069E+01 0.33069E+01 0.00000E+00 0.00000E+00 2 5.75654E-06 0.00000E+00 5.75654E-06 0.00000E+00 + 0.33069E+01 0.33069E+01 0.00000E+00 0.00000E+00 4 3.59121E-06 0.00000E+00 3.59121E-06 0.00000E+00 + 0.33069E+01 0.33069E+01 0.00000E+00 0.00000E+00 6 3.17962E-05 1.80000E+02 -3.17962E-05 0.00000E+00 + 0.32221E+01 0.33069E+01 0.00000E+00 0.00000E+00 1 5.14803E+00 -3.46323E+01 4.23588E+00 -2.92566E+00 + 0.32221E+01 0.33069E+01 0.00000E+00 0.00000E+00 3 1.20820E+00 -1.35824E+01 1.17441E+00 -2.83739E-01 + 0.32221E+01 0.33069E+01 0.00000E+00 0.00000E+00 5 3.05246E+01 2.44557E+01 2.77860E+01 1.26369E+01 + 0.32221E+01 0.33069E+01 0.00000E+00 0.00000E+00 2 5.91160E-06 1.00114E+02 -1.03812E-06 5.81974E-06 + 0.32221E+01 0.33069E+01 0.00000E+00 0.00000E+00 4 1.81314E-05 2.77930E+01 1.60397E-05 8.45427E-06 + 0.32221E+01 0.33069E+01 0.00000E+00 0.00000E+00 6 2.43082E-04 -9.68352E+01 -2.89299E-05 -2.41354E-04 + 0.31416E+01 0.33069E+01 0.00000E+00 0.00000E+00 1 5.39175E+00 -1.03247E+02 -1.23556E+00 -5.24827E+00 + 0.31416E+01 0.33069E+01 0.00000E+00 0.00000E+00 3 3.28178E+00 -7.07206E+00 3.25681E+00 -4.04044E-01 + 0.31416E+01 0.33069E+01 0.00000E+00 0.00000E+00 5 8.18655E+01 6.80708E+01 3.05735E+01 7.59422E+01 + 0.31416E+01 0.33069E+01 0.00000E+00 0.00000E+00 2 8.81423E-06 1.42874E+02 -7.02772E-06 5.31994E-06 + 0.31416E+01 0.33069E+01 0.00000E+00 0.00000E+00 4 6.05192E-05 8.86126E+01 1.46532E-06 6.05015E-05 + 0.31416E+01 0.33069E+01 0.00000E+00 0.00000E+00 6 3.35711E-04 -1.60966E+02 -3.17355E-04 -1.09488E-04 + 0.30650E+01 0.33069E+01 0.00000E+00 0.00000E+00 1 6.45781E+00 -1.61022E+02 -6.10680E+00 -2.10008E+00 + 0.30650E+01 0.33069E+01 0.00000E+00 0.00000E+00 3 4.66441E+00 -9.32095E+00 4.60283E+00 -7.55471E-01 + 0.30650E+01 0.33069E+01 0.00000E+00 0.00000E+00 5 1.23585E+02 7.88140E+01 2.39749E+01 1.21237E+02 + 0.30650E+01 0.33069E+01 0.00000E+00 0.00000E+00 2 8.41546E-06 5.10222E+01 5.29349E-06 6.54209E-06 + 0.30650E+01 0.33069E+01 0.00000E+00 0.00000E+00 4 6.02865E-06 8.36571E+01 6.66039E-07 5.99175E-06 + 0.30650E+01 0.33069E+01 0.00000E+00 0.00000E+00 6 5.46304E-04 -1.31478E+01 5.31984E-04 -1.24265E-04 + 0.29920E+01 0.33069E+01 0.00000E+00 0.00000E+00 1 1.14903E+01 1.74663E+02 -1.14405E+01 1.06874E+00 + 0.29920E+01 0.33069E+01 0.00000E+00 0.00000E+00 3 5.23110E+00 -5.76997E+01 2.79528E+00 -4.42163E+00 + 0.29920E+01 0.33069E+01 0.00000E+00 0.00000E+00 5 9.02289E+01 7.50244E+01 2.33159E+01 8.71644E+01 + 0.29920E+01 0.33069E+01 0.00000E+00 0.00000E+00 2 4.44995E-06 1.32688E+02 -3.01709E-06 3.27096E-06 + 0.29920E+01 0.33069E+01 0.00000E+00 0.00000E+00 4 5.91956E-06 8.10346E+01 9.22494E-07 5.84724E-06 + 0.29920E+01 0.33069E+01 0.00000E+00 0.00000E+00 6 2.91271E-04 -2.08572E+01 2.72184E-04 -1.03704E-04 + 0.29224E+01 0.33069E+01 0.00000E+00 0.00000E+00 1 1.17325E+01 1.59341E+02 -1.09781E+01 4.13926E+00 + 0.29224E+01 0.33069E+01 0.00000E+00 0.00000E+00 3 7.09722E+00 -9.70942E+01 -8.76513E-01 -7.04289E+00 + 0.29224E+01 0.33069E+01 0.00000E+00 0.00000E+00 5 4.49436E+01 4.96483E+01 2.91000E+01 3.42508E+01 + 0.29224E+01 0.33069E+01 0.00000E+00 0.00000E+00 2 2.95759E-06 2.14469E+01 2.75280E-06 1.08141E-06 + 0.29224E+01 0.33069E+01 0.00000E+00 0.00000E+00 4 1.20440E-05 1.76158E+01 1.14792E-05 3.64491E-06 + 0.29224E+01 0.33069E+01 0.00000E+00 0.00000E+00 6 4.80684E-04 2.47218E+01 4.36629E-04 2.01028E-04 + 0.28560E+01 0.33069E+01 0.00000E+00 0.00000E+00 1 4.28310E+00 8.46581E+01 3.98751E-01 4.26450E+00 + 0.28560E+01 0.33069E+01 0.00000E+00 0.00000E+00 3 7.60248E+00 -9.94386E+01 -1.24673E+00 -7.49956E+00 + 0.28560E+01 0.33069E+01 0.00000E+00 0.00000E+00 5 5.72891E+01 2.60950E+00 5.72297E+01 2.60829E+00 + 0.28560E+01 0.33069E+01 0.00000E+00 0.00000E+00 2 1.05864E-05 -1.22751E+01 1.03444E-05 -2.25072E-06 + 0.28560E+01 0.33069E+01 0.00000E+00 0.00000E+00 4 7.78256E-07 1.43678E+02 -6.27039E-07 4.60982E-07 + 0.28560E+01 0.33069E+01 0.00000E+00 0.00000E+00 6 6.26602E-04 -6.37784E+01 2.76860E-04 -5.62119E-04 + 0.27925E+01 0.33069E+01 0.00000E+00 0.00000E+00 1 1.50079E+01 1.90980E+01 1.41819E+01 4.91037E+00 + 0.27925E+01 0.33069E+01 0.00000E+00 0.00000E+00 3 5.71084E+00 -1.10885E+02 -2.03585E+00 -5.33563E+00 + 0.27925E+01 0.33069E+01 0.00000E+00 0.00000E+00 5 4.90367E+01 -1.81833E+01 4.65880E+01 -1.53023E+01 + 0.27925E+01 0.33069E+01 0.00000E+00 0.00000E+00 2 7.63357E-07 -1.48395E+02 -6.50139E-07 -4.00042E-07 + 0.27925E+01 0.33069E+01 0.00000E+00 0.00000E+00 4 8.19459E-06 4.13612E+01 6.15052E-06 5.41501E-06 + 0.27925E+01 0.33069E+01 0.00000E+00 0.00000E+00 6 5.25932E-04 -1.14055E+02 -2.14379E-04 -4.80256E-04 + 0.27318E+01 0.33069E+01 0.00000E+00 0.00000E+00 1 1.82059E+01 1.53791E+01 1.75540E+01 4.82826E+00 + 0.27318E+01 0.33069E+01 0.00000E+00 0.00000E+00 3 3.18614E+00 -1.56170E+02 -2.91451E+00 -1.28729E+00 + 0.27318E+01 0.33069E+01 0.00000E+00 0.00000E+00 5 7.69760E+00 -2.24585E+01 7.11379E+00 -2.94059E+00 + 0.27318E+01 0.33069E+01 0.00000E+00 0.00000E+00 2 6.99504E-06 -1.59522E+02 -6.55302E-06 -2.44716E-06 + 0.27318E+01 0.33069E+01 0.00000E+00 0.00000E+00 4 4.36731E-06 2.81080E+00 4.36205E-06 2.14164E-07 + 0.27318E+01 0.33069E+01 0.00000E+00 0.00000E+00 6 2.85978E-04 -1.56747E+02 -2.62749E-04 -1.12902E-04 + 0.26737E+01 0.33069E+01 0.00000E+00 0.00000E+00 1 1.13180E+01 -2.74231E+01 1.00462E+01 -5.21259E+00 + 0.26737E+01 0.33069E+01 0.00000E+00 0.00000E+00 3 3.72815E+00 1.60700E+02 -3.51863E+00 1.23222E+00 + 0.26737E+01 0.33069E+01 0.00000E+00 0.00000E+00 5 5.33211E+01 1.12122E+02 -2.00793E+01 4.93959E+01 + 0.26737E+01 0.33069E+01 0.00000E+00 0.00000E+00 2 2.93761E-06 1.38832E+02 -2.21140E-06 1.93372E-06 + 0.26737E+01 0.33069E+01 0.00000E+00 0.00000E+00 4 4.21577E-06 -1.30912E+02 -2.76093E-06 -3.18591E-06 + 0.26737E+01 0.33069E+01 0.00000E+00 0.00000E+00 6 9.77801E-05 -2.28602E+01 9.01000E-05 -3.79860E-05 + 0.26180E+01 0.33069E+01 0.00000E+00 0.00000E+00 1 2.02219E+01 -9.85940E+01 -3.02180E+00 -1.99949E+01 + 0.26180E+01 0.33069E+01 0.00000E+00 0.00000E+00 3 3.88253E+00 1.51717E+02 -3.41903E+00 1.83963E+00 + 0.26180E+01 0.33069E+01 0.00000E+00 0.00000E+00 5 7.39803E+01 9.27143E+01 -3.50337E+00 7.38973E+01 + 0.26180E+01 0.33069E+01 0.00000E+00 0.00000E+00 2 1.22426E-06 -1.47260E+02 -1.02976E-06 -6.62121E-07 + 0.26180E+01 0.33069E+01 0.00000E+00 0.00000E+00 4 2.54240E-06 5.18446E+01 1.57069E-06 1.99919E-06 + 0.26180E+01 0.33069E+01 0.00000E+00 0.00000E+00 6 2.70116E-04 -1.15025E+02 -1.14261E-04 -2.44760E-04 + 0.25646E+01 0.33069E+01 0.00000E+00 0.00000E+00 1 2.74087E+01 -9.69004E+01 -3.29296E+00 -2.72102E+01 + 0.25646E+01 0.33069E+01 0.00000E+00 0.00000E+00 3 1.07254E+00 -1.67951E+02 -1.04891E+00 -2.23898E-01 + 0.25646E+01 0.33069E+01 0.00000E+00 0.00000E+00 5 8.21600E+01 9.67425E+01 -9.64626E+00 8.15918E+01 + 0.25646E+01 0.33069E+01 0.00000E+00 0.00000E+00 2 6.06778E-07 -6.99510E+01 2.08018E-07 -5.70007E-07 + 0.25646E+01 0.33069E+01 0.00000E+00 0.00000E+00 4 4.87384E-06 -7.78200E+00 4.82895E-06 -6.59939E-07 + 0.25646E+01 0.33069E+01 0.00000E+00 0.00000E+00 6 1.81551E-04 6.77134E+01 6.88512E-05 1.67989E-04 + 0.25133E+01 0.33069E+01 0.00000E+00 0.00000E+00 1 1.64862E+01 -1.06148E+02 -4.58507E+00 -1.58358E+01 + 0.25133E+01 0.33069E+01 0.00000E+00 0.00000E+00 3 9.33601E-01 -7.79702E+01 1.94581E-01 -9.13099E-01 + 0.25133E+01 0.33069E+01 0.00000E+00 0.00000E+00 5 6.05770E+01 4.12157E+01 4.55681E+01 3.99140E+01 + 0.25133E+01 0.33069E+01 0.00000E+00 0.00000E+00 2 6.23049E-06 -8.60054E+01 4.34032E-07 -6.21535E-06 + 0.25133E+01 0.33069E+01 0.00000E+00 0.00000E+00 4 9.05473E-07 1.75158E+02 -9.02241E-07 7.64350E-08 + 0.25133E+01 0.33069E+01 0.00000E+00 0.00000E+00 6 6.83445E-05 -1.08814E+02 -2.20407E-05 -6.46930E-05 + 0.24640E+01 0.33069E+01 0.00000E+00 0.00000E+00 1 1.22168E+01 -1.77839E+02 -1.22081E+01 -4.60711E-01 + 0.24640E+01 0.33069E+01 0.00000E+00 0.00000E+00 3 2.32278E+00 -8.69932E+00 2.29606E+00 -3.51318E-01 + 0.24640E+01 0.33069E+01 0.00000E+00 0.00000E+00 5 8.19299E+01 2.45268E+01 7.45371E+01 3.40106E+01 + 0.24640E+01 0.33069E+01 0.00000E+00 0.00000E+00 2 4.58820E-07 1.36231E+02 -3.31330E-07 3.17390E-07 + 0.24640E+01 0.33069E+01 0.00000E+00 0.00000E+00 4 2.14618E-06 1.56678E+02 -1.97083E-06 8.49670E-07 + 0.24640E+01 0.33069E+01 0.00000E+00 0.00000E+00 6 2.13293E-04 1.80530E+01 2.02793E-04 6.60987E-05 + 0.24166E+01 0.33069E+01 0.00000E+00 0.00000E+00 1 2.09174E+01 1.65269E+02 -2.02298E+01 5.31892E+00 + 0.24166E+01 0.33069E+01 0.00000E+00 0.00000E+00 3 7.97927E-01 2.14742E+01 7.42537E-01 2.92107E-01 + 0.24166E+01 0.33069E+01 0.00000E+00 0.00000E+00 5 1.06738E+02 3.81942E+01 8.38872E+01 6.59990E+01 + 0.24166E+01 0.33069E+01 0.00000E+00 0.00000E+00 2 5.58009E-06 7.41556E+01 1.52351E-06 5.36808E-06 + 0.24166E+01 0.33069E+01 0.00000E+00 0.00000E+00 4 2.22143E-06 -6.31227E+01 1.00426E-06 -1.98146E-06 + 0.24166E+01 0.33069E+01 0.00000E+00 0.00000E+00 6 4.76081E-05 -1.41135E+02 -3.70687E-05 -2.98738E-05 + 0.23710E+01 0.33069E+01 0.00000E+00 0.00000E+00 1 1.42961E+01 1.75777E+02 -1.42573E+01 1.05267E+00 + 0.23710E+01 0.33069E+01 0.00000E+00 0.00000E+00 3 1.30989E+00 1.07242E+02 -3.88269E-01 1.25103E+00 + 0.23710E+01 0.33069E+01 0.00000E+00 0.00000E+00 5 3.71069E+01 3.73954E+01 2.94801E+01 2.25354E+01 + 0.23710E+01 0.33069E+01 0.00000E+00 0.00000E+00 2 1.92787E-06 -4.84092E+00 1.92099E-06 -1.62692E-07 + 0.23710E+01 0.33069E+01 0.00000E+00 0.00000E+00 4 1.11818E-05 -1.79654E+02 -1.11816E-05 -6.75648E-08 + 0.23710E+01 0.33069E+01 0.00000E+00 0.00000E+00 6 6.09858E-05 -6.23092E+01 2.83401E-05 -5.40010E-05 + 0.23271E+01 0.33069E+01 0.00000E+00 0.00000E+00 1 8.04026E+00 3.09528E+01 6.89526E+00 4.13535E+00 + 0.23271E+01 0.33069E+01 0.00000E+00 0.00000E+00 3 6.42253E-01 -1.70871E+02 -6.34118E-01 -1.01896E-01 + 0.23271E+01 0.33069E+01 0.00000E+00 0.00000E+00 5 6.35426E+01 -1.21393E+02 -3.30997E+01 -5.42409E+01 + 0.23271E+01 0.33069E+01 0.00000E+00 0.00000E+00 2 2.26784E-06 -1.30755E+02 -1.48050E-06 -1.71790E-06 + 0.23271E+01 0.33069E+01 0.00000E+00 0.00000E+00 4 5.91589E-06 -9.57248E+01 -5.90112E-07 -5.88638E-06 + 0.23271E+01 0.33069E+01 0.00000E+00 0.00000E+00 6 9.62674E-05 1.16908E+02 -4.35669E-05 8.58448E-05 + 0.22848E+01 0.33069E+01 0.00000E+00 0.00000E+00 1 1.67240E+01 3.19616E+01 1.41887E+01 8.85289E+00 + 0.22848E+01 0.33069E+01 0.00000E+00 0.00000E+00 3 9.22088E-01 -1.33721E+02 -6.37296E-01 -6.66409E-01 + 0.22848E+01 0.33069E+01 0.00000E+00 0.00000E+00 5 9.99712E+01 -1.04237E+02 -2.45859E+01 -9.69009E+01 + 0.22848E+01 0.33069E+01 0.00000E+00 0.00000E+00 2 1.92930E-06 7.82711E+01 3.92189E-07 1.88902E-06 + 0.22848E+01 0.33069E+01 0.00000E+00 0.00000E+00 4 9.30376E-07 -1.44858E+02 -7.60796E-07 -5.35527E-07 + 0.22848E+01 0.33069E+01 0.00000E+00 0.00000E+00 6 1.82300E-04 -9.77350E+01 -2.45360E-05 -1.80641E-04 + 0.22440E+01 0.33069E+01 0.00000E+00 0.00000E+00 1 8.42768E+00 3.44955E+01 6.94585E+00 4.77294E+00 + 0.22440E+01 0.33069E+01 0.00000E+00 0.00000E+00 3 2.06577E-01 -1.60700E+02 -1.94968E-01 -6.82753E-02 + 0.22440E+01 0.33069E+01 0.00000E+00 0.00000E+00 5 3.84353E+01 -6.98287E+01 1.32536E+01 -3.60779E+01 + 0.22440E+01 0.33069E+01 0.00000E+00 0.00000E+00 2 7.06247E-07 1.38290E+02 -5.27226E-07 4.69911E-07 + 0.22440E+01 0.33069E+01 0.00000E+00 0.00000E+00 4 1.04757E-06 1.54347E+02 -9.44313E-07 4.53507E-07 + 0.22440E+01 0.33069E+01 0.00000E+00 0.00000E+00 6 1.13962E-04 -1.79161E+02 -1.13950E-04 -1.66935E-06 + 0.22046E+01 0.33069E+01 0.00000E+00 0.00000E+00 1 1.45535E+01 -6.40363E+01 6.37153E+00 -1.30846E+01 + 0.22046E+01 0.33069E+01 0.00000E+00 0.00000E+00 3 1.58545E+00 1.46648E+02 -1.32435E+00 8.71651E-01 + 0.22046E+01 0.33069E+01 0.00000E+00 0.00000E+00 5 6.92007E+01 9.31779E+01 -3.83624E+00 6.90943E+01 + 0.22046E+01 0.33069E+01 0.00000E+00 0.00000E+00 2 2.96718E-06 2.15950E+00 2.96508E-06 1.11808E-07 + 0.22046E+01 0.33069E+01 0.00000E+00 0.00000E+00 4 1.48967E-06 -1.32978E+02 -1.01553E-06 -1.08986E-06 + 0.22046E+01 0.33069E+01 0.00000E+00 0.00000E+00 6 1.01757E-04 1.71976E+02 -1.00761E-04 1.42036E-05 + 0.21666E+01 0.33069E+01 0.00000E+00 0.00000E+00 1 2.04869E+01 -6.39193E+01 9.00678E+00 -1.84008E+01 + 0.21666E+01 0.33069E+01 0.00000E+00 0.00000E+00 3 9.12667E-01 -6.91198E+01 3.25289E-01 -8.52730E-01 + 0.21666E+01 0.33069E+01 0.00000E+00 0.00000E+00 5 8.05563E+01 1.23656E+02 -4.46450E+01 6.70533E+01 + 0.21666E+01 0.33069E+01 0.00000E+00 0.00000E+00 2 2.68749E-06 4.35276E+01 1.94854E-06 1.85088E-06 + 0.21666E+01 0.33069E+01 0.00000E+00 0.00000E+00 4 2.61825E-06 -4.98400E+01 1.68857E-06 -2.00099E-06 + 0.21666E+01 0.33069E+01 0.00000E+00 0.00000E+00 6 1.00610E-04 3.61838E+01 8.12054E-05 5.93980E-05 + 0.21299E+01 0.33069E+01 0.00000E+00 0.00000E+00 1 1.21210E+01 -8.28108E+01 1.51689E+00 -1.20257E+01 + 0.21299E+01 0.33069E+01 0.00000E+00 0.00000E+00 3 2.24524E+00 -1.01561E+02 -4.49968E-01 -2.19968E+00 + 0.21299E+01 0.33069E+01 0.00000E+00 0.00000E+00 5 2.23455E+01 1.17410E+02 -1.02867E+01 1.98369E+01 + 0.21299E+01 0.33069E+01 0.00000E+00 0.00000E+00 2 1.92762E-06 -1.54166E+02 -1.73498E-06 -8.39981E-07 + 0.21299E+01 0.33069E+01 0.00000E+00 0.00000E+00 4 4.40192E-06 1.38331E+01 4.27424E-06 1.05247E-06 + 0.21299E+01 0.33069E+01 0.00000E+00 0.00000E+00 6 7.45024E-05 1.11992E+02 -2.78997E-05 6.90812E-05 + 0.20944E+01 0.33069E+01 0.00000E+00 0.00000E+00 1 9.08354E+00 -1.53332E+02 -8.11725E+00 -4.07689E+00 + 0.20944E+01 0.33069E+01 0.00000E+00 0.00000E+00 3 1.27270E+00 -1.06955E+02 -3.71136E-01 -1.21738E+00 + 0.20944E+01 0.33069E+01 0.00000E+00 0.00000E+00 5 2.50240E+01 -6.16577E+00 2.48792E+01 -2.68771E+00 + 0.20944E+01 0.33069E+01 0.00000E+00 0.00000E+00 2 1.71116E-06 -9.07836E+01 -2.34015E-08 -1.71100E-06 + 0.20944E+01 0.33069E+01 0.00000E+00 0.00000E+00 4 2.94271E-07 -7.74094E+01 6.41464E-08 -2.87195E-07 + 0.20944E+01 0.33069E+01 0.00000E+00 0.00000E+00 6 1.50976E-04 -1.02402E+02 -3.24258E-05 -1.47453E-04 + 0.32221E+01 0.32221E+01 0.00000E+00 0.00000E+00 1 4.00089E+00 0.00000E+00 4.00089E+00 0.00000E+00 + 0.32221E+01 0.32221E+01 0.00000E+00 0.00000E+00 3 2.88495E-02 0.00000E+00 2.88495E-02 0.00000E+00 + 0.32221E+01 0.32221E+01 0.00000E+00 0.00000E+00 5 2.32265E+01 0.00000E+00 2.32265E+01 0.00000E+00 + 0.32221E+01 0.32221E+01 0.00000E+00 0.00000E+00 2 6.64027E-06 0.00000E+00 6.64027E-06 0.00000E+00 + 0.32221E+01 0.32221E+01 0.00000E+00 0.00000E+00 4 6.74325E-06 0.00000E+00 6.74325E-06 0.00000E+00 + 0.32221E+01 0.32221E+01 0.00000E+00 0.00000E+00 6 1.56245E-04 0.00000E+00 1.56245E-04 0.00000E+00 + 0.31416E+01 0.32221E+01 0.00000E+00 0.00000E+00 1 2.56906E+00 -3.90476E+01 1.99519E+00 -1.61842E+00 + 0.31416E+01 0.32221E+01 0.00000E+00 0.00000E+00 3 1.21507E+00 -2.39199E+01 1.11071E+00 -4.92663E-01 + 0.31416E+01 0.32221E+01 0.00000E+00 0.00000E+00 5 2.91967E+01 2.54164E+01 2.63708E+01 1.25310E+01 + 0.31416E+01 0.32221E+01 0.00000E+00 0.00000E+00 2 8.86689E-06 5.34425E+01 5.28138E-06 7.12241E-06 + 0.31416E+01 0.32221E+01 0.00000E+00 0.00000E+00 4 1.16479E-05 8.23350E+01 1.55361E-06 1.15439E-05 + 0.31416E+01 0.32221E+01 0.00000E+00 0.00000E+00 6 1.56602E-04 -7.65351E+01 3.64646E-05 -1.52297E-04 + 0.30650E+01 0.32221E+01 0.00000E+00 0.00000E+00 1 3.28880E+00 -1.01939E+02 -6.80374E-01 -3.21766E+00 + 0.30650E+01 0.32221E+01 0.00000E+00 0.00000E+00 3 3.95180E+00 -4.78661E+00 3.93802E+00 -3.29758E-01 + 0.30650E+01 0.32221E+01 0.00000E+00 0.00000E+00 5 8.57890E+01 6.93187E+01 3.02980E+01 8.02607E+01 + 0.30650E+01 0.32221E+01 0.00000E+00 0.00000E+00 2 5.83036E-06 1.15324E+02 -2.49382E-06 5.27010E-06 + 0.30650E+01 0.32221E+01 0.00000E+00 0.00000E+00 4 1.05357E-05 8.86891E+01 2.41035E-07 1.05330E-05 + 0.30650E+01 0.32221E+01 0.00000E+00 0.00000E+00 6 1.90556E-04 -6.89630E+01 6.84043E-05 -1.77856E-04 + 0.29920E+01 0.32221E+01 0.00000E+00 0.00000E+00 1 5.99572E+00 -1.61570E+02 -5.68819E+00 -1.89557E+00 + 0.29920E+01 0.32221E+01 0.00000E+00 0.00000E+00 3 5.30700E+00 -1.44258E+01 5.13968E+00 -1.32212E+00 + 0.29920E+01 0.32221E+01 0.00000E+00 0.00000E+00 5 1.32318E+02 7.69687E+01 2.98356E+01 1.28911E+02 + 0.29920E+01 0.32221E+01 0.00000E+00 0.00000E+00 2 2.70198E-07 1.07410E+02 -8.08460E-08 2.57819E-07 + 0.29920E+01 0.32221E+01 0.00000E+00 0.00000E+00 4 5.06073E-06 9.05547E+01 -4.89942E-08 5.06049E-06 + 0.29920E+01 0.32221E+01 0.00000E+00 0.00000E+00 6 5.87868E-04 -2.24599E+00 5.87416E-04 -2.30385E-05 + 0.29224E+01 0.32221E+01 0.00000E+00 0.00000E+00 1 1.16437E+01 1.71192E+02 -1.15064E+01 1.78302E+00 + 0.29224E+01 0.32221E+01 0.00000E+00 0.00000E+00 3 5.78197E+00 -6.02877E+01 2.86581E+00 -5.02179E+00 + 0.29224E+01 0.32221E+01 0.00000E+00 0.00000E+00 5 1.03101E+02 7.46290E+01 2.73289E+01 9.94132E+01 + 0.29224E+01 0.32221E+01 0.00000E+00 0.00000E+00 2 9.01556E-06 1.43507E+02 -7.24784E-06 5.36182E-06 + 0.29224E+01 0.32221E+01 0.00000E+00 0.00000E+00 4 7.93507E-06 4.15345E+01 5.93985E-06 5.26151E-06 + 0.29224E+01 0.32221E+01 0.00000E+00 0.00000E+00 6 1.44228E-04 4.36586E+01 1.04344E-04 9.95692E-05 + 0.28560E+01 0.32221E+01 0.00000E+00 0.00000E+00 1 1.07875E+01 1.59368E+02 -1.00957E+01 3.80108E+00 + 0.28560E+01 0.32221E+01 0.00000E+00 0.00000E+00 3 7.36798E+00 -9.05373E+01 -6.90991E-02 -7.36766E+00 + 0.28560E+01 0.32221E+01 0.00000E+00 0.00000E+00 5 6.45869E+01 3.89650E+01 5.02182E+01 4.06152E+01 + 0.28560E+01 0.32221E+01 0.00000E+00 0.00000E+00 2 2.71026E-06 -3.06925E+01 2.33061E-06 -1.38340E-06 + 0.28560E+01 0.32221E+01 0.00000E+00 0.00000E+00 4 1.31204E-05 1.44053E+02 -1.06218E-05 7.70210E-06 + 0.28560E+01 0.32221E+01 0.00000E+00 0.00000E+00 6 4.28170E-04 -1.37850E+00 4.28046E-04 -1.03005E-05 + 0.27925E+01 0.32221E+01 0.00000E+00 0.00000E+00 1 4.29163E+00 6.07295E+01 2.09832E+00 3.74368E+00 + 0.27925E+01 0.32221E+01 0.00000E+00 0.00000E+00 3 8.08047E+00 -9.72004E+01 -1.01281E+00 -8.01674E+00 + 0.27925E+01 0.32221E+01 0.00000E+00 0.00000E+00 5 5.66686E+01 9.67621E+00 5.58623E+01 9.52486E+00 + 0.27925E+01 0.32221E+01 0.00000E+00 0.00000E+00 2 5.78653E-06 -8.97933E+00 5.71562E-06 -9.03150E-07 + 0.27925E+01 0.32221E+01 0.00000E+00 0.00000E+00 4 3.70427E-06 1.75725E+02 -3.69397E-06 2.76101E-07 + 0.27925E+01 0.32221E+01 0.00000E+00 0.00000E+00 6 7.02881E-04 -1.00971E+01 6.91995E-04 -1.23227E-04 + 0.27318E+01 0.32221E+01 0.00000E+00 0.00000E+00 1 1.39391E+01 1.78181E+01 1.32705E+01 4.26530E+00 + 0.27318E+01 0.32221E+01 0.00000E+00 0.00000E+00 3 5.91850E+00 -1.11980E+02 -2.21521E+00 -5.48831E+00 + 0.27318E+01 0.32221E+01 0.00000E+00 0.00000E+00 5 4.64500E+01 5.67854E+00 4.62221E+01 4.59609E+00 + 0.27318E+01 0.32221E+01 0.00000E+00 0.00000E+00 2 2.05393E-06 -1.18655E+02 -9.84930E-07 -1.80237E-06 + 0.27318E+01 0.32221E+01 0.00000E+00 0.00000E+00 4 4.96297E-06 -4.80368E+01 3.31850E-06 -3.69034E-06 + 0.27318E+01 0.32221E+01 0.00000E+00 0.00000E+00 6 4.51200E-04 -9.30355E+01 -2.38931E-05 -4.50567E-04 + 0.26737E+01 0.32221E+01 0.00000E+00 0.00000E+00 1 1.52556E+01 1.04143E+01 1.50043E+01 2.75769E+00 + 0.26737E+01 0.32221E+01 0.00000E+00 0.00000E+00 3 3.52321E+00 -1.54476E+02 -3.17936E+00 -1.51811E+00 + 0.26737E+01 0.32221E+01 0.00000E+00 0.00000E+00 5 2.10269E+01 6.21645E+01 9.81818E+00 1.85939E+01 + 0.26737E+01 0.32221E+01 0.00000E+00 0.00000E+00 2 1.15831E-06 5.16612E+00 1.15360E-06 1.04298E-07 + 0.26737E+01 0.32221E+01 0.00000E+00 0.00000E+00 4 3.34887E-06 2.77282E+00 3.34495E-06 1.62005E-07 + 0.26737E+01 0.32221E+01 0.00000E+00 0.00000E+00 6 9.29740E-05 -4.95518E+01 6.03178E-05 -7.07525E-05 + 0.26180E+01 0.32221E+01 0.00000E+00 0.00000E+00 1 9.18995E+00 -6.01182E+01 4.57854E+00 -7.96819E+00 + 0.26180E+01 0.32221E+01 0.00000E+00 0.00000E+00 3 4.46430E+00 1.70099E+02 -4.39781E+00 7.67603E-01 + 0.26180E+01 0.32221E+01 0.00000E+00 0.00000E+00 5 6.05988E+01 8.37716E+01 6.57447E+00 6.02411E+01 + 0.26180E+01 0.32221E+01 0.00000E+00 0.00000E+00 2 2.29814E-06 -2.67470E+01 2.05224E-06 -1.03428E-06 + 0.26180E+01 0.32221E+01 0.00000E+00 0.00000E+00 4 7.18406E-07 -1.32066E+02 -4.81319E-07 -5.33329E-07 + 0.26180E+01 0.32221E+01 0.00000E+00 0.00000E+00 6 5.07451E-04 -9.44696E+01 -3.95453E-05 -5.05908E-04 + 0.25646E+01 0.32221E+01 0.00000E+00 0.00000E+00 1 2.40122E+01 -1.01034E+02 -4.59562E+00 -2.35683E+01 + 0.25646E+01 0.32221E+01 0.00000E+00 0.00000E+00 3 3.58467E+00 1.59904E+02 -3.36643E+00 1.23167E+00 + 0.25646E+01 0.32221E+01 0.00000E+00 0.00000E+00 5 9.25832E+01 8.55923E+01 7.11526E+00 9.23094E+01 + 0.25646E+01 0.32221E+01 0.00000E+00 0.00000E+00 2 3.66825E-06 5.37326E+01 2.16997E-06 2.95758E-06 + 0.25646E+01 0.32221E+01 0.00000E+00 0.00000E+00 4 4.53639E-06 -1.59267E+02 -4.24261E-06 -1.60595E-06 + 0.25646E+01 0.32221E+01 0.00000E+00 0.00000E+00 6 2.15821E-04 1.63001E+02 -2.06391E-04 6.30978E-05 + 0.25133E+01 0.32221E+01 0.00000E+00 0.00000E+00 1 2.53602E+01 -1.05919E+02 -6.95563E+00 -2.43877E+01 + 0.25133E+01 0.32221E+01 0.00000E+00 0.00000E+00 3 8.99981E-01 -1.36082E+02 -6.48287E-01 -6.24250E-01 + 0.25133E+01 0.32221E+01 0.00000E+00 0.00000E+00 5 7.02861E+01 5.82691E+01 3.69656E+01 5.97803E+01 + 0.25133E+01 0.32221E+01 0.00000E+00 0.00000E+00 2 7.99925E-07 -1.59144E+02 -7.47514E-07 -2.84786E-07 + 0.25133E+01 0.32221E+01 0.00000E+00 0.00000E+00 4 6.99294E-06 -1.22808E+02 -3.78899E-06 -5.87748E-06 + 0.25133E+01 0.32221E+01 0.00000E+00 0.00000E+00 6 1.06806E-04 8.49532E+01 9.39563E-06 1.06392E-04 + 0.24640E+01 0.32221E+01 0.00000E+00 0.00000E+00 1 1.40421E+01 -1.19324E+02 -6.87706E+00 -1.22429E+01 + 0.24640E+01 0.32221E+01 0.00000E+00 0.00000E+00 3 1.55138E+00 -2.64235E+01 1.38930E+00 -6.90367E-01 + 0.24640E+01 0.32221E+01 0.00000E+00 0.00000E+00 5 6.61810E+01 2.97083E+01 5.74821E+01 3.27983E+01 + 0.24640E+01 0.32221E+01 0.00000E+00 0.00000E+00 2 9.97848E-07 -8.64413E+01 6.19375E-08 -9.95924E-07 + 0.24640E+01 0.32221E+01 0.00000E+00 0.00000E+00 4 5.09857E-06 -8.40541E+01 5.28157E-07 -5.07114E-06 + 0.24640E+01 0.32221E+01 0.00000E+00 0.00000E+00 6 1.48459E-04 -1.72541E+02 -1.47203E-04 -1.92712E-05 + 0.24166E+01 0.32221E+01 0.00000E+00 0.00000E+00 1 1.63234E+01 1.63480E+02 -1.56496E+01 4.64144E+00 + 0.24166E+01 0.32221E+01 0.00000E+00 0.00000E+00 3 1.77044E+00 -1.72515E+01 1.69080E+00 -5.25056E-01 + 0.24166E+01 0.32221E+01 0.00000E+00 0.00000E+00 5 8.94154E+01 3.14578E+01 7.62735E+01 4.66632E+01 + 0.24166E+01 0.32221E+01 0.00000E+00 0.00000E+00 2 1.65948E-06 -2.60303E+00 1.65777E-06 -7.53667E-08 + 0.24166E+01 0.32221E+01 0.00000E+00 0.00000E+00 4 2.95939E-06 -1.58207E+01 2.84729E-06 -8.06812E-07 + 0.24166E+01 0.32221E+01 0.00000E+00 0.00000E+00 6 6.27932E-05 1.48730E+02 -5.36715E-05 3.25938E-05 + 0.23710E+01 0.32221E+01 0.00000E+00 0.00000E+00 1 2.14001E+01 1.64890E+02 -2.06602E+01 5.57858E+00 + 0.23710E+01 0.32221E+01 0.00000E+00 0.00000E+00 3 9.21499E-01 1.17264E+02 -4.22125E-01 8.19128E-01 + 0.23710E+01 0.32221E+01 0.00000E+00 0.00000E+00 5 1.01737E+02 3.91313E+01 7.89179E+01 6.42065E+01 + 0.23710E+01 0.32221E+01 0.00000E+00 0.00000E+00 2 2.56148E-06 -5.22096E+01 1.56961E-06 -2.02423E-06 + 0.23710E+01 0.32221E+01 0.00000E+00 0.00000E+00 4 5.73147E-06 -3.99962E+01 4.39081E-06 -3.68383E-06 + 0.23710E+01 0.32221E+01 0.00000E+00 0.00000E+00 6 1.00830E-05 1.41763E+02 -7.91974E-06 6.24050E-06 + 0.23271E+01 0.32221E+01 0.00000E+00 0.00000E+00 1 8.82415E+00 1.76468E+02 -8.80739E+00 5.43607E-01 + 0.23271E+01 0.32221E+01 0.00000E+00 0.00000E+00 3 1.18779E+00 1.15738E+02 -5.15799E-01 1.06995E+00 + 0.23271E+01 0.32221E+01 0.00000E+00 0.00000E+00 5 4.17719E+01 4.82800E+01 2.77988E+01 3.11788E+01 + 0.23271E+01 0.32221E+01 0.00000E+00 0.00000E+00 2 3.37552E-06 9.38447E+01 -2.26336E-07 3.36793E-06 + 0.23271E+01 0.32221E+01 0.00000E+00 0.00000E+00 4 3.92462E-06 -1.08836E+02 -1.26713E-06 -3.71444E-06 + 0.23271E+01 0.32221E+01 0.00000E+00 0.00000E+00 6 4.50783E-05 1.11946E+02 -1.68475E-05 4.18117E-05 + 0.22848E+01 0.32221E+01 0.00000E+00 0.00000E+00 1 1.09510E+01 1.37279E+01 1.06382E+01 2.59880E+00 + 0.22848E+01 0.32221E+01 0.00000E+00 0.00000E+00 3 5.38637E-01 -1.57222E+02 -4.96630E-01 -2.08539E-01 + 0.22848E+01 0.32221E+01 0.00000E+00 0.00000E+00 5 9.04731E+01 -1.05859E+02 -2.47236E+01 -8.70295E+01 + 0.22848E+01 0.32221E+01 0.00000E+00 0.00000E+00 2 3.31225E-06 6.31044E+01 1.49835E-06 2.95397E-06 + 0.22848E+01 0.32221E+01 0.00000E+00 0.00000E+00 4 2.98878E-06 -2.41118E+01 2.72801E-06 -1.22097E-06 + 0.22848E+01 0.32221E+01 0.00000E+00 0.00000E+00 6 2.58852E-04 9.35700E+01 -1.61182E-05 2.58350E-04 + 0.22440E+01 0.32221E+01 0.00000E+00 0.00000E+00 1 1.17257E+01 3.08957E+01 1.00618E+01 6.02085E+00 + 0.22440E+01 0.32221E+01 0.00000E+00 0.00000E+00 3 7.03421E-01 -1.44387E+02 -5.71863E-01 -4.09603E-01 + 0.22440E+01 0.32221E+01 0.00000E+00 0.00000E+00 5 9.34239E+01 -8.33427E+01 1.08307E+01 -9.27939E+01 + 0.22440E+01 0.32221E+01 0.00000E+00 0.00000E+00 2 1.00026E-06 -9.05892E+01 -1.02864E-08 -1.00020E-06 + 0.22440E+01 0.32221E+01 0.00000E+00 0.00000E+00 4 2.61028E-07 1.30421E+02 -1.69252E-07 1.98720E-07 + 0.22440E+01 0.32221E+01 0.00000E+00 0.00000E+00 6 2.08845E-05 1.29341E+02 -1.32393E-05 1.61518E-05 + 0.22046E+01 0.32221E+01 0.00000E+00 0.00000E+00 1 6.03086E+00 -2.70883E+01 5.36931E+00 -2.74623E+00 + 0.22046E+01 0.32221E+01 0.00000E+00 0.00000E+00 3 9.19405E-01 -1.42945E+02 -7.33737E-01 -5.54017E-01 + 0.22046E+01 0.32221E+01 0.00000E+00 0.00000E+00 5 1.77970E+01 1.74796E+01 1.69752E+01 5.34564E+00 + 0.22046E+01 0.32221E+01 0.00000E+00 0.00000E+00 2 2.84097E-06 1.18490E+02 -1.35515E-06 2.49693E-06 + 0.22046E+01 0.32221E+01 0.00000E+00 0.00000E+00 4 2.64383E-06 7.95742E+01 4.78432E-07 2.60018E-06 + 0.22046E+01 0.32221E+01 0.00000E+00 0.00000E+00 6 2.92056E-05 1.13689E+01 2.86326E-05 5.75717E-06 + 0.21666E+01 0.32221E+01 0.00000E+00 0.00000E+00 1 1.70704E+01 -8.10622E+01 2.65209E+00 -1.68632E+01 + 0.21666E+01 0.32221E+01 0.00000E+00 0.00000E+00 3 1.30050E+00 1.30671E+02 -8.47548E-01 9.86391E-01 + 0.21666E+01 0.32221E+01 0.00000E+00 0.00000E+00 5 7.60497E+01 9.73927E+01 -9.78525E+00 7.54175E+01 + 0.21666E+01 0.32221E+01 0.00000E+00 0.00000E+00 2 7.37410E-07 -1.09562E+02 -2.46904E-07 -6.94847E-07 + 0.21666E+01 0.32221E+01 0.00000E+00 0.00000E+00 4 3.49392E-06 -1.77999E+02 -3.49179E-06 -1.22010E-07 + 0.21666E+01 0.32221E+01 0.00000E+00 0.00000E+00 6 1.70396E-04 8.96988E+00 1.68312E-04 2.65674E-05 + 0.21299E+01 0.32221E+01 0.00000E+00 0.00000E+00 1 1.74880E+01 -7.49059E+01 4.55397E+00 -1.68847E+01 + 0.21299E+01 0.32221E+01 0.00000E+00 0.00000E+00 3 1.97778E+00 -7.07827E+01 6.50990E-01 -1.86757E+00 + 0.21299E+01 0.32221E+01 0.00000E+00 0.00000E+00 5 5.67913E+01 1.21039E+02 -2.92832E+01 4.86595E+01 + 0.21299E+01 0.32221E+01 0.00000E+00 0.00000E+00 2 8.53820E-07 -2.57543E+01 7.69007E-07 -3.70996E-07 + 0.21299E+01 0.32221E+01 0.00000E+00 0.00000E+00 4 1.34685E-06 1.77357E+02 -1.34542E-06 6.21067E-08 + 0.21299E+01 0.32221E+01 0.00000E+00 0.00000E+00 6 9.39638E-05 1.05687E+02 -2.54065E-05 9.04638E-05 + 0.20944E+01 0.32221E+01 0.00000E+00 0.00000E+00 1 8.92948E+00 -1.22442E+02 -4.79022E+00 -7.53588E+00 + 0.20944E+01 0.32221E+01 0.00000E+00 0.00000E+00 3 2.39755E+00 -9.18690E+01 -7.81947E-02 -2.39628E+00 + 0.20944E+01 0.32221E+01 0.00000E+00 0.00000E+00 5 2.14737E+01 -1.72418E+01 2.05087E+01 -6.36489E+00 + 0.20944E+01 0.32221E+01 0.00000E+00 0.00000E+00 2 7.23683E-07 -1.20623E+02 -3.68629E-07 -6.22760E-07 + 0.20944E+01 0.32221E+01 0.00000E+00 0.00000E+00 4 2.97366E-06 -1.14090E+02 -1.21376E-06 -2.71467E-06 + 0.20944E+01 0.32221E+01 0.00000E+00 0.00000E+00 6 2.79167E-04 -9.17359E+01 -8.45651E-06 -2.79039E-04 + 0.31416E+01 0.31416E+01 0.00000E+00 0.00000E+00 1 1.58103E+00 0.00000E+00 1.58103E+00 0.00000E+00 + 0.31416E+01 0.31416E+01 0.00000E+00 0.00000E+00 3 1.76372E-02 0.00000E+00 1.76372E-02 0.00000E+00 + 0.31416E+01 0.31416E+01 0.00000E+00 0.00000E+00 5 2.19079E+01 0.00000E+00 2.19079E+01 0.00000E+00 + 0.31416E+01 0.31416E+01 0.00000E+00 0.00000E+00 2 3.38728E-06 1.80000E+02 -3.38728E-06 0.00000E+00 + 0.31416E+01 0.31416E+01 0.00000E+00 0.00000E+00 4 1.01490E-06 1.80000E+02 -1.01490E-06 0.00000E+00 + 0.31416E+01 0.31416E+01 0.00000E+00 0.00000E+00 6 1.08573E-04 0.00000E+00 1.08573E-04 0.00000E+00 + 0.30650E+01 0.31416E+01 0.00000E+00 0.00000E+00 1 1.79877E+00 -5.30353E+01 1.08164E+00 -1.43723E+00 + 0.30650E+01 0.31416E+01 0.00000E+00 0.00000E+00 3 1.29269E+00 -1.01067E+01 1.27263E+00 -2.26843E-01 + 0.30650E+01 0.31416E+01 0.00000E+00 0.00000E+00 5 3.15740E+01 3.95041E+01 2.43618E+01 2.00853E+01 + 0.30650E+01 0.31416E+01 0.00000E+00 0.00000E+00 2 1.24966E-05 9.68362E+01 -1.48749E-06 1.24078E-05 + 0.30650E+01 0.31416E+01 0.00000E+00 0.00000E+00 4 1.13157E-05 3.03390E+01 9.76602E-06 5.71572E-06 + 0.30650E+01 0.31416E+01 0.00000E+00 0.00000E+00 6 3.29694E-05 -7.72999E+01 7.24828E-06 -3.21627E-05 + 0.29920E+01 0.31416E+01 0.00000E+00 0.00000E+00 1 3.80793E+00 -1.21004E+02 -1.96143E+00 -3.26391E+00 + 0.29920E+01 0.31416E+01 0.00000E+00 0.00000E+00 3 4.02645E+00 -8.99489E+00 3.97693E+00 -6.29521E-01 + 0.29920E+01 0.31416E+01 0.00000E+00 0.00000E+00 5 9.14481E+01 7.17247E+01 2.86765E+01 8.68356E+01 + 0.29920E+01 0.31416E+01 0.00000E+00 0.00000E+00 2 1.08541E-05 8.51068E+01 9.25838E-07 1.08146E-05 + 0.29920E+01 0.31416E+01 0.00000E+00 0.00000E+00 4 6.08053E-06 -8.99832E+01 1.78134E-09 -6.08052E-06 + 0.29920E+01 0.31416E+01 0.00000E+00 0.00000E+00 6 5.25645E-05 -1.45268E+02 -4.31987E-05 -2.99483E-05 + 0.29224E+01 0.31416E+01 0.00000E+00 0.00000E+00 1 8.17371E+00 -1.79744E+02 -8.17363E+00 -3.65671E-02 + 0.29224E+01 0.31416E+01 0.00000E+00 0.00000E+00 3 4.46138E+00 -1.64375E+01 4.27904E+00 -1.26244E+00 + 0.29224E+01 0.31416E+01 0.00000E+00 0.00000E+00 5 1.37133E+02 7.97110E+01 2.44940E+01 1.34928E+02 + 0.29224E+01 0.31416E+01 0.00000E+00 0.00000E+00 2 4.22608E-06 8.65935E+01 2.51110E-07 4.21862E-06 + 0.29224E+01 0.31416E+01 0.00000E+00 0.00000E+00 4 5.71515E-06 8.02188E+01 9.70923E-07 5.63208E-06 + 0.29224E+01 0.31416E+01 0.00000E+00 0.00000E+00 6 7.39210E-04 -8.30003E+00 7.31467E-04 -1.06710E-04 + 0.28560E+01 0.31416E+01 0.00000E+00 0.00000E+00 1 1.29692E+01 1.58849E+02 -1.20955E+01 4.67968E+00 + 0.28560E+01 0.31416E+01 0.00000E+00 0.00000E+00 3 5.49147E+00 -7.02954E+01 1.85156E+00 -5.16991E+00 + 0.28560E+01 0.31416E+01 0.00000E+00 0.00000E+00 5 1.00454E+02 6.65339E+01 4.00016E+01 9.21465E+01 + 0.28560E+01 0.31416E+01 0.00000E+00 0.00000E+00 2 4.64069E-06 -3.54293E+01 3.78138E-06 -2.69020E-06 + 0.28560E+01 0.31416E+01 0.00000E+00 0.00000E+00 4 7.51481E-06 6.40552E+01 3.28777E-06 6.75744E-06 + 0.28560E+01 0.31416E+01 0.00000E+00 0.00000E+00 6 1.31061E-04 6.50035E+00 1.30218E-04 1.48373E-05 + 0.27925E+01 0.31416E+01 0.00000E+00 0.00000E+00 1 9.36792E+00 1.42607E+02 -7.44270E+00 5.68895E+00 + 0.27925E+01 0.31416E+01 0.00000E+00 0.00000E+00 3 7.62471E+00 -1.00274E+02 -1.35987E+00 -7.50246E+00 + 0.27925E+01 0.31416E+01 0.00000E+00 0.00000E+00 5 5.49913E+01 1.18017E+01 5.38288E+01 1.12471E+01 + 0.27925E+01 0.31416E+01 0.00000E+00 0.00000E+00 2 5.89978E-06 -1.13749E+02 -2.37597E-06 -5.40020E-06 + 0.27925E+01 0.31416E+01 0.00000E+00 0.00000E+00 4 1.28122E-05 1.12365E+02 -4.87512E-06 1.18485E-05 + 0.27925E+01 0.31416E+01 0.00000E+00 0.00000E+00 6 6.73883E-05 8.52743E+01 5.55178E-06 6.71592E-05 + 0.27318E+01 0.31416E+01 0.00000E+00 0.00000E+00 1 7.25288E+00 3.84256E+01 5.68202E+00 4.50765E+00 + 0.27318E+01 0.31416E+01 0.00000E+00 0.00000E+00 3 7.37681E+00 -1.08502E+02 -2.34095E+00 -6.99552E+00 + 0.27318E+01 0.31416E+01 0.00000E+00 0.00000E+00 5 5.91100E+01 -1.56966E+01 5.69056E+01 -1.59918E+01 + 0.27318E+01 0.31416E+01 0.00000E+00 0.00000E+00 2 1.14470E-06 -3.52935E+00 1.14253E-06 -7.04675E-08 + 0.27318E+01 0.31416E+01 0.00000E+00 0.00000E+00 4 3.84368E-06 1.61384E+02 -3.64258E-06 1.22697E-06 + 0.27318E+01 0.31416E+01 0.00000E+00 0.00000E+00 6 1.95776E-04 -7.40347E+01 5.38493E-05 -1.88225E-04 + 0.26737E+01 0.31416E+01 0.00000E+00 0.00000E+00 1 1.83639E+01 8.15725E+00 1.81781E+01 2.60566E+00 + 0.26737E+01 0.31416E+01 0.00000E+00 0.00000E+00 3 4.27707E+00 -1.23714E+02 -2.37395E+00 -3.55776E+00 + 0.26737E+01 0.31416E+01 0.00000E+00 0.00000E+00 5 3.46238E+01 -2.80243E+01 3.05641E+01 -1.62678E+01 + 0.26737E+01 0.31416E+01 0.00000E+00 0.00000E+00 2 5.92158E-06 5.20959E+01 3.63788E-06 4.67237E-06 + 0.26737E+01 0.31416E+01 0.00000E+00 0.00000E+00 4 6.99575E-06 -9.82339E+01 -1.00189E-06 -6.92363E-06 + 0.26737E+01 0.31416E+01 0.00000E+00 0.00000E+00 6 4.71459E-04 -9.67948E+01 -5.57805E-05 -4.68148E-04 + 0.26180E+01 0.31416E+01 0.00000E+00 0.00000E+00 1 1.59281E+01 4.35413E+00 1.58821E+01 1.20928E+00 + 0.26180E+01 0.31416E+01 0.00000E+00 0.00000E+00 3 3.04640E+00 -1.79290E+02 -3.04616E+00 -3.77240E-02 + 0.26180E+01 0.31416E+01 0.00000E+00 0.00000E+00 5 9.46486E+00 1.71674E+02 -9.36511E+00 1.37051E+00 + 0.26180E+01 0.31416E+01 0.00000E+00 0.00000E+00 2 4.56980E-06 6.48379E+00 4.54057E-06 5.16031E-07 + 0.26180E+01 0.31416E+01 0.00000E+00 0.00000E+00 4 3.43454E-06 -1.79607E+02 -3.43446E-06 -2.35319E-08 + 0.26180E+01 0.31416E+01 0.00000E+00 0.00000E+00 6 1.02748E-04 -1.48110E+02 -8.72396E-05 -5.42800E-05 + 0.25646E+01 0.31416E+01 0.00000E+00 0.00000E+00 1 1.32867E+01 -6.25514E+01 6.12454E+00 -1.17909E+01 + 0.25646E+01 0.31416E+01 0.00000E+00 0.00000E+00 3 3.75115E+00 1.54057E+02 -3.37313E+00 1.64106E+00 + 0.25646E+01 0.31416E+01 0.00000E+00 0.00000E+00 5 6.78785E+01 1.18300E+02 -3.21802E+01 5.97655E+01 + 0.25646E+01 0.31416E+01 0.00000E+00 0.00000E+00 2 5.23708E-06 1.43924E+01 5.07272E-06 1.30173E-06 + 0.25646E+01 0.31416E+01 0.00000E+00 0.00000E+00 4 3.45185E-06 -1.30032E+02 -2.22031E-06 -2.64302E-06 + 0.25646E+01 0.31416E+01 0.00000E+00 0.00000E+00 6 2.05606E-04 -1.58547E+02 -1.91361E-04 -7.51993E-05 + 0.25133E+01 0.31416E+01 0.00000E+00 0.00000E+00 1 2.74333E+01 -1.01852E+02 -5.63424E+00 -2.68485E+01 + 0.25133E+01 0.31416E+01 0.00000E+00 0.00000E+00 3 2.53625E+00 1.53185E+02 -2.26352E+00 1.14413E+00 + 0.25133E+01 0.31416E+01 0.00000E+00 0.00000E+00 5 9.55203E+01 9.23872E+01 -3.97862E+00 9.54374E+01 + 0.25133E+01 0.31416E+01 0.00000E+00 0.00000E+00 2 5.40033E-07 7.12165E+00 5.35867E-07 6.69514E-08 + 0.25133E+01 0.31416E+01 0.00000E+00 0.00000E+00 4 1.31520E-06 -1.73655E+02 -1.30714E-06 -1.45353E-07 + 0.25133E+01 0.31416E+01 0.00000E+00 0.00000E+00 6 1.86442E-04 -9.97691E+01 -3.16352E-05 -1.83739E-04 + 0.24640E+01 0.31416E+01 0.00000E+00 0.00000E+00 1 2.65817E+01 -9.91894E+01 -4.24504E+00 -2.62405E+01 + 0.24640E+01 0.31416E+01 0.00000E+00 0.00000E+00 3 3.41429E-01 -3.79584E+01 2.69202E-01 -2.10009E-01 + 0.24640E+01 0.31416E+01 0.00000E+00 0.00000E+00 5 7.53478E+01 8.06728E+01 1.22118E+01 7.43516E+01 + 0.24640E+01 0.31416E+01 0.00000E+00 0.00000E+00 2 2.93799E-06 -7.23755E+01 8.89555E-07 -2.80009E-06 + 0.24640E+01 0.31416E+01 0.00000E+00 0.00000E+00 4 1.67552E-06 -1.07074E+02 -4.91932E-07 -1.60168E-06 + 0.24640E+01 0.31416E+01 0.00000E+00 0.00000E+00 6 6.65284E-05 1.40035E+02 -5.09898E-05 4.27324E-05 + 0.24166E+01 0.31416E+01 0.00000E+00 0.00000E+00 1 1.30540E+01 -1.34057E+02 -9.07745E+00 -9.38114E+00 + 0.24166E+01 0.31416E+01 0.00000E+00 0.00000E+00 3 2.46610E+00 -2.80311E+01 2.17681E+00 -1.15894E+00 + 0.24166E+01 0.31416E+01 0.00000E+00 0.00000E+00 5 5.69636E+01 3.54445E+01 4.64070E+01 3.30340E+01 + 0.24166E+01 0.31416E+01 0.00000E+00 0.00000E+00 2 1.50157E-06 2.47443E+01 1.36370E-06 6.28509E-07 + 0.24166E+01 0.31416E+01 0.00000E+00 0.00000E+00 4 4.28603E-06 -5.43498E+00 4.26676E-06 -4.05956E-07 + 0.24166E+01 0.31416E+01 0.00000E+00 0.00000E+00 6 1.18596E-04 -1.77898E+02 -1.18517E-04 -4.34935E-06 + 0.23710E+01 0.31416E+01 0.00000E+00 0.00000E+00 1 2.06105E+01 1.59464E+02 -1.93007E+01 7.23010E+00 + 0.23710E+01 0.31416E+01 0.00000E+00 0.00000E+00 3 1.33614E+00 -3.01040E+01 1.15592E+00 -6.70170E-01 + 0.23710E+01 0.31416E+01 0.00000E+00 0.00000E+00 5 7.19964E+01 3.08864E+01 6.17864E+01 3.69584E+01 + 0.23710E+01 0.31416E+01 0.00000E+00 0.00000E+00 2 2.51853E-06 -8.73930E+01 1.14556E-07 -2.51592E-06 + 0.23710E+01 0.31416E+01 0.00000E+00 0.00000E+00 4 7.75308E-06 -9.24477E+01 -3.31120E-07 -7.74601E-06 + 0.23710E+01 0.31416E+01 0.00000E+00 0.00000E+00 6 2.89795E-04 1.79667E+02 -2.89790E-04 1.68599E-06 + 0.23271E+01 0.31416E+01 0.00000E+00 0.00000E+00 1 1.93909E+01 1.67678E+02 -1.89442E+01 4.13804E+00 + 0.23271E+01 0.31416E+01 0.00000E+00 0.00000E+00 3 1.02691E+00 1.29162E+02 -6.48504E-01 7.96227E-01 + 0.23271E+01 0.31416E+01 0.00000E+00 0.00000E+00 5 8.27344E+01 6.39107E+01 3.63843E+01 7.43045E+01 + 0.23271E+01 0.31416E+01 0.00000E+00 0.00000E+00 2 5.26636E-07 -5.32558E+01 3.15056E-07 -4.22001E-07 + 0.23271E+01 0.31416E+01 0.00000E+00 0.00000E+00 4 2.33265E-06 -1.77165E+02 -2.32980E-06 -1.15354E-07 + 0.23271E+01 0.31416E+01 0.00000E+00 0.00000E+00 6 5.94593E-05 -8.67924E+01 3.32704E-06 -5.93661E-05 + 0.22848E+01 0.31416E+01 0.00000E+00 0.00000E+00 1 3.60084E+00 1.09834E+02 -1.22178E+00 3.38723E+00 + 0.22848E+01 0.31416E+01 0.00000E+00 0.00000E+00 3 1.19411E+00 1.39425E+02 -9.06998E-01 7.76695E-01 + 0.22848E+01 0.31416E+01 0.00000E+00 0.00000E+00 5 8.37402E+00 4.75539E+01 5.65160E+00 6.17929E+00 + 0.22848E+01 0.31416E+01 0.00000E+00 0.00000E+00 2 2.19916E-06 -1.73358E+02 -2.18440E-06 -2.54368E-07 + 0.22848E+01 0.31416E+01 0.00000E+00 0.00000E+00 4 4.71871E-06 8.75130E+01 2.04760E-07 4.71427E-06 + 0.22848E+01 0.31416E+01 0.00000E+00 0.00000E+00 6 9.63651E-05 -1.33459E+02 -6.62830E-05 -6.99485E-05 + 0.22440E+01 0.31416E+01 0.00000E+00 0.00000E+00 1 1.79167E+01 1.67906E+01 1.71528E+01 5.17566E+00 + 0.22440E+01 0.31416E+01 0.00000E+00 0.00000E+00 3 9.17823E-01 -1.55050E+02 -8.32168E-01 -3.87162E-01 + 0.22440E+01 0.31416E+01 0.00000E+00 0.00000E+00 5 8.13527E+01 -9.47317E+01 -6.71072E+00 -8.10754E+01 + 0.22440E+01 0.31416E+01 0.00000E+00 0.00000E+00 2 1.04896E-06 3.58003E+01 8.50768E-07 6.13600E-07 + 0.22440E+01 0.31416E+01 0.00000E+00 0.00000E+00 4 3.05093E-06 -8.36322E+01 3.38379E-07 -3.03210E-06 + 0.22440E+01 0.31416E+01 0.00000E+00 0.00000E+00 6 6.66518E-05 1.33327E+02 -4.57335E-05 4.84861E-05 + 0.22046E+01 0.31416E+01 0.00000E+00 0.00000E+00 1 1.60538E+01 2.33084E+01 1.47436E+01 6.35218E+00 + 0.22046E+01 0.31416E+01 0.00000E+00 0.00000E+00 3 5.64136E-01 -7.04714E+01 1.88578E-01 -5.31684E-01 + 0.22046E+01 0.31416E+01 0.00000E+00 0.00000E+00 5 6.84836E+01 -8.15034E+01 1.01185E+01 -6.77319E+01 + 0.22046E+01 0.31416E+01 0.00000E+00 0.00000E+00 2 1.51508E-06 -9.27331E+01 -7.22441E-08 -1.51336E-06 + 0.22046E+01 0.31416E+01 0.00000E+00 0.00000E+00 4 4.72556E-06 -7.23113E+01 1.43584E-06 -4.50214E-06 + 0.22046E+01 0.31416E+01 0.00000E+00 0.00000E+00 6 1.12507E-04 1.59093E+02 -1.05100E-04 4.01476E-05 + 0.21666E+01 0.31416E+01 0.00000E+00 0.00000E+00 1 1.21408E+01 -5.96264E+01 6.13880E+00 -1.04744E+01 + 0.21666E+01 0.31416E+01 0.00000E+00 0.00000E+00 3 9.05807E-01 -1.51226E+02 -7.93965E-01 -4.36012E-01 + 0.21666E+01 0.31416E+01 0.00000E+00 0.00000E+00 5 4.79139E+01 9.30007E+01 -2.50820E+00 4.78482E+01 + 0.21666E+01 0.31416E+01 0.00000E+00 0.00000E+00 2 9.83295E-07 -1.76485E+02 -9.81445E-07 -6.02884E-08 + 0.21666E+01 0.31416E+01 0.00000E+00 0.00000E+00 4 3.76238E-06 -1.33469E+02 -2.58837E-06 -2.73053E-06 + 0.21666E+01 0.31416E+01 0.00000E+00 0.00000E+00 6 9.48272E-05 1.69363E+02 -9.31978E-05 1.75031E-05 + 0.21299E+01 0.31416E+01 0.00000E+00 0.00000E+00 1 2.01951E+01 -7.45596E+01 5.37664E+00 -1.94662E+01 + 0.21299E+01 0.31416E+01 0.00000E+00 0.00000E+00 3 7.23846E-01 1.15021E+02 -3.06146E-01 6.55918E-01 + 0.21299E+01 0.31416E+01 0.00000E+00 0.00000E+00 5 8.24766E+01 1.09107E+02 -2.69979E+01 7.79327E+01 + 0.21299E+01 0.31416E+01 0.00000E+00 0.00000E+00 2 5.11521E-07 1.58672E+02 -4.76488E-07 1.86046E-07 + 0.21299E+01 0.31416E+01 0.00000E+00 0.00000E+00 4 1.99540E-06 -1.32474E+02 -1.34741E-06 -1.47177E-06 + 0.21299E+01 0.31416E+01 0.00000E+00 0.00000E+00 6 2.43957E-04 2.96022E+01 2.12115E-04 1.20509E-04 + 0.20944E+01 0.31416E+01 0.00000E+00 0.00000E+00 1 1.50718E+01 -6.83947E+01 5.54961E+00 -1.40129E+01 + 0.20944E+01 0.31416E+01 0.00000E+00 0.00000E+00 3 1.92523E+00 -5.43157E+01 1.12302E+00 -1.56376E+00 + 0.20944E+01 0.31416E+01 0.00000E+00 0.00000E+00 5 4.86214E+01 1.12197E+02 -1.83690E+01 4.50180E+01 + 0.20944E+01 0.31416E+01 0.00000E+00 0.00000E+00 2 1.29498E-06 1.44378E+01 1.25408E-06 3.22876E-07 + 0.20944E+01 0.31416E+01 0.00000E+00 0.00000E+00 4 1.24815E-06 -6.86166E+01 4.55084E-07 -1.16223E-06 + 0.20944E+01 0.31416E+01 0.00000E+00 0.00000E+00 6 1.80728E-04 8.69925E+01 9.48232E-06 1.80479E-04 + 0.30650E+01 0.30650E+01 0.00000E+00 0.00000E+00 1 2.50944E+00 0.00000E+00 2.50944E+00 0.00000E+00 + 0.30650E+01 0.30650E+01 0.00000E+00 0.00000E+00 3 7.95123E-03 0.00000E+00 7.95123E-03 0.00000E+00 + 0.30650E+01 0.30650E+01 0.00000E+00 0.00000E+00 5 1.51398E+01 0.00000E+00 1.51398E+01 0.00000E+00 + 0.30650E+01 0.30650E+01 0.00000E+00 0.00000E+00 2 6.31068E-06 1.80000E+02 -6.31068E-06 0.00000E+00 + 0.30650E+01 0.30650E+01 0.00000E+00 0.00000E+00 4 1.44558E-05 0.00000E+00 1.44558E-05 0.00000E+00 + 0.30650E+01 0.30650E+01 0.00000E+00 0.00000E+00 6 3.12659E-04 1.80000E+02 -3.12659E-04 0.00000E+00 + 0.29920E+01 0.30650E+01 0.00000E+00 0.00000E+00 1 3.09084E+00 -6.09739E+01 1.49970E+00 -2.70263E+00 + 0.29920E+01 0.30650E+01 0.00000E+00 0.00000E+00 3 1.41196E+00 -8.29920E+00 1.39717E+00 -2.03805E-01 + 0.29920E+01 0.30650E+01 0.00000E+00 0.00000E+00 5 2.98566E+01 4.20992E+01 2.21532E+01 2.00164E+01 + 0.29920E+01 0.30650E+01 0.00000E+00 0.00000E+00 2 6.97544E-06 1.69785E+02 -6.86486E-06 1.23710E-06 + 0.29920E+01 0.30650E+01 0.00000E+00 0.00000E+00 4 8.16619E-06 4.72419E+01 5.54406E-06 5.99583E-06 + 0.29920E+01 0.30650E+01 0.00000E+00 0.00000E+00 6 3.54579E-05 1.74217E+02 -3.52774E-05 3.57268E-06 + 0.29224E+01 0.30650E+01 0.00000E+00 0.00000E+00 1 5.63273E+00 -1.19841E+02 -2.80285E+00 -4.88586E+00 + 0.29224E+01 0.30650E+01 0.00000E+00 0.00000E+00 3 4.31124E+00 -8.41458E+00 4.26483E+00 -6.30884E-01 + 0.29224E+01 0.30650E+01 0.00000E+00 0.00000E+00 5 9.74291E+01 7.46742E+01 2.57512E+01 9.39644E+01 + 0.29224E+01 0.30650E+01 0.00000E+00 0.00000E+00 2 2.03001E-06 -8.86616E+01 4.74156E-08 -2.02945E-06 + 0.29224E+01 0.30650E+01 0.00000E+00 0.00000E+00 4 1.00412E-05 1.28487E+02 -6.24907E-06 7.85976E-06 + 0.29224E+01 0.30650E+01 0.00000E+00 0.00000E+00 6 3.14848E-04 -5.69245E+01 1.71826E-04 -2.63828E-04 + 0.28560E+01 0.30650E+01 0.00000E+00 0.00000E+00 1 9.18838E+00 -1.76929E+02 -9.17518E+00 -4.92206E-01 + 0.28560E+01 0.30650E+01 0.00000E+00 0.00000E+00 3 5.02562E+00 -2.30242E+01 4.62528E+00 -1.96561E+00 + 0.28560E+01 0.30650E+01 0.00000E+00 0.00000E+00 5 1.35299E+02 7.99324E+01 2.36517E+01 1.33216E+02 + 0.28560E+01 0.30650E+01 0.00000E+00 0.00000E+00 2 2.96692E-08 1.06729E+02 -8.54001E-09 2.84135E-08 + 0.28560E+01 0.30650E+01 0.00000E+00 0.00000E+00 4 7.60737E-06 9.55469E+01 -7.35337E-07 7.57175E-06 + 0.28560E+01 0.30650E+01 0.00000E+00 0.00000E+00 6 4.54898E-04 -7.07716E+00 4.51432E-04 -5.60461E-05 + 0.27925E+01 0.30650E+01 0.00000E+00 0.00000E+00 1 1.37180E+01 1.59833E+02 -1.28770E+01 4.72938E+00 + 0.27925E+01 0.30650E+01 0.00000E+00 0.00000E+00 3 6.06189E+00 -7.21600E+01 1.85712E+00 -5.77041E+00 + 0.27925E+01 0.30650E+01 0.00000E+00 0.00000E+00 5 9.75147E+01 6.93434E+01 3.43999E+01 9.12456E+01 + 0.27925E+01 0.30650E+01 0.00000E+00 0.00000E+00 2 1.02677E-06 -5.79064E+01 5.45527E-07 -8.69861E-07 + 0.27925E+01 0.30650E+01 0.00000E+00 0.00000E+00 4 1.11337E-06 -1.37518E+02 -8.21107E-07 -7.51920E-07 + 0.27925E+01 0.30650E+01 0.00000E+00 0.00000E+00 6 2.56149E-04 8.78169E+00 2.53146E-04 3.91062E-05 + 0.27318E+01 0.30650E+01 0.00000E+00 0.00000E+00 1 1.03401E+01 1.46198E+02 -8.59231E+00 5.75242E+00 + 0.27318E+01 0.30650E+01 0.00000E+00 0.00000E+00 3 8.61129E+00 -9.74080E+01 -1.11028E+00 -8.53941E+00 + 0.27318E+01 0.30650E+01 0.00000E+00 0.00000E+00 5 6.74153E+01 2.36129E+01 6.17708E+01 2.70036E+01 + 0.27318E+01 0.30650E+01 0.00000E+00 0.00000E+00 2 4.66094E-06 3.52205E+01 3.80770E-06 2.68808E-06 + 0.27318E+01 0.30650E+01 0.00000E+00 0.00000E+00 4 2.04337E-05 1.38803E+01 1.98371E-05 4.90193E-06 + 0.27318E+01 0.30650E+01 0.00000E+00 0.00000E+00 6 3.41051E-04 -2.94919E+01 2.96860E-04 -1.67899E-04 + 0.26737E+01 0.30650E+01 0.00000E+00 0.00000E+00 1 8.79167E+00 3.15101E+01 7.49532E+00 4.59496E+00 + 0.26737E+01 0.30650E+01 0.00000E+00 0.00000E+00 3 7.66236E+00 -1.07517E+02 -2.30628E+00 -7.30704E+00 + 0.26737E+01 0.30650E+01 0.00000E+00 0.00000E+00 5 6.49361E+01 -1.70303E+00 6.49074E+01 -1.92984E+00 + 0.26737E+01 0.30650E+01 0.00000E+00 0.00000E+00 2 8.61478E-07 1.36316E+02 -6.22989E-07 5.95003E-07 + 0.26737E+01 0.30650E+01 0.00000E+00 0.00000E+00 4 9.82996E-06 1.69118E+02 -9.65321E-06 1.85570E-06 + 0.26737E+01 0.30650E+01 0.00000E+00 0.00000E+00 6 1.53887E-04 -9.76694E+01 -2.05375E-05 -1.52511E-04 + 0.26180E+01 0.30650E+01 0.00000E+00 0.00000E+00 1 1.80622E+01 1.59403E+01 1.73676E+01 4.96050E+00 + 0.26180E+01 0.30650E+01 0.00000E+00 0.00000E+00 3 4.68391E+00 -1.28050E+02 -2.88692E+00 -3.68845E+00 + 0.26180E+01 0.30650E+01 0.00000E+00 0.00000E+00 5 4.82801E+01 -1.44493E+01 4.67530E+01 -1.20470E+01 + 0.26180E+01 0.30650E+01 0.00000E+00 0.00000E+00 2 2.37284E-06 -1.72936E+02 -2.35483E-06 -2.91813E-07 + 0.26180E+01 0.30650E+01 0.00000E+00 0.00000E+00 4 3.85329E-06 1.08473E+02 -1.22094E-06 3.65474E-06 + 0.26180E+01 0.30650E+01 0.00000E+00 0.00000E+00 6 3.48806E-04 -1.06708E+02 -1.00277E-04 -3.34081E-04 + 0.25646E+01 0.30650E+01 0.00000E+00 0.00000E+00 1 1.45124E+01 4.68660E+00 1.44639E+01 1.18574E+00 + 0.25646E+01 0.30650E+01 0.00000E+00 0.00000E+00 3 3.75489E+00 -1.79474E+02 -3.75473E+00 -3.44416E-02 + 0.25646E+01 0.30650E+01 0.00000E+00 0.00000E+00 5 9.91892E+00 7.15706E+01 3.13572E+00 9.41022E+00 + 0.25646E+01 0.30650E+01 0.00000E+00 0.00000E+00 2 1.59267E-06 -1.68036E+02 -1.55807E-06 -3.30162E-07 + 0.25646E+01 0.30650E+01 0.00000E+00 0.00000E+00 4 4.10852E-06 -1.12420E+00 4.10773E-06 -8.06081E-08 + 0.25646E+01 0.30650E+01 0.00000E+00 0.00000E+00 6 1.16822E-04 -1.38060E+02 -8.68981E-05 -7.80777E-05 + 0.25133E+01 0.30650E+01 0.00000E+00 0.00000E+00 1 1.41564E+01 -8.23769E+01 1.87794E+00 -1.40313E+01 + 0.25133E+01 0.30650E+01 0.00000E+00 0.00000E+00 3 4.49327E+00 1.56898E+02 -4.13296E+00 1.76299E+00 + 0.25133E+01 0.30650E+01 0.00000E+00 0.00000E+00 5 5.72878E+01 9.51152E+01 -5.10767E+00 5.70597E+01 + 0.25133E+01 0.30650E+01 0.00000E+00 0.00000E+00 2 2.37793E-06 1.05218E+02 -6.24207E-07 2.29454E-06 + 0.25133E+01 0.30650E+01 0.00000E+00 0.00000E+00 4 3.20466E-06 -2.60086E+01 2.88012E-06 -1.40527E-06 + 0.25133E+01 0.30650E+01 0.00000E+00 0.00000E+00 6 3.71750E-04 -8.50622E+01 3.19984E-05 -3.70371E-04 + 0.24640E+01 0.30650E+01 0.00000E+00 0.00000E+00 1 2.71239E+01 -9.89332E+01 -4.21186E+00 -2.67949E+01 + 0.24640E+01 0.30650E+01 0.00000E+00 0.00000E+00 3 2.53996E+00 1.46838E+02 -2.12626E+00 1.38939E+00 + 0.24640E+01 0.30650E+01 0.00000E+00 0.00000E+00 5 7.14741E+01 9.12960E+01 -1.61657E+00 7.14558E+01 + 0.24640E+01 0.30650E+01 0.00000E+00 0.00000E+00 2 5.50395E-07 -7.91471E+01 1.03633E-07 -5.40551E-07 + 0.24640E+01 0.30650E+01 0.00000E+00 0.00000E+00 4 5.19374E-06 -1.00034E+01 5.11479E-06 -9.02192E-07 + 0.24640E+01 0.30650E+01 0.00000E+00 0.00000E+00 6 8.45798E-05 7.43503E+01 2.28158E-05 8.14444E-05 + 0.24166E+01 0.30650E+01 0.00000E+00 0.00000E+00 1 2.35400E+01 -9.92195E+01 -3.77150E+00 -2.32359E+01 + 0.24166E+01 0.30650E+01 0.00000E+00 0.00000E+00 3 1.10056E+00 -1.81575E+01 1.04575E+00 -3.42968E-01 + 0.24166E+01 0.30650E+01 0.00000E+00 0.00000E+00 5 5.59100E+01 7.49761E+01 1.44931E+01 5.39989E+01 + 0.24166E+01 0.30650E+01 0.00000E+00 0.00000E+00 2 2.97017E-06 1.29309E+02 -1.88162E-06 2.29814E-06 + 0.24166E+01 0.30650E+01 0.00000E+00 0.00000E+00 4 1.75195E-06 1.34004E+02 -1.21709E-06 1.26017E-06 + 0.24166E+01 0.30650E+01 0.00000E+00 0.00000E+00 6 1.43326E-05 4.87347E+01 9.45299E-06 1.07733E-05 + 0.23710E+01 0.30650E+01 0.00000E+00 0.00000E+00 1 1.20201E+01 -1.65326E+02 -1.16280E+01 -3.04493E+00 + 0.23710E+01 0.30650E+01 0.00000E+00 0.00000E+00 3 2.65057E+00 -1.95935E+01 2.49709E+00 -8.88854E-01 + 0.23710E+01 0.30650E+01 0.00000E+00 0.00000E+00 5 6.67225E+01 1.48191E+01 6.45032E+01 1.70654E+01 + 0.23710E+01 0.30650E+01 0.00000E+00 0.00000E+00 2 1.80048E-06 1.36471E+02 -1.30540E-06 1.24003E-06 + 0.23710E+01 0.30650E+01 0.00000E+00 0.00000E+00 4 8.75992E-07 1.58631E+02 -8.15770E-07 3.19187E-07 + 0.23710E+01 0.30650E+01 0.00000E+00 0.00000E+00 6 3.08813E-04 -9.73512E+00 3.04366E-04 -5.22183E-05 + 0.23271E+01 0.30650E+01 0.00000E+00 0.00000E+00 1 2.12044E+01 1.64625E+02 -2.04455E+01 5.62196E+00 + 0.23271E+01 0.30650E+01 0.00000E+00 0.00000E+00 3 1.24435E+00 -2.25689E+01 1.14906E+00 -4.77575E-01 + 0.23271E+01 0.30650E+01 0.00000E+00 0.00000E+00 5 7.92437E+01 3.96668E+01 6.09994E+01 5.05829E+01 + 0.23271E+01 0.30650E+01 0.00000E+00 0.00000E+00 2 1.41065E-06 3.02488E+00 1.40869E-06 7.44394E-08 + 0.23271E+01 0.30650E+01 0.00000E+00 0.00000E+00 4 4.83958E-06 -4.92244E+01 3.16072E-06 -3.66489E-06 + 0.23271E+01 0.30650E+01 0.00000E+00 0.00000E+00 6 1.65730E-04 -1.58428E+02 -1.54121E-04 -6.09348E-05 + 0.22848E+01 0.30650E+01 0.00000E+00 0.00000E+00 1 1.76460E+01 1.69383E+02 -1.73440E+01 3.25101E+00 + 0.22848E+01 0.30650E+01 0.00000E+00 0.00000E+00 3 1.42119E+00 1.38516E+02 -1.06467E+00 9.41408E-01 + 0.22848E+01 0.30650E+01 0.00000E+00 0.00000E+00 5 5.66047E+01 5.58541E+01 3.17723E+01 4.68466E+01 + 0.22848E+01 0.30650E+01 0.00000E+00 0.00000E+00 2 2.16764E-06 -1.55594E+02 -1.97394E-06 -8.95665E-07 + 0.22848E+01 0.30650E+01 0.00000E+00 0.00000E+00 4 1.88245E-06 -2.80966E+00 1.88018E-06 -9.22741E-08 + 0.22848E+01 0.30650E+01 0.00000E+00 0.00000E+00 6 4.29749E-05 1.39554E+02 -3.27047E-05 2.78790E-05 + 0.22440E+01 0.30650E+01 0.00000E+00 0.00000E+00 1 4.62705E+00 4.43739E+01 3.30737E+00 3.23586E+00 + 0.22440E+01 0.30650E+01 0.00000E+00 0.00000E+00 3 1.03463E+00 -1.72985E+02 -1.02689E+00 -1.26359E-01 + 0.22440E+01 0.30650E+01 0.00000E+00 0.00000E+00 5 2.96367E+01 -1.05291E+02 -7.81567E+00 -2.85876E+01 + 0.22440E+01 0.30650E+01 0.00000E+00 0.00000E+00 2 2.70994E-06 2.15554E+01 2.52041E-06 9.95631E-07 + 0.22440E+01 0.30650E+01 0.00000E+00 0.00000E+00 4 1.59330E-06 7.40557E+01 4.37684E-07 1.53200E-06 + 0.22440E+01 0.30650E+01 0.00000E+00 0.00000E+00 6 1.30989E-04 -9.49238E+01 -1.12429E-05 -1.30506E-04 + 0.22046E+01 0.30650E+01 0.00000E+00 0.00000E+00 1 2.06804E+01 3.02859E+01 1.78579E+01 1.04294E+01 + 0.22046E+01 0.30650E+01 0.00000E+00 0.00000E+00 3 7.75393E-01 -1.60693E+02 -7.31786E-01 -2.56367E-01 + 0.22046E+01 0.30650E+01 0.00000E+00 0.00000E+00 5 9.77683E+01 -8.93897E+01 1.04145E+00 -9.77628E+01 + 0.22046E+01 0.30650E+01 0.00000E+00 0.00000E+00 2 5.77566E-07 1.10119E+01 5.66932E-07 1.10323E-07 + 0.22046E+01 0.30650E+01 0.00000E+00 0.00000E+00 4 3.66530E-06 7.91517E+01 6.89845E-07 3.59980E-06 + 0.22046E+01 0.30650E+01 0.00000E+00 0.00000E+00 6 5.63491E-05 1.05036E+02 -1.46181E-05 5.44199E-05 + 0.21666E+01 0.30650E+01 0.00000E+00 0.00000E+00 1 1.19820E+01 2.09652E+01 1.11888E+01 4.28717E+00 + 0.21666E+01 0.30650E+01 0.00000E+00 0.00000E+00 3 6.31362E-01 -5.48142E+01 3.63809E-01 -5.16005E-01 + 0.21666E+01 0.30650E+01 0.00000E+00 0.00000E+00 5 4.71165E+01 -7.47822E+01 1.23675E+01 -4.54644E+01 + 0.21666E+01 0.30650E+01 0.00000E+00 0.00000E+00 2 7.03500E-07 6.99763E+01 2.40885E-07 6.60974E-07 + 0.21666E+01 0.30650E+01 0.00000E+00 0.00000E+00 4 2.56260E-06 9.82779E+01 -3.68950E-07 2.53590E-06 + 0.21666E+01 0.30650E+01 0.00000E+00 0.00000E+00 6 1.27213E-04 2.23153E+00 1.27116E-04 4.95337E-06 + 0.21299E+01 0.30650E+01 0.00000E+00 0.00000E+00 1 1.37246E+01 -7.25985E+01 4.10457E+00 -1.30965E+01 + 0.21299E+01 0.30650E+01 0.00000E+00 0.00000E+00 3 1.33064E+00 -1.57098E+02 -1.22575E+00 -5.17818E-01 + 0.21299E+01 0.30650E+01 0.00000E+00 0.00000E+00 5 5.68474E+01 8.95623E+01 4.34268E-01 5.68457E+01 + 0.21299E+01 0.30650E+01 0.00000E+00 0.00000E+00 2 2.46391E-06 -1.74243E+02 -2.45149E-06 -2.47173E-07 + 0.21299E+01 0.30650E+01 0.00000E+00 0.00000E+00 4 3.13717E-06 -1.77054E+02 -3.13303E-06 -1.61227E-07 + 0.21299E+01 0.30650E+01 0.00000E+00 0.00000E+00 6 1.65946E-04 9.74871E+00 1.63550E-04 2.80993E-05 + 0.20944E+01 0.30650E+01 0.00000E+00 0.00000E+00 1 2.03059E+01 -7.02986E+01 6.84551E+00 -1.91172E+01 + 0.20944E+01 0.30650E+01 0.00000E+00 0.00000E+00 3 7.18959E-01 6.39303E+01 3.15957E-01 6.45812E-01 + 0.20944E+01 0.30650E+01 0.00000E+00 0.00000E+00 5 8.23647E+01 1.21496E+02 -4.30302E+01 7.02306E+01 + 0.20944E+01 0.30650E+01 0.00000E+00 0.00000E+00 2 2.27839E-06 -7.10309E+01 7.40609E-07 -2.15466E-06 + 0.20944E+01 0.30650E+01 0.00000E+00 0.00000E+00 4 3.58954E-07 1.11310E+02 -1.30448E-07 3.34412E-07 + 0.20944E+01 0.30650E+01 0.00000E+00 0.00000E+00 6 5.91580E-05 -1.78825E+02 -5.91455E-05 -1.21345E-06 + 0.29920E+01 0.29920E+01 0.00000E+00 0.00000E+00 1 3.20414E+00 0.00000E+00 3.20414E+00 0.00000E+00 + 0.29920E+01 0.29920E+01 0.00000E+00 0.00000E+00 3 5.16735E-03 0.00000E+00 5.16735E-03 0.00000E+00 + 0.29920E+01 0.29920E+01 0.00000E+00 0.00000E+00 5 1.50632E+01 0.00000E+00 1.50632E+01 0.00000E+00 + 0.29920E+01 0.29920E+01 0.00000E+00 0.00000E+00 2 4.41190E-06 1.80000E+02 -4.41190E-06 0.00000E+00 + 0.29920E+01 0.29920E+01 0.00000E+00 0.00000E+00 4 2.44841E-06 1.80000E+02 -2.44841E-06 0.00000E+00 + 0.29920E+01 0.29920E+01 0.00000E+00 0.00000E+00 6 3.27479E-04 1.80000E+02 -3.27479E-04 0.00000E+00 + 0.29224E+01 0.29920E+01 0.00000E+00 0.00000E+00 1 3.63782E+00 -6.64775E+01 1.45189E+00 -3.33553E+00 + 0.29224E+01 0.29920E+01 0.00000E+00 0.00000E+00 3 1.45780E+00 -8.71388E+00 1.44097E+00 -2.20856E-01 + 0.29224E+01 0.29920E+01 0.00000E+00 0.00000E+00 5 3.11243E+01 4.70156E+01 2.12205E+01 2.27686E+01 + 0.29224E+01 0.29920E+01 0.00000E+00 0.00000E+00 2 1.12588E-05 1.15963E+02 -4.92902E-06 1.01225E-05 + 0.29224E+01 0.29920E+01 0.00000E+00 0.00000E+00 4 8.32998E-06 8.73037E+01 3.91864E-07 8.32076E-06 + 0.29224E+01 0.29920E+01 0.00000E+00 0.00000E+00 6 2.20172E-04 -9.22268E+01 -8.55479E-06 -2.20006E-04 + 0.28560E+01 0.29920E+01 0.00000E+00 0.00000E+00 1 4.86436E+00 -1.28038E+02 -2.99733E+00 -3.83120E+00 + 0.28560E+01 0.29920E+01 0.00000E+00 0.00000E+00 3 4.35641E+00 -6.53510E+00 4.32810E+00 -4.95811E-01 + 0.28560E+01 0.29920E+01 0.00000E+00 0.00000E+00 5 9.64122E+01 7.24474E+01 2.90761E+01 9.19233E+01 + 0.28560E+01 0.29920E+01 0.00000E+00 0.00000E+00 2 8.38760E-06 8.25092E+01 1.09346E-06 8.31602E-06 + 0.28560E+01 0.29920E+01 0.00000E+00 0.00000E+00 4 8.56144E-06 8.57579E+01 6.33296E-07 8.53798E-06 + 0.28560E+01 0.29920E+01 0.00000E+00 0.00000E+00 6 4.81114E-04 4.10509E+00 4.79880E-04 3.44410E-05 + 0.27925E+01 0.29920E+01 0.00000E+00 0.00000E+00 1 8.51462E+00 1.77450E+02 -8.50619E+00 3.78773E-01 + 0.27925E+01 0.29920E+01 0.00000E+00 0.00000E+00 3 4.86150E+00 -2.35797E+01 4.45559E+00 -1.94472E+00 + 0.27925E+01 0.29920E+01 0.00000E+00 0.00000E+00 5 1.31075E+02 8.21415E+01 1.79215E+01 1.29844E+02 + 0.27925E+01 0.29920E+01 0.00000E+00 0.00000E+00 2 4.23912E-07 6.96271E+00 4.20786E-07 5.13881E-08 + 0.27925E+01 0.29920E+01 0.00000E+00 0.00000E+00 4 2.82719E-07 1.71289E+02 -2.79458E-07 4.28202E-08 + 0.27925E+01 0.29920E+01 0.00000E+00 0.00000E+00 6 2.85911E-04 -4.71172E+00 2.84945E-04 -2.34855E-05 + 0.27318E+01 0.29920E+01 0.00000E+00 0.00000E+00 1 1.37122E+01 1.63071E+02 -1.31180E+01 3.99275E+00 + 0.27318E+01 0.29920E+01 0.00000E+00 0.00000E+00 3 6.26467E+00 -7.27207E+01 1.86080E+00 -5.98193E+00 + 0.27318E+01 0.29920E+01 0.00000E+00 0.00000E+00 5 9.13140E+01 6.51676E+01 3.83487E+01 8.28712E+01 + 0.27318E+01 0.29920E+01 0.00000E+00 0.00000E+00 2 2.55170E-06 -4.22443E+01 1.88899E-06 -1.71549E-06 + 0.27318E+01 0.29920E+01 0.00000E+00 0.00000E+00 4 3.90508E-06 -5.83649E+01 2.04824E-06 -3.32481E-06 + 0.27318E+01 0.29920E+01 0.00000E+00 0.00000E+00 6 1.11527E-04 5.08188E+00 1.11088E-04 9.87896E-06 + 0.26737E+01 0.29920E+01 0.00000E+00 0.00000E+00 1 7.76110E+00 1.36049E+02 -5.58746E+00 5.38654E+00 + 0.26737E+01 0.29920E+01 0.00000E+00 0.00000E+00 3 8.07233E+00 -9.97707E+01 -1.36993E+00 -7.95524E+00 + 0.26737E+01 0.29920E+01 0.00000E+00 0.00000E+00 5 5.04915E+01 2.19095E+01 4.68447E+01 1.88405E+01 + 0.26737E+01 0.29920E+01 0.00000E+00 0.00000E+00 2 2.92892E-06 1.52488E+02 -2.59770E-06 1.35298E-06 + 0.26737E+01 0.29920E+01 0.00000E+00 0.00000E+00 4 3.84423E-06 7.60335E+01 9.27825E-07 3.73059E-06 + 0.26737E+01 0.29920E+01 0.00000E+00 0.00000E+00 6 2.31010E-04 -1.19817E+02 -1.14865E-04 -2.00429E-04 + 0.26180E+01 0.29920E+01 0.00000E+00 0.00000E+00 1 9.51911E+00 2.48256E+01 8.63945E+00 3.99667E+00 + 0.26180E+01 0.29920E+01 0.00000E+00 0.00000E+00 3 6.91751E+00 -1.06723E+02 -1.99051E+00 -6.62494E+00 + 0.26180E+01 0.29920E+01 0.00000E+00 0.00000E+00 5 5.87013E+01 1.23302E+00 5.86877E+01 1.26317E+00 + 0.26180E+01 0.29920E+01 0.00000E+00 0.00000E+00 2 4.84626E-06 -3.80990E+01 3.81374E-06 -2.99025E-06 + 0.26180E+01 0.29920E+01 0.00000E+00 0.00000E+00 4 5.03414E-06 -1.59650E+02 -4.71994E-06 -1.75064E-06 + 0.26180E+01 0.29920E+01 0.00000E+00 0.00000E+00 6 2.54206E-04 -1.09996E+02 -8.69285E-05 -2.38881E-04 + 0.25646E+01 0.29920E+01 0.00000E+00 0.00000E+00 1 1.75550E+01 1.27595E+01 1.71215E+01 3.87718E+00 + 0.25646E+01 0.29920E+01 0.00000E+00 0.00000E+00 3 4.06487E+00 -1.28127E+02 -2.50969E+00 -3.19760E+00 + 0.25646E+01 0.29920E+01 0.00000E+00 0.00000E+00 5 3.21221E+01 -1.38003E+01 3.11948E+01 -7.66238E+00 + 0.25646E+01 0.29920E+01 0.00000E+00 0.00000E+00 2 4.81729E-06 -8.58681E+01 3.47095E-07 -4.80477E-06 + 0.25646E+01 0.29920E+01 0.00000E+00 0.00000E+00 4 3.48907E-06 -8.51028E+01 2.97853E-07 -3.47633E-06 + 0.25646E+01 0.29920E+01 0.00000E+00 0.00000E+00 6 5.32649E-05 -1.71136E+02 -5.26287E-05 -8.20755E-06 + 0.25133E+01 0.29920E+01 0.00000E+00 0.00000E+00 1 1.24906E+01 -6.40080E+00 1.24127E+01 -1.39249E+00 + 0.25133E+01 0.29920E+01 0.00000E+00 0.00000E+00 3 3.74608E+00 1.75740E+02 -3.73573E+00 2.78259E-01 + 0.25133E+01 0.29920E+01 0.00000E+00 0.00000E+00 5 2.60177E+01 9.69843E+01 -3.16371E+00 2.58247E+01 + 0.25133E+01 0.29920E+01 0.00000E+00 0.00000E+00 2 1.26209E-06 1.10552E+02 -4.43061E-07 1.18176E-06 + 0.25133E+01 0.29920E+01 0.00000E+00 0.00000E+00 4 9.21939E-07 -1.09632E+02 -3.09756E-07 -8.68345E-07 + 0.25133E+01 0.29920E+01 0.00000E+00 0.00000E+00 6 2.70159E-04 -8.73976E+01 1.22664E-05 -2.69880E-04 + 0.24640E+01 0.29920E+01 0.00000E+00 0.00000E+00 1 1.68658E+01 -8.96433E+01 1.04990E-01 -1.68654E+01 + 0.24640E+01 0.29920E+01 0.00000E+00 0.00000E+00 3 4.13163E+00 1.60658E+02 -3.89843E+00 1.36844E+00 + 0.24640E+01 0.29920E+01 0.00000E+00 0.00000E+00 5 6.36269E+01 8.55975E+01 4.88417E+00 6.34392E+01 + 0.24640E+01 0.29920E+01 0.00000E+00 0.00000E+00 2 3.48481E-06 1.24579E+01 3.40275E-06 7.51749E-07 + 0.24640E+01 0.29920E+01 0.00000E+00 0.00000E+00 4 8.77465E-06 4.26036E+01 6.45862E-06 5.93975E-06 + 0.24640E+01 0.29920E+01 0.00000E+00 0.00000E+00 6 2.26090E-04 -1.27184E+02 -1.36643E-04 -1.80126E-04 + 0.24166E+01 0.29920E+01 0.00000E+00 0.00000E+00 1 2.79367E+01 -9.80616E+01 -3.91779E+00 -2.76607E+01 + 0.24166E+01 0.29920E+01 0.00000E+00 0.00000E+00 3 1.64668E+00 1.49257E+02 -1.41526E+00 8.41771E-01 + 0.24166E+01 0.29920E+01 0.00000E+00 0.00000E+00 5 7.06124E+01 9.83744E+01 -1.02840E+01 6.98595E+01 + 0.24166E+01 0.29920E+01 0.00000E+00 0.00000E+00 2 2.67334E-06 -1.77014E+02 -2.66971E-06 -1.39275E-07 + 0.24166E+01 0.29920E+01 0.00000E+00 0.00000E+00 4 9.85843E-07 1.59813E+02 -9.25285E-07 3.40198E-07 + 0.24166E+01 0.29920E+01 0.00000E+00 0.00000E+00 6 1.86373E-04 6.63097E+01 7.48833E-05 1.70668E-04 + 0.23710E+01 0.29920E+01 0.00000E+00 0.00000E+00 1 1.95538E+01 -1.09895E+02 -6.65409E+00 -1.83868E+01 + 0.23710E+01 0.29920E+01 0.00000E+00 0.00000E+00 3 1.48576E+00 -2.15786E+01 1.38163E+00 -5.46427E-01 + 0.23710E+01 0.29920E+01 0.00000E+00 0.00000E+00 5 6.10188E+01 5.10876E+01 3.83278E+01 4.74791E+01 + 0.23710E+01 0.29920E+01 0.00000E+00 0.00000E+00 2 9.55273E-07 -1.06645E+02 -2.73629E-07 -9.15245E-07 + 0.23710E+01 0.29920E+01 0.00000E+00 0.00000E+00 4 1.20120E-06 4.14159E+01 9.00812E-07 7.94618E-07 + 0.23710E+01 0.29920E+01 0.00000E+00 0.00000E+00 6 2.65805E-04 1.63126E+02 -2.54361E-04 7.71556E-05 + 0.23271E+01 0.29920E+01 0.00000E+00 0.00000E+00 1 1.27424E+01 -1.72627E+02 -1.26371E+01 -1.63514E+00 + 0.23271E+01 0.29920E+01 0.00000E+00 0.00000E+00 3 2.43966E+00 -1.61115E+01 2.34384E+00 -6.77025E-01 + 0.23271E+01 0.29920E+01 0.00000E+00 0.00000E+00 5 6.10343E+01 2.59216E+01 5.48938E+01 2.66806E+01 + 0.23271E+01 0.29920E+01 0.00000E+00 0.00000E+00 2 1.30291E-06 1.43823E+02 -1.05171E-06 7.69088E-07 + 0.23271E+01 0.29920E+01 0.00000E+00 0.00000E+00 4 8.40430E-07 1.53599E+02 -7.52776E-07 3.73698E-07 + 0.23271E+01 0.29920E+01 0.00000E+00 0.00000E+00 6 5.87352E-05 5.13623E+01 3.66739E-05 4.58786E-05 + 0.22848E+01 0.29920E+01 0.00000E+00 0.00000E+00 1 2.17638E+01 1.64133E+02 -2.09346E+01 5.95027E+00 + 0.22848E+01 0.29920E+01 0.00000E+00 0.00000E+00 3 2.13266E-01 -4.65067E+01 1.46784E-01 -1.54715E-01 + 0.22848E+01 0.29920E+01 0.00000E+00 0.00000E+00 5 8.11437E+01 3.75443E+01 6.43374E+01 4.94470E+01 + 0.22848E+01 0.29920E+01 0.00000E+00 0.00000E+00 2 6.74621E-07 -1.15090E+02 -2.86071E-07 -6.10964E-07 + 0.22848E+01 0.29920E+01 0.00000E+00 0.00000E+00 4 4.73717E-06 9.50374E+01 -4.15952E-07 4.71888E-06 + 0.22848E+01 0.29920E+01 0.00000E+00 0.00000E+00 6 1.14367E-04 -1.37029E+02 -8.36829E-05 -7.79551E-05 + 0.22440E+01 0.29920E+01 0.00000E+00 0.00000E+00 1 1.31227E+01 1.75330E+02 -1.30792E+01 1.06840E+00 + 0.22440E+01 0.29920E+01 0.00000E+00 0.00000E+00 3 1.44710E+00 1.40856E+02 -1.12231E+00 9.13522E-01 + 0.22440E+01 0.29920E+01 0.00000E+00 0.00000E+00 5 3.18253E+01 2.89941E+01 2.78366E+01 1.54264E+01 + 0.22440E+01 0.29920E+01 0.00000E+00 0.00000E+00 2 1.34708E-06 5.03331E+00 1.34189E-06 1.18186E-07 + 0.22440E+01 0.29920E+01 0.00000E+00 0.00000E+00 4 3.03423E-07 -4.18975E+00 3.02612E-07 -2.21680E-08 + 0.22440E+01 0.29920E+01 0.00000E+00 0.00000E+00 6 1.69529E-04 -7.90685E+01 3.21487E-05 -1.66453E-04 + 0.22046E+01 0.29920E+01 0.00000E+00 0.00000E+00 1 1.24103E+01 3.53628E+01 1.01206E+01 7.18245E+00 + 0.22046E+01 0.29920E+01 0.00000E+00 0.00000E+00 3 1.44591E+00 -1.66948E+02 -1.40855E+00 -3.26527E-01 + 0.22046E+01 0.29920E+01 0.00000E+00 0.00000E+00 5 4.85957E+01 -9.56471E+01 -4.78183E+00 -4.83599E+01 + 0.22046E+01 0.29920E+01 0.00000E+00 0.00000E+00 2 2.71144E-06 -8.85527E+01 6.84833E-08 -2.71057E-06 + 0.22046E+01 0.29920E+01 0.00000E+00 0.00000E+00 4 3.56548E-06 -5.78962E+01 1.89489E-06 -3.02027E-06 + 0.22046E+01 0.29920E+01 0.00000E+00 0.00000E+00 6 2.61977E-04 9.00292E+01 -1.33567E-07 2.61976E-04 + 0.21666E+01 0.29920E+01 0.00000E+00 0.00000E+00 1 1.85331E+01 3.39583E+01 1.53722E+01 1.03524E+01 + 0.21666E+01 0.29920E+01 0.00000E+00 0.00000E+00 3 1.58374E-01 -1.63461E+02 -1.51822E-01 -4.50842E-02 + 0.21666E+01 0.29920E+01 0.00000E+00 0.00000E+00 5 9.44050E+01 -8.89250E+01 1.77118E+00 -9.43884E+01 + 0.21666E+01 0.29920E+01 0.00000E+00 0.00000E+00 2 9.87668E-07 1.03215E+02 -2.25785E-07 9.61514E-07 + 0.21666E+01 0.29920E+01 0.00000E+00 0.00000E+00 4 4.26548E-07 -8.90534E+01 7.04661E-09 -4.26489E-07 + 0.21666E+01 0.29920E+01 0.00000E+00 0.00000E+00 6 6.69974E-05 -1.22467E+02 -3.59653E-05 -5.65256E-05 + 0.21299E+01 0.29920E+01 0.00000E+00 0.00000E+00 1 7.55788E+00 -7.18198E+00 7.49858E+00 -9.44895E-01 + 0.21299E+01 0.29920E+01 0.00000E+00 0.00000E+00 3 1.06194E+00 -7.20482E+01 3.27308E-01 -1.01024E+00 + 0.21299E+01 0.29920E+01 0.00000E+00 0.00000E+00 5 2.52707E+01 -2.66921E+01 2.25777E+01 -1.13515E+01 + 0.21299E+01 0.29920E+01 0.00000E+00 0.00000E+00 2 1.38894E-06 1.14290E+02 -5.71347E-07 1.26598E-06 + 0.21299E+01 0.29920E+01 0.00000E+00 0.00000E+00 4 2.64062E-06 9.02661E+01 -1.22622E-08 2.64060E-06 + 0.21299E+01 0.29920E+01 0.00000E+00 0.00000E+00 6 2.20895E-04 -2.60107E+00 2.20668E-04 -1.00246E-05 + 0.20944E+01 0.29920E+01 0.00000E+00 0.00000E+00 1 1.98178E+01 -7.55436E+01 4.94740E+00 -1.91904E+01 + 0.20944E+01 0.29920E+01 0.00000E+00 0.00000E+00 3 7.47904E-01 1.67895E+02 -7.31274E-01 1.56837E-01 + 0.20944E+01 0.29920E+01 0.00000E+00 0.00000E+00 5 8.54562E+01 1.05448E+02 -2.27618E+01 8.23691E+01 + 0.20944E+01 0.29920E+01 0.00000E+00 0.00000E+00 2 2.24614E-06 -1.56344E+02 -2.05739E-06 -9.01257E-07 + 0.20944E+01 0.29920E+01 0.00000E+00 0.00000E+00 4 1.19292E-06 -1.65847E+02 -1.15671E-06 -2.91688E-07 + 0.20944E+01 0.29920E+01 0.00000E+00 0.00000E+00 6 4.64384E-05 -4.77673E+01 3.12133E-05 -3.43840E-05 + 0.29224E+01 0.29224E+01 0.00000E+00 0.00000E+00 1 1.73609E+00 0.00000E+00 1.73609E+00 0.00000E+00 + 0.29224E+01 0.29224E+01 0.00000E+00 0.00000E+00 3 3.12877E-03 0.00000E+00 3.12877E-03 0.00000E+00 + 0.29224E+01 0.29224E+01 0.00000E+00 0.00000E+00 5 1.52229E+01 0.00000E+00 1.52229E+01 0.00000E+00 + 0.29224E+01 0.29224E+01 0.00000E+00 0.00000E+00 2 8.00747E-06 0.00000E+00 8.00747E-06 0.00000E+00 + 0.29224E+01 0.29224E+01 0.00000E+00 0.00000E+00 4 6.64880E-06 0.00000E+00 6.64880E-06 0.00000E+00 + 0.29224E+01 0.29224E+01 0.00000E+00 0.00000E+00 6 1.98559E-04 1.80000E+02 -1.98559E-04 0.00000E+00 + 0.28560E+01 0.29224E+01 0.00000E+00 0.00000E+00 1 2.00515E+00 -8.38511E+01 2.14778E-01 -1.99362E+00 + 0.28560E+01 0.29224E+01 0.00000E+00 0.00000E+00 3 1.52258E+00 -9.04601E+00 1.50364E+00 -2.39392E-01 + 0.28560E+01 0.29224E+01 0.00000E+00 0.00000E+00 5 2.99704E+01 4.14056E+01 2.24792E+01 1.98220E+01 + 0.28560E+01 0.29224E+01 0.00000E+00 0.00000E+00 2 5.59192E-06 1.22608E+02 -3.01344E-06 4.71049E-06 + 0.28560E+01 0.29224E+01 0.00000E+00 0.00000E+00 4 1.40752E-05 7.58878E+01 3.43183E-06 1.36504E-05 + 0.28560E+01 0.29224E+01 0.00000E+00 0.00000E+00 6 9.23355E-05 -1.16928E+02 -4.18158E-05 -8.23242E-05 + 0.27925E+01 0.29224E+01 0.00000E+00 0.00000E+00 1 4.26265E+00 -1.33490E+02 -2.93366E+00 -3.09254E+00 + 0.27925E+01 0.29224E+01 0.00000E+00 0.00000E+00 3 4.57653E+00 -6.46592E+00 4.54742E+00 -5.15373E-01 + 0.27925E+01 0.29224E+01 0.00000E+00 0.00000E+00 5 9.84029E+01 7.65286E+01 2.29240E+01 9.56954E+01 + 0.27925E+01 0.29224E+01 0.00000E+00 0.00000E+00 2 2.20782E-06 8.15078E+01 3.26038E-07 2.18361E-06 + 0.27925E+01 0.29224E+01 0.00000E+00 0.00000E+00 4 1.30159E-05 9.31661E+01 -7.18873E-07 1.29960E-05 + 0.27925E+01 0.29224E+01 0.00000E+00 0.00000E+00 6 5.28876E-04 -5.36492E+01 3.13479E-04 -4.25958E-04 + 0.27318E+01 0.29224E+01 0.00000E+00 0.00000E+00 1 9.13680E+00 1.76761E+02 -9.12221E+00 5.16255E-01 + 0.27318E+01 0.29224E+01 0.00000E+00 0.00000E+00 3 5.14489E+00 -2.71408E+01 4.57838E+00 -2.34699E+00 + 0.27318E+01 0.29224E+01 0.00000E+00 0.00000E+00 5 1.41053E+02 7.92505E+01 2.63087E+01 1.38578E+02 + 0.27318E+01 0.29224E+01 0.00000E+00 0.00000E+00 2 8.83224E-07 -9.46804E+01 -7.20695E-08 -8.80278E-07 + 0.27318E+01 0.29224E+01 0.00000E+00 0.00000E+00 4 3.16192E-06 8.70850E+01 1.60796E-07 3.15783E-06 + 0.27318E+01 0.29224E+01 0.00000E+00 0.00000E+00 6 4.20467E-04 -4.87699E+00 4.18945E-04 -3.57468E-05 + 0.26737E+01 0.29224E+01 0.00000E+00 0.00000E+00 1 1.32817E+01 1.54995E+02 -1.20368E+01 5.61408E+00 + 0.26737E+01 0.29224E+01 0.00000E+00 0.00000E+00 3 6.55706E+00 -7.72709E+01 1.44479E+00 -6.39591E+00 + 0.26737E+01 0.29224E+01 0.00000E+00 0.00000E+00 5 8.53385E+01 6.36293E+01 3.79054E+01 7.64581E+01 + 0.26737E+01 0.29224E+01 0.00000E+00 0.00000E+00 2 5.47491E-06 -1.11732E+02 -2.02719E-06 -5.08578E-06 + 0.26737E+01 0.29224E+01 0.00000E+00 0.00000E+00 4 3.38819E-06 -1.43134E+02 -2.71068E-06 -2.03274E-06 + 0.26737E+01 0.29224E+01 0.00000E+00 0.00000E+00 6 1.01490E-04 -1.89943E+01 9.59635E-05 -3.30322E-05 + 0.26180E+01 0.29224E+01 0.00000E+00 0.00000E+00 1 7.37822E+00 1.34171E+02 -5.14113E+00 5.29216E+00 + 0.26180E+01 0.29224E+01 0.00000E+00 0.00000E+00 3 8.34493E+00 -9.93923E+01 -1.36184E+00 -8.23306E+00 + 0.26180E+01 0.29224E+01 0.00000E+00 0.00000E+00 5 6.16965E+01 1.34385E+01 6.00072E+01 1.43384E+01 + 0.26180E+01 0.29224E+01 0.00000E+00 0.00000E+00 2 9.64682E-07 -4.27705E+01 7.08154E-07 -6.55080E-07 + 0.26180E+01 0.29224E+01 0.00000E+00 0.00000E+00 4 4.65061E-06 4.73718E+01 3.14958E-06 3.42175E-06 + 0.26180E+01 0.29224E+01 0.00000E+00 0.00000E+00 6 3.26837E-04 -1.67728E+02 -3.19369E-04 -6.94684E-05 + 0.25646E+01 0.29224E+01 0.00000E+00 0.00000E+00 1 1.04291E+01 1.97171E+01 9.81768E+00 3.51855E+00 + 0.25646E+01 0.29224E+01 0.00000E+00 0.00000E+00 3 6.93632E+00 -1.07175E+02 -2.04826E+00 -6.62700E+00 + 0.25646E+01 0.29224E+01 0.00000E+00 0.00000E+00 5 5.92988E+01 -2.67371E+00 5.92342E+01 -2.76617E+00 + 0.25646E+01 0.29224E+01 0.00000E+00 0.00000E+00 2 1.73277E-06 -6.15041E+01 8.26696E-07 -1.52285E-06 + 0.25646E+01 0.29224E+01 0.00000E+00 0.00000E+00 4 1.17070E-05 -1.39505E+02 -8.90271E-06 -7.60229E-06 + 0.25646E+01 0.29224E+01 0.00000E+00 0.00000E+00 6 2.41054E-04 2.64707E+01 2.15783E-04 1.07448E-04 + 0.25133E+01 0.29224E+01 0.00000E+00 0.00000E+00 1 1.87157E+01 1.29366E+01 1.82407E+01 4.18996E+00 + 0.25133E+01 0.29224E+01 0.00000E+00 0.00000E+00 3 3.98255E+00 -1.40068E+02 -3.05384E+00 -2.55632E+00 + 0.25133E+01 0.29224E+01 0.00000E+00 0.00000E+00 5 2.40943E+01 -1.22014E+00 2.40888E+01 -5.13062E-01 + 0.25133E+01 0.29224E+01 0.00000E+00 0.00000E+00 2 2.54540E-06 1.43672E+02 -2.05068E-06 1.50790E-06 + 0.25133E+01 0.29224E+01 0.00000E+00 0.00000E+00 4 5.98382E-06 -7.12277E+01 1.92564E-06 -5.66551E-06 + 0.25133E+01 0.29224E+01 0.00000E+00 0.00000E+00 6 8.20876E-05 -4.31614E+01 5.98772E-05 -5.61525E-05 + 0.24640E+01 0.29224E+01 0.00000E+00 0.00000E+00 1 1.05443E+01 -1.49967E+01 1.01851E+01 -2.72847E+00 + 0.24640E+01 0.29224E+01 0.00000E+00 0.00000E+00 3 4.03365E+00 1.74712E+02 -4.01649E+00 3.71761E-01 + 0.24640E+01 0.29224E+01 0.00000E+00 0.00000E+00 5 3.30204E+01 8.40650E+01 3.41431E+00 3.28434E+01 + 0.24640E+01 0.29224E+01 0.00000E+00 0.00000E+00 2 2.35025E-06 -7.93037E+01 4.36213E-07 -2.30941E-06 + 0.24640E+01 0.29224E+01 0.00000E+00 0.00000E+00 4 5.00339E-06 1.76349E+01 4.76826E-06 1.51578E-06 + 0.24640E+01 0.29224E+01 0.00000E+00 0.00000E+00 6 5.55457E-05 8.68065E+01 3.09440E-06 5.54594E-05 + 0.24166E+01 0.29224E+01 0.00000E+00 0.00000E+00 1 1.94453E+01 -9.16873E+01 -5.72578E-01 -1.94369E+01 + 0.24166E+01 0.29224E+01 0.00000E+00 0.00000E+00 3 4.12679E+00 1.58413E+02 -3.83734E+00 1.51829E+00 + 0.24166E+01 0.29224E+01 0.00000E+00 0.00000E+00 5 6.06485E+01 9.55064E+01 -5.81962E+00 6.03687E+01 + 0.24166E+01 0.29224E+01 0.00000E+00 0.00000E+00 2 3.42961E-06 -8.19322E+01 4.81326E-07 -3.39566E-06 + 0.24166E+01 0.29224E+01 0.00000E+00 0.00000E+00 4 2.89488E-06 -1.25491E+02 -1.68070E-06 -2.35703E-06 + 0.24166E+01 0.29224E+01 0.00000E+00 0.00000E+00 6 1.90739E-04 1.01994E+02 -3.96377E-05 1.86575E-04 + 0.23710E+01 0.29224E+01 0.00000E+00 0.00000E+00 1 2.94620E+01 -1.04199E+02 -7.22656E+00 -2.85620E+01 + 0.23710E+01 0.29224E+01 0.00000E+00 0.00000E+00 3 9.49842E-01 1.24300E+02 -5.35256E-01 7.84665E-01 + 0.23710E+01 0.29224E+01 0.00000E+00 0.00000E+00 5 7.44031E+01 7.65667E+01 1.72849E+01 7.23675E+01 + 0.23710E+01 0.29224E+01 0.00000E+00 0.00000E+00 2 2.60380E-06 1.59817E+02 -2.44392E-06 8.98353E-07 + 0.23710E+01 0.29224E+01 0.00000E+00 0.00000E+00 4 3.42972E-06 -1.62204E+02 -3.26561E-06 -1.04820E-06 + 0.23710E+01 0.29224E+01 0.00000E+00 0.00000E+00 6 8.87255E-05 8.76976E+01 3.56438E-06 8.86539E-05 + 0.23271E+01 0.29224E+01 0.00000E+00 0.00000E+00 1 1.73380E+01 -1.05705E+02 -4.69319E+00 -1.66907E+01 + 0.23271E+01 0.29224E+01 0.00000E+00 0.00000E+00 3 2.05421E+00 -7.88748E+00 2.03477E+00 -2.81895E-01 + 0.23271E+01 0.29224E+01 0.00000E+00 0.00000E+00 5 5.21149E+01 5.35490E+01 3.09633E+01 4.19194E+01 + 0.23271E+01 0.29224E+01 0.00000E+00 0.00000E+00 2 7.99993E-07 -1.15064E+02 -3.38896E-07 -7.24664E-07 + 0.23271E+01 0.29224E+01 0.00000E+00 0.00000E+00 4 3.01917E-06 8.32681E+01 3.53921E-07 2.99836E-06 + 0.23271E+01 0.29224E+01 0.00000E+00 0.00000E+00 6 5.63930E-05 -9.57955E+01 -5.69450E-06 -5.61048E-05 + 0.22848E+01 0.29224E+01 0.00000E+00 0.00000E+00 1 1.66206E+01 1.71423E+02 -1.64347E+01 2.47876E+00 + 0.22848E+01 0.29224E+01 0.00000E+00 0.00000E+00 3 2.40194E+00 -1.52169E+01 2.31772E+00 -6.30447E-01 + 0.22848E+01 0.29224E+01 0.00000E+00 0.00000E+00 5 6.57065E+01 2.86295E+01 5.76729E+01 3.14829E+01 + 0.22848E+01 0.29224E+01 0.00000E+00 0.00000E+00 2 1.59714E-06 9.35039E+01 -9.76108E-08 1.59416E-06 + 0.22848E+01 0.29224E+01 0.00000E+00 0.00000E+00 4 1.15226E-06 1.32101E+02 -7.72523E-07 8.54933E-07 + 0.22848E+01 0.29224E+01 0.00000E+00 0.00000E+00 6 1.96648E-04 1.75897E+02 -1.96145E-04 1.40687E-05 + 0.22440E+01 0.29224E+01 0.00000E+00 0.00000E+00 1 2.30053E+01 1.66101E+02 -2.23316E+01 5.52623E+00 + 0.22440E+01 0.29224E+01 0.00000E+00 0.00000E+00 3 5.32420E-01 1.72401E+02 -5.27745E-01 7.04030E-02 + 0.22440E+01 0.29224E+01 0.00000E+00 0.00000E+00 5 8.08843E+01 4.02702E+01 6.17151E+01 5.22830E+01 + 0.22440E+01 0.29224E+01 0.00000E+00 0.00000E+00 2 2.91065E-06 -5.42246E+01 1.70159E-06 -2.36145E-06 + 0.22440E+01 0.29224E+01 0.00000E+00 0.00000E+00 4 2.98953E-06 -5.92340E+01 1.52924E-06 -2.56880E-06 + 0.22440E+01 0.29224E+01 0.00000E+00 0.00000E+00 6 1.16256E-04 2.37913E+01 1.06377E-04 4.68986E-05 + 0.22046E+01 0.29224E+01 0.00000E+00 0.00000E+00 1 8.79170E+00 1.59634E+02 -8.24209E+00 3.05972E+00 + 0.22046E+01 0.29224E+01 0.00000E+00 0.00000E+00 3 1.46796E+00 1.71019E+02 -1.44996E+00 2.29161E-01 + 0.22046E+01 0.29224E+01 0.00000E+00 0.00000E+00 5 2.16617E+01 9.09004E+01 -3.40391E-01 2.16590E+01 + 0.22046E+01 0.29224E+01 0.00000E+00 0.00000E+00 2 6.80921E-07 -1.79445E+02 -6.80889E-07 -6.59972E-09 + 0.22046E+01 0.29224E+01 0.00000E+00 0.00000E+00 4 5.55372E-06 -1.28148E+02 -3.43050E-06 -4.36755E-06 + 0.22046E+01 0.29224E+01 0.00000E+00 0.00000E+00 6 8.58247E-05 -9.01714E+01 -2.56770E-07 -8.58244E-05 + 0.21666E+01 0.29224E+01 0.00000E+00 0.00000E+00 1 1.56120E+01 3.45817E+01 1.28537E+01 8.86110E+00 + 0.21666E+01 0.29224E+01 0.00000E+00 0.00000E+00 3 1.42988E+00 -1.69677E+02 -1.40673E+00 -2.56231E-01 + 0.21666E+01 0.29224E+01 0.00000E+00 0.00000E+00 5 7.66154E+01 -8.26708E+01 9.77389E+00 -7.59894E+01 + 0.21666E+01 0.29224E+01 0.00000E+00 0.00000E+00 2 3.34693E-06 -7.51154E+01 8.59735E-07 -3.23462E-06 + 0.21666E+01 0.29224E+01 0.00000E+00 0.00000E+00 4 7.77524E-07 1.37369E+02 -5.72048E-07 5.26597E-07 + 0.21666E+01 0.29224E+01 0.00000E+00 0.00000E+00 6 5.98680E-05 -5.53727E+01 3.40191E-05 -4.92634E-05 + 0.21299E+01 0.29224E+01 0.00000E+00 0.00000E+00 1 1.62035E+01 3.41247E+01 1.34136E+01 9.09010E+00 + 0.21299E+01 0.29224E+01 0.00000E+00 0.00000E+00 3 4.34207E-01 -1.30698E+01 4.22960E-01 -9.81905E-02 + 0.21299E+01 0.29224E+01 0.00000E+00 0.00000E+00 5 7.42014E+01 -6.69004E+01 2.91115E+01 -6.82523E+01 + 0.21299E+01 0.29224E+01 0.00000E+00 0.00000E+00 2 8.33325E-07 -3.39016E+01 6.91657E-07 -4.64802E-07 + 0.21299E+01 0.29224E+01 0.00000E+00 0.00000E+00 4 4.36486E-07 -1.27469E+02 -2.65527E-07 -3.46432E-07 + 0.21299E+01 0.29224E+01 0.00000E+00 0.00000E+00 6 4.35615E-05 -5.96437E+01 2.20149E-05 -3.75892E-05 + 0.20944E+01 0.29224E+01 0.00000E+00 0.00000E+00 1 1.08420E+01 -5.07675E+01 6.85721E+00 -8.39804E+00 + 0.20944E+01 0.29224E+01 0.00000E+00 0.00000E+00 3 7.73468E-01 -7.15541E+01 2.44732E-01 -7.33729E-01 + 0.20944E+01 0.29224E+01 0.00000E+00 0.00000E+00 5 3.15972E+01 8.33718E+01 3.64715E+00 3.13860E+01 + 0.20944E+01 0.29224E+01 0.00000E+00 0.00000E+00 2 3.06378E-06 1.62271E+02 -2.91828E-06 9.32944E-07 + 0.20944E+01 0.29224E+01 0.00000E+00 0.00000E+00 4 1.12963E-06 1.04146E+02 -2.76080E-07 1.09538E-06 + 0.20944E+01 0.29224E+01 0.00000E+00 0.00000E+00 6 5.23700E-05 -1.36288E+02 -3.78544E-05 -3.61893E-05 + 0.28560E+01 0.28560E+01 0.00000E+00 0.00000E+00 1 5.81068E-01 0.00000E+00 5.81068E-01 0.00000E+00 + 0.28560E+01 0.28560E+01 0.00000E+00 0.00000E+00 3 1.81068E-03 0.00000E+00 1.81068E-03 0.00000E+00 + 0.28560E+01 0.28560E+01 0.00000E+00 0.00000E+00 5 1.71142E+01 0.00000E+00 1.71142E+01 0.00000E+00 + 0.28560E+01 0.28560E+01 0.00000E+00 0.00000E+00 2 3.40969E-06 1.80000E+02 -3.40969E-06 0.00000E+00 + 0.28560E+01 0.28560E+01 0.00000E+00 0.00000E+00 4 1.32014E-05 0.00000E+00 1.32014E-05 0.00000E+00 + 0.28560E+01 0.28560E+01 0.00000E+00 0.00000E+00 6 2.28262E-04 1.80000E+02 -2.28262E-04 0.00000E+00 + 0.27925E+01 0.28560E+01 0.00000E+00 0.00000E+00 1 2.44614E+00 -9.45329E+01 -1.93320E-01 -2.43849E+00 + 0.27925E+01 0.28560E+01 0.00000E+00 0.00000E+00 3 1.59004E+00 -4.49349E+00 1.58515E+00 -1.24573E-01 + 0.27925E+01 0.28560E+01 0.00000E+00 0.00000E+00 5 3.23642E+01 4.64426E+01 2.23016E+01 2.34538E+01 + 0.27925E+01 0.28560E+01 0.00000E+00 0.00000E+00 2 4.93158E-06 1.23503E+02 -2.72211E-06 4.11225E-06 + 0.27925E+01 0.28560E+01 0.00000E+00 0.00000E+00 4 1.11418E-05 7.84032E+01 2.23976E-06 1.09144E-05 + 0.27925E+01 0.28560E+01 0.00000E+00 0.00000E+00 6 3.02158E-04 -1.09885E+02 -1.02773E-04 -2.84143E-04 + 0.27318E+01 0.28560E+01 0.00000E+00 0.00000E+00 1 4.94866E+00 -1.34728E+02 -3.48260E+00 -3.51578E+00 + 0.27318E+01 0.28560E+01 0.00000E+00 0.00000E+00 3 4.74716E+00 -7.98853E+00 4.70109E+00 -6.59736E-01 + 0.27318E+01 0.28560E+01 0.00000E+00 0.00000E+00 5 1.04174E+02 7.64051E+01 2.44868E+01 1.01255E+02 + 0.27318E+01 0.28560E+01 0.00000E+00 0.00000E+00 2 2.64423E-06 -1.04633E+02 -6.68026E-07 -2.55846E-06 + 0.27318E+01 0.28560E+01 0.00000E+00 0.00000E+00 4 8.36828E-06 9.09234E+01 -1.34862E-07 8.36719E-06 + 0.27318E+01 0.28560E+01 0.00000E+00 0.00000E+00 6 2.52259E-04 -7.30799E+01 7.34170E-05 -2.41339E-04 + 0.26737E+01 0.28560E+01 0.00000E+00 0.00000E+00 1 9.99327E+00 1.69980E+02 -9.84085E+00 1.73868E+00 + 0.26737E+01 0.28560E+01 0.00000E+00 0.00000E+00 3 4.77174E+00 -3.12465E+01 4.07957E+00 -2.47520E+00 + 0.26737E+01 0.28560E+01 0.00000E+00 0.00000E+00 5 1.33891E+02 8.16043E+01 1.95492E+01 1.32456E+02 + 0.26737E+01 0.28560E+01 0.00000E+00 0.00000E+00 2 2.00845E-06 1.10381E+02 -6.99454E-07 1.88272E-06 + 0.26737E+01 0.28560E+01 0.00000E+00 0.00000E+00 4 4.54610E-06 8.82252E+01 1.40797E-07 4.54392E-06 + 0.26737E+01 0.28560E+01 0.00000E+00 0.00000E+00 6 4.88982E-04 -6.43086E+00 4.85905E-04 -5.47680E-05 + 0.26180E+01 0.28560E+01 0.00000E+00 0.00000E+00 1 1.36331E+01 1.54974E+02 -1.23532E+01 5.76724E+00 + 0.26180E+01 0.28560E+01 0.00000E+00 0.00000E+00 3 6.62384E+00 -8.38714E+01 7.07159E-01 -6.58598E+00 + 0.26180E+01 0.28560E+01 0.00000E+00 0.00000E+00 5 8.55833E+01 5.88558E+01 4.42632E+01 7.32480E+01 + 0.26180E+01 0.28560E+01 0.00000E+00 0.00000E+00 2 3.51046E-06 5.62799E+01 1.94878E-06 2.91986E-06 + 0.26180E+01 0.28560E+01 0.00000E+00 0.00000E+00 4 1.45016E-05 -9.30549E+01 -7.72825E-07 -1.44810E-05 + 0.26180E+01 0.28560E+01 0.00000E+00 0.00000E+00 6 6.85670E-05 -1.73752E+02 -6.81597E-05 -7.46212E-06 + 0.25646E+01 0.28560E+01 0.00000E+00 0.00000E+00 1 5.80623E+00 1.31742E+02 -3.86563E+00 4.33235E+00 + 0.25646E+01 0.28560E+01 0.00000E+00 0.00000E+00 3 8.15723E+00 -1.01985E+02 -1.69393E+00 -7.97941E+00 + 0.25646E+01 0.28560E+01 0.00000E+00 0.00000E+00 5 6.03532E+01 8.28484E+00 5.97233E+01 8.69655E+00 + 0.25646E+01 0.28560E+01 0.00000E+00 0.00000E+00 2 7.59171E-06 7.65530E+00 7.52405E-06 1.01131E-06 + 0.25646E+01 0.28560E+01 0.00000E+00 0.00000E+00 4 1.33443E-06 1.07626E+02 -4.04061E-07 1.27178E-06 + 0.25646E+01 0.28560E+01 0.00000E+00 0.00000E+00 6 2.55196E-04 -4.62040E+00 2.54367E-04 -2.05571E-05 + 0.25133E+01 0.28560E+01 0.00000E+00 0.00000E+00 1 1.30818E+01 2.05844E+01 1.22466E+01 4.59938E+00 + 0.25133E+01 0.28560E+01 0.00000E+00 0.00000E+00 3 6.44484E+00 -1.14048E+02 -2.62625E+00 -5.88547E+00 + 0.25133E+01 0.28560E+01 0.00000E+00 0.00000E+00 5 5.55628E+01 -1.44324E+01 5.38094E+01 -1.38483E+01 + 0.25133E+01 0.28560E+01 0.00000E+00 0.00000E+00 2 2.44027E-06 1.33742E+02 -1.68723E-06 1.76301E-06 + 0.25133E+01 0.28560E+01 0.00000E+00 0.00000E+00 4 2.70522E-06 -8.86009E+01 6.60539E-08 -2.70442E-06 + 0.25133E+01 0.28560E+01 0.00000E+00 0.00000E+00 6 5.53013E-04 -7.69672E+01 1.24709E-04 -5.38768E-04 + 0.24640E+01 0.28560E+01 0.00000E+00 0.00000E+00 1 1.76778E+01 1.31237E+01 1.72161E+01 4.01381E+00 + 0.24640E+01 0.28560E+01 0.00000E+00 0.00000E+00 3 3.69425E+00 -1.50205E+02 -3.20591E+00 -1.83565E+00 + 0.24640E+01 0.28560E+01 0.00000E+00 0.00000E+00 5 2.62964E+01 -2.00297E+01 2.47059E+01 -9.00674E+00 + 0.24640E+01 0.28560E+01 0.00000E+00 0.00000E+00 2 1.18375E-06 -2.09284E+01 1.10565E-06 -4.22837E-07 + 0.24640E+01 0.28560E+01 0.00000E+00 0.00000E+00 4 7.53457E-07 -6.68744E+01 2.95919E-07 -6.92914E-07 + 0.24640E+01 0.28560E+01 0.00000E+00 0.00000E+00 6 7.88243E-05 -1.78880E+02 -7.88092E-05 -1.54046E-06 + 0.24166E+01 0.28560E+01 0.00000E+00 0.00000E+00 1 1.01333E+01 -2.05301E+01 9.48974E+00 -3.55376E+00 + 0.24166E+01 0.28560E+01 0.00000E+00 0.00000E+00 3 4.12898E+00 1.65631E+02 -3.99982E+00 1.02466E+00 + 0.24166E+01 0.28560E+01 0.00000E+00 0.00000E+00 5 2.20810E+01 1.06323E+02 -6.20604E+00 2.11910E+01 + 0.24166E+01 0.28560E+01 0.00000E+00 0.00000E+00 2 9.17995E-07 -1.01347E+02 -1.80623E-07 -9.00050E-07 + 0.24166E+01 0.28560E+01 0.00000E+00 0.00000E+00 4 4.48411E-07 -8.39290E+01 4.74246E-08 -4.45896E-07 + 0.24166E+01 0.28560E+01 0.00000E+00 0.00000E+00 6 1.74551E-04 1.14674E+02 -7.28658E-05 1.58615E-04 + 0.23710E+01 0.28560E+01 0.00000E+00 0.00000E+00 1 2.28961E+01 -9.53220E+01 -2.12368E+00 -2.27974E+01 + 0.23710E+01 0.28560E+01 0.00000E+00 0.00000E+00 3 3.67692E+00 1.48573E+02 -3.13752E+00 1.91721E+00 + 0.23710E+01 0.28560E+01 0.00000E+00 0.00000E+00 5 6.76766E+01 9.52948E+01 -6.24515E+00 6.73878E+01 + 0.23710E+01 0.28560E+01 0.00000E+00 0.00000E+00 2 2.10394E-06 1.43820E+02 -1.69822E-06 1.24201E-06 + 0.23710E+01 0.28560E+01 0.00000E+00 0.00000E+00 4 3.20424E-07 -1.13382E+01 3.14171E-07 -6.29952E-08 + 0.23710E+01 0.28560E+01 0.00000E+00 0.00000E+00 6 1.35904E-04 9.14335E+01 -3.39979E-06 1.35861E-04 + 0.23271E+01 0.28560E+01 0.00000E+00 0.00000E+00 1 2.74253E+01 -9.34883E+01 -1.66871E+00 -2.73745E+01 + 0.23271E+01 0.28560E+01 0.00000E+00 0.00000E+00 3 7.28477E-01 8.83742E+01 2.06684E-02 7.28184E-01 + 0.23271E+01 0.28560E+01 0.00000E+00 0.00000E+00 5 6.50544E+01 9.89694E+01 -1.01425E+01 6.42589E+01 + 0.23271E+01 0.28560E+01 0.00000E+00 0.00000E+00 2 2.41244E-06 8.96915E+01 1.29894E-08 2.41241E-06 + 0.23271E+01 0.28560E+01 0.00000E+00 0.00000E+00 4 1.94811E-06 1.28775E+02 -1.22004E-06 1.51876E-06 + 0.23271E+01 0.28560E+01 0.00000E+00 0.00000E+00 6 4.18479E-05 6.20995E+01 1.95822E-05 3.69836E-05 + 0.22848E+01 0.28560E+01 0.00000E+00 0.00000E+00 1 1.48896E+01 -1.13489E+02 -5.93466E+00 -1.36557E+01 + 0.22848E+01 0.28560E+01 0.00000E+00 0.00000E+00 3 2.48930E+00 -1.86485E+00 2.48798E+00 -8.10070E-02 + 0.22848E+01 0.28560E+01 0.00000E+00 0.00000E+00 5 4.36002E+01 5.43320E+01 2.54227E+01 3.54212E+01 + 0.22848E+01 0.28560E+01 0.00000E+00 0.00000E+00 2 2.52814E-06 9.76661E+01 -3.37252E-07 2.50555E-06 + 0.22848E+01 0.28560E+01 0.00000E+00 0.00000E+00 4 7.28989E-06 1.20613E+01 7.12897E-06 1.52328E-06 + 0.22848E+01 0.28560E+01 0.00000E+00 0.00000E+00 6 5.33510E-05 -1.27452E+02 -3.24428E-05 -4.23532E-05 + 0.22440E+01 0.28560E+01 0.00000E+00 0.00000E+00 1 1.93758E+01 1.71160E+02 -1.91456E+01 2.97766E+00 + 0.22440E+01 0.28560E+01 0.00000E+00 0.00000E+00 3 2.10563E+00 -1.69193E+01 2.01449E+00 -6.12789E-01 + 0.22440E+01 0.28560E+01 0.00000E+00 0.00000E+00 5 6.96320E+01 3.23632E+01 5.88162E+01 3.72729E+01 + 0.22440E+01 0.28560E+01 0.00000E+00 0.00000E+00 2 6.78470E-07 -1.15982E+02 -2.97228E-07 -6.09900E-07 + 0.22440E+01 0.28560E+01 0.00000E+00 0.00000E+00 4 1.89001E-06 7.60956E+01 4.54173E-07 1.83463E-06 + 0.22440E+01 0.28560E+01 0.00000E+00 0.00000E+00 6 1.76770E-04 1.76673E+02 -1.76472E-04 1.02595E-05 + 0.22046E+01 0.28560E+01 0.00000E+00 0.00000E+00 1 2.04130E+01 1.69713E+02 -2.00849E+01 3.64533E+00 + 0.22046E+01 0.28560E+01 0.00000E+00 0.00000E+00 3 6.38442E-01 1.58382E+02 -5.93534E-01 2.35212E-01 + 0.22046E+01 0.28560E+01 0.00000E+00 0.00000E+00 5 5.34053E+01 5.82665E+01 2.80895E+01 4.54214E+01 + 0.22046E+01 0.28560E+01 0.00000E+00 0.00000E+00 2 9.68627E-07 -1.31188E+02 -6.37875E-07 -7.28940E-07 + 0.22046E+01 0.28560E+01 0.00000E+00 0.00000E+00 4 1.61081E-06 5.30040E+01 9.69322E-07 1.28652E-06 + 0.22046E+01 0.28560E+01 0.00000E+00 0.00000E+00 6 6.98023E-05 -2.54073E+01 6.30511E-05 -2.99487E-05 + 0.21666E+01 0.28560E+01 0.00000E+00 0.00000E+00 1 4.99591E+00 1.28006E+02 -3.07619E+00 3.93652E+00 + 0.21666E+01 0.28560E+01 0.00000E+00 0.00000E+00 3 1.51623E+00 -1.64389E+02 -1.46030E+00 -4.08031E-01 + 0.21666E+01 0.28560E+01 0.00000E+00 0.00000E+00 5 5.00677E+00 -1.60199E+01 4.81234E+00 -1.38173E+00 + 0.21666E+01 0.28560E+01 0.00000E+00 0.00000E+00 2 2.01144E-06 1.03512E+02 -4.69964E-07 1.95576E-06 + 0.21666E+01 0.28560E+01 0.00000E+00 0.00000E+00 4 3.38270E-06 -9.68797E+01 -4.05197E-07 -3.35834E-06 + 0.21666E+01 0.28560E+01 0.00000E+00 0.00000E+00 6 8.59911E-05 7.74065E+01 1.87489E-05 8.39223E-05 + 0.21299E+01 0.28560E+01 0.00000E+00 0.00000E+00 1 1.79958E+01 3.25498E+01 1.51691E+01 9.68234E+00 + 0.21299E+01 0.28560E+01 0.00000E+00 0.00000E+00 3 9.81263E-01 -1.67439E+02 -9.57777E-01 -2.13398E-01 + 0.21299E+01 0.28560E+01 0.00000E+00 0.00000E+00 5 6.56998E+01 -7.56039E+01 1.63345E+01 -6.36368E+01 + 0.21299E+01 0.28560E+01 0.00000E+00 0.00000E+00 2 7.40134E-07 7.47946E+01 1.94122E-07 7.14223E-07 + 0.21299E+01 0.28560E+01 0.00000E+00 0.00000E+00 4 4.33592E-06 -9.10201E+01 -7.71960E-08 -4.33523E-06 + 0.21299E+01 0.28560E+01 0.00000E+00 0.00000E+00 6 1.27932E-04 1.09479E+02 -4.26609E-05 1.20610E-04 + 0.20944E+01 0.28560E+01 0.00000E+00 0.00000E+00 1 1.40725E+01 2.61119E+01 1.26362E+01 6.19368E+00 + 0.20944E+01 0.28560E+01 0.00000E+00 0.00000E+00 3 8.83654E-01 -2.14788E+01 8.22287E-01 -3.23555E-01 + 0.20944E+01 0.28560E+01 0.00000E+00 0.00000E+00 5 4.45042E+01 -5.53691E+01 2.52911E+01 -3.66194E+01 + 0.20944E+01 0.28560E+01 0.00000E+00 0.00000E+00 2 1.03091E-06 9.44356E+01 -7.97287E-08 1.02783E-06 + 0.20944E+01 0.28560E+01 0.00000E+00 0.00000E+00 4 2.12337E-06 -2.62212E+01 1.90486E-06 -9.38183E-07 + 0.20944E+01 0.28560E+01 0.00000E+00 0.00000E+00 6 1.80284E-04 -1.76287E+02 -1.79906E-04 -1.16764E-05 + 0.27925E+01 0.27925E+01 0.00000E+00 0.00000E+00 1 1.21616E+00 0.00000E+00 1.21616E+00 0.00000E+00 + 0.27925E+01 0.27925E+01 0.00000E+00 0.00000E+00 3 8.75154E-04 0.00000E+00 8.75154E-04 0.00000E+00 + 0.27925E+01 0.27925E+01 0.00000E+00 0.00000E+00 5 1.32386E+01 0.00000E+00 1.32386E+01 0.00000E+00 + 0.27925E+01 0.27925E+01 0.00000E+00 0.00000E+00 2 1.26564E-06 0.00000E+00 1.26564E-06 0.00000E+00 + 0.27925E+01 0.27925E+01 0.00000E+00 0.00000E+00 4 7.21829E-07 0.00000E+00 7.21829E-07 0.00000E+00 + 0.27925E+01 0.27925E+01 0.00000E+00 0.00000E+00 6 6.58881E-05 0.00000E+00 6.58881E-05 0.00000E+00 + 0.27318E+01 0.27925E+01 0.00000E+00 0.00000E+00 1 2.99689E+00 -8.57624E+01 2.21449E-01 -2.98870E+00 + 0.27318E+01 0.27925E+01 0.00000E+00 0.00000E+00 3 1.69605E+00 -6.36262E+00 1.68561E+00 -1.87958E-01 + 0.27318E+01 0.27925E+01 0.00000E+00 0.00000E+00 5 3.12425E+01 4.77437E+01 2.10089E+01 2.31239E+01 + 0.27318E+01 0.27925E+01 0.00000E+00 0.00000E+00 2 3.90400E-06 -1.37755E+02 -2.89002E-06 -2.62468E-06 + 0.27318E+01 0.27925E+01 0.00000E+00 0.00000E+00 4 3.97613E-06 1.17488E+02 -1.83521E-06 3.52727E-06 + 0.27318E+01 0.27925E+01 0.00000E+00 0.00000E+00 6 1.07980E-04 -1.43028E+02 -8.62682E-05 -6.49417E-05 + 0.26737E+01 0.27925E+01 0.00000E+00 0.00000E+00 1 5.25264E+00 -1.38376E+02 -3.92647E+00 -3.48899E+00 + 0.26737E+01 0.27925E+01 0.00000E+00 0.00000E+00 3 4.80379E+00 -8.21597E+00 4.75449E+00 -6.86485E-01 + 0.26737E+01 0.27925E+01 0.00000E+00 0.00000E+00 5 1.05892E+02 7.78254E+01 2.23316E+01 1.03510E+02 + 0.26737E+01 0.27925E+01 0.00000E+00 0.00000E+00 2 4.34380E-06 1.12819E+02 -1.68461E-06 4.00384E-06 + 0.26737E+01 0.27925E+01 0.00000E+00 0.00000E+00 4 4.25874E-06 7.74177E+01 9.27729E-07 4.15646E-06 + 0.26737E+01 0.27925E+01 0.00000E+00 0.00000E+00 6 5.24343E-04 -5.58042E+01 2.94693E-04 -4.33696E-04 + 0.26180E+01 0.27925E+01 0.00000E+00 0.00000E+00 1 1.02808E+01 1.69702E+02 -1.01152E+01 1.83780E+00 + 0.26180E+01 0.27925E+01 0.00000E+00 0.00000E+00 3 5.28256E+00 -3.71599E+01 4.20995E+00 -3.19089E+00 + 0.26180E+01 0.27925E+01 0.00000E+00 0.00000E+00 5 1.32184E+02 8.17516E+01 1.89638E+01 1.30816E+02 + 0.26180E+01 0.27925E+01 0.00000E+00 0.00000E+00 2 1.03961E-06 -1.77630E+02 -1.03872E-06 -4.29921E-08 + 0.26180E+01 0.27925E+01 0.00000E+00 0.00000E+00 4 1.29266E-05 2.39625E+00 1.29153E-05 5.40462E-07 + 0.26180E+01 0.27925E+01 0.00000E+00 0.00000E+00 6 2.55113E-04 -2.30168E+01 2.34803E-04 -9.97494E-05 + 0.25646E+01 0.27925E+01 0.00000E+00 0.00000E+00 1 1.34537E+01 1.60128E+02 -1.26526E+01 4.57323E+00 + 0.25646E+01 0.27925E+01 0.00000E+00 0.00000E+00 3 7.09561E+00 -8.32269E+01 8.36835E-01 -7.04609E+00 + 0.25646E+01 0.27925E+01 0.00000E+00 0.00000E+00 5 8.62840E+01 6.07027E+01 4.22223E+01 7.52476E+01 + 0.25646E+01 0.27925E+01 0.00000E+00 0.00000E+00 2 6.66437E-06 -6.19825E+01 3.13053E-06 -5.88333E-06 + 0.25646E+01 0.27925E+01 0.00000E+00 0.00000E+00 4 1.49611E-06 4.31931E+01 1.09074E-06 1.02403E-06 + 0.25646E+01 0.27925E+01 0.00000E+00 0.00000E+00 6 2.17590E-04 4.36931E+00 2.16957E-04 1.65770E-05 + 0.25133E+01 0.27925E+01 0.00000E+00 0.00000E+00 1 5.74495E+00 1.12412E+02 -2.19032E+00 5.31102E+00 + 0.25133E+01 0.27925E+01 0.00000E+00 0.00000E+00 3 8.84963E+00 -1.00659E+02 -1.63686E+00 -8.69693E+00 + 0.25133E+01 0.27925E+01 0.00000E+00 0.00000E+00 5 6.98582E+01 1.14147E+01 6.84765E+01 1.38256E+01 + 0.25133E+01 0.27925E+01 0.00000E+00 0.00000E+00 2 1.45669E-06 1.53147E+02 -1.29961E-06 6.58002E-07 + 0.25133E+01 0.27925E+01 0.00000E+00 0.00000E+00 4 2.08655E-06 1.71101E+01 1.99420E-06 6.13882E-07 + 0.25133E+01 0.27925E+01 0.00000E+00 0.00000E+00 6 2.47259E-04 -2.94702E+01 2.15267E-04 -1.21645E-04 + 0.24640E+01 0.27925E+01 0.00000E+00 0.00000E+00 1 1.24994E+01 1.75067E+01 1.19205E+01 3.76004E+00 + 0.24640E+01 0.27925E+01 0.00000E+00 0.00000E+00 3 6.79684E+00 -1.12944E+02 -2.64967E+00 -6.25909E+00 + 0.24640E+01 0.27925E+01 0.00000E+00 0.00000E+00 5 6.91018E+01 4.03998E-01 6.91001E+01 4.87240E-01 + 0.24640E+01 0.27925E+01 0.00000E+00 0.00000E+00 2 3.71749E-06 1.11105E+02 -1.33857E-06 3.46814E-06 + 0.24640E+01 0.27925E+01 0.00000E+00 0.00000E+00 4 8.77516E-06 -9.98944E+01 -1.50786E-06 -8.64464E-06 + 0.24640E+01 0.27925E+01 0.00000E+00 0.00000E+00 6 2.29703E-04 -7.76460E+01 4.91453E-05 -2.24384E-04 + 0.24166E+01 0.27925E+01 0.00000E+00 0.00000E+00 1 1.67570E+01 1.76369E+01 1.59693E+01 5.07708E+00 + 0.24166E+01 0.27925E+01 0.00000E+00 0.00000E+00 3 4.17591E+00 -1.53770E+02 -3.74591E+00 -1.84564E+00 + 0.24166E+01 0.27925E+01 0.00000E+00 0.00000E+00 5 3.32540E+01 -9.60656E+00 3.27877E+01 -5.54948E+00 + 0.24166E+01 0.27925E+01 0.00000E+00 0.00000E+00 2 9.58634E-07 -1.53250E+02 -8.56037E-07 -4.31486E-07 + 0.24166E+01 0.27925E+01 0.00000E+00 0.00000E+00 4 2.22483E-06 -7.77877E+01 4.70628E-07 -2.17448E-06 + 0.24166E+01 0.27925E+01 0.00000E+00 0.00000E+00 6 4.34599E-05 -1.12554E+02 -1.66693E-05 -4.01360E-05 + 0.23710E+01 0.27925E+01 0.00000E+00 0.00000E+00 1 8.63124E+00 -4.84844E+01 5.72100E+00 -6.46286E+00 + 0.23710E+01 0.27925E+01 0.00000E+00 0.00000E+00 3 4.96646E+00 1.66124E+02 -4.82152E+00 1.19105E+00 + 0.23710E+01 0.27925E+01 0.00000E+00 0.00000E+00 5 3.27101E+01 7.01479E+01 1.11082E+01 3.07662E+01 + 0.23710E+01 0.27925E+01 0.00000E+00 0.00000E+00 2 3.78819E-06 3.77693E+01 2.99450E-06 2.32020E-06 + 0.23710E+01 0.27925E+01 0.00000E+00 0.00000E+00 4 9.50462E-07 1.16165E+02 -4.19119E-07 8.53063E-07 + 0.23710E+01 0.27925E+01 0.00000E+00 0.00000E+00 6 9.79233E-05 -1.28307E+02 -6.07007E-05 -7.68401E-05 + 0.23271E+01 0.27925E+01 0.00000E+00 0.00000E+00 1 2.24513E+01 -9.50507E+01 -1.97656E+00 -2.23641E+01 + 0.23271E+01 0.27925E+01 0.00000E+00 0.00000E+00 3 3.70165E+00 1.52356E+02 -3.27909E+00 1.71750E+00 + 0.23271E+01 0.27925E+01 0.00000E+00 0.00000E+00 5 5.49267E+01 9.14186E+01 -1.35977E+00 5.49098E+01 + 0.23271E+01 0.27925E+01 0.00000E+00 0.00000E+00 2 8.60613E-07 9.99467E+01 -1.48655E-07 8.47677E-07 + 0.23271E+01 0.27925E+01 0.00000E+00 0.00000E+00 4 4.29007E-06 -8.08523E+01 6.82038E-07 -4.23550E-06 + 0.23271E+01 0.27925E+01 0.00000E+00 0.00000E+00 6 1.80876E-04 -5.61221E+01 1.00825E-04 -1.50168E-04 + 0.22848E+01 0.27925E+01 0.00000E+00 0.00000E+00 1 2.51988E+01 -9.52845E+01 -2.32082E+00 -2.50917E+01 + 0.22848E+01 0.27925E+01 0.00000E+00 0.00000E+00 3 7.35137E-01 7.40248E+01 2.02325E-01 7.06746E-01 + 0.22848E+01 0.27925E+01 0.00000E+00 0.00000E+00 5 4.68186E+01 8.73144E+01 2.19372E+00 4.67672E+01 + 0.22848E+01 0.27925E+01 0.00000E+00 0.00000E+00 2 2.65047E-06 4.30846E+01 1.93576E-06 1.81048E-06 + 0.22848E+01 0.27925E+01 0.00000E+00 0.00000E+00 4 9.38394E-07 -1.51538E+02 -8.24977E-07 -4.47209E-07 + 0.22848E+01 0.27925E+01 0.00000E+00 0.00000E+00 6 8.10926E-05 1.36487E+02 -5.88103E-05 5.58333E-05 + 0.22440E+01 0.27925E+01 0.00000E+00 0.00000E+00 1 1.20633E+01 -1.37775E+02 -8.93301E+00 -8.10708E+00 + 0.22440E+01 0.27925E+01 0.00000E+00 0.00000E+00 3 2.78578E+00 1.52381E+00 2.78479E+00 7.40804E-02 + 0.22440E+01 0.27925E+01 0.00000E+00 0.00000E+00 5 5.02338E+01 2.70231E+01 4.47495E+01 2.28237E+01 + 0.22440E+01 0.27925E+01 0.00000E+00 0.00000E+00 2 1.23247E-06 -6.73666E+01 4.74295E-07 -1.13755E-06 + 0.22440E+01 0.27925E+01 0.00000E+00 0.00000E+00 4 4.45884E-06 -6.47148E+00 4.43043E-06 -5.02550E-07 + 0.22440E+01 0.27925E+01 0.00000E+00 0.00000E+00 6 1.28790E-04 -3.17769E+00 1.28592E-04 -7.13918E-06 + 0.22046E+01 0.27925E+01 0.00000E+00 0.00000E+00 1 2.07107E+01 1.66200E+02 -2.01128E+01 4.94015E+00 + 0.22046E+01 0.27925E+01 0.00000E+00 0.00000E+00 3 1.74341E+00 -1.38622E+01 1.69263E+00 -4.17700E-01 + 0.22046E+01 0.27925E+01 0.00000E+00 0.00000E+00 5 6.22825E+01 2.45357E+01 5.66586E+01 2.58634E+01 + 0.22046E+01 0.27925E+01 0.00000E+00 0.00000E+00 2 3.31035E-07 1.38692E+02 -2.48665E-07 2.18517E-07 + 0.22046E+01 0.27925E+01 0.00000E+00 0.00000E+00 4 5.51568E-07 1.56870E+02 -5.07231E-07 2.16666E-07 + 0.22046E+01 0.27925E+01 0.00000E+00 0.00000E+00 6 4.84965E-05 5.24995E+01 2.95231E-05 3.84746E-05 + 0.21666E+01 0.27925E+01 0.00000E+00 0.00000E+00 1 1.92058E+01 1.69288E+02 -1.88711E+01 3.56997E+00 + 0.21666E+01 0.27925E+01 0.00000E+00 0.00000E+00 3 1.01868E+00 -1.69913E+02 -1.00293E+00 -1.78412E-01 + 0.21666E+01 0.27925E+01 0.00000E+00 0.00000E+00 5 3.95483E+01 4.15908E+01 2.95784E+01 2.62524E+01 + 0.21666E+01 0.27925E+01 0.00000E+00 0.00000E+00 2 2.28219E-06 1.74684E+02 -2.27237E-06 2.11461E-07 + 0.21666E+01 0.27925E+01 0.00000E+00 0.00000E+00 4 1.16054E-06 1.08789E+02 -3.73789E-07 1.09869E-06 + 0.21666E+01 0.27925E+01 0.00000E+00 0.00000E+00 6 5.10827E-05 3.62955E+01 4.11713E-05 3.02384E-05 + 0.21299E+01 0.27925E+01 0.00000E+00 0.00000E+00 1 5.78640E+00 6.73837E+01 2.22520E+00 5.34143E+00 + 0.21299E+01 0.27925E+01 0.00000E+00 0.00000E+00 3 1.74343E+00 -1.56168E+02 -1.59478E+00 -7.04442E-01 + 0.21299E+01 0.27925E+01 0.00000E+00 0.00000E+00 5 1.70183E+01 -9.16251E+01 -4.82640E-01 -1.70114E+01 + 0.21299E+01 0.27925E+01 0.00000E+00 0.00000E+00 2 2.72935E-06 -7.43510E+01 7.36222E-07 -2.62817E-06 + 0.21299E+01 0.27925E+01 0.00000E+00 0.00000E+00 4 2.06740E-06 -2.89679E+01 1.80875E-06 -1.00128E-06 + 0.21299E+01 0.27925E+01 0.00000E+00 0.00000E+00 6 3.38845E-04 9.29410E+01 -1.73852E-05 3.38399E-04 + 0.20944E+01 0.27925E+01 0.00000E+00 0.00000E+00 1 2.00217E+01 3.35211E+01 1.66918E+01 1.10569E+01 + 0.20944E+01 0.27925E+01 0.00000E+00 0.00000E+00 3 6.96733E-01 -1.58725E+02 -6.49250E-01 -2.52808E-01 + 0.20944E+01 0.27925E+01 0.00000E+00 0.00000E+00 5 7.21482E+01 -6.87173E+01 2.61876E+01 -6.72278E+01 + 0.20944E+01 0.27925E+01 0.00000E+00 0.00000E+00 2 1.70298E-06 -1.26619E+02 -1.01581E-06 -1.36685E-06 + 0.20944E+01 0.27925E+01 0.00000E+00 0.00000E+00 4 2.52174E-06 -8.50161E+01 2.19078E-07 -2.51220E-06 + 0.20944E+01 0.27925E+01 0.00000E+00 0.00000E+00 6 2.54497E-04 8.88888E+01 4.93535E-06 2.54449E-04 + 0.27318E+01 0.27318E+01 0.00000E+00 0.00000E+00 1 9.88159E-01 0.00000E+00 9.88159E-01 0.00000E+00 + 0.27318E+01 0.27318E+01 0.00000E+00 0.00000E+00 3 5.88477E-04 0.00000E+00 5.88477E-04 0.00000E+00 + 0.27318E+01 0.27318E+01 0.00000E+00 0.00000E+00 5 1.35555E+01 0.00000E+00 1.35555E+01 0.00000E+00 + 0.27318E+01 0.27318E+01 0.00000E+00 0.00000E+00 2 3.33124E-06 1.80000E+02 -3.33124E-06 0.00000E+00 + 0.27318E+01 0.27318E+01 0.00000E+00 0.00000E+00 4 1.17964E-05 1.80000E+02 -1.17964E-05 0.00000E+00 + 0.27318E+01 0.27318E+01 0.00000E+00 0.00000E+00 6 2.14546E-04 1.80000E+02 -2.14546E-04 0.00000E+00 + 0.26737E+01 0.27318E+01 0.00000E+00 0.00000E+00 1 3.04400E+00 -9.81010E+01 -4.28958E-01 -3.01363E+00 + 0.26737E+01 0.27318E+01 0.00000E+00 0.00000E+00 3 1.77980E+00 -4.83644E+00 1.77346E+00 -1.50058E-01 + 0.26737E+01 0.27318E+01 0.00000E+00 0.00000E+00 5 3.44279E+01 4.92137E+01 2.24897E+01 2.60671E+01 + 0.26737E+01 0.27318E+01 0.00000E+00 0.00000E+00 2 1.82742E-06 -1.68174E+02 -1.78863E-06 -3.74498E-07 + 0.26737E+01 0.27318E+01 0.00000E+00 0.00000E+00 4 4.85704E-06 3.57594E+01 3.94138E-06 2.83837E-06 + 0.26737E+01 0.27318E+01 0.00000E+00 0.00000E+00 6 8.20018E-05 7.51696E+01 2.09891E-05 7.92701E-05 + 0.26180E+01 0.27318E+01 0.00000E+00 0.00000E+00 1 4.87437E+00 -1.44580E+02 -3.97226E+00 -2.82500E+00 + 0.26180E+01 0.27318E+01 0.00000E+00 0.00000E+00 3 4.87744E+00 -7.53151E+00 4.83537E+00 -6.39294E-01 + 0.26180E+01 0.27318E+01 0.00000E+00 0.00000E+00 5 1.05867E+02 7.70618E+01 2.37037E+01 1.03179E+02 + 0.26180E+01 0.27318E+01 0.00000E+00 0.00000E+00 2 3.83286E-06 3.69927E+01 3.06135E-06 2.30628E-06 + 0.26180E+01 0.27318E+01 0.00000E+00 0.00000E+00 4 4.72130E-06 4.72995E+01 3.20183E-06 3.46972E-06 + 0.26180E+01 0.27318E+01 0.00000E+00 0.00000E+00 6 4.19212E-04 -4.31346E+01 3.05920E-04 -2.86622E-04 + 0.25646E+01 0.27318E+01 0.00000E+00 0.00000E+00 1 9.26384E+00 1.70794E+02 -9.14451E+00 1.48215E+00 + 0.25646E+01 0.27318E+01 0.00000E+00 0.00000E+00 3 4.89316E+00 -3.29770E+01 4.10482E+00 -2.66336E+00 + 0.25646E+01 0.27318E+01 0.00000E+00 0.00000E+00 5 1.34512E+02 8.26866E+01 1.71230E+01 1.33418E+02 + 0.25646E+01 0.27318E+01 0.00000E+00 0.00000E+00 2 1.18969E-06 -1.09852E+02 -4.04002E-07 -1.11899E-06 + 0.25646E+01 0.27318E+01 0.00000E+00 0.00000E+00 4 5.55081E-06 -5.17166E+01 3.43902E-06 -4.35714E-06 + 0.25646E+01 0.27318E+01 0.00000E+00 0.00000E+00 6 3.18843E-04 4.16089E+00 3.18002E-04 2.31344E-05 + 0.25133E+01 0.27318E+01 0.00000E+00 0.00000E+00 1 1.27326E+01 1.52623E+02 -1.13065E+01 5.85507E+00 + 0.25133E+01 0.27318E+01 0.00000E+00 0.00000E+00 3 7.01183E+00 -8.71831E+01 3.44595E-01 -7.00336E+00 + 0.25133E+01 0.27318E+01 0.00000E+00 0.00000E+00 5 6.64709E+01 5.76319E+01 3.55856E+01 5.61430E+01 + 0.25133E+01 0.27318E+01 0.00000E+00 0.00000E+00 2 3.33667E-06 -3.45026E+01 2.74975E-06 -1.89004E-06 + 0.25133E+01 0.27318E+01 0.00000E+00 0.00000E+00 4 5.83528E-06 -1.37436E+02 -4.29779E-06 -3.94708E-06 + 0.25133E+01 0.27318E+01 0.00000E+00 0.00000E+00 6 7.23275E-05 2.03473E+01 6.78144E-05 2.51490E-05 + 0.24640E+01 0.27318E+01 0.00000E+00 0.00000E+00 1 3.09384E+00 1.05706E+02 -8.37508E-01 2.97833E+00 + 0.24640E+01 0.27318E+01 0.00000E+00 0.00000E+00 3 7.95930E+00 -1.01065E+02 -1.52758E+00 -7.81134E+00 + 0.24640E+01 0.27318E+01 0.00000E+00 0.00000E+00 5 5.68897E+01 1.75703E+01 5.42357E+01 1.71737E+01 + 0.24640E+01 0.27318E+01 0.00000E+00 0.00000E+00 2 7.25244E-06 -3.99520E+00 7.23481E-06 -5.05298E-07 + 0.24640E+01 0.27318E+01 0.00000E+00 0.00000E+00 4 6.30310E-06 8.48102E+00 6.23417E-06 9.29592E-07 + 0.24640E+01 0.27318E+01 0.00000E+00 0.00000E+00 6 3.35166E-04 -1.61832E+02 -3.18457E-04 -1.04506E-04 + 0.24166E+01 0.27318E+01 0.00000E+00 0.00000E+00 1 1.32653E+01 1.30554E+01 1.29224E+01 2.99654E+00 + 0.24166E+01 0.27318E+01 0.00000E+00 0.00000E+00 3 5.64110E+00 -1.11906E+02 -2.10457E+00 -5.23381E+00 + 0.24166E+01 0.27318E+01 0.00000E+00 0.00000E+00 5 5.89150E+01 -3.44970E+00 5.88082E+01 -3.54505E+00 + 0.24166E+01 0.27318E+01 0.00000E+00 0.00000E+00 2 1.65142E-06 -9.40526E+01 -1.16709E-07 -1.64729E-06 + 0.24166E+01 0.27318E+01 0.00000E+00 0.00000E+00 4 2.44106E-06 1.42608E+02 -1.93943E-06 1.48235E-06 + 0.24166E+01 0.27318E+01 0.00000E+00 0.00000E+00 6 5.09806E-05 1.69801E+02 -5.01751E-05 9.02665E-06 + 0.23710E+01 0.27318E+01 0.00000E+00 0.00000E+00 1 1.48222E+01 1.11695E+01 1.45414E+01 2.87122E+00 + 0.23710E+01 0.27318E+01 0.00000E+00 0.00000E+00 3 3.83740E+00 -1.62215E+02 -3.65400E+00 -1.17213E+00 + 0.23710E+01 0.27318E+01 0.00000E+00 0.00000E+00 5 1.98519E+01 3.17369E+00 1.98214E+01 1.09906E+00 + 0.23710E+01 0.27318E+01 0.00000E+00 0.00000E+00 2 5.16607E-07 9.47227E+01 -4.25336E-08 5.14853E-07 + 0.23710E+01 0.27318E+01 0.00000E+00 0.00000E+00 4 3.44561E-07 -1.04890E+02 -8.85375E-08 -3.32992E-07 + 0.23710E+01 0.27318E+01 0.00000E+00 0.00000E+00 6 6.74514E-05 5.80933E+01 3.56506E-05 5.72602E-05 + 0.23271E+01 0.27318E+01 0.00000E+00 0.00000E+00 1 9.93171E+00 -5.71547E+01 5.38669E+00 -8.34401E+00 + 0.23271E+01 0.27318E+01 0.00000E+00 0.00000E+00 3 4.22904E+00 1.65470E+02 -4.09377E+00 1.06103E+00 + 0.23271E+01 0.27318E+01 0.00000E+00 0.00000E+00 5 4.08187E+01 9.19603E+01 -1.39631E+00 4.07948E+01 + 0.23271E+01 0.27318E+01 0.00000E+00 0.00000E+00 2 2.77704E-06 8.55216E+01 2.16841E-07 2.76856E-06 + 0.23271E+01 0.27318E+01 0.00000E+00 0.00000E+00 4 1.44138E-06 2.30221E+01 1.32658E-06 5.63703E-07 + 0.23271E+01 0.27318E+01 0.00000E+00 0.00000E+00 6 1.99466E-04 -1.07664E+02 -6.05256E-05 -1.90062E-04 + 0.22848E+01 0.27318E+01 0.00000E+00 0.00000E+00 1 2.48546E+01 -9.68734E+01 -2.97451E+00 -2.46760E+01 + 0.22848E+01 0.27318E+01 0.00000E+00 0.00000E+00 3 2.68514E+00 1.55477E+02 -2.44292E+00 1.11451E+00 + 0.22848E+01 0.27318E+01 0.00000E+00 0.00000E+00 5 5.40682E+01 9.82983E+01 -7.80348E+00 5.35022E+01 + 0.22848E+01 0.27318E+01 0.00000E+00 0.00000E+00 2 1.56654E-06 1.40237E+02 -1.20419E-06 1.00198E-06 + 0.22848E+01 0.27318E+01 0.00000E+00 0.00000E+00 4 7.13940E-06 -4.37004E+00 7.11865E-06 -5.44006E-07 + 0.22848E+01 0.27318E+01 0.00000E+00 0.00000E+00 6 1.06412E-04 1.07515E+02 -3.20260E-05 1.01479E-04 + 0.22440E+01 0.27318E+01 0.00000E+00 0.00000E+00 1 2.41132E+01 -9.77061E+01 -3.23338E+00 -2.38954E+01 + 0.22440E+01 0.27318E+01 0.00000E+00 0.00000E+00 3 1.03312E+00 3.07853E+01 8.87542E-01 5.28773E-01 + 0.22440E+01 0.27318E+01 0.00000E+00 0.00000E+00 5 6.06884E+01 8.35523E+01 6.81514E+00 6.03046E+01 + 0.22440E+01 0.27318E+01 0.00000E+00 0.00000E+00 2 1.40854E-06 -7.70794E+01 3.14951E-07 -1.37287E-06 + 0.22440E+01 0.27318E+01 0.00000E+00 0.00000E+00 4 2.95379E-06 -4.72397E+01 2.00542E-06 -2.16868E-06 + 0.22440E+01 0.27318E+01 0.00000E+00 0.00000E+00 6 3.21778E-05 1.60313E+02 -3.02970E-05 1.08399E-05 + 0.22046E+01 0.27318E+01 0.00000E+00 0.00000E+00 1 1.20745E+01 -1.49065E+02 -1.03569E+01 -6.20717E+00 + 0.22046E+01 0.27318E+01 0.00000E+00 0.00000E+00 3 2.77604E+00 -9.83558E-01 2.77563E+00 -4.76520E-02 + 0.22046E+01 0.27318E+01 0.00000E+00 0.00000E+00 5 5.36922E+01 3.02980E+01 4.63585E+01 2.70876E+01 + 0.22046E+01 0.27318E+01 0.00000E+00 0.00000E+00 2 1.24236E-06 5.49462E+00 1.23665E-06 1.18958E-07 + 0.22046E+01 0.27318E+01 0.00000E+00 0.00000E+00 4 2.52431E-06 1.55736E+01 2.43164E-06 6.77720E-07 + 0.22046E+01 0.27318E+01 0.00000E+00 0.00000E+00 6 7.09017E-05 -3.77725E+00 7.07477E-05 -4.67084E-06 + 0.21666E+01 0.27318E+01 0.00000E+00 0.00000E+00 1 2.16159E+01 1.67220E+02 -2.10804E+01 4.78171E+00 + 0.21666E+01 0.27318E+01 0.00000E+00 0.00000E+00 3 8.45370E-01 -1.99200E+01 7.94791E-01 -2.88024E-01 + 0.21666E+01 0.27318E+01 0.00000E+00 0.00000E+00 5 6.21901E+01 3.26116E+01 5.23854E+01 3.35168E+01 + 0.21666E+01 0.27318E+01 0.00000E+00 0.00000E+00 2 6.35578E-07 1.48741E+02 -5.43312E-07 3.29807E-07 + 0.21666E+01 0.27318E+01 0.00000E+00 0.00000E+00 4 4.44986E-06 8.68346E+01 2.45717E-07 4.44307E-06 + 0.21666E+01 0.27318E+01 0.00000E+00 0.00000E+00 6 1.02991E-04 -5.62825E+01 5.71700E-05 -8.56660E-05 + 0.21299E+01 0.27318E+01 0.00000E+00 0.00000E+00 1 1.58698E+01 1.73840E+02 -1.57781E+01 1.70297E+00 + 0.21299E+01 0.27318E+01 0.00000E+00 0.00000E+00 3 1.42874E+00 1.74471E+02 -1.42209E+00 1.37648E-01 + 0.21299E+01 0.27318E+01 0.00000E+00 0.00000E+00 5 2.47913E+01 3.91596E+01 1.92229E+01 1.56553E+01 + 0.21299E+01 0.27318E+01 0.00000E+00 0.00000E+00 2 9.46399E-07 -7.56923E+00 9.38152E-07 -1.24664E-07 + 0.21299E+01 0.27318E+01 0.00000E+00 0.00000E+00 4 2.10982E-06 1.69855E+02 -2.07684E-06 3.71621E-07 + 0.21299E+01 0.27318E+01 0.00000E+00 0.00000E+00 6 4.44561E-05 -7.51622E+01 1.13845E-05 -4.29736E-05 + 0.20944E+01 0.27318E+01 0.00000E+00 0.00000E+00 1 1.19579E+01 3.06224E+01 1.02903E+01 6.09109E+00 + 0.20944E+01 0.27318E+01 0.00000E+00 0.00000E+00 3 2.01573E+00 -1.65367E+02 -1.95034E+00 -5.09244E-01 + 0.20944E+01 0.27318E+01 0.00000E+00 0.00000E+00 5 2.88466E+01 -1.01924E+02 -5.96013E+00 -2.82242E+01 + 0.20944E+01 0.27318E+01 0.00000E+00 0.00000E+00 2 3.87432E-06 8.05708E+01 6.34722E-07 3.82198E-06 + 0.20944E+01 0.27318E+01 0.00000E+00 0.00000E+00 4 4.94141E-06 9.31243E+01 -2.69318E-07 4.93407E-06 + 0.20944E+01 0.27318E+01 0.00000E+00 0.00000E+00 6 4.13474E-05 -7.85680E+01 8.19524E-06 -4.05271E-05 + 0.26737E+01 0.26737E+01 0.00000E+00 0.00000E+00 1 3.70012E-01 0.00000E+00 3.70012E-01 0.00000E+00 + 0.26737E+01 0.26737E+01 0.00000E+00 0.00000E+00 3 2.92609E-04 0.00000E+00 2.92609E-04 0.00000E+00 + 0.26737E+01 0.26737E+01 0.00000E+00 0.00000E+00 5 1.43914E+01 0.00000E+00 1.43914E+01 0.00000E+00 + 0.26737E+01 0.26737E+01 0.00000E+00 0.00000E+00 2 4.20897E-06 0.00000E+00 4.20897E-06 0.00000E+00 + 0.26737E+01 0.26737E+01 0.00000E+00 0.00000E+00 4 5.53729E-06 0.00000E+00 5.53729E-06 0.00000E+00 + 0.26737E+01 0.26737E+01 0.00000E+00 0.00000E+00 6 3.04325E-05 0.00000E+00 3.04325E-05 0.00000E+00 + 0.26180E+01 0.26737E+01 0.00000E+00 0.00000E+00 1 2.62650E+00 -1.11336E+02 -9.55616E-01 -2.44649E+00 + 0.26180E+01 0.26737E+01 0.00000E+00 0.00000E+00 3 1.84064E+00 -6.05397E+00 1.83037E+00 -1.94123E-01 + 0.26180E+01 0.26737E+01 0.00000E+00 0.00000E+00 5 3.27263E+01 4.57963E+01 2.28171E+01 2.34604E+01 + 0.26180E+01 0.26737E+01 0.00000E+00 0.00000E+00 2 2.51730E-06 -8.56758E+01 1.89802E-07 -2.51013E-06 + 0.26180E+01 0.26737E+01 0.00000E+00 0.00000E+00 4 6.50271E-06 1.13448E+02 -2.58755E-06 5.96572E-06 + 0.26180E+01 0.26737E+01 0.00000E+00 0.00000E+00 6 2.30119E-04 -1.24221E+02 -1.29415E-04 -1.90280E-04 + 0.25646E+01 0.26737E+01 0.00000E+00 0.00000E+00 1 4.20855E+00 -1.47226E+02 -3.53862E+00 -2.27817E+00 + 0.25646E+01 0.26737E+01 0.00000E+00 0.00000E+00 3 4.84088E+00 -8.06122E+00 4.79304E+00 -6.78842E-01 + 0.25646E+01 0.26737E+01 0.00000E+00 0.00000E+00 5 1.11344E+02 8.06424E+01 1.81041E+01 1.09862E+02 + 0.25646E+01 0.26737E+01 0.00000E+00 0.00000E+00 2 2.30228E-06 1.63308E+02 -2.20527E-06 6.61272E-07 + 0.25646E+01 0.26737E+01 0.00000E+00 0.00000E+00 4 3.47938E-06 1.67803E+01 3.33122E-06 1.00451E-06 + 0.25646E+01 0.26737E+01 0.00000E+00 0.00000E+00 6 2.23469E-04 2.69963E+01 1.99119E-04 1.01440E-04 + 0.25133E+01 0.26737E+01 0.00000E+00 0.00000E+00 1 1.04750E+01 1.61748E+02 -9.94795E+00 3.28069E+00 + 0.25133E+01 0.26737E+01 0.00000E+00 0.00000E+00 3 5.24238E+00 -4.09580E+01 3.95899E+00 -3.43641E+00 + 0.25133E+01 0.26737E+01 0.00000E+00 0.00000E+00 5 1.23620E+02 8.04268E+01 2.05589E+01 1.21899E+02 + 0.25133E+01 0.26737E+01 0.00000E+00 0.00000E+00 2 1.93744E-06 -1.73167E+02 -1.92368E-06 -2.30511E-07 + 0.25133E+01 0.26737E+01 0.00000E+00 0.00000E+00 4 8.53473E-06 1.62589E+02 -8.14368E-06 2.55384E-06 + 0.25133E+01 0.26737E+01 0.00000E+00 0.00000E+00 6 9.22792E-05 -3.05325E+01 7.94838E-05 -4.68804E-05 + 0.24640E+01 0.26737E+01 0.00000E+00 0.00000E+00 1 1.16031E+01 1.55238E+02 -1.05362E+01 4.85998E+00 + 0.24640E+01 0.26737E+01 0.00000E+00 0.00000E+00 3 7.41141E+00 -8.64473E+01 4.59260E-01 -7.39717E+00 + 0.24640E+01 0.26737E+01 0.00000E+00 0.00000E+00 5 7.25239E+01 5.73002E+01 3.91801E+01 6.10297E+01 + 0.24640E+01 0.26737E+01 0.00000E+00 0.00000E+00 2 2.42973E-06 -1.00411E+02 -4.39084E-07 -2.38973E-06 + 0.24640E+01 0.26737E+01 0.00000E+00 0.00000E+00 4 2.51103E-06 -1.21095E+02 -1.29685E-06 -2.15022E-06 + 0.24640E+01 0.26737E+01 0.00000E+00 0.00000E+00 6 1.54819E-04 -2.47312E+01 1.40619E-04 -6.47703E-05 + 0.24166E+01 0.26737E+01 0.00000E+00 0.00000E+00 1 2.41652E+00 7.47232E+01 6.36708E-01 2.33113E+00 + 0.24166E+01 0.26737E+01 0.00000E+00 0.00000E+00 3 8.22924E+00 -1.01194E+02 -1.59751E+00 -8.07269E+00 + 0.24166E+01 0.26737E+01 0.00000E+00 0.00000E+00 5 6.57635E+01 1.75436E+01 6.27047E+01 1.98232E+01 + 0.24166E+01 0.26737E+01 0.00000E+00 0.00000E+00 2 3.34839E-06 -6.41545E+01 1.45972E-06 -3.01346E-06 + 0.24166E+01 0.26737E+01 0.00000E+00 0.00000E+00 4 1.19384E-06 -1.49956E+02 -1.03344E-06 -5.97712E-07 + 0.24166E+01 0.26737E+01 0.00000E+00 0.00000E+00 6 2.06164E-04 1.79174E+02 -2.06143E-04 2.97063E-06 + 0.23710E+01 0.26737E+01 0.00000E+00 0.00000E+00 1 1.38738E+01 1.56415E+01 1.33600E+01 3.74061E+00 + 0.23710E+01 0.26737E+01 0.00000E+00 0.00000E+00 3 5.93695E+00 -1.17701E+02 -2.75982E+00 -5.25650E+00 + 0.23710E+01 0.26737E+01 0.00000E+00 0.00000E+00 5 6.23136E+01 9.90791E-01 6.23043E+01 1.07751E+00 + 0.23710E+01 0.26737E+01 0.00000E+00 0.00000E+00 2 2.25056E-06 -9.79821E+01 -3.12523E-07 -2.22876E-06 + 0.23710E+01 0.26737E+01 0.00000E+00 0.00000E+00 4 1.77537E-06 -9.04619E+01 -1.43120E-08 -1.77531E-06 + 0.23710E+01 0.26737E+01 0.00000E+00 0.00000E+00 6 1.41614E-04 -1.64128E+02 -1.36214E-04 -3.87305E-05 + 0.23271E+01 0.26737E+01 0.00000E+00 0.00000E+00 1 1.40921E+01 1.62698E+01 1.35278E+01 3.94805E+00 + 0.23271E+01 0.26737E+01 0.00000E+00 0.00000E+00 3 3.90854E+00 -1.62881E+02 -3.73537E+00 -1.15052E+00 + 0.23271E+01 0.26737E+01 0.00000E+00 0.00000E+00 5 2.23551E+01 8.85805E+00 2.20884E+01 3.44239E+00 + 0.23271E+01 0.26737E+01 0.00000E+00 0.00000E+00 2 1.01493E-07 8.41885E+01 1.02768E-08 1.00971E-07 + 0.23271E+01 0.26737E+01 0.00000E+00 0.00000E+00 4 3.14157E-07 -5.23581E+01 1.91863E-07 -2.48763E-07 + 0.23271E+01 0.26737E+01 0.00000E+00 0.00000E+00 6 5.74916E-05 1.69996E+02 -5.66175E-05 9.98737E-06 + 0.22848E+01 0.26737E+01 0.00000E+00 0.00000E+00 1 1.05039E+01 -7.50070E+01 2.71737E+00 -1.01463E+01 + 0.22848E+01 0.26737E+01 0.00000E+00 0.00000E+00 3 4.37877E+00 1.69737E+02 -4.30871E+00 7.80177E-01 + 0.22848E+01 0.26737E+01 0.00000E+00 0.00000E+00 5 3.51899E+01 7.48350E+01 9.20570E+00 3.39645E+01 + 0.22848E+01 0.26737E+01 0.00000E+00 0.00000E+00 2 2.24243E-06 1.57716E+02 -2.07496E-06 8.50320E-07 + 0.22848E+01 0.26737E+01 0.00000E+00 0.00000E+00 4 8.27111E-06 -9.81815E+01 -1.17705E-06 -8.18693E-06 + 0.22848E+01 0.26737E+01 0.00000E+00 0.00000E+00 6 1.97198E-04 1.04579E+02 -4.96391E-05 1.90849E-04 + 0.22440E+01 0.26737E+01 0.00000E+00 0.00000E+00 1 2.64232E+01 -9.93225E+01 -4.28033E+00 -2.60742E+01 + 0.22440E+01 0.26737E+01 0.00000E+00 0.00000E+00 3 2.73834E+00 1.49411E+02 -2.35728E+00 1.39346E+00 + 0.22440E+01 0.26737E+01 0.00000E+00 0.00000E+00 5 5.87454E+01 9.03016E+01 -3.09191E-01 5.87445E+01 + 0.22440E+01 0.26737E+01 0.00000E+00 0.00000E+00 2 2.92856E-06 -1.64531E+02 -2.82248E-06 -7.81072E-07 + 0.22440E+01 0.26737E+01 0.00000E+00 0.00000E+00 4 7.32684E-07 -1.33520E+02 -5.04531E-07 -5.31294E-07 + 0.22440E+01 0.26737E+01 0.00000E+00 0.00000E+00 6 9.31198E-05 -7.26856E+01 2.77138E-05 -8.89002E-05 + 0.22046E+01 0.26737E+01 0.00000E+00 0.00000E+00 1 2.19485E+01 -9.45274E+01 -1.73253E+00 -2.18801E+01 + 0.22046E+01 0.26737E+01 0.00000E+00 0.00000E+00 3 1.40106E+00 3.29641E+01 1.17551E+00 7.62337E-01 + 0.22046E+01 0.26737E+01 0.00000E+00 0.00000E+00 5 5.14446E+01 7.79036E+01 1.07806E+01 5.03024E+01 + 0.22046E+01 0.26737E+01 0.00000E+00 0.00000E+00 2 7.56448E-07 -1.54506E+02 -6.82791E-07 -3.25592E-07 + 0.22046E+01 0.26737E+01 0.00000E+00 0.00000E+00 4 1.31756E-06 1.17367E+02 -6.05657E-07 1.17010E-06 + 0.22046E+01 0.26737E+01 0.00000E+00 0.00000E+00 6 8.17195E-05 -1.68172E+02 -7.99845E-05 -1.67498E-05 + 0.21666E+01 0.26737E+01 0.00000E+00 0.00000E+00 1 1.30484E+01 -1.72871E+02 -1.29475E+01 -1.61926E+00 + 0.21666E+01 0.26737E+01 0.00000E+00 0.00000E+00 3 2.71018E+00 7.89307E+00 2.68450E+00 3.72175E-01 + 0.21666E+01 0.26737E+01 0.00000E+00 0.00000E+00 5 5.25169E+01 1.99609E+01 4.93620E+01 1.79282E+01 + 0.21666E+01 0.26737E+01 0.00000E+00 0.00000E+00 2 2.03014E-06 1.09485E+01 1.99319E-06 3.85579E-07 + 0.21666E+01 0.26737E+01 0.00000E+00 0.00000E+00 4 3.21902E-06 -2.73450E+01 2.85931E-06 -1.47865E-06 + 0.21666E+01 0.26737E+01 0.00000E+00 0.00000E+00 6 1.37460E-04 1.74005E+02 -1.36708E-04 1.43566E-05 + 0.21299E+01 0.26737E+01 0.00000E+00 0.00000E+00 1 2.36001E+01 1.70247E+02 -2.32590E+01 3.99792E+00 + 0.21299E+01 0.26737E+01 0.00000E+00 0.00000E+00 3 7.78443E-01 -1.47243E+01 7.52879E-01 -1.97855E-01 + 0.21299E+01 0.26737E+01 0.00000E+00 0.00000E+00 5 6.67362E+01 3.08280E+01 5.73071E+01 3.41998E+01 + 0.21299E+01 0.26737E+01 0.00000E+00 0.00000E+00 2 1.72971E-06 -8.69862E+01 9.09418E-08 -1.72732E-06 + 0.21299E+01 0.26737E+01 0.00000E+00 0.00000E+00 4 1.73180E-06 -3.87661E+01 1.35030E-06 -1.08435E-06 + 0.21299E+01 0.26737E+01 0.00000E+00 0.00000E+00 6 1.58173E-04 2.10440E+01 1.47624E-04 5.67976E-05 + 0.20944E+01 0.26737E+01 0.00000E+00 0.00000E+00 1 1.03149E+01 1.63290E+02 -9.87934E+00 2.96590E+00 + 0.20944E+01 0.26737E+01 0.00000E+00 0.00000E+00 3 1.64642E+00 -1.67859E+02 -1.60959E+00 -3.46283E-01 + 0.20944E+01 0.26737E+01 0.00000E+00 0.00000E+00 5 1.23237E+01 9.50036E+01 -1.07485E+00 1.22768E+01 + 0.20944E+01 0.26737E+01 0.00000E+00 0.00000E+00 2 3.18490E-07 2.59747E+01 2.86318E-07 1.39491E-07 + 0.20944E+01 0.26737E+01 0.00000E+00 0.00000E+00 4 2.79945E-06 -9.97526E+01 -4.74209E-07 -2.75899E-06 + 0.20944E+01 0.26737E+01 0.00000E+00 0.00000E+00 6 6.95920E-05 1.61175E+01 6.68567E-05 1.93193E-05 + 0.26180E+01 0.26180E+01 0.00000E+00 0.00000E+00 1 4.23049E-01 1.80000E+02 -4.23049E-01 0.00000E+00 + 0.26180E+01 0.26180E+01 0.00000E+00 0.00000E+00 3 1.59925E-04 0.00000E+00 1.59925E-04 0.00000E+00 + 0.26180E+01 0.26180E+01 0.00000E+00 0.00000E+00 5 1.48693E+01 0.00000E+00 1.48693E+01 0.00000E+00 + 0.26180E+01 0.26180E+01 0.00000E+00 0.00000E+00 2 8.03931E-06 0.00000E+00 8.03931E-06 0.00000E+00 + 0.26180E+01 0.26180E+01 0.00000E+00 0.00000E+00 4 1.08467E-05 0.00000E+00 1.08467E-05 0.00000E+00 + 0.26180E+01 0.26180E+01 0.00000E+00 0.00000E+00 6 1.03875E-04 1.80000E+02 -1.03875E-04 0.00000E+00 + 0.25646E+01 0.26180E+01 0.00000E+00 0.00000E+00 1 2.77774E+00 -1.09838E+02 -9.42639E-01 -2.61290E+00 + 0.25646E+01 0.26180E+01 0.00000E+00 0.00000E+00 3 1.93586E+00 -4.99262E+00 1.92852E+00 -1.68473E-01 + 0.25646E+01 0.26180E+01 0.00000E+00 0.00000E+00 5 3.40748E+01 4.92859E+01 2.22264E+01 2.58278E+01 + 0.25646E+01 0.26180E+01 0.00000E+00 0.00000E+00 2 9.98808E-07 -1.12733E+02 -3.85970E-07 -9.21218E-07 + 0.25646E+01 0.26180E+01 0.00000E+00 0.00000E+00 4 7.67472E-07 -5.15858E+01 4.76862E-07 -6.01345E-07 + 0.25646E+01 0.26180E+01 0.00000E+00 0.00000E+00 6 1.63999E-04 -9.16428E+01 -4.70164E-06 -1.63931E-04 + 0.25133E+01 0.26180E+01 0.00000E+00 0.00000E+00 1 4.61936E+00 -1.58473E+02 -4.29713E+00 -1.69506E+00 + 0.25133E+01 0.26180E+01 0.00000E+00 0.00000E+00 3 4.85044E+00 -9.15870E+00 4.78860E+00 -7.72043E-01 + 0.25133E+01 0.26180E+01 0.00000E+00 0.00000E+00 5 1.11108E+02 7.87111E+01 2.17501E+01 1.08958E+02 + 0.25133E+01 0.26180E+01 0.00000E+00 0.00000E+00 2 1.28980E-06 1.26108E+01 1.25869E-06 2.81599E-07 + 0.25133E+01 0.26180E+01 0.00000E+00 0.00000E+00 4 4.24475E-06 2.81989E+01 3.74095E-06 2.00579E-06 + 0.25133E+01 0.26180E+01 0.00000E+00 0.00000E+00 6 3.24459E-04 -6.55785E+01 1.34146E-04 -2.95429E-04 + 0.24640E+01 0.26180E+01 0.00000E+00 0.00000E+00 1 1.00622E+01 1.60422E+02 -9.48050E+00 3.37169E+00 + 0.24640E+01 0.26180E+01 0.00000E+00 0.00000E+00 3 5.07438E+00 -4.44364E+01 3.62325E+00 -3.55266E+00 + 0.24640E+01 0.26180E+01 0.00000E+00 0.00000E+00 5 1.24238E+02 8.25527E+01 1.61029E+01 1.23190E+02 + 0.24640E+01 0.26180E+01 0.00000E+00 0.00000E+00 2 2.60861E-06 -8.71850E+01 1.28111E-07 -2.60546E-06 + 0.24640E+01 0.26180E+01 0.00000E+00 0.00000E+00 4 1.03709E-05 1.50150E+02 -8.99501E-06 5.16197E-06 + 0.24640E+01 0.26180E+01 0.00000E+00 0.00000E+00 6 6.15096E-05 2.01304E+01 5.77521E-05 2.11690E-05 + 0.24166E+01 0.26180E+01 0.00000E+00 0.00000E+00 1 1.11553E+01 1.54816E+02 -1.00949E+01 4.74685E+00 + 0.24166E+01 0.26180E+01 0.00000E+00 0.00000E+00 3 7.52408E+00 -9.15795E+01 -2.07392E-01 -7.52123E+00 + 0.24166E+01 0.26180E+01 0.00000E+00 0.00000E+00 5 6.45505E+01 5.21916E+01 3.95709E+01 5.09991E+01 + 0.24166E+01 0.26180E+01 0.00000E+00 0.00000E+00 2 2.22728E-06 1.17227E+01 2.18082E-06 4.52528E-07 + 0.24166E+01 0.26180E+01 0.00000E+00 0.00000E+00 4 7.12007E-07 -1.75451E+02 -7.09764E-07 -5.64698E-08 + 0.24166E+01 0.26180E+01 0.00000E+00 0.00000E+00 6 1.16323E-04 7.82612E+01 2.36658E-05 1.13890E-04 + 0.23710E+01 0.26180E+01 0.00000E+00 0.00000E+00 1 3.16602E+00 5.02492E+01 2.02451E+00 2.43414E+00 + 0.23710E+01 0.26180E+01 0.00000E+00 0.00000E+00 3 8.28671E+00 -1.04606E+02 -2.08964E+00 -8.01891E+00 + 0.23710E+01 0.26180E+01 0.00000E+00 0.00000E+00 5 6.87941E+01 1.02831E+01 6.76891E+01 1.22806E+01 + 0.23710E+01 0.26180E+01 0.00000E+00 0.00000E+00 2 1.73533E-06 -5.42728E+01 1.01331E-06 -1.40875E-06 + 0.23710E+01 0.26180E+01 0.00000E+00 0.00000E+00 4 4.49294E-06 -1.09053E+02 -1.46665E-06 -4.24682E-06 + 0.23710E+01 0.26180E+01 0.00000E+00 0.00000E+00 6 6.82403E-05 -1.05080E+02 -1.77540E-05 -6.58903E-05 + 0.23271E+01 0.26180E+01 0.00000E+00 0.00000E+00 1 1.44556E+01 1.51996E+01 1.39499E+01 3.79001E+00 + 0.23271E+01 0.26180E+01 0.00000E+00 0.00000E+00 3 5.22895E+00 -1.21763E+02 -2.75256E+00 -4.44582E+00 + 0.23271E+01 0.26180E+01 0.00000E+00 0.00000E+00 5 5.87136E+01 -7.28037E+00 5.82403E+01 -7.44047E+00 + 0.23271E+01 0.26180E+01 0.00000E+00 0.00000E+00 2 1.88356E-06 -9.06332E+01 -2.08155E-08 -1.88345E-06 + 0.23271E+01 0.26180E+01 0.00000E+00 0.00000E+00 4 2.24923E-06 -1.01862E+02 -4.62347E-07 -2.20120E-06 + 0.23271E+01 0.26180E+01 0.00000E+00 0.00000E+00 6 3.04890E-05 -1.27802E+02 -1.86878E-05 -2.40903E-05 + 0.22848E+01 0.26180E+01 0.00000E+00 0.00000E+00 1 1.32124E+01 1.43374E+01 1.28009E+01 3.27181E+00 + 0.22848E+01 0.26180E+01 0.00000E+00 0.00000E+00 3 3.83798E+00 -1.73932E+02 -3.81648E+00 -4.05707E-01 + 0.22848E+01 0.26180E+01 0.00000E+00 0.00000E+00 5 1.91591E+01 1.88954E+00 1.91487E+01 6.31728E-01 + 0.22848E+01 0.26180E+01 0.00000E+00 0.00000E+00 2 7.08324E-07 -1.40783E+01 6.87049E-07 -1.72298E-07 + 0.22848E+01 0.26180E+01 0.00000E+00 0.00000E+00 4 1.06321E-06 1.45105E+01 1.02929E-06 2.66394E-07 + 0.22848E+01 0.26180E+01 0.00000E+00 0.00000E+00 6 6.85575E-05 1.01300E+02 -1.34333E-05 6.72286E-05 + 0.22440E+01 0.26180E+01 0.00000E+00 0.00000E+00 1 1.37385E+01 -8.70308E+01 7.11650E-01 -1.37201E+01 + 0.22440E+01 0.26180E+01 0.00000E+00 0.00000E+00 3 4.45625E+00 1.63263E+02 -4.26747E+00 1.28331E+00 + 0.22440E+01 0.26180E+01 0.00000E+00 0.00000E+00 5 3.96033E+01 8.40983E+01 4.07209E+00 3.93934E+01 + 0.22440E+01 0.26180E+01 0.00000E+00 0.00000E+00 2 3.09288E-06 -1.09422E+02 -1.02845E-06 -2.91689E-06 + 0.22440E+01 0.26180E+01 0.00000E+00 0.00000E+00 4 1.04613E-05 -9.46753E+01 -8.52701E-07 -1.04265E-05 + 0.22440E+01 0.26180E+01 0.00000E+00 0.00000E+00 6 1.26138E-04 1.23202E+02 -6.90714E-05 1.05546E-04 + 0.22046E+01 0.26180E+01 0.00000E+00 0.00000E+00 1 2.69533E+01 -9.22575E+01 -1.06171E+00 -2.69324E+01 + 0.22046E+01 0.26180E+01 0.00000E+00 0.00000E+00 3 2.30420E+00 1.39430E+02 -1.75030E+00 1.49859E+00 + 0.22046E+01 0.26180E+01 0.00000E+00 0.00000E+00 5 5.95776E+01 1.01337E+02 -1.17113E+01 5.84152E+01 + 0.22046E+01 0.26180E+01 0.00000E+00 0.00000E+00 2 4.66306E-07 1.71105E+02 -4.60697E-07 7.21040E-08 + 0.22046E+01 0.26180E+01 0.00000E+00 0.00000E+00 4 7.47960E-06 1.72827E+02 -7.42106E-06 9.33990E-07 + 0.22046E+01 0.26180E+01 0.00000E+00 0.00000E+00 6 8.88396E-05 1.10860E+02 -3.16347E-05 8.30163E-05 + 0.21666E+01 0.26180E+01 0.00000E+00 0.00000E+00 1 1.86147E+01 -9.96577E+01 -3.12284E+00 -1.83509E+01 + 0.21666E+01 0.26180E+01 0.00000E+00 0.00000E+00 3 1.81386E+00 2.59382E+01 1.63115E+00 7.93385E-01 + 0.21666E+01 0.26180E+01 0.00000E+00 0.00000E+00 5 3.74485E+01 6.19937E+01 1.75847E+01 3.30632E+01 + 0.21666E+01 0.26180E+01 0.00000E+00 0.00000E+00 2 2.00537E-06 6.65614E+01 7.97668E-07 1.83990E-06 + 0.21666E+01 0.26180E+01 0.00000E+00 0.00000E+00 4 1.51242E-06 8.57667E+01 1.11642E-07 1.50829E-06 + 0.21666E+01 0.26180E+01 0.00000E+00 0.00000E+00 6 6.08665E-05 -1.59059E+02 -5.68462E-05 -2.17541E-05 + 0.21299E+01 0.26180E+01 0.00000E+00 0.00000E+00 1 1.55012E+01 1.78676E+02 -1.54970E+01 3.58245E-01 + 0.21299E+01 0.26180E+01 0.00000E+00 0.00000E+00 3 2.95452E+00 1.53506E+01 2.84912E+00 7.82134E-01 + 0.21299E+01 0.26180E+01 0.00000E+00 0.00000E+00 5 5.35052E+01 2.41415E+01 4.88256E+01 2.18832E+01 + 0.21299E+01 0.26180E+01 0.00000E+00 0.00000E+00 2 6.02786E-07 -1.78404E+01 5.73800E-07 -1.84673E-07 + 0.21299E+01 0.26180E+01 0.00000E+00 0.00000E+00 4 1.64210E-06 1.13792E+02 -6.62462E-07 1.50255E-06 + 0.21299E+01 0.26180E+01 0.00000E+00 0.00000E+00 6 8.05618E-05 -1.73756E+02 -8.00838E-05 -8.76267E-06 + 0.20944E+01 0.26180E+01 0.00000E+00 0.00000E+00 1 2.09465E+01 1.66828E+02 -2.03954E+01 4.77309E+00 + 0.20944E+01 0.26180E+01 0.00000E+00 0.00000E+00 3 4.81796E-01 -9.76257E+01 -6.39351E-02 -4.77535E-01 + 0.20944E+01 0.26180E+01 0.00000E+00 0.00000E+00 5 3.95541E+01 3.82302E+01 3.10710E+01 2.44770E+01 + 0.20944E+01 0.26180E+01 0.00000E+00 0.00000E+00 2 1.09721E-06 9.85309E+01 -1.62762E-07 1.08507E-06 + 0.20944E+01 0.26180E+01 0.00000E+00 0.00000E+00 4 1.85033E-06 7.98266E+01 3.26820E-07 1.82124E-06 + 0.20944E+01 0.26180E+01 0.00000E+00 0.00000E+00 6 9.35476E-05 2.29388E+01 8.61501E-05 3.64599E-05 + 0.25646E+01 0.25646E+01 0.00000E+00 0.00000E+00 1 4.59129E-01 1.80000E+02 -4.59129E-01 0.00000E+00 + 0.25646E+01 0.25646E+01 0.00000E+00 0.00000E+00 3 9.81196E-05 0.00000E+00 9.81196E-05 0.00000E+00 + 0.25646E+01 0.25646E+01 0.00000E+00 0.00000E+00 5 1.55791E+01 0.00000E+00 1.55791E+01 0.00000E+00 + 0.25646E+01 0.25646E+01 0.00000E+00 0.00000E+00 2 1.80561E-06 0.00000E+00 1.80561E-06 0.00000E+00 + 0.25646E+01 0.25646E+01 0.00000E+00 0.00000E+00 4 1.07863E-05 0.00000E+00 1.07863E-05 0.00000E+00 + 0.25646E+01 0.25646E+01 0.00000E+00 0.00000E+00 6 2.20164E-05 1.80000E+02 -2.20164E-05 0.00000E+00 + 0.25133E+01 0.25646E+01 0.00000E+00 0.00000E+00 1 2.59250E+00 -1.30892E+02 -1.69715E+00 -1.95979E+00 + 0.25133E+01 0.25646E+01 0.00000E+00 0.00000E+00 3 1.97099E+00 -8.55821E+00 1.94905E+00 -2.93312E-01 + 0.25133E+01 0.25646E+01 0.00000E+00 0.00000E+00 5 3.45317E+01 4.56402E+01 2.41433E+01 2.46889E+01 + 0.25133E+01 0.25646E+01 0.00000E+00 0.00000E+00 2 2.84572E-06 -2.47186E+01 2.58498E-06 -1.18997E-06 + 0.25133E+01 0.25646E+01 0.00000E+00 0.00000E+00 4 1.82856E-06 -9.67189E+00 1.80257E-06 -3.07208E-07 + 0.25133E+01 0.25646E+01 0.00000E+00 0.00000E+00 6 1.30848E-04 -8.76991E+01 5.25320E-06 -1.30742E-04 + 0.24640E+01 0.25646E+01 0.00000E+00 0.00000E+00 1 4.27810E+00 -1.60654E+02 -4.03655E+00 -1.41720E+00 + 0.24640E+01 0.25646E+01 0.00000E+00 0.00000E+00 3 4.98661E+00 -8.12100E+00 4.93660E+00 -7.04428E-01 + 0.24640E+01 0.25646E+01 0.00000E+00 0.00000E+00 5 1.10587E+02 7.97064E+01 1.97611E+01 1.08807E+02 + 0.24640E+01 0.25646E+01 0.00000E+00 0.00000E+00 2 1.98566E-06 -2.84187E-02 1.98566E-06 -9.84888E-10 + 0.24640E+01 0.25646E+01 0.00000E+00 0.00000E+00 4 8.18241E-07 -1.10111E+02 -2.81344E-07 -7.68351E-07 + 0.24640E+01 0.25646E+01 0.00000E+00 0.00000E+00 6 1.70954E-04 -1.78785E+02 -1.70916E-04 -3.62646E-06 + 0.24166E+01 0.25646E+01 0.00000E+00 0.00000E+00 1 1.00816E+01 1.62866E+02 -9.63416E+00 2.97019E+00 + 0.24166E+01 0.25646E+01 0.00000E+00 0.00000E+00 3 5.27809E+00 -4.40207E+01 3.79541E+00 -3.66784E+00 + 0.24166E+01 0.25646E+01 0.00000E+00 0.00000E+00 5 1.22093E+02 8.24386E+01 1.60660E+01 1.21031E+02 + 0.24166E+01 0.25646E+01 0.00000E+00 0.00000E+00 2 9.73308E-07 1.21762E+02 -5.12340E-07 8.27549E-07 + 0.24166E+01 0.25646E+01 0.00000E+00 0.00000E+00 4 6.22296E-06 -6.03384E+01 3.07960E-06 -5.40753E-06 + 0.24166E+01 0.25646E+01 0.00000E+00 0.00000E+00 6 4.94736E-05 1.49034E+02 -4.24221E-05 2.54558E-05 + 0.23710E+01 0.25646E+01 0.00000E+00 0.00000E+00 1 1.08599E+01 1.52868E+02 -9.66479E+00 4.95264E+00 + 0.23710E+01 0.25646E+01 0.00000E+00 0.00000E+00 3 7.83000E+00 -8.92017E+01 1.09089E-01 -7.82924E+00 + 0.23710E+01 0.25646E+01 0.00000E+00 0.00000E+00 5 6.52693E+01 5.36141E+01 3.87191E+01 5.25444E+01 + 0.23710E+01 0.25646E+01 0.00000E+00 0.00000E+00 2 4.10740E-06 -8.18059E+01 5.85419E-07 -4.06547E-06 + 0.23710E+01 0.25646E+01 0.00000E+00 0.00000E+00 4 1.69509E-06 -1.59988E+02 -1.59275E-06 -5.80083E-07 + 0.23710E+01 0.25646E+01 0.00000E+00 0.00000E+00 6 1.59795E-04 -1.68407E+02 -1.56535E-04 -3.21116E-05 + 0.23271E+01 0.25646E+01 0.00000E+00 0.00000E+00 1 3.31756E+00 2.94780E+01 2.88808E+00 1.63254E+00 + 0.23271E+01 0.25646E+01 0.00000E+00 0.00000E+00 3 7.64408E+00 -9.95197E+01 -1.26423E+00 -7.53881E+00 + 0.23271E+01 0.25646E+01 0.00000E+00 0.00000E+00 5 6.80540E+01 2.06100E+01 6.36984E+01 2.39554E+01 + 0.23271E+01 0.25646E+01 0.00000E+00 0.00000E+00 2 2.01647E-06 1.60814E+02 -1.90446E-06 6.62697E-07 + 0.23271E+01 0.25646E+01 0.00000E+00 0.00000E+00 4 5.64655E-06 -8.27920E+01 7.08478E-07 -5.60193E-06 + 0.23271E+01 0.25646E+01 0.00000E+00 0.00000E+00 6 2.33516E-04 -1.63745E+02 -2.24182E-04 -6.53646E-05 + 0.22848E+01 0.25646E+01 0.00000E+00 0.00000E+00 1 1.45039E+01 1.70247E+01 1.38683E+01 4.24652E+00 + 0.22848E+01 0.25646E+01 0.00000E+00 0.00000E+00 3 4.88370E+00 -1.17238E+02 -2.23518E+00 -4.34217E+00 + 0.22848E+01 0.25646E+01 0.00000E+00 0.00000E+00 5 5.58690E+01 -8.48944E-01 5.58628E+01 -8.27772E-01 + 0.22848E+01 0.25646E+01 0.00000E+00 0.00000E+00 2 6.62362E-07 9.70743E+01 -8.15735E-08 6.57320E-07 + 0.22848E+01 0.25646E+01 0.00000E+00 0.00000E+00 4 7.70753E-06 -9.37111E+01 -4.98870E-07 -7.69136E-06 + 0.22848E+01 0.25646E+01 0.00000E+00 0.00000E+00 6 4.92314E-05 1.02916E+02 -1.10047E-05 4.79857E-05 + 0.22440E+01 0.25646E+01 0.00000E+00 0.00000E+00 1 9.66419E+00 4.89942E+00 9.62887E+00 8.25387E-01 + 0.22440E+01 0.25646E+01 0.00000E+00 0.00000E+00 3 4.08869E+00 -1.71471E+02 -4.04348E+00 -6.06384E-01 + 0.22440E+01 0.25646E+01 0.00000E+00 0.00000E+00 5 2.33451E+01 4.38300E+01 1.68411E+01 1.61670E+01 + 0.22440E+01 0.25646E+01 0.00000E+00 0.00000E+00 2 5.38092E-07 -1.47705E+02 -4.54854E-07 -2.87492E-07 + 0.22440E+01 0.25646E+01 0.00000E+00 0.00000E+00 4 1.95962E-06 -7.07240E+01 6.46907E-07 -1.84976E-06 + 0.22440E+01 0.25646E+01 0.00000E+00 0.00000E+00 6 7.64034E-05 7.24916E+01 2.29856E-05 7.28639E-05 + 0.22046E+01 0.25646E+01 0.00000E+00 0.00000E+00 1 1.64108E+01 -9.02107E+01 -6.03548E-02 -1.64107E+01 + 0.22046E+01 0.25646E+01 0.00000E+00 0.00000E+00 3 4.25230E+00 1.69324E+02 -4.17870E+00 7.87768E-01 + 0.22046E+01 0.25646E+01 0.00000E+00 0.00000E+00 5 5.60560E+01 8.63431E+01 3.57534E+00 5.59418E+01 + 0.22046E+01 0.25646E+01 0.00000E+00 0.00000E+00 2 3.29777E-06 -5.17568E+01 2.04132E-06 -2.59004E-06 + 0.22046E+01 0.25646E+01 0.00000E+00 0.00000E+00 4 3.55720E-06 -1.37312E+02 -2.61473E-06 -2.41182E-06 + 0.22046E+01 0.25646E+01 0.00000E+00 0.00000E+00 6 1.21328E-04 8.25404E+01 1.57517E-05 1.20301E-04 + 0.21666E+01 0.25646E+01 0.00000E+00 0.00000E+00 1 2.65746E+01 -9.47532E+01 -2.20209E+00 -2.64833E+01 + 0.21666E+01 0.25646E+01 0.00000E+00 0.00000E+00 3 1.45216E+00 1.59921E+02 -1.36390E+00 4.98538E-01 + 0.21666E+01 0.25646E+01 0.00000E+00 0.00000E+00 5 5.62687E+01 9.06942E+01 -6.81773E-01 5.62646E+01 + 0.21666E+01 0.25646E+01 0.00000E+00 0.00000E+00 2 5.06288E-07 9.44156E+00 4.99429E-07 8.30522E-08 + 0.21666E+01 0.25646E+01 0.00000E+00 0.00000E+00 4 5.21208E-06 8.33900E+00 5.15697E-06 7.55906E-07 + 0.21666E+01 0.25646E+01 0.00000E+00 0.00000E+00 6 5.05265E-05 5.78727E+01 2.68701E-05 4.27893E-05 + 0.21299E+01 0.25646E+01 0.00000E+00 0.00000E+00 1 1.62188E+01 -1.11953E+02 -6.06333E+00 -1.50428E+01 + 0.21299E+01 0.25646E+01 0.00000E+00 0.00000E+00 3 1.68053E+00 3.26164E+01 1.41551E+00 9.05824E-01 + 0.21299E+01 0.25646E+01 0.00000E+00 0.00000E+00 5 5.28383E+01 4.30692E+01 3.85999E+01 3.60823E+01 + 0.21299E+01 0.25646E+01 0.00000E+00 0.00000E+00 2 1.73661E-06 -7.30663E+01 5.05812E-07 -1.66131E-06 + 0.21299E+01 0.25646E+01 0.00000E+00 0.00000E+00 4 1.95358E-06 8.39511E+01 2.05863E-07 1.94270E-06 + 0.21299E+01 0.25646E+01 0.00000E+00 0.00000E+00 6 4.12791E-06 -3.09891E+01 3.53872E-06 -2.12536E-06 + 0.20944E+01 0.25646E+01 0.00000E+00 0.00000E+00 1 1.86705E+01 1.68717E+02 -1.83096E+01 3.65311E+00 + 0.20944E+01 0.25646E+01 0.00000E+00 0.00000E+00 3 2.07151E+00 1.01473E+01 2.03911E+00 3.64958E-01 + 0.20944E+01 0.25646E+01 0.00000E+00 0.00000E+00 5 6.04991E+01 1.35560E+01 5.88136E+01 1.41808E+01 + 0.20944E+01 0.25646E+01 0.00000E+00 0.00000E+00 2 1.74809E-07 6.99503E+01 5.99306E-08 1.64214E-07 + 0.20944E+01 0.25646E+01 0.00000E+00 0.00000E+00 4 2.27829E-06 6.75440E+01 8.70248E-07 2.10553E-06 + 0.20944E+01 0.25646E+01 0.00000E+00 0.00000E+00 6 8.38698E-05 2.84010E+01 7.37752E-05 3.98917E-05 + 0.25133E+01 0.25133E+01 0.00000E+00 0.00000E+00 1 1.82311E+00 1.80000E+02 -1.82311E+00 0.00000E+00 + 0.25133E+01 0.25133E+01 0.00000E+00 0.00000E+00 3 5.07167E-05 0.00000E+00 5.07167E-05 0.00000E+00 + 0.25133E+01 0.25133E+01 0.00000E+00 0.00000E+00 5 1.61802E+01 0.00000E+00 1.61802E+01 0.00000E+00 + 0.25133E+01 0.25133E+01 0.00000E+00 0.00000E+00 2 1.36589E-05 0.00000E+00 1.36589E-05 0.00000E+00 + 0.25133E+01 0.25133E+01 0.00000E+00 0.00000E+00 4 3.20230E-05 0.00000E+00 3.20230E-05 0.00000E+00 + 0.25133E+01 0.25133E+01 0.00000E+00 0.00000E+00 6 3.42136E-05 1.80000E+02 -3.42136E-05 0.00000E+00 + 0.24640E+01 0.25133E+01 0.00000E+00 0.00000E+00 1 2.76948E+00 -1.33796E+02 -1.91675E+00 -1.99902E+00 + 0.24640E+01 0.25133E+01 0.00000E+00 0.00000E+00 3 2.09360E+00 -6.10296E+00 2.08173E+00 -2.22582E-01 + 0.24640E+01 0.25133E+01 0.00000E+00 0.00000E+00 5 3.57647E+01 4.73021E+01 2.42532E+01 2.62849E+01 + 0.24640E+01 0.25133E+01 0.00000E+00 0.00000E+00 2 1.98851E-06 -1.69124E+02 -1.95279E-06 -3.75210E-07 + 0.24640E+01 0.25133E+01 0.00000E+00 0.00000E+00 4 5.50598E-06 7.91162E+01 1.03962E-06 5.40694E-06 + 0.24640E+01 0.25133E+01 0.00000E+00 0.00000E+00 6 1.66193E-04 -4.37386E+01 1.20075E-04 -1.14901E-04 + 0.24166E+01 0.25133E+01 0.00000E+00 0.00000E+00 1 3.93690E+00 -1.66943E+02 -3.83511E+00 -8.89434E-01 + 0.24166E+01 0.25133E+01 0.00000E+00 0.00000E+00 3 4.79222E+00 -1.09777E+01 4.70453E+00 -9.12569E-01 + 0.24166E+01 0.25133E+01 0.00000E+00 0.00000E+00 5 1.14559E+02 8.24390E+01 1.50738E+01 1.13563E+02 + 0.24166E+01 0.25133E+01 0.00000E+00 0.00000E+00 2 1.22654E-06 1.07937E+02 -3.77749E-07 1.16692E-06 + 0.24166E+01 0.25133E+01 0.00000E+00 0.00000E+00 4 9.12714E-06 2.57647E+01 8.21978E-06 3.96736E-06 + 0.24166E+01 0.25133E+01 0.00000E+00 0.00000E+00 6 2.23285E-04 -5.16908E+01 1.38415E-04 -1.75206E-04 + 0.23710E+01 0.25133E+01 0.00000E+00 0.00000E+00 1 1.08284E+01 1.55229E+02 -9.83208E+00 4.53693E+00 + 0.23710E+01 0.25133E+01 0.00000E+00 0.00000E+00 3 5.50178E+00 -5.22476E+01 3.36846E+00 -4.35006E+00 + 0.23710E+01 0.25133E+01 0.00000E+00 0.00000E+00 5 1.19477E+02 8.11471E+01 1.83874E+01 1.18054E+02 + 0.23710E+01 0.25133E+01 0.00000E+00 0.00000E+00 2 3.89118E-06 -9.73704E+01 -4.99175E-07 -3.85903E-06 + 0.23710E+01 0.25133E+01 0.00000E+00 0.00000E+00 4 1.24203E-05 -4.96017E+01 8.04955E-06 -9.45877E-06 + 0.23710E+01 0.25133E+01 0.00000E+00 0.00000E+00 6 2.26285E-05 1.81244E+01 2.15057E-05 7.03932E-06 + 0.23271E+01 0.25133E+01 0.00000E+00 0.00000E+00 1 9.62937E+00 1.57101E+02 -8.87047E+00 3.74692E+00 + 0.23271E+01 0.25133E+01 0.00000E+00 0.00000E+00 3 7.86383E+00 -9.46689E+01 -6.40101E-01 -7.83774E+00 + 0.23271E+01 0.25133E+01 0.00000E+00 0.00000E+00 5 6.54405E+01 4.48357E+01 4.64060E+01 4.61405E+01 + 0.23271E+01 0.25133E+01 0.00000E+00 0.00000E+00 2 2.80196E-06 -1.40401E+02 -2.15898E-06 -1.78600E-06 + 0.23271E+01 0.25133E+01 0.00000E+00 0.00000E+00 4 2.56895E-06 -1.01593E+02 -5.16258E-07 -2.51655E-06 + 0.23271E+01 0.25133E+01 0.00000E+00 0.00000E+00 6 1.33631E-04 4.06268E+01 1.01422E-04 8.70113E-05 + 0.22848E+01 0.25133E+01 0.00000E+00 0.00000E+00 1 4.74483E+00 2.57859E+01 4.27237E+00 2.06405E+00 + 0.22848E+01 0.25133E+01 0.00000E+00 0.00000E+00 3 7.68665E+00 -1.06050E+02 -2.12511E+00 -7.38705E+00 + 0.22848E+01 0.25133E+01 0.00000E+00 0.00000E+00 5 7.46109E+01 8.15711E+00 7.38561E+01 1.05864E+01 + 0.22848E+01 0.25133E+01 0.00000E+00 0.00000E+00 2 3.00025E-06 1.22374E+02 -1.60645E-06 2.53393E-06 + 0.22848E+01 0.25133E+01 0.00000E+00 0.00000E+00 4 1.13164E-05 -9.21203E+01 -4.18683E-07 -1.13086E-05 + 0.22848E+01 0.25133E+01 0.00000E+00 0.00000E+00 6 3.65094E-04 1.76587E+02 -3.64446E-04 2.17323E-05 + 0.22440E+01 0.25133E+01 0.00000E+00 0.00000E+00 1 1.49529E+01 1.46818E+01 1.44647E+01 3.78982E+00 + 0.22440E+01 0.25133E+01 0.00000E+00 0.00000E+00 3 4.98333E+00 -1.29990E+02 -3.20256E+00 -3.81801E+00 + 0.22440E+01 0.25133E+01 0.00000E+00 0.00000E+00 5 6.05960E+01 -1.07476E+01 5.95331E+01 -1.13001E+01 + 0.22440E+01 0.25133E+01 0.00000E+00 0.00000E+00 2 1.43892E-06 8.47493E+01 1.31680E-07 1.43288E-06 + 0.22440E+01 0.25133E+01 0.00000E+00 0.00000E+00 4 3.91034E-06 -8.65406E+01 2.35955E-07 -3.90322E-06 + 0.22440E+01 0.25133E+01 0.00000E+00 0.00000E+00 6 3.04366E-05 -3.74345E+01 2.41681E-05 -1.85010E-05 + 0.22046E+01 0.25133E+01 0.00000E+00 0.00000E+00 1 1.10470E+01 5.37033E+00 1.09985E+01 1.03392E+00 + 0.22046E+01 0.25133E+01 0.00000E+00 0.00000E+00 3 4.29703E+00 -1.76854E+02 -4.29055E+00 -2.35812E-01 + 0.22046E+01 0.25133E+01 0.00000E+00 0.00000E+00 5 1.15805E+01 4.92785E+01 7.55493E+00 8.77677E+00 + 0.22046E+01 0.25133E+01 0.00000E+00 0.00000E+00 2 1.81727E-07 -1.14469E+02 -7.52705E-08 -1.65406E-07 + 0.22046E+01 0.25133E+01 0.00000E+00 0.00000E+00 4 5.44271E-07 3.97481E+01 4.18470E-07 3.48015E-07 + 0.22046E+01 0.25133E+01 0.00000E+00 0.00000E+00 6 4.46692E-05 1.15387E+02 -1.91507E-05 4.03557E-05 + 0.21666E+01 0.25133E+01 0.00000E+00 0.00000E+00 1 1.72371E+01 -8.98832E+01 3.51487E-02 -1.72371E+01 + 0.21666E+01 0.25133E+01 0.00000E+00 0.00000E+00 3 4.14583E+00 1.67669E+02 -4.05019E+00 8.85373E-01 + 0.21666E+01 0.25133E+01 0.00000E+00 0.00000E+00 5 3.82672E+01 9.08519E+01 -5.68932E-01 3.82630E+01 + 0.21666E+01 0.25133E+01 0.00000E+00 0.00000E+00 2 5.30200E-06 -1.19479E+02 -2.60911E-06 -4.61560E-06 + 0.21666E+01 0.25133E+01 0.00000E+00 0.00000E+00 4 5.26273E-06 -1.34683E+02 -3.70066E-06 -3.74185E-06 + 0.21666E+01 0.25133E+01 0.00000E+00 0.00000E+00 6 4.90573E-05 -2.76038E+01 4.34733E-05 -2.27309E-05 + 0.21299E+01 0.25133E+01 0.00000E+00 0.00000E+00 1 2.64988E+01 -9.22949E+01 -1.06107E+00 -2.64775E+01 + 0.21299E+01 0.25133E+01 0.00000E+00 0.00000E+00 3 1.63240E+00 1.37915E+02 -1.21150E+00 1.09408E+00 + 0.21299E+01 0.25133E+01 0.00000E+00 0.00000E+00 5 5.55525E+01 9.94113E+01 -9.08399E+00 5.48048E+01 + 0.21299E+01 0.25133E+01 0.00000E+00 0.00000E+00 2 3.47424E-06 1.91105E+01 3.28277E-06 1.13744E-06 + 0.21299E+01 0.25133E+01 0.00000E+00 0.00000E+00 4 2.05174E-06 1.22629E+02 -1.10630E-06 1.72793E-06 + 0.21299E+01 0.25133E+01 0.00000E+00 0.00000E+00 6 3.20855E-05 -1.78978E+02 -3.20804E-05 -5.72505E-07 + 0.20944E+01 0.25133E+01 0.00000E+00 0.00000E+00 1 1.42624E+01 -1.18362E+02 -6.77513E+00 -1.25505E+01 + 0.20944E+01 0.25133E+01 0.00000E+00 0.00000E+00 3 2.29428E+00 3.13556E+01 1.95921E+00 1.19382E+00 + 0.20944E+01 0.25133E+01 0.00000E+00 0.00000E+00 5 4.55175E+01 3.44980E+01 3.75131E+01 2.57801E+01 + 0.20944E+01 0.25133E+01 0.00000E+00 0.00000E+00 2 6.94707E-07 8.29685E+01 8.50431E-08 6.89482E-07 + 0.20944E+01 0.25133E+01 0.00000E+00 0.00000E+00 4 1.11884E-06 -8.69927E+01 5.86977E-08 -1.11730E-06 + 0.20944E+01 0.25133E+01 0.00000E+00 0.00000E+00 6 1.21930E-04 -1.74106E+02 -1.21286E-04 -1.25209E-05 + 0.24640E+01 0.24640E+01 0.00000E+00 0.00000E+00 1 1.62739E+00 1.80000E+02 -1.62739E+00 0.00000E+00 + 0.24640E+01 0.24640E+01 0.00000E+00 0.00000E+00 3 2.65716E-05 0.00000E+00 2.65716E-05 0.00000E+00 + 0.24640E+01 0.24640E+01 0.00000E+00 0.00000E+00 5 1.64331E+01 0.00000E+00 1.64331E+01 0.00000E+00 + 0.24640E+01 0.24640E+01 0.00000E+00 0.00000E+00 2 9.96787E-07 0.00000E+00 9.96787E-07 0.00000E+00 + 0.24640E+01 0.24640E+01 0.00000E+00 0.00000E+00 4 1.18508E-05 0.00000E+00 1.18508E-05 0.00000E+00 + 0.24640E+01 0.24640E+01 0.00000E+00 0.00000E+00 6 6.64460E-05 1.80000E+02 -6.64460E-05 0.00000E+00 + 0.24166E+01 0.24640E+01 0.00000E+00 0.00000E+00 1 2.91036E+00 -1.26271E+02 -1.72178E+00 -2.34642E+00 + 0.24166E+01 0.24640E+01 0.00000E+00 0.00000E+00 3 2.23080E+00 -5.53862E+00 2.22038E+00 -2.15309E-01 + 0.24166E+01 0.24640E+01 0.00000E+00 0.00000E+00 5 3.59041E+01 4.96506E+01 2.32460E+01 2.73629E+01 + 0.24166E+01 0.24640E+01 0.00000E+00 0.00000E+00 2 2.27657E-06 -1.01546E+02 -4.55665E-07 -2.23050E-06 + 0.24166E+01 0.24640E+01 0.00000E+00 0.00000E+00 4 5.86579E-07 3.58749E+01 4.75304E-07 3.43745E-07 + 0.24166E+01 0.24640E+01 0.00000E+00 0.00000E+00 6 1.66010E-04 -1.32756E+02 -1.12700E-04 -1.21893E-04 + 0.23710E+01 0.24640E+01 0.00000E+00 0.00000E+00 1 4.82429E+00 -1.71847E+02 -4.77553E+00 -6.84203E-01 + 0.23710E+01 0.24640E+01 0.00000E+00 0.00000E+00 3 5.04325E+00 -1.16186E+01 4.93992E+00 -1.01569E+00 + 0.23710E+01 0.24640E+01 0.00000E+00 0.00000E+00 5 1.14147E+02 8.04614E+01 1.89156E+01 1.12569E+02 + 0.23710E+01 0.24640E+01 0.00000E+00 0.00000E+00 2 1.77233E-06 -1.47327E+02 -1.49190E-06 -9.56771E-07 + 0.23710E+01 0.24640E+01 0.00000E+00 0.00000E+00 4 6.65699E-06 5.31297E+00 6.62839E-06 6.16410E-07 + 0.23710E+01 0.24640E+01 0.00000E+00 0.00000E+00 6 4.76147E-04 -5.59817E+01 2.66384E-04 -3.94659E-04 + 0.23271E+01 0.24640E+01 0.00000E+00 0.00000E+00 1 1.05162E+01 1.57660E+02 -9.72690E+00 3.99721E+00 + 0.23271E+01 0.24640E+01 0.00000E+00 0.00000E+00 3 5.18278E+00 -5.27377E+01 3.13799E+00 -4.12483E+00 + 0.23271E+01 0.24640E+01 0.00000E+00 0.00000E+00 5 1.17899E+02 8.29269E+01 1.45175E+01 1.17001E+02 + 0.23271E+01 0.24640E+01 0.00000E+00 0.00000E+00 2 2.02556E-06 -9.68752E+01 -2.42473E-07 -2.01099E-06 + 0.23271E+01 0.24640E+01 0.00000E+00 0.00000E+00 4 8.67031E-06 -9.18577E+01 -2.81060E-07 -8.66575E-06 + 0.23271E+01 0.24640E+01 0.00000E+00 0.00000E+00 6 1.34486E-04 -7.84345E+01 2.69629E-05 -1.31756E-04 + 0.22848E+01 0.24640E+01 0.00000E+00 0.00000E+00 1 9.59987E+00 1.53727E+02 -8.60814E+00 4.24940E+00 + 0.22848E+01 0.24640E+01 0.00000E+00 0.00000E+00 3 7.92159E+00 -9.36053E+01 -4.98136E-01 -7.90591E+00 + 0.22848E+01 0.24640E+01 0.00000E+00 0.00000E+00 5 6.34484E+01 4.39881E+01 4.56501E+01 4.40655E+01 + 0.22848E+01 0.24640E+01 0.00000E+00 0.00000E+00 2 1.52648E-06 -1.02919E+02 -3.41287E-07 -1.48784E-06 + 0.22848E+01 0.24640E+01 0.00000E+00 0.00000E+00 4 2.02892E-06 -1.64748E+02 -1.95746E-06 -5.33734E-07 + 0.22848E+01 0.24640E+01 0.00000E+00 0.00000E+00 6 2.33450E-05 4.20972E+01 1.73221E-05 1.56502E-05 + 0.22440E+01 0.24640E+01 0.00000E+00 0.00000E+00 1 5.62033E+00 1.46195E+01 5.43836E+00 1.41856E+00 + 0.22440E+01 0.24640E+01 0.00000E+00 0.00000E+00 3 7.42437E+00 -1.04382E+02 -1.84413E+00 -7.19169E+00 + 0.22440E+01 0.24640E+01 0.00000E+00 0.00000E+00 5 7.31717E+01 1.16111E+01 7.16743E+01 1.47271E+01 + 0.22440E+01 0.24640E+01 0.00000E+00 0.00000E+00 2 3.36477E-06 -1.78080E+02 -3.36288E-06 -1.12748E-07 + 0.22440E+01 0.24640E+01 0.00000E+00 0.00000E+00 4 7.43328E-06 -1.34784E+02 -5.23624E-06 -5.27593E-06 + 0.22440E+01 0.24640E+01 0.00000E+00 0.00000E+00 6 1.63077E-04 -1.53059E+02 -1.45379E-04 -7.38863E-05 + 0.22046E+01 0.24640E+01 0.00000E+00 0.00000E+00 1 1.58727E+01 1.81396E+01 1.50838E+01 4.94169E+00 + 0.22046E+01 0.24640E+01 0.00000E+00 0.00000E+00 3 4.31703E+00 -1.29376E+02 -2.73877E+00 -3.33704E+00 + 0.22046E+01 0.24640E+01 0.00000E+00 0.00000E+00 5 4.40080E+01 -7.96956E+00 4.35830E+01 -6.10158E+00 + 0.22046E+01 0.24640E+01 0.00000E+00 0.00000E+00 2 2.27771E-06 1.51662E+02 -2.00476E-06 1.08116E-06 + 0.22046E+01 0.24640E+01 0.00000E+00 0.00000E+00 4 3.42756E-06 -9.49794E+01 -2.97504E-07 -3.41462E-06 + 0.22046E+01 0.24640E+01 0.00000E+00 0.00000E+00 6 4.67777E-05 -1.83356E+01 4.44028E-05 -1.47154E-05 + 0.21666E+01 0.24640E+01 0.00000E+00 0.00000E+00 1 8.66877E+00 -7.38075E+00 8.59695E+00 -1.11361E+00 + 0.21666E+01 0.24640E+01 0.00000E+00 0.00000E+00 3 3.77499E+00 -1.77059E+02 -3.77002E+00 -1.93711E-01 + 0.21666E+01 0.24640E+01 0.00000E+00 0.00000E+00 5 1.99115E+01 5.57932E+01 1.11939E+01 1.64671E+01 + 0.21666E+01 0.24640E+01 0.00000E+00 0.00000E+00 2 1.50634E-06 1.08621E+01 1.47935E-06 2.83863E-07 + 0.21666E+01 0.24640E+01 0.00000E+00 0.00000E+00 4 2.57294E-06 -6.73079E+01 9.92586E-07 -2.37377E-06 + 0.21666E+01 0.24640E+01 0.00000E+00 0.00000E+00 6 1.70858E-04 8.35463E+01 1.92044E-05 1.69775E-04 + 0.21299E+01 0.24640E+01 0.00000E+00 0.00000E+00 1 2.12555E+01 -9.52994E+01 -1.96316E+00 -2.11647E+01 + 0.21299E+01 0.24640E+01 0.00000E+00 0.00000E+00 3 3.76957E+00 1.69664E+02 -3.70841E+00 6.76311E-01 + 0.21299E+01 0.24640E+01 0.00000E+00 0.00000E+00 5 5.16602E+01 9.05873E+01 -5.29557E-01 5.16575E+01 + 0.21299E+01 0.24640E+01 0.00000E+00 0.00000E+00 2 2.35479E-06 8.44371E+00 2.32926E-06 3.45771E-07 + 0.21299E+01 0.24640E+01 0.00000E+00 0.00000E+00 4 2.47714E-06 -3.64110E+01 1.99355E-06 -1.47037E-06 + 0.21299E+01 0.24640E+01 0.00000E+00 0.00000E+00 6 1.26386E-04 6.38374E+01 5.57261E-05 1.13437E-04 + 0.20944E+01 0.24640E+01 0.00000E+00 0.00000E+00 1 2.66000E+01 -9.34550E+01 -1.60304E+00 -2.65516E+01 + 0.20944E+01 0.24640E+01 0.00000E+00 0.00000E+00 3 1.09185E+00 1.10306E+02 -3.78908E-01 1.02400E+00 + 0.20944E+01 0.24640E+01 0.00000E+00 0.00000E+00 5 5.88171E+01 8.96013E+01 4.09256E-01 5.88157E+01 + 0.20944E+01 0.24640E+01 0.00000E+00 0.00000E+00 2 1.58192E-06 -8.42631E+01 1.58129E-07 -1.57400E-06 + 0.20944E+01 0.24640E+01 0.00000E+00 0.00000E+00 4 8.26462E-07 -1.10483E+02 -2.89209E-07 -7.74207E-07 + 0.20944E+01 0.24640E+01 0.00000E+00 0.00000E+00 6 8.97645E-05 4.07513E+01 6.80011E-05 5.85962E-05 + 0.24166E+01 0.24166E+01 0.00000E+00 0.00000E+00 1 9.59032E-01 1.80000E+02 -9.59032E-01 0.00000E+00 + 0.24166E+01 0.24166E+01 0.00000E+00 0.00000E+00 3 1.60482E-05 0.00000E+00 1.60482E-05 0.00000E+00 + 0.24166E+01 0.24166E+01 0.00000E+00 0.00000E+00 5 1.49407E+01 0.00000E+00 1.49407E+01 0.00000E+00 + 0.24166E+01 0.24166E+01 0.00000E+00 0.00000E+00 2 4.27245E-06 1.80000E+02 -4.27245E-06 0.00000E+00 + 0.24166E+01 0.24166E+01 0.00000E+00 0.00000E+00 4 1.32833E-05 0.00000E+00 1.32833E-05 0.00000E+00 + 0.24166E+01 0.24166E+01 0.00000E+00 0.00000E+00 6 9.77430E-05 1.80000E+02 -9.77430E-05 0.00000E+00 + 0.23710E+01 0.24166E+01 0.00000E+00 0.00000E+00 1 3.29044E+00 -1.34722E+02 -2.31536E+00 -2.33797E+00 + 0.23710E+01 0.24166E+01 0.00000E+00 0.00000E+00 3 2.24660E+00 -7.69601E+00 2.22637E+00 -3.00859E-01 + 0.23710E+01 0.24166E+01 0.00000E+00 0.00000E+00 5 3.73915E+01 4.76427E+01 2.51926E+01 2.76307E+01 + 0.23710E+01 0.24166E+01 0.00000E+00 0.00000E+00 2 2.10815E-06 -5.96550E+01 1.06505E-06 -1.81934E-06 + 0.23710E+01 0.24166E+01 0.00000E+00 0.00000E+00 4 2.84560E-06 -6.62104E+01 1.14786E-06 -2.60382E-06 + 0.23710E+01 0.24166E+01 0.00000E+00 0.00000E+00 6 1.98337E-04 2.05034E+01 1.85773E-04 6.94703E-05 + 0.23271E+01 0.24166E+01 0.00000E+00 0.00000E+00 1 4.48761E+00 -1.71785E+02 -4.44156E+00 -6.41256E-01 + 0.23271E+01 0.24166E+01 0.00000E+00 0.00000E+00 3 4.86181E+00 -1.02060E+01 4.78488E+00 -8.61456E-01 + 0.23271E+01 0.24166E+01 0.00000E+00 0.00000E+00 5 1.19374E+02 8.30553E+01 1.44337E+01 1.18498E+02 + 0.23271E+01 0.24166E+01 0.00000E+00 0.00000E+00 2 3.43434E-06 1.77992E+02 -3.43223E-06 1.20355E-07 + 0.23271E+01 0.24166E+01 0.00000E+00 0.00000E+00 4 1.47346E-06 -1.72277E+02 -1.46009E-06 -1.98011E-07 + 0.23271E+01 0.24166E+01 0.00000E+00 0.00000E+00 6 2.05305E-04 -4.11288E+00 2.04776E-04 -1.47248E-05 + 0.22848E+01 0.24166E+01 0.00000E+00 0.00000E+00 1 1.10570E+01 1.58523E+02 -1.02892E+01 4.04830E+00 + 0.22848E+01 0.24166E+01 0.00000E+00 0.00000E+00 3 5.57811E+00 -5.64170E+01 3.08550E+00 -4.64704E+00 + 0.22848E+01 0.24166E+01 0.00000E+00 0.00000E+00 5 1.12087E+02 7.96187E+01 2.01979E+01 1.10252E+02 + 0.22848E+01 0.24166E+01 0.00000E+00 0.00000E+00 2 1.36369E-06 5.63592E+01 7.55463E-07 1.13531E-06 + 0.22848E+01 0.24166E+01 0.00000E+00 0.00000E+00 4 7.53426E-06 -8.93759E+01 8.20629E-08 -7.53382E-06 + 0.22848E+01 0.24166E+01 0.00000E+00 0.00000E+00 6 9.21702E-05 2.54065E+01 8.32561E-05 3.95444E-05 + 0.22440E+01 0.24166E+01 0.00000E+00 0.00000E+00 1 9.02836E+00 1.54345E+02 -8.13835E+00 3.90878E+00 + 0.22440E+01 0.24166E+01 0.00000E+00 0.00000E+00 3 8.34311E+00 -9.47944E+01 -6.97320E-01 -8.31392E+00 + 0.22440E+01 0.24166E+01 0.00000E+00 0.00000E+00 5 6.46496E+01 4.37749E+01 4.66810E+01 4.47263E+01 + 0.22440E+01 0.24166E+01 0.00000E+00 0.00000E+00 2 1.68581E-06 -1.63060E+02 -1.61266E-06 -4.91208E-07 + 0.22440E+01 0.24166E+01 0.00000E+00 0.00000E+00 4 4.59077E-06 -7.08521E+01 1.50581E-06 -4.33678E-06 + 0.22440E+01 0.24166E+01 0.00000E+00 0.00000E+00 6 2.97532E-05 1.77633E+02 -2.97278E-05 1.22877E-06 + 0.22046E+01 0.24166E+01 0.00000E+00 0.00000E+00 1 7.20899E+00 1.50333E+01 6.96227E+00 1.86987E+00 + 0.22046E+01 0.24166E+01 0.00000E+00 0.00000E+00 3 7.08530E+00 -1.02686E+02 -1.55598E+00 -6.91234E+00 + 0.22046E+01 0.24166E+01 0.00000E+00 0.00000E+00 5 7.40432E+01 9.47755E+00 7.30326E+01 1.21920E+01 + 0.22046E+01 0.24166E+01 0.00000E+00 0.00000E+00 2 1.14001E-06 -7.49781E+01 2.95476E-07 -1.10105E-06 + 0.22046E+01 0.24166E+01 0.00000E+00 0.00000E+00 4 1.42776E-06 -9.94398E+00 1.40631E-06 -2.46553E-07 + 0.22046E+01 0.24166E+01 0.00000E+00 0.00000E+00 6 2.78570E-04 1.56225E+02 -2.54929E-04 1.12305E-04 + 0.21666E+01 0.24166E+01 0.00000E+00 0.00000E+00 1 1.56576E+01 2.31540E+01 1.43964E+01 6.15663E+00 + 0.21666E+01 0.24166E+01 0.00000E+00 0.00000E+00 3 4.16196E+00 -1.32456E+02 -2.80942E+00 -3.07067E+00 + 0.21666E+01 0.24166E+01 0.00000E+00 0.00000E+00 5 4.41034E+01 -8.25322E+00 4.36467E+01 -6.33097E+00 + 0.21666E+01 0.24166E+01 0.00000E+00 0.00000E+00 2 1.25392E-06 1.70977E+02 -1.23840E-06 1.96659E-07 + 0.21666E+01 0.24166E+01 0.00000E+00 0.00000E+00 4 2.12017E-06 -1.47603E+02 -1.79017E-06 -1.13596E-06 + 0.21666E+01 0.24166E+01 0.00000E+00 0.00000E+00 6 1.90925E-05 1.47468E+02 -1.60967E-05 1.02675E-05 + 0.21299E+01 0.24166E+01 0.00000E+00 0.00000E+00 1 8.07919E+00 -2.73079E+01 7.17879E+00 -3.70651E+00 + 0.21299E+01 0.24166E+01 0.00000E+00 0.00000E+00 3 4.14169E+00 -1.78657E+02 -4.14055E+00 -9.70542E-02 + 0.21299E+01 0.24166E+01 0.00000E+00 0.00000E+00 5 2.87978E+01 6.32728E+01 1.29516E+01 2.57210E+01 + 0.21299E+01 0.24166E+01 0.00000E+00 0.00000E+00 2 1.32186E-06 8.08276E+01 2.10712E-07 1.30496E-06 + 0.21299E+01 0.24166E+01 0.00000E+00 0.00000E+00 4 5.10099E-06 -8.39159E+01 5.40646E-07 -5.07226E-06 + 0.21299E+01 0.24166E+01 0.00000E+00 0.00000E+00 6 2.03888E-04 1.12950E+02 -7.95018E-05 1.87749E-04 + 0.20944E+01 0.24166E+01 0.00000E+00 0.00000E+00 1 2.31982E+01 -9.73313E+01 -2.96024E+00 -2.30086E+01 + 0.20944E+01 0.24166E+01 0.00000E+00 0.00000E+00 3 3.59513E+00 1.65930E+02 -3.48727E+00 8.74031E-01 + 0.20944E+01 0.24166E+01 0.00000E+00 0.00000E+00 5 5.60198E+01 8.75221E+01 2.42192E+00 5.59674E+01 + 0.20944E+01 0.24166E+01 0.00000E+00 0.00000E+00 2 2.44246E-06 -1.76036E+02 -2.43662E-06 -1.68831E-07 + 0.20944E+01 0.24166E+01 0.00000E+00 0.00000E+00 4 8.84298E-08 -1.91467E+01 8.35380E-08 -2.90039E-08 + 0.20944E+01 0.24166E+01 0.00000E+00 0.00000E+00 6 3.46101E-05 1.17419E+01 3.38859E-05 7.04325E-06 + 0.23710E+01 0.23710E+01 0.00000E+00 0.00000E+00 1 2.51411E+00 1.80000E+02 -2.51411E+00 0.00000E+00 + 0.23710E+01 0.23710E+01 0.00000E+00 0.00000E+00 3 1.01704E-05 0.00000E+00 1.01704E-05 0.00000E+00 + 0.23710E+01 0.23710E+01 0.00000E+00 0.00000E+00 5 1.65535E+01 0.00000E+00 1.65535E+01 0.00000E+00 + 0.23710E+01 0.23710E+01 0.00000E+00 0.00000E+00 2 9.94306E-07 1.80000E+02 -9.94306E-07 0.00000E+00 + 0.23710E+01 0.23710E+01 0.00000E+00 0.00000E+00 4 4.86764E-06 0.00000E+00 4.86764E-06 0.00000E+00 + 0.23710E+01 0.23710E+01 0.00000E+00 0.00000E+00 6 5.76070E-05 1.80000E+02 -5.76070E-05 0.00000E+00 + 0.23271E+01 0.23710E+01 0.00000E+00 0.00000E+00 1 3.23272E+00 -1.31307E+02 -2.13392E+00 -2.42835E+00 + 0.23271E+01 0.23710E+01 0.00000E+00 0.00000E+00 3 2.30706E+00 -6.91139E+00 2.29029E+00 -2.77618E-01 + 0.23271E+01 0.23710E+01 0.00000E+00 0.00000E+00 5 3.82785E+01 5.17116E+01 2.37181E+01 3.00449E+01 + 0.23271E+01 0.23710E+01 0.00000E+00 0.00000E+00 2 1.72087E-06 -9.30177E+01 -9.05939E-08 -1.71848E-06 + 0.23271E+01 0.23710E+01 0.00000E+00 0.00000E+00 4 5.97793E-06 1.50725E+02 -5.21443E-06 2.92325E-06 + 0.23271E+01 0.23710E+01 0.00000E+00 0.00000E+00 6 3.63202E-04 -1.10170E+01 3.56508E-04 -6.94080E-05 + 0.22848E+01 0.23710E+01 0.00000E+00 0.00000E+00 1 4.60457E+00 -1.73609E+02 -4.57596E+00 -5.12512E-01 + 0.22848E+01 0.23710E+01 0.00000E+00 0.00000E+00 3 4.80372E+00 -1.25714E+01 4.68856E+00 -1.04556E+00 + 0.22848E+01 0.23710E+01 0.00000E+00 0.00000E+00 5 1.21148E+02 8.26672E+01 1.54625E+01 1.20158E+02 + 0.22848E+01 0.23710E+01 0.00000E+00 0.00000E+00 2 8.17058E-07 -1.35530E+01 7.94306E-07 -1.91474E-07 + 0.22848E+01 0.23710E+01 0.00000E+00 0.00000E+00 4 1.09341E-05 -7.35319E-01 1.09332E-05 -1.40321E-07 + 0.22848E+01 0.23710E+01 0.00000E+00 0.00000E+00 6 1.41056E-04 1.48178E+02 -1.19854E-04 7.43769E-05 + 0.22440E+01 0.23710E+01 0.00000E+00 0.00000E+00 1 1.12014E+01 1.56411E+02 -1.02654E+01 4.48257E+00 + 0.22440E+01 0.23710E+01 0.00000E+00 0.00000E+00 3 5.70665E+00 -6.14195E+01 2.73002E+00 -5.01127E+00 + 0.22440E+01 0.23710E+01 0.00000E+00 0.00000E+00 5 1.10802E+02 8.03870E+01 1.85032E+01 1.09246E+02 + 0.22440E+01 0.23710E+01 0.00000E+00 0.00000E+00 2 1.38247E-06 -1.34730E+02 -9.72945E-07 -9.82144E-07 + 0.22440E+01 0.23710E+01 0.00000E+00 0.00000E+00 4 1.08116E-05 -8.84942E+01 2.84113E-07 -1.08079E-05 + 0.22440E+01 0.23710E+01 0.00000E+00 0.00000E+00 6 4.95307E-05 2.18727E+01 4.59652E-05 1.84525E-05 + 0.22046E+01 0.23710E+01 0.00000E+00 0.00000E+00 1 8.25510E+00 1.55917E+02 -7.53656E+00 3.36854E+00 + 0.22046E+01 0.23710E+01 0.00000E+00 0.00000E+00 3 7.72769E+00 -9.86082E+01 -1.15666E+00 -7.64064E+00 + 0.22046E+01 0.23710E+01 0.00000E+00 0.00000E+00 5 6.14841E+01 3.27726E+01 5.16974E+01 3.32817E+01 + 0.22046E+01 0.23710E+01 0.00000E+00 0.00000E+00 2 2.12278E-06 -1.54670E+02 -1.91869E-06 -9.08197E-07 + 0.22046E+01 0.23710E+01 0.00000E+00 0.00000E+00 4 7.74713E-06 -8.73794E+01 3.54212E-07 -7.73902E-06 + 0.22046E+01 0.23710E+01 0.00000E+00 0.00000E+00 6 5.28933E-05 9.72034E+01 -6.63237E-06 5.24759E-05 + 0.21666E+01 0.23710E+01 0.00000E+00 0.00000E+00 1 7.85583E+00 1.71911E+01 7.50487E+00 2.32187E+00 + 0.21666E+01 0.23710E+01 0.00000E+00 0.00000E+00 3 6.62369E+00 -1.07117E+02 -1.94949E+00 -6.33031E+00 + 0.21666E+01 0.23710E+01 0.00000E+00 0.00000E+00 5 7.19310E+01 -2.55913E-01 7.19303E+01 -3.21280E-01 + 0.21666E+01 0.23710E+01 0.00000E+00 0.00000E+00 2 3.42622E-06 -1.08816E+02 -1.10506E-06 -3.24312E-06 + 0.21666E+01 0.23710E+01 0.00000E+00 0.00000E+00 4 2.45914E-06 -1.07314E+02 -7.31853E-07 -2.34771E-06 + 0.21666E+01 0.23710E+01 0.00000E+00 0.00000E+00 6 1.93186E-04 9.41748E+01 -1.40637E-05 1.92673E-04 + 0.21299E+01 0.23710E+01 0.00000E+00 0.00000E+00 1 1.57615E+01 2.11123E+01 1.47035E+01 5.67725E+00 + 0.21299E+01 0.23710E+01 0.00000E+00 0.00000E+00 3 4.12341E+00 -1.43771E+02 -3.32622E+00 -2.43697E+00 + 0.21299E+01 0.23710E+01 0.00000E+00 0.00000E+00 5 3.90024E+01 -2.27265E+01 3.59743E+01 -1.50679E+01 + 0.21299E+01 0.23710E+01 0.00000E+00 0.00000E+00 2 6.75023E-07 -1.60326E+02 -6.35616E-07 -2.27264E-07 + 0.21299E+01 0.23710E+01 0.00000E+00 0.00000E+00 4 4.41882E-06 -1.60137E+02 -4.15594E-06 -1.50139E-06 + 0.21299E+01 0.23710E+01 0.00000E+00 0.00000E+00 6 5.44941E-05 -3.84270E+01 4.26907E-05 -3.38690E-05 + 0.20944E+01 0.23710E+01 0.00000E+00 0.00000E+00 1 9.96840E+00 -4.38440E+01 7.18949E+00 -6.90509E+00 + 0.20944E+01 0.23710E+01 0.00000E+00 0.00000E+00 3 4.36793E+00 1.75158E+02 -4.35234E+00 3.68701E-01 + 0.20944E+01 0.23710E+01 0.00000E+00 0.00000E+00 5 3.08478E+01 8.84235E+01 8.48693E-01 3.08362E+01 + 0.20944E+01 0.23710E+01 0.00000E+00 0.00000E+00 2 3.44414E-06 -9.32438E+01 -1.94886E-07 -3.43862E-06 + 0.20944E+01 0.23710E+01 0.00000E+00 0.00000E+00 4 2.63412E-06 -6.20510E+01 1.23457E-06 -2.32689E-06 + 0.20944E+01 0.23710E+01 0.00000E+00 0.00000E+00 6 2.51327E-04 8.76492E+01 1.03091E-05 2.51116E-04 + 0.23271E+01 0.23271E+01 0.00000E+00 0.00000E+00 1 1.66378E+00 1.80000E+02 -1.66378E+00 0.00000E+00 + 0.23271E+01 0.23271E+01 0.00000E+00 0.00000E+00 3 6.12907E-06 0.00000E+00 6.12907E-06 0.00000E+00 + 0.23271E+01 0.23271E+01 0.00000E+00 0.00000E+00 5 1.48457E+01 0.00000E+00 1.48457E+01 0.00000E+00 + 0.23271E+01 0.23271E+01 0.00000E+00 0.00000E+00 2 3.03711E-07 1.80000E+02 -3.03711E-07 0.00000E+00 + 0.23271E+01 0.23271E+01 0.00000E+00 0.00000E+00 4 1.17644E-05 0.00000E+00 1.17644E-05 0.00000E+00 + 0.23271E+01 0.23271E+01 0.00000E+00 0.00000E+00 6 2.50416E-05 1.80000E+02 -2.50416E-05 0.00000E+00 + 0.22848E+01 0.23271E+01 0.00000E+00 0.00000E+00 1 3.20392E+00 -1.27274E+02 -1.94038E+00 -2.54952E+00 + 0.22848E+01 0.23271E+01 0.00000E+00 0.00000E+00 3 2.49595E+00 -7.57406E+00 2.47418E+00 -3.28986E-01 + 0.22848E+01 0.23271E+01 0.00000E+00 0.00000E+00 5 3.79429E+01 5.38816E+01 2.23657E+01 3.06503E+01 + 0.22848E+01 0.23271E+01 0.00000E+00 0.00000E+00 2 1.50299E-06 6.75234E+01 5.74604E-07 1.38882E-06 + 0.22848E+01 0.23271E+01 0.00000E+00 0.00000E+00 4 1.91026E-06 1.36220E+02 -1.37921E-06 1.32170E-06 + 0.22848E+01 0.23271E+01 0.00000E+00 0.00000E+00 6 2.27853E-04 -8.82064E+01 7.13173E-06 -2.27742E-04 + 0.22440E+01 0.23271E+01 0.00000E+00 0.00000E+00 1 5.26317E+00 -1.75554E+02 -5.24733E+00 -4.07987E-01 + 0.22440E+01 0.23271E+01 0.00000E+00 0.00000E+00 3 5.08230E+00 -1.41644E+01 4.92778E+00 -1.24366E+00 + 0.22440E+01 0.23271E+01 0.00000E+00 0.00000E+00 5 1.22101E+02 8.19903E+01 1.70137E+01 1.20910E+02 + 0.22440E+01 0.23271E+01 0.00000E+00 0.00000E+00 2 1.84558E-06 -1.56140E+02 -1.68785E-06 -7.46540E-07 + 0.22440E+01 0.23271E+01 0.00000E+00 0.00000E+00 4 2.08511E-06 -9.28527E-01 2.08484E-06 -3.37895E-08 + 0.22440E+01 0.23271E+01 0.00000E+00 0.00000E+00 6 1.21474E-04 -4.06481E+01 9.21656E-05 -7.91299E-05 + 0.22046E+01 0.23271E+01 0.00000E+00 0.00000E+00 1 1.17684E+01 1.58606E+02 -1.09575E+01 4.29289E+00 + 0.22046E+01 0.23271E+01 0.00000E+00 0.00000E+00 3 5.73142E+00 -6.31114E+01 2.59208E+00 -5.11178E+00 + 0.22046E+01 0.23271E+01 0.00000E+00 0.00000E+00 5 1.11465E+02 7.95724E+01 2.01742E+01 1.09624E+02 + 0.22046E+01 0.23271E+01 0.00000E+00 0.00000E+00 2 1.88872E-06 -3.39485E+01 1.56677E-06 -1.05475E-06 + 0.22046E+01 0.23271E+01 0.00000E+00 0.00000E+00 4 1.24921E-05 -1.05664E+02 -3.37279E-06 -1.20282E-05 + 0.22046E+01 0.23271E+01 0.00000E+00 0.00000E+00 6 3.76591E-05 8.72415E+01 1.81241E-06 3.76154E-05 + 0.21666E+01 0.23271E+01 0.00000E+00 0.00000E+00 1 7.62036E+00 1.48501E+02 -6.49747E+00 3.98154E+00 + 0.21666E+01 0.23271E+01 0.00000E+00 0.00000E+00 3 8.07935E+00 -9.58507E+01 -8.23584E-01 -8.03726E+00 + 0.21666E+01 0.23271E+01 0.00000E+00 0.00000E+00 5 6.62201E+01 3.34156E+01 5.52738E+01 3.64679E+01 + 0.21666E+01 0.23271E+01 0.00000E+00 0.00000E+00 2 1.70708E-06 5.40875E+00 1.69948E-06 1.60910E-07 + 0.21666E+01 0.23271E+01 0.00000E+00 0.00000E+00 4 4.43270E-07 3.46091E+01 3.64831E-07 2.51766E-07 + 0.21666E+01 0.23271E+01 0.00000E+00 0.00000E+00 6 1.13153E-04 -5.04382E+01 7.20681E-05 -8.72339E-05 + 0.21299E+01 0.23271E+01 0.00000E+00 0.00000E+00 1 9.33327E+00 1.63463E+01 8.95600E+00 2.62678E+00 + 0.21299E+01 0.23271E+01 0.00000E+00 0.00000E+00 3 6.73542E+00 -1.04561E+02 -1.69340E+00 -6.51907E+00 + 0.21299E+01 0.23271E+01 0.00000E+00 0.00000E+00 5 7.27446E+01 5.15510E+00 7.24504E+01 6.53625E+00 + 0.21299E+01 0.23271E+01 0.00000E+00 0.00000E+00 2 1.66185E-06 7.30276E+01 4.85112E-07 1.58947E-06 + 0.21299E+01 0.23271E+01 0.00000E+00 0.00000E+00 4 4.63007E-06 -1.15016E+02 -1.95793E-06 -4.19572E-06 + 0.21299E+01 0.23271E+01 0.00000E+00 0.00000E+00 6 7.16823E-05 1.02347E+02 -1.53273E-05 7.00245E-05 + 0.20944E+01 0.23271E+01 0.00000E+00 0.00000E+00 1 1.53788E+01 1.62263E+01 1.47662E+01 4.29732E+00 + 0.20944E+01 0.23271E+01 0.00000E+00 0.00000E+00 3 4.04320E+00 -1.44997E+02 -3.31187E+00 -2.31926E+00 + 0.20944E+01 0.23271E+01 0.00000E+00 0.00000E+00 5 3.08768E+01 -3.57626E-01 3.08762E+01 -1.92724E-01 + 0.20944E+01 0.23271E+01 0.00000E+00 0.00000E+00 2 1.03963E-06 3.62357E+01 8.38558E-07 6.14535E-07 + 0.20944E+01 0.23271E+01 0.00000E+00 0.00000E+00 4 1.51533E-06 1.54121E+02 -1.36337E-06 6.61394E-07 + 0.20944E+01 0.23271E+01 0.00000E+00 0.00000E+00 6 8.54304E-05 1.30058E+01 8.32389E-05 1.92261E-05 + 0.22848E+01 0.22848E+01 0.00000E+00 0.00000E+00 1 1.56286E+00 1.80000E+02 -1.56286E+00 0.00000E+00 + 0.22848E+01 0.22848E+01 0.00000E+00 0.00000E+00 3 6.47903E-06 0.00000E+00 6.47903E-06 0.00000E+00 + 0.22848E+01 0.22848E+01 0.00000E+00 0.00000E+00 5 1.42047E+01 0.00000E+00 1.42047E+01 0.00000E+00 + 0.22848E+01 0.22848E+01 0.00000E+00 0.00000E+00 2 2.24027E-06 0.00000E+00 2.24027E-06 0.00000E+00 + 0.22848E+01 0.22848E+01 0.00000E+00 0.00000E+00 4 1.43419E-05 0.00000E+00 1.43419E-05 0.00000E+00 + 0.22848E+01 0.22848E+01 0.00000E+00 0.00000E+00 6 2.91130E-05 1.80000E+02 -2.91130E-05 0.00000E+00 + 0.22440E+01 0.22848E+01 0.00000E+00 0.00000E+00 1 3.64622E+00 -1.23859E+02 -2.03149E+00 -3.02786E+00 + 0.22440E+01 0.22848E+01 0.00000E+00 0.00000E+00 3 2.51870E+00 -7.61593E+00 2.49648E+00 -3.33809E-01 + 0.22440E+01 0.22848E+01 0.00000E+00 0.00000E+00 5 4.04245E+01 5.47874E+01 2.33092E+01 3.30275E+01 + 0.22440E+01 0.22848E+01 0.00000E+00 0.00000E+00 2 2.37609E-06 -4.40877E+01 1.70669E-06 -1.65319E-06 + 0.22440E+01 0.22848E+01 0.00000E+00 0.00000E+00 4 7.48753E-06 1.56327E+02 -6.85746E-06 3.00638E-06 + 0.22440E+01 0.22848E+01 0.00000E+00 0.00000E+00 6 1.46665E-04 -2.98037E+01 1.27266E-04 -7.28967E-05 + 0.22046E+01 0.22848E+01 0.00000E+00 0.00000E+00 1 5.13155E+00 -1.76107E+02 -5.11971E+00 -3.48410E-01 + 0.22046E+01 0.22848E+01 0.00000E+00 0.00000E+00 3 4.78575E+00 -1.19142E+01 4.68265E+00 -9.88000E-01 + 0.22046E+01 0.22848E+01 0.00000E+00 0.00000E+00 5 1.28137E+02 8.35634E+01 1.43646E+01 1.27329E+02 + 0.22046E+01 0.22848E+01 0.00000E+00 0.00000E+00 2 9.56700E-07 9.85345E+01 -1.41979E-07 9.46106E-07 + 0.22046E+01 0.22848E+01 0.00000E+00 0.00000E+00 4 1.53400E-06 2.33493E+01 1.40838E-06 6.07979E-07 + 0.22046E+01 0.22848E+01 0.00000E+00 0.00000E+00 6 1.65632E-04 -5.74881E+01 8.90231E-05 -1.39674E-04 + 0.21666E+01 0.22848E+01 0.00000E+00 0.00000E+00 1 1.21376E+01 1.57957E+02 -1.12503E+01 4.55530E+00 + 0.21666E+01 0.22848E+01 0.00000E+00 0.00000E+00 3 5.92341E+00 -6.71152E+01 2.30350E+00 -5.45717E+00 + 0.21666E+01 0.22848E+01 0.00000E+00 0.00000E+00 5 9.87885E+01 7.49032E+01 2.57295E+01 9.53790E+01 + 0.21666E+01 0.22848E+01 0.00000E+00 0.00000E+00 2 4.03998E-06 -9.81618E+01 -5.73552E-07 -3.99906E-06 + 0.21666E+01 0.22848E+01 0.00000E+00 0.00000E+00 4 9.83424E-06 -9.69611E+01 -1.19187E-06 -9.76175E-06 + 0.21666E+01 0.22848E+01 0.00000E+00 0.00000E+00 6 5.07488E-05 8.15329E+01 7.47236E-06 5.01957E-05 + 0.21299E+01 0.22848E+01 0.00000E+00 0.00000E+00 1 7.26880E+00 1.49323E+02 -6.25160E+00 3.70848E+00 + 0.21299E+01 0.22848E+01 0.00000E+00 0.00000E+00 3 8.16749E+00 -9.87052E+01 -1.23615E+00 -8.07340E+00 + 0.21299E+01 0.22848E+01 0.00000E+00 0.00000E+00 5 6.57019E+01 3.07856E+01 5.64437E+01 3.36280E+01 + 0.21299E+01 0.22848E+01 0.00000E+00 0.00000E+00 2 7.16164E-07 -7.72561E+00 7.09664E-07 -9.62733E-08 + 0.21299E+01 0.22848E+01 0.00000E+00 0.00000E+00 4 5.33055E-06 1.78605E+02 -5.32897E-06 1.29799E-07 + 0.21299E+01 0.22848E+01 0.00000E+00 0.00000E+00 6 2.66012E-04 -1.19642E+02 -1.31564E-04 -2.31199E-04 + 0.20944E+01 0.22848E+01 0.00000E+00 0.00000E+00 1 1.12179E+01 9.18696E+00 1.10740E+01 1.79101E+00 + 0.20944E+01 0.22848E+01 0.00000E+00 0.00000E+00 3 6.31591E+00 -1.06712E+02 -1.81616E+00 -6.04915E+00 + 0.20944E+01 0.22848E+01 0.00000E+00 0.00000E+00 5 7.09518E+01 3.21537E+00 7.08401E+01 3.97964E+00 + 0.20944E+01 0.22848E+01 0.00000E+00 0.00000E+00 2 2.03983E-06 7.91649E+01 3.83454E-07 2.00346E-06 + 0.20944E+01 0.22848E+01 0.00000E+00 0.00000E+00 4 4.48152E-06 1.32446E+02 -3.02456E-06 3.30697E-06 + 0.20944E+01 0.22848E+01 0.00000E+00 0.00000E+00 6 1.24124E-04 -5.81115E+01 6.55706E-05 -1.05391E-04 + 0.22440E+01 0.22440E+01 0.00000E+00 0.00000E+00 1 2.21362E+00 1.80000E+02 -2.21362E+00 0.00000E+00 + 0.22440E+01 0.22440E+01 0.00000E+00 0.00000E+00 3 4.98642E-06 0.00000E+00 4.98642E-06 0.00000E+00 + 0.22440E+01 0.22440E+01 0.00000E+00 0.00000E+00 5 1.45033E+01 0.00000E+00 1.45033E+01 0.00000E+00 + 0.22440E+01 0.22440E+01 0.00000E+00 0.00000E+00 2 8.36424E-07 1.80000E+02 -8.36424E-07 0.00000E+00 + 0.22440E+01 0.22440E+01 0.00000E+00 0.00000E+00 4 8.10463E-06 0.00000E+00 8.10463E-06 0.00000E+00 + 0.22440E+01 0.22440E+01 0.00000E+00 0.00000E+00 6 8.84465E-05 1.80000E+02 -8.84465E-05 0.00000E+00 + 0.22046E+01 0.22440E+01 0.00000E+00 0.00000E+00 1 3.89333E+00 -1.24658E+02 -2.21402E+00 -3.20251E+00 + 0.22046E+01 0.22440E+01 0.00000E+00 0.00000E+00 3 2.48684E+00 -7.79987E+00 2.46383E+00 -3.37497E-01 + 0.22046E+01 0.22440E+01 0.00000E+00 0.00000E+00 5 4.22529E+01 5.74754E+01 2.27178E+01 3.56260E+01 + 0.22046E+01 0.22440E+01 0.00000E+00 0.00000E+00 2 2.01517E-06 -4.31111E+01 1.47114E-06 -1.37720E-06 + 0.22046E+01 0.22440E+01 0.00000E+00 0.00000E+00 4 6.54532E-06 1.62545E+02 -6.24391E-06 1.96335E-06 + 0.22046E+01 0.22440E+01 0.00000E+00 0.00000E+00 6 1.19649E-04 5.05196E+01 7.60744E-05 9.23498E-05 + 0.21666E+01 0.22440E+01 0.00000E+00 0.00000E+00 1 5.42571E+00 -1.76826E+02 -5.41739E+00 -3.00460E-01 + 0.21666E+01 0.22440E+01 0.00000E+00 0.00000E+00 3 4.70330E+00 -1.29312E+01 4.58402E+00 -1.05251E+00 + 0.21666E+01 0.22440E+01 0.00000E+00 0.00000E+00 5 1.30831E+02 8.22879E+01 1.75568E+01 1.29647E+02 + 0.21666E+01 0.22440E+01 0.00000E+00 0.00000E+00 2 1.31430E-06 -1.72187E+01 1.25539E-06 -3.89058E-07 + 0.21666E+01 0.22440E+01 0.00000E+00 0.00000E+00 4 2.89151E-06 1.74726E+02 -2.87927E-06 2.65786E-07 + 0.21666E+01 0.22440E+01 0.00000E+00 0.00000E+00 6 7.45065E-05 -1.19683E+02 -3.68952E-05 -6.47300E-05 + 0.21299E+01 0.22440E+01 0.00000E+00 0.00000E+00 1 1.21362E+01 1.58224E+02 -1.12702E+01 4.50224E+00 + 0.21299E+01 0.22440E+01 0.00000E+00 0.00000E+00 3 6.03805E+00 -7.04826E+01 2.01727E+00 -5.69111E+00 + 0.21299E+01 0.22440E+01 0.00000E+00 0.00000E+00 5 9.72676E+01 7.65296E+01 2.26578E+01 9.45918E+01 + 0.21299E+01 0.22440E+01 0.00000E+00 0.00000E+00 2 3.11693E-06 -7.38506E+01 8.66950E-07 -2.99393E-06 + 0.21299E+01 0.22440E+01 0.00000E+00 0.00000E+00 4 8.73655E-06 -8.10936E+01 1.35259E-06 -8.63121E-06 + 0.21299E+01 0.22440E+01 0.00000E+00 0.00000E+00 6 1.07319E-05 -6.68298E+01 4.22262E-06 -9.86626E-06 + 0.20944E+01 0.22440E+01 0.00000E+00 0.00000E+00 1 5.73219E+00 1.46528E+02 -4.78154E+00 3.16147E+00 + 0.20944E+01 0.22440E+01 0.00000E+00 0.00000E+00 3 7.68175E+00 -9.90306E+01 -1.20575E+00 -7.58653E+00 + 0.20944E+01 0.22440E+01 0.00000E+00 0.00000E+00 5 5.80712E+01 2.64435E+01 5.19954E+01 2.58600E+01 + 0.20944E+01 0.22440E+01 0.00000E+00 0.00000E+00 2 9.35021E-07 -1.55839E+02 -8.53109E-07 -3.82713E-07 + 0.20944E+01 0.22440E+01 0.00000E+00 0.00000E+00 4 2.26569E-06 -5.07482E+00 2.25680E-06 -2.00415E-07 + 0.20944E+01 0.22440E+01 0.00000E+00 0.00000E+00 6 7.68801E-05 -1.00813E+02 -1.44235E-05 -7.55150E-05 + 0.22046E+01 0.22046E+01 0.00000E+00 0.00000E+00 1 1.81499E+00 1.80000E+02 -1.81499E+00 0.00000E+00 + 0.22046E+01 0.22046E+01 0.00000E+00 0.00000E+00 3 3.49882E-06 0.00000E+00 3.49882E-06 0.00000E+00 + 0.22046E+01 0.22046E+01 0.00000E+00 0.00000E+00 5 1.24185E+01 0.00000E+00 1.24185E+01 0.00000E+00 + 0.22046E+01 0.22046E+01 0.00000E+00 0.00000E+00 2 3.62506E-06 0.00000E+00 3.62506E-06 0.00000E+00 + 0.22046E+01 0.22046E+01 0.00000E+00 0.00000E+00 4 1.14240E-05 0.00000E+00 1.14240E-05 0.00000E+00 + 0.22046E+01 0.22046E+01 0.00000E+00 0.00000E+00 6 8.82489E-05 1.80000E+02 -8.82489E-05 0.00000E+00 + 0.21666E+01 0.22046E+01 0.00000E+00 0.00000E+00 1 3.28513E+00 -1.30511E+02 -2.13399E+00 -2.49763E+00 + 0.21666E+01 0.22046E+01 0.00000E+00 0.00000E+00 3 2.70267E+00 -8.69396E+00 2.67162E+00 -4.08527E-01 + 0.21666E+01 0.22046E+01 0.00000E+00 0.00000E+00 5 4.11349E+01 6.13794E+01 1.97039E+01 3.61086E+01 + 0.21666E+01 0.22046E+01 0.00000E+00 0.00000E+00 2 1.55780E-06 1.63211E+01 1.49502E-06 4.37774E-07 + 0.21666E+01 0.22046E+01 0.00000E+00 0.00000E+00 4 3.54645E-06 1.07269E+02 -1.05279E-06 3.38658E-06 + 0.21666E+01 0.22046E+01 0.00000E+00 0.00000E+00 6 1.00423E-04 4.03061E+01 7.65827E-05 6.49608E-05 + 0.21299E+01 0.22046E+01 0.00000E+00 0.00000E+00 1 6.05348E+00 1.79207E+02 -6.05290E+00 8.37893E-02 + 0.21299E+01 0.22046E+01 0.00000E+00 0.00000E+00 3 5.02843E+00 -1.59116E+01 4.83577E+00 -1.37856E+00 + 0.21299E+01 0.22046E+01 0.00000E+00 0.00000E+00 5 1.29327E+02 8.25524E+01 1.67633E+01 1.28236E+02 + 0.21299E+01 0.22046E+01 0.00000E+00 0.00000E+00 2 2.54464E-06 -1.47866E+02 -2.15482E-06 -1.35349E-06 + 0.21299E+01 0.22046E+01 0.00000E+00 0.00000E+00 4 2.39613E-06 -1.53281E+02 -2.14028E-06 -1.07735E-06 + 0.21299E+01 0.22046E+01 0.00000E+00 0.00000E+00 6 1.70334E-04 -8.26972E+01 2.16517E-05 -1.68952E-04 + 0.20944E+01 0.22046E+01 0.00000E+00 0.00000E+00 1 1.25312E+01 1.57711E+02 -1.15949E+01 4.75278E+00 + 0.20944E+01 0.22046E+01 0.00000E+00 0.00000E+00 3 6.24369E+00 -7.16336E+01 1.96733E+00 -5.92564E+00 + 0.20944E+01 0.22046E+01 0.00000E+00 0.00000E+00 5 1.01246E+02 7.43523E+01 2.73082E+01 9.74934E+01 + 0.20944E+01 0.22046E+01 0.00000E+00 0.00000E+00 2 2.26889E-06 8.98722E+01 5.06218E-09 2.26889E-06 + 0.20944E+01 0.22046E+01 0.00000E+00 0.00000E+00 4 8.62987E-06 -9.21313E+01 -3.20947E-07 -8.62390E-06 + 0.20944E+01 0.22046E+01 0.00000E+00 0.00000E+00 6 2.16609E-05 1.18665E+02 -1.03906E-05 1.90061E-05 + 0.21666E+01 0.21666E+01 0.00000E+00 0.00000E+00 1 1.91536E+00 1.80000E+02 -1.91536E+00 0.00000E+00 + 0.21666E+01 0.21666E+01 0.00000E+00 0.00000E+00 3 6.90190E-06 0.00000E+00 6.90190E-06 0.00000E+00 + 0.21666E+01 0.21666E+01 0.00000E+00 0.00000E+00 5 1.22242E+01 0.00000E+00 1.22242E+01 0.00000E+00 + 0.21666E+01 0.21666E+01 0.00000E+00 0.00000E+00 2 3.47327E-07 0.00000E+00 3.47327E-07 0.00000E+00 + 0.21666E+01 0.21666E+01 0.00000E+00 0.00000E+00 4 1.02372E-05 0.00000E+00 1.02372E-05 0.00000E+00 + 0.21666E+01 0.21666E+01 0.00000E+00 0.00000E+00 6 1.28242E-05 0.00000E+00 1.28242E-05 0.00000E+00 + 0.21299E+01 0.21666E+01 0.00000E+00 0.00000E+00 1 4.16790E+00 -1.24268E+02 -2.34681E+00 -3.44440E+00 + 0.21299E+01 0.21666E+01 0.00000E+00 0.00000E+00 3 2.73395E+00 -9.44882E+00 2.69686E+00 -4.48823E-01 + 0.21299E+01 0.21666E+01 0.00000E+00 0.00000E+00 5 4.54091E+01 6.15691E+01 2.16192E+01 3.99324E+01 + 0.21299E+01 0.21666E+01 0.00000E+00 0.00000E+00 2 7.87168E-07 1.02104E+02 -1.65060E-07 7.69668E-07 + 0.21299E+01 0.21666E+01 0.00000E+00 0.00000E+00 4 1.09217E-06 6.62516E+01 4.39841E-07 9.99688E-07 + 0.21299E+01 0.21666E+01 0.00000E+00 0.00000E+00 6 1.50123E-04 1.23949E+01 1.46624E-04 3.22235E-05 + 0.20944E+01 0.21666E+01 0.00000E+00 0.00000E+00 1 5.78062E+00 1.73491E+02 -5.74336E+00 6.55279E-01 + 0.20944E+01 0.21666E+01 0.00000E+00 0.00000E+00 3 4.79947E+00 -1.50422E+01 4.63502E+00 -1.24561E+00 + 0.20944E+01 0.21666E+01 0.00000E+00 0.00000E+00 5 1.36075E+02 8.33994E+01 1.56415E+01 1.35173E+02 + 0.20944E+01 0.21666E+01 0.00000E+00 0.00000E+00 2 4.64743E-07 -3.89751E+01 3.61301E-07 -2.92315E-07 + 0.20944E+01 0.21666E+01 0.00000E+00 0.00000E+00 4 1.22359E-06 -1.15149E+02 -5.20003E-07 -1.10760E-06 + 0.20944E+01 0.21666E+01 0.00000E+00 0.00000E+00 6 1.49979E-04 -9.17476E+01 -4.57377E-06 -1.49910E-04 + 0.21299E+01 0.21299E+01 0.00000E+00 0.00000E+00 1 2.25674E+00 1.80000E+02 -2.25674E+00 0.00000E+00 + 0.21299E+01 0.21299E+01 0.00000E+00 0.00000E+00 3 5.26849E-06 0.00000E+00 5.26849E-06 0.00000E+00 + 0.21299E+01 0.21299E+01 0.00000E+00 0.00000E+00 5 1.18046E+01 0.00000E+00 1.18046E+01 0.00000E+00 + 0.21299E+01 0.21299E+01 0.00000E+00 0.00000E+00 2 2.13086E-06 0.00000E+00 2.13086E-06 0.00000E+00 + 0.21299E+01 0.21299E+01 0.00000E+00 0.00000E+00 4 5.13815E-06 0.00000E+00 5.13815E-06 0.00000E+00 + 0.21299E+01 0.21299E+01 0.00000E+00 0.00000E+00 6 4.39875E-05 1.80000E+02 -4.39875E-05 0.00000E+00 + 0.20944E+01 0.21299E+01 0.00000E+00 0.00000E+00 1 3.73377E+00 -1.26958E+02 -2.24486E+00 -2.98356E+00 + 0.20944E+01 0.21299E+01 0.00000E+00 0.00000E+00 3 2.77177E+00 -8.04265E+00 2.74451E+00 -3.87799E-01 + 0.20944E+01 0.21299E+01 0.00000E+00 0.00000E+00 5 4.62629E+01 6.19648E+01 2.17442E+01 4.08344E+01 + 0.20944E+01 0.21299E+01 0.00000E+00 0.00000E+00 2 1.02241E-06 1.04605E+02 -2.57809E-07 9.89370E-07 + 0.20944E+01 0.21299E+01 0.00000E+00 0.00000E+00 4 3.25000E-06 -1.66784E+02 -3.16393E-06 -7.43009E-07 + 0.20944E+01 0.21299E+01 0.00000E+00 0.00000E+00 6 2.69725E-04 -7.31518E+01 7.81765E-05 -2.58147E-04 + 0.20944E+01 0.20944E+01 0.00000E+00 0.00000E+00 1 2.91315E+00 1.80000E+02 -2.91315E+00 0.00000E+00 + 0.20944E+01 0.20944E+01 0.00000E+00 0.00000E+00 3 3.44961E-06 0.00000E+00 3.44961E-06 0.00000E+00 + 0.20944E+01 0.20944E+01 0.00000E+00 0.00000E+00 5 1.19853E+01 0.00000E+00 1.19853E+01 0.00000E+00 + 0.20944E+01 0.20944E+01 0.00000E+00 0.00000E+00 2 2.44990E-06 0.00000E+00 2.44990E-06 0.00000E+00 + 0.20944E+01 0.20944E+01 0.00000E+00 0.00000E+00 4 3.07220E-08 0.00000E+00 3.07220E-08 0.00000E+00 + 0.20944E+01 0.20944E+01 0.00000E+00 0.00000E+00 6 2.42692E-06 1.80000E+02 -2.42692E-06 0.00000E+00 diff --git a/RAFT/examples/VolturnUS-S_example.yaml b/RAFT/examples/VolturnUS-S_example.yaml index 3e75961fa..d58066431 100644 --- a/RAFT/examples/VolturnUS-S_example.yaml +++ b/RAFT/examples/VolturnUS-S_example.yaml @@ -1,11 +1,11 @@ type: input file for RAFT name: IEA 15 MW with VolturnUS-S steel semi -comments: Revised example with "super-member" type inputs, including one for the tower +comments: This is a quick example that includes potential flow BEM hydrodynamics with PyHAMS and different wave headings. settings: # global Settings - min_freq : 0.001 # [Hz] lowest frequency to consider, also the frequency bin width - max_freq : 0.40 # [Hz] highest frequency to consider + min_freq : 0.001 # [Hz] lowest frequency to consider, also the frequency bin width + max_freq : 0.20 # [Hz] highest frequency to consider XiStart : 0 # sets initial amplitude of each DOF for all frequencies nIter : 4 # sets how many iterations to perform in Model.solveDynamics() @@ -20,8 +20,8 @@ cases: keys : [wind_speed, wind_heading, turbulence, turbine_status, yaw_misalign, wave_spectrum, wave_period, wave_height, wave_heading ] data : # m/s deg % or e.g. IIB_NTM string deg string (s) (m) (deg) - - [ 0, 0, 0, operating, 0, JONSWAP, 12, 6, 0 ] - - [ 16, 0, 0, operating, 0, JONSWAP, 12, 6, 0 ] + - [ 0, 0, 0, operating, 0, JONSWAP, 12, 6, 0 ] + - [ 16, 0, 0, operating, 0, JONSWAP, 12, 6, 30 ] turbine: @@ -1088,6 +1088,7 @@ platform: potModMaster : 1 # [int] master switch for potMod variables; 0=keeps all member potMod vars the same, 1=turns all potMod vars to False (no HAMS), 2=turns all potMod vars to True (no strip) dlsMax : 5.0 # maximum node splitting section amount for platform members; can't be 0 + qtfPath : 'IEA-15-240-RWT-UMaineSemi.12d' # path to the qtf file for the platform members: # list all members here @@ -1122,7 +1123,7 @@ platform: gamma : 0.0 # [deg] twist angle about the member's z-axis potMod : True # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory # --- outer shell including hydro--- - stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + stations : [0, 35] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB d : 12.5 # [m] diameters if circular or side lengths if rectangular (can be pairs) t : 0.05 # [m] wall thicknesses (scalar or list of same length as stations) Cd : 0.6 # [-] transverse drag coefficient (optional, scalar or list of same length as stations) @@ -1148,7 +1149,7 @@ platform: gamma : 0.0 # [deg] twist angle about the member's z-axis potMod : False # [bool] Whether to model the member with potential flow (BEM model) plus viscous drag or purely strip theory # --- outer shell including hydro--- - stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB + stations : [0, 40.5] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB d : [12.4, 7.0] # [m] diameters if circular or side lengths if rectangular (can be pairs) t : 0.05 # [m] wall thicknesses (scalar or list of same length as stations) Cd : [1.5, 2.2 ] # [-] transverse drag coefficient (optional, scalar or list of same length as stations) @@ -1156,7 +1157,7 @@ platform: CdEnd : 0.0 # [-] end axial drag coefficient (optional, scalar or list of same length as stations) CaEnd : 0.0 # [-] end axial added mass coefficient (optional, scalar or list of same length as stations) rho_shell : 7850 # [kg/m3] - l_fill : 43.0 # [m] + l_fill : 40.5 # [m] rho_fill : 1025.0 # [kg/m3] diff --git a/RAFT/examples/example_from_yaml.py b/RAFT/examples/example_from_yaml.py index 8d4e90193..2c142d1eb 100644 --- a/RAFT/examples/example_from_yaml.py +++ b/RAFT/examples/example_from_yaml.py @@ -1,30 +1,44 @@ # example script for running RAFT from a YAML input file -import numpy as np +import sys import matplotlib.pyplot as plt import yaml import raft -# open the design YAML file and parse it into a dictionary for passing to raft -with open('VolturnUS-S_example.yaml') as file: - design = yaml.load(file, Loader=yaml.FullLoader) +def run_example(plot_flag = False): + # open the design YAML file and parse it into a dictionary for passing to raft + with open('VolturnUS-S_example.yaml') as file: + design = yaml.load(file, Loader=yaml.FullLoader) -# Create the RAFT model (will set up all model objects based on the design dict) -model = raft.Model(design) + # Create the RAFT model (will set up all model objects based on the design dict) + model = raft.Model(design) -# Evaluate the system properties and equilibrium position before loads are applied -model.analyzeUnloaded() + # Evaluate the system properties and equilibrium position before loads are applied + model.analyzeUnloaded() -# Compute natural frequencie -model.solveEigen() + # Compute natural frequencie + model.solveEigen() -# Simule the different load cases -model.analyzeCases(display=1) + # Simule the different load cases + model.analyzeCases(display=1) -# Plot the power spectral densities from the load cases -model.plotResponses() + if plot_flag: + # Plot the power spectral densities from the load cases + model.plotResponses() -# Visualize the system in its most recently evaluated mean offset position -model.plot(hideGrid=True) + # Visualize the system in its most recently evaluated mean offset position + model.plot() -plt.show() + plt.show() + +if __name__ == "__main__": + if len(sys.argv) == 2: + plot_flag = sys.argv[1].lower() in ["1", "t", "true", "y", "yes", 1, True] + elif len(sys.argv) == 1: + plot_flag = True + else: + print("Usage: python example_from_yaml.py ") + print(" The last argument is an optional declaration to show or suppress the plots (default is True)") + + run_example(plot_flag = plot_flag) + diff --git a/RAFT/pyproject.toml b/RAFT/pyproject.toml new file mode 100644 index 000000000..4924da1cb --- /dev/null +++ b/RAFT/pyproject.toml @@ -0,0 +1,194 @@ +[build-system] +requires = ["setuptools", "wheel"] +build-backend = "setuptools.build_meta" + +[project] +name = "RAFT" +version = "1.1.0" +description = "RAFT: Response Amplitudes of Floating Turbines" +readme = "README.md" +requires-python = ">=3.9" +license = {text = "Apache-2.0"} +keywords = ["wind", "floating", "frequency", "design", "optimization"] +authors = [ + {name = "National Renewable Energy Laboratory", email = "matthew.hall@nrel.gov" } +] +maintainers = [ + {name = "Matthew Hall", email = "matthew.hall@nrel.gov"}, + {name = "Stein Housner", email = "stein.housner@nrel.gov"}, + {name = "Daniel Zalkind", email = "daniel.zalkind@nrel.gov"}, +] +classifiers = [ # Optional + # How mature is this project? Common values are + # 3 - Alpha + # 4 - Beta + # 5 - Production/Stable + "Development Status :: 4 - Beta", + + # Indicate who your project is intended for + "Intended Audience :: Science/Research", + "Topic :: Scientific/Engineering", + + "License :: OSI Approved :: Apache Software License", + + # Specify the Python versions you support here. In particular, ensure + # that you indicate you support Python 3. These classifiers are *not* + # checked by "pip install". See instead "python_requires" below. + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3 :: Only", + + "Operating System :: OS Independent", +] + +# List additional groups of dependencies here (e.g. development +# dependencies). Users will be able to install these using the "extras" +# syntax, for example: +# +# $ pip install sampleproject[dev] +# +# Similar to `dependencies` above, these must be valid existing +# projects. +dependencies = [ + "matplotlib", + "moorpy", + "numpy", + "openmdao", + "pyhams", + "pyyaml", + "scipy", + "wisdem", +] + +[project.optional-dependencies] +dev = ["pre-commit"] +docs = [ + "sphinx", + "sphinx-rtd-theme" +] +test = [ + "pytest", + "pytest-cov", + "pytest-xdist", +] + +# List URLs that are relevant to your project +# +# This field corresponds to the "Project-URL" and "Home-Page" metadata fields: +# https://packaging.python.org/specifications/core-metadata/#project-url-multiple-use +# https://packaging.python.org/specifications/core-metadata/#home-page-optional +# +# Examples listed include a pattern for specifying where the package tracks +# issues, where the source is hosted, where to say thanks to the package +# maintainers, and where to support the project financially. The key is +# what's used to render the link text on PyPI. +[project.urls] # Optional +"Homepage" = "https://github.com/WISDEM/RAFT" +"Documentation" = "https://openraft.readthedocs.io" + + +# This is configuration specific to the `setuptools` build backend. +# If you are using a different build backend, you will need to change this. +[tool.setuptools] +include-package-data = true + +#[tool.setuptools.packages] +#find = {} + +[tool.setuptools.packages.find] +exclude = ["docs", "examples", "tests"] +namespaces = true + +[tool.setuptools.package-data] +# If there are data files included in your packages that need to be +# installed, specify them here. +"*" = ["*.txt", "*.md"] + +#[tool.black] +#line-length = 120 +#target-version = ['py311'] +#preview=true +#exclude = ''' +#/( +# \.git +# | \.hg +# | \.mypy_cache +# | \.tox +# | \.venv +# | _build +# | buck-out +# | build +# | dist +#)/ +#''' + +[tool.isort] +# https://github.com/PyCQA/isort +multi_line_output = "3" +include_trailing_comma = true +force_grid_wrap = false +use_parentheses = true +line_length = "120" +sections = ["FUTURE", "STDLIB", "THIRDPARTY", "FIRSTPARTY", "LOCALFOLDER"] +known_first_party = ["wisdem"] +length_sort = "1" +profile = "black" +skip_glob = ['__init__.py'] +atomic = true +#lines_after_imports = 2 +#lines_between_types = 1 +#src_paths=isort,test + +[tool.ruff] +select = ["A", "C", "E", "F", "I"] +ignore = [] + +# Allow autofix for all enabled rules (when `--fix`) is provided. +fixable = ["A", "C", "E", "F", "I"] +unfixable = [] # fix all + +# Exclude a variety of commonly ignored directories. +exclude = [ + ".bzr", + ".direnv", + ".eggs", + ".git", + ".hg", + ".mypy_cache", + ".nox", + ".pants.d", + ".ruff_cache", + ".svn", + ".tox", + ".venv", + "__pypackages__", + "_build", + "buck-out", + "build", + "dist", + "node_modules", + "venv", +] +per-file-ignores = {} # ignore no specific files and checks + +line-length = 88 + +# Allow unused variables when underscore-prefixed. +dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" + +target-version = "py311" + +[tool.ruff.mccabe] +max-complexity = 10 + +#[tool.docformatter] +#blank=true +#close-quotes-on-newline=true +#in-place=true +#make-summary-multi-line=true +#pre-summary-newline=true +#recursive=true +#wrap-descriptions=68 +#wrap-summaries=88 diff --git a/RAFT/raft-env.yaml b/RAFT/raft-env.yaml new file mode 100644 index 000000000..6743c421a Binary files /dev/null and b/RAFT/raft-env.yaml differ diff --git a/RAFT/raft/__init__.py b/RAFT/raft/__init__.py index 5f589a52e..0216fb23a 100644 --- a/RAFT/raft/__init__.py +++ b/RAFT/raft/__init__.py @@ -1,6 +1 @@ -#from .raft_model import Model - -import raft.raft_model as model - -from importlib import reload -Model = reload(model).Model +from raft.raft_model import Model diff --git a/RAFT/raft/helpers.py b/RAFT/raft/helpers.py index 32187b96d..e251a4f9e 100644 --- a/RAFT/raft/helpers.py +++ b/RAFT/raft/helpers.py @@ -1,5 +1,6 @@ import os import numpy as np +import matplotlib.pyplot as plt # ---------------------------- misc classes ----------------------------------- @@ -62,8 +63,27 @@ def FrustumVCV(dA, dB, H, rtn=0): return hc -def getVelocity(r, Xi, ws): - '''Get node complex velocity spectrum based on platform motion's and relative position from PRP''' +def getKinematics(r, Xi, ws): + '''Get node complex displacement, velocity, and acceleration complex + amplitudes based on platform motion's and relative position from + platform reference point PRP). + + Parameters + ---------- + r : array + X, y, z coordinates of point of interest relative to PRP [m]. + Xi : complex 2D array + Complex amplitudes of 6 degree of freedom as a function of frequency + (size 6 by nw). + ws : array + Frequency vector of length nw [rad/s]. + + Returns + ------- + dr, v, a : complex 2D array + Each is a 3 by nw array of the complex amplitudes of the point's + displacements, velocities, and accelerations, respectively. + ''' nw = len(ws) @@ -182,6 +202,10 @@ def VecVecTrans(vec): return vvt +def intrp(x, xA, xB, yA, yB): + '''Do simple interpolation between two points.''' + return yA + (x-xA)*(yB-yA)/(xB-xA) + # produce alternator matrix def getH(r): '''Produces the alternator matrix for a size-3 vector, r. Multiplying this array by a vector @@ -358,12 +382,26 @@ def rotateMatrix6(Min, rotMat): rotMat : array(3,3) rotation matrix (DCM) ''' - outMat = np.zeros([6,6]) # rotated matrix + outMat = np.zeros_like(Min) # rotated matrix + + shape = Min.shape + if not (shape[0]==6 and shape[1]==6): + raise Exception('The input matrix must be 6x6 (with an optional third dimension).') - outMat[:3,:3] = rotateMatrix3(Min[:3,:3], rotMat) # mass matrix - outMat[:3,3:] = rotateMatrix3(Min[:3,3:], rotMat) # product of inertia matrix - outMat[3:,:3] = outMat[:3,3:].T - outMat[3:,3:] = rotateMatrix3(Min[3:,3:], rotMat) # moment of inertia matrix + if len(shape) == 2: + outMat[:3,:3] = rotateMatrix3(Min[:3,:3], rotMat) # mass matrix + outMat[:3,3:] = rotateMatrix3(Min[:3,3:], rotMat) # product of inertia matrix + outMat[3:,:3] = outMat[:3,3:].T + outMat[3:,3:] = rotateMatrix3(Min[3:,3:], rotMat) # moment of inertia matrix + + elif len(shape) == 3: + for i in range(shape[2]): # process each 6x6 slice + outMat[:3,:3, i] = rotateMatrix3(Min[:3,:3, i], rotMat) + outMat[:3,3:, i] = rotateMatrix3(Min[:3,3:, i], rotMat) + outMat[3:,:3, i] = outMat[:3,3:, i].T + outMat[3:,3:, i] = rotateMatrix3(Min[3:,3:, i], rotMat) + else: + raise Exception('Input matrix must be two- or three-dimensional.') return outMat @@ -382,19 +420,51 @@ def rotateMatrix3(Min, rotMat): return np.matmul( np.matmul(rotMat, Min), rotMat.T ) -def getRMS(xi, dw): - '''Calculates standard deviation or RMS of inputted (complex) response amplitude vector.''' +def RotFrm2Vect( A, B): + '''Rodriguez rotation function, which returns the rotation matrix + that transforms vector A into Vector B. + ''' + + + v = np.cross(A,B) - return np.sqrt( np.sum( np.abs(xi)**2 )*dw ) + if np.sum(v**2)==0: # if something goes wrong (or A==B), no transformation + return np.eye(3) + + ssc = np.array([[0, -v[2], v[1]], + [v[2], 0, -v[0]], + [-v[1], v[0], 0]]) + + R = np.eye(3,3) + ssc + np.matmul(ssc,ssc)*(1-np.dot(A,B))/(np.linalg.norm(v)*np.linalg.norm(v)) + + return R + +def getRMS(xi): + '''Calculates standard deviation or RMS of inputted (complex) response amplitude vector. + If a matrix is provided, the first dimension is considered to be multiple cases and the + second dimension is considered to be frequencies. Results are summed across cases for + each frequency. The calculation is the same regardless.''' + + return np.sqrt( np.sum( np.abs(xi)**2 ) ) -def getPSD(xi): - '''Calculates power spectral density from inputted (complex) response amplitude vector. Units of [unit]^2/(rad/s)''' +def getPSD(xi, dw): + '''Calculates power spectral density from inputted (complex) response amplitude vector. Units of [unit]^2/(rad/s). + If a matrix is provided, the first dimension is considered to be multiple cases and the + second dimension is considered to be frequencies. Results are summed across cases for + each frequency.''' + + if len(xi.shape) == 1: + psd = 0.5*np.abs(xi)**2/dw + elif len(xi.shape) == 2: + psd = np.sum(0.5*np.abs(xi)**2/dw, axis=0) # sum squares across excitation sources for each frequency + else: + raise Exception("getPSD must be passed an array with 1 or 2 dimensions.") - return np.abs(xi)**2 + return psd -def JONSWAP(ws, Hs, Tp, Gamma=1.0): +def JONSWAP(ws, Hs, Tp, Gamma=None): '''Returns the JONSWAP wave spectrum for the given frequencies and parameters. Parameters @@ -422,6 +492,17 @@ def JONSWAP(ws, Hs, Tp, Gamma=1.0): on what's documented in IEC 61400-3. ''' + # If peak shape parameter gamma is not specified, use the recommendation + # from IEC 61400-3 as a function of Hs and Tp. For PM spectrum, use 1. + if not Gamma: + TpOvrSqrtHs = Tp/np.sqrt(Hs) + if TpOvrSqrtHs <= 3.6: + Gamma = 5.0 + elif TpOvrSqrtHs >= 5.0: + Gamma = 1.0 + else: + Gamma = np.exp( 5.75 - 1.15*TpOvrSqrtHs ) + # handle both scalar and array inputs if isinstance(ws, (list, tuple, np.ndarray)): ws = np.array(ws) @@ -446,14 +527,14 @@ def JONSWAP(ws, Hs, Tp, Gamma=1.0): def printMat(mat): '''Print a matrix''' for i in range(mat.shape[0]): - print( "\t".join(["{:+8.3e}"]*mat.shape[1]).format( *mat[i,:] )) + print( " ".join(["{:+10.3e}"]*mat.shape[1]).format( *mat[i,:] )) def printVec(vec): '''Print a vector''' - print( "\t".join(["{:+8.3e}"]*len(vec)).format( *vec )) + print( " ".join(["{:+10.3e}"]*len(vec)).format( *vec )) -def getFromDict(dict, key, shape=0, dtype=float, default=None): +def getFromDict(dict, key, shape=0, dtype=float, default=None, index=None): ''' Function to streamline getting values from design dictionary from YAML file, including error checking. @@ -467,8 +548,10 @@ def getFromDict(dict, key, shape=0, dtype=float, default=None): The desired shape of the output. If not provided, assuming scalar output. If -1, any input shape is used. dtype : type Must be a python type than can serve as a function to format the input value to the right type. - default : number, optional - The default value to fill in if the item isn't in the dictionary. Otherwise will raise error if the key doesn't exist. + default : number or list, optional + The default value to fill in if the item isn't in the dictionary. + Otherwise will raise error if the key doesn't exist. It may be a list + (to be tiled shape times if shape > 1) but may not be a numpy array. ''' # in future could support nested keys if type(key)==list: ... @@ -488,9 +571,22 @@ def getFromDict(dict, key, shape=0, dtype=float, default=None): if np.isscalar(val): # if a scalar value is provided and we need to produce an array (of any shape) return np.tile(dtype(val), shape) - elif np.isscalar(shape): # if expecting a 1D array - if len(val) == shape: - return np.array([dtype(v) for v in val]) + elif np.isscalar(shape): # if expecting a 1D array (or if wanting the result to have the same length as the input) + if len(val) == shape: # throw an error if the input is not the same length as the shape, meaning the user is missing data + if index == None: + return np.array([dtype(v) for v in val]) # if no index is provided, do normally and return the array input + else: + keyshape = np.array(val).shape # otherwise, use the index to create the output arrays desired + if len(keyshape) == 1: # if the input is 1D, shape=n, and index!=None, then tile the indexed value of length shape + if index in range(keyshape[0]): + return np.tile(val[index], shape) + else: + raise ValueError(f"Value for index '{index}' is not within the size of {val} (len={keyshape[0]})") + else: # if the input is 2D, len(val)=shape, and index!=None + if index in range(keyshape[1]): + return np.array([v[index] for v in val]) # then pull the indexed value out of each row of 2D input + else: + raise ValueError(f"Value for index '{index}' is not within the size of {val} (len={keyshape[0]})") else: raise ValueError(f"Value for key '{key}' is not the expected size of {shape} and is instead: {val}") @@ -513,7 +609,10 @@ def getFromDict(dict, key, shape=0, dtype=float, default=None): if shape==0 or shape==-1: return default else: - return np.tile(default, shape) + if np.isscalar(default): + return np.tile(default, shape) + else: + return np.tile(default, [shape, 1]) def convertIEAturbineYAML2RAFT(fname_turbine): ''' @@ -667,6 +766,314 @@ def convertIEAturbineYAML2RAFT(fname_turbine): return d +# ----- additional helper functions from Joep van der Spek ----- + + +def getUniqueCaseHeadings(keys, values): + ''' + Function to obtain unique heading values for calculation in BEM. + + Parameters + ---------- + keys : dict + dict with keys of design data + values : dict + dict of all design data + ''' + caseHeadings = [] + data = [dict(zip(keys, value)) for value in values] + wave_headings = [float(data_head['wave_heading']) for data_head in data] + wave_headings += [float(data_head['wave_heading2']) for data_head in data] + for wh in wave_headings: + if wh not in caseHeadings: + caseHeadings.append(wh) + # print(caseHeadings) + maxHeading = max(caseHeadings) + minHeading = min(caseHeadings) + if len(caseHeadings) == 2: + headingStep = maxHeading - minHeading + numberOfHeadings = 2 + elif len(caseHeadings) > 2: + headingStep = np.min(np.abs(np.diff(np.sort(caseHeadings)))) + numberOfHeadings = int((maxHeading - minHeading) / headingStep + 1) + # this is different from only two headings, as it requires headings in between + else: + headingStep = 0 + numberOfHeadings = 1 + return caseHeadings, headingStep, numberOfHeadings # only have unique values in evaluated list, otherwise possibly issues with np.diff + + +def getSigmaXPSD(TBFA, TBSS, frequencies, angles=np.linspace(0,2*np.pi,50), d = 10, thickness= 0.083): + """Function to retrieve Axial stress (sigma_x) around tower base circumference using tower base bending""" + # angles = np.linspace(0,2*np.pi,dAngles) # Array with angles to calculate for anywhere around tower. + + angleMeshFA, TBFAMesh = np.meshgrid(angles, TBFA) + angleMeshSS, TBSSMesh = np.meshgrid(angles, TBSS) + # print('TBFA',TBFA) + # print('TBFSS', TBSS) + Izz = np.pi/8*thickness*d**3 # Bending moment of inertia, assume thin walled + + sigmaX = ((TBFAMesh*np.cos(angleMeshFA)-TBSSMesh*np.sin(angleMeshSS))*d/2)/Izz # Return? + # print(sigmaX) + # sigmaX = psdTBFAMesh*(np.cos(angleMeshFA)*d/2/Izz)**2+psdTBSSMesh*(np.sin(angleMeshSS)*d/2/Izz)**2 + ANGLESMesh, FREQMesh = np.meshgrid(angles, frequencies) + return getPSD(sigmaX/10**6, frequencies[1]-frequencies[0]), ANGLESMesh, FREQMesh + + +def parametricAnalysisBuilder(design, changeType, startValueSensitivityStudy, parametricAnalysis= False): + + if parametricAnalysis: + misalignmentAngle = getFromDict(design['parametricAnalysis'], 'misalignmentAngle', default=0) + numMisalignAngles = getFromDict(design['parametricAnalysis'], 'numMisalign', dtype=int, default=0) + if misalignmentAngle is not None and numMisalignAngles is not None and changeType == 'misalignment': + design['cases']['data'][0][13] = startValueSensitivityStudy + for misalign in range(numMisalignAngles): + add_design = design['cases']['data'][0].copy() + add_design[13] += misalignmentAngle * (misalign + 1) + design['cases']['data'].append(add_design) + + windMisalignmentAngle = getFromDict(design['parametricAnalysis'], 'windMisalignmentAngle', default=0) + numWindMisalignAngles = getFromDict(design['parametricAnalysis'], 'numWindMisalign', dtype=int, default=0) + if windMisalignmentAngle is not None and numWindMisalignAngles is not None and changeType == 'windMisalignment': + design['cases']['data'][0][1] = startValueSensitivityStudy + for angle in range(numWindMisalignAngles): + add_design = design['cases']['data'][0].copy() + add_design[1] += windMisalignmentAngle * (angle + 1) + design['cases']['data'].append(add_design) + + rotationAngle = getFromDict(design['parametricAnalysis'], 'rotationAngle', default=0) + numRotations = getFromDict(design['parametricAnalysis'], 'numRotations', dtype=int, default=0) + if rotationAngle is not None and numRotations is not None and changeType == 'floaterRotation': + for misalign in range(numRotations): + add_design = design['cases']['data'][0].copy() + add_design[1] += rotationAngle * (misalign + 1) + add_design[8] += rotationAngle * (misalign + 1) + add_design[13] += rotationAngle * (misalign + 1) + design['cases']['data'].append(add_design) + + windSpeedIncrement = getFromDict(design['parametricAnalysis'], 'windSpeedIncrement', default=0) + numWSIncrements = getFromDict(design['parametricAnalysis'], 'numWSIncrements', dtype=int, default=0) + if windSpeedIncrement is not None and numWSIncrements is not None and changeType == 'windSpeed': + design['cases']['data'][0][0] = startValueSensitivityStudy + for numIncr in range(numWSIncrements): + add_design = design['cases']['data'][0].copy() + add_design[0] += windSpeedIncrement * (numIncr + 1) + design['cases']['data'].append(add_design) + + waveHeightIncrement1 = getFromDict(design['parametricAnalysis'], 'waveHeightIncrement1', default=0) + numWHincrements1 = getFromDict(design['parametricAnalysis'], 'numWHIncrements1', dtype=int, default=0) + if waveHeightIncrement1 is not None and numWHincrements1 is not None and changeType == 'waveHeight1': + design['cases']['data'][0][7] = startValueSensitivityStudy + for numIncr in range(numWHincrements1): + add_design = design['cases']['data'][0].copy() + add_design[7] += waveHeightIncrement1 * (numIncr + 1) + design['cases']['data'].append(add_design) + + waveHeightIncrement2 = getFromDict(design['parametricAnalysis'], 'waveHeightIncrement2', default=0) + numWHincrements2 = getFromDict(design['parametricAnalysis'], 'numWHIncrements2', dtype=int, default=0) + if waveHeightIncrement2 is not None and numWHincrements2 is not None and changeType == 'waveHeight2': + design['cases']['data'][0][12] = startValueSensitivityStudy + for numIncr in range(numWHincrements2): + add_design = design['cases']['data'][0].copy() + add_design[12] += waveHeightIncrement2 * (numIncr + 1) + design['cases']['data'].append(add_design) + + wavePeriodIncrement1 = getFromDict(design['parametricAnalysis'], 'wavePeriodIncrement1', default=0) + numWPincrements1 = getFromDict(design['parametricAnalysis'], 'numWPIncrements1', dtype=int, default=0) + if wavePeriodIncrement1 is not None and numWPincrements1 is not None and changeType == 'wavePeriod1': + design['cases']['data'][0][6] = startValueSensitivityStudy + for numIncr in range(numWPincrements1): + add_design = design['cases']['data'][0].copy() + add_design[6] += wavePeriodIncrement1 * (numIncr + 1) + design['cases']['data'].append(add_design) + + wavePeriodIncrement2 = getFromDict(design['parametricAnalysis'], 'wavePeriodIncrement2', default=0) + numWPincrements2 = getFromDict(design['parametricAnalysis'], 'numWPIncrements2', dtype=int, default=0) + if wavePeriodIncrement2 is not None and numWPincrements2 is not None and changeType == 'wavePeriod2': + design['cases']['data'][0][11] = startValueSensitivityStudy + for numIncr in range(numWPincrements2): + add_design = design['cases']['data'][0].copy() + add_design[11] += wavePeriodIncrement2 * (numIncr + 1) + design['cases']['data'].append(add_design) + + return design + else: + return design + + +def retrieveAxisParAnalysis(iCase, cases, changeType, variableXaxis, parametricAnalysisDict): + + if changeType == 'misalignment': + variableXaxis.append(cases['wave_heading2']) + string_x_axis = 'Misalignment second wave system [deg]' + title_string = f'Misalignment WS 2 $= {variableXaxis[-1]:10.2f}$ [deg]' + elif changeType == 'misalignment1': + variableXaxis.append(cases['wave_heading1']) + string_x_axis = 'Misalignment first wave system [deg]' + title_string = f'Misalignment WS 1 $= {variableXaxis[-1]:10.2f}$ [deg]' + elif changeType == 'windMisalignment': + variableXaxis.append(cases['wind_heading']) + string_x_axis = 'Wind heading [deg]' + title_string = f'Misalignment Wind $= {variableXaxis[-1]:10.2f}$ [deg]' + + elif changeType == 'floaterRotation': + rotationAngle = getFromDict(parametricAnalysisDict, 'rotationAngle') + variableXaxis.append(iCase * rotationAngle) # not robust, now only works for single base case being rotated + string_x_axis = 'Floater rotation [deg]' + title_string = f'Floater Rotation $= {variableXaxis[-1]:10.2f}$ [deg]' + elif changeType == 'windSpeed': + variableXaxis.append(cases['wind_speed']) + string_x_axis = 'Average Wind Speed [m/s]' + title_string = f'$U_{{ave}} = {variableXaxis[-1]:10.2f}$ [m/s]' + elif changeType == 'waveHeight1': + variableXaxis.append(cases['wave_height']) + string_x_axis = 'Wave Height system 1 [m]' + title_string = f'WS1 $H_{{s}}={variableXaxis[-1]:10.2f}$ [m]' + elif changeType == 'waveHeight2': + variableXaxis.append(cases['wave_height2']) + string_x_axis = 'Wave Height system 2 [m]' + title_string = f'WS2 $H_{{s}}={variableXaxis[-1]:10.2f}$ [m]' + elif changeType == 'wavePeriod1': + variableXaxis.append(cases['wave_period']) + string_x_axis = 'Wave Period system 1 [s]' + title_string = f'WS1 $T_{{p}}={variableXaxis[-1]:10.2f}$ [s]' + elif changeType == 'wavePeriod2': + variableXaxis.append(cases['wave_period2']) + string_x_axis = 'Wave Period system 2 [s]' + title_string = f'WS2 $T{{p}}={variableXaxis[-1]:10.2f}$ [s]' + else: + variableXaxis.append(iCase) + string_x_axis = 'Case number' + title_string = f'Base Case {iCase+1}' + + return variableXaxis, string_x_axis, title_string + + +def plotFloaterRotation_min_max_moments(equivalent_moment_list, floater_rotations): + + max_moment = [] + min_moment = [] + + for index, equivalent_moment_list_in_list in enumerate(equivalent_moment_list): + max_moment.append([np.amax(equivalent_moment_list_in_list)]) + min_moment.append([np.amax(equivalent_moment_list_in_list)]) + + fig, ax = plt.subplots(figsize=get_figsize(400)) + ax.plot(floater_rotations, max_moment, label='Max eq stress') + ax.plot(floater_rotations, min_moment, label='Min eq stress') + ax.set_xlabel('Floater Rotation angle [deg]') + ax.set_ylabel('Equivalent Moment [MNm]') + ax.set_ylim(bottom=0) + ax.set_title(f'Equivalent Moment for changing different floater rotations') + ax.legend() + ax.grid() + + +def get_figsize(width, fraction=1, subplots=(1, 1)): + """Set figure dimensions to avoid scaling in LaTeX. + + Parameters + ---------- + width: float or string + Document width in points, or string of predined document type + fraction: float, optional + Fraction of the width which you wish the figure to occupy + subplots: array-like, optional + The number of rows and columns of subplots. + Returns + ------- + fig_dim: tuple + Dimensions of figure in inches + """ + if width == 'thesis': + width_pt = 426.79135 + elif width == 'beamer': + width_pt = 307.28987 + else: + width_pt = width + + # Width of figure (in pts) + fig_width_pt = width_pt * fraction + # Convert from pt to inches + inches_per_pt = 1 / 72.27 + + # Golden ratio to set aesthetic figure height + # https://disq.us/p/2940ij3 + golden_ratio = (5**.5 - 1) / 2 + + # Figure width in inches + fig_width_in = fig_width_pt * inches_per_pt + # Figure height in inches + fig_height_in = fig_width_in * golden_ratio * (subplots[0] / subplots[1]) + + return (fig_width_in, fig_height_in) + + +def bmatrix(a): + """Returns a LaTeX bmatrix + + :a: numpy array + :returns: LaTeX bmatrix as a string + """ + + if len(a.shape) > 2: + raise ValueError('bmatrix can at most display two dimensions') + lines = str(a).replace('[', '').replace(']', '').splitlines() + rv = [r'\begin{bmatrix}'] + rv += [' ' + ' & '.join(l.split()) + r'\\' for l in lines] + rv += [r'\end{bmatrix}'] + return '\n'.join(rv) + + +def printCaseToTable(cases, keys): + parameters = ['U$_{ave}$ [m/s]', 'Turbulence Intensity [-]', 'Misalignment Angle [deg]', 'Yaw error [deg]' + ,'T$_p$ system 1 [s]', 'H$_s$ system 1 [m]', '$\gamma$ system 1 [-]', 'Misalignment angle system 1 [deg]' + ,'T$_p$ system 2 [s]', 'H$_s$ system 2 [m]', '$\gamma$ system 2 [-]', 'Misalignment angle system 2 [deg]'] + for iCase, item in enumerate(cases): + case = dict(zip(keys, cases[iCase])) + parameters[0] += f" & {case['wind_speed']:.2f}" + parameters[1] += f" & {case['turbulence']:.2f}" + parameters[2] += f" & {case['wind_heading']:.2f}" + parameters[3] += f" & {case['yaw_misalign']:.2f}" + parameters[4] += f" & {case['wave_period']:.2f}" + parameters[5] += f" & {case['wave_height']:.2f}" + parameters[6] += f" & {case['gamma_ws1']:.2f}" + parameters[7] += f" & {case['wave_heading']:.2f}" + parameters[8] += f" & {case['wave_period2']:.2f}" + parameters[9] += f" & {case['wave_height2']:.2f}" + parameters[10] += f" & {case['gamma_ws2']:.2f}" + parameters[11] += f" & {case['wave_heading2']:.2f}" + + for p, temp in enumerate(parameters): + parameters[p] += f' \\\ \hline' + print(parameters[p]) + + +def adjustMooring(ms, design): + ''' + ms: moorpy system + design: RAFT input dictionary + + Returns updated design dictionary to match moorpy mooring system (hackish method - will not work for every mooring system!) + ''' + + design['mooring']['water_depth'] = ms.depth + for i, linetype in enumerate(ms.lineTypes): + #design['mooring']['line_types'][i]['name'] = linetype + design['mooring']['line_types'][i]['diameter'] = ms.lineTypes[linetype]['input_d'] + design['mooring']['line_types'][i]['mass_density'] = ms.lineTypes[linetype]['m'] + design['mooring']['line_types'][i]['stiffness'] = ms.lineTypes[linetype]['EA'] + + nLines = len(ms.lineList) + for i in range(nLines): + design['mooring']['points'][i]['location'] = list(ms.pointList[i*2].r) + design['mooring']['points'][i+3]['location'] = list(ms.pointList[i*2+1].r) + + design['mooring']['lines'][i]['length'] = ms.lineList[i].L + + return(design) + + if __name__ == '__main__': diff --git a/RAFT/raft/member2pnl.py b/RAFT/raft/member2pnl.py index e47c7b7eb..4f56f242b 100644 --- a/RAFT/raft/member2pnl.py +++ b/RAFT/raft/member2pnl.py @@ -138,7 +138,8 @@ def meshMember(stations, diameters, rA, rB, dz_max=0, da_max=0, savedNodes=[], s sin_m = dr_s/np.sqrt(dr_s**2 + dz_s**2) # make subdivision # local panel longitudinal discretization - n_z = np.int_(np.ceil( np.sqrt(dr_s*dr_s + dz_s*dz_s) / dz_ps )) + n_z = int(np.ceil( np.sqrt(dr_s*dr_s + dz_s*dz_s) / dz_ps )) + # local panel longitudinal dimension d_l = np.sqrt(dr_s*dr_s + dz_s*dz_s)/n_z; for i_z in range(1,n_z+1): @@ -147,7 +148,7 @@ def meshMember(stations, diameters, rA, rB, dz_max=0, da_max=0, savedNodes=[], s # fill in end B if it's submerged - n_r = np.int_(np.ceil( radii[-1] / (0.6*da_max) )) # local panel radial discretization # + n_r = int(np.ceil( radii[-1] / (0.6*da_max) )) # local panel radial discretization # dr = radii[-1] / n_r # local panel radial size for i_r in range(n_r): @@ -156,7 +157,7 @@ def meshMember(stations, diameters, rA, rB, dz_max=0, da_max=0, savedNodes=[], s # fill in end A if it's submerged - n_r = np.int_(np.ceil( radii[0] / (0.6*da_max) )) # local panel radial discretization # + n_r = int(np.ceil( radii[0] / (0.6*da_max) )) # local panel radial discretization # dr = radii[0] / n_r # local panel radial size for i_r in range(n_r): @@ -172,7 +173,7 @@ def meshMember(stations, diameters, rA, rB, dz_max=0, da_max=0, savedNodes=[], s z = [] npan =0; - naz = np.int_(8); + naz = int(8); # go through each point of the radius profile, panelizing from top to bottom: for i_rp in range(len(z_rp)-1): @@ -186,13 +187,13 @@ def meshMember(stations, diameters, rA, rB, dz_max=0, da_max=0, savedNodes=[], s # scale up or down azimuthal discretization as needed while ( (r1*2*np.pi/naz >= da_max/2) and (r2*2*np.pi/naz >= da_max/2) ): - naz = np.int_(2*naz) + naz = int(2*naz) while ( (r1*2*np.pi/naz < da_max/2) and (r2*2*np.pi/naz < da_max/2) ): - naz = np.int_(naz/2) + naz = int(naz/2) # transition - increase azimuthal discretization if ( (r1*2*np.pi/naz < da_max/2) and (r2*2*np.pi/naz >= da_max/2) ): - for ia in range(1, np.int_(naz/2)+1): + for ia in range(1, int(naz/2)+1): th1 = (ia-1 )*2*np.pi/naz*2 th2 = (ia-0.5)*2*np.pi/naz*2 th3 = (ia )*2*np.pi/naz*2 @@ -211,7 +212,7 @@ def meshMember(stations, diameters, rA, rB, dz_max=0, da_max=0, savedNodes=[], s # transition - decrease azimuthal discretization elif ( (r1*2*np.pi/naz >= da_max/2) and (r2*2*np.pi/naz < da_max/2) ): - for ia in range(1, np.int_(naz/2)+1): + for ia in range(1, int(naz/2)+1): th1 = (ia-1 )*2*np.pi/naz*2 th2 = (ia-0.5)*2*np.pi/naz*2 th3 = (ia )*2*np.pi/naz*2 @@ -366,7 +367,7 @@ def meshMemberForGDF(stations, diameters, rA, rB, dz_max=0, da_max=0, endA=True, sin_m = dr_s/np.sqrt(dr_s**2 + dz_s**2) # make subdivision # local panel longitudinal discretization - n_z = np.int_(np.ceil( np.sqrt(dr_s*dr_s + dz_s*dz_s) / dz_ps )) + n_z = int(np.ceil( np.sqrt(dr_s*dr_s + dz_s*dz_s) / dz_ps )) # local panel longitudinal dimension d_l = np.sqrt(dr_s*dr_s + dz_s*dz_s)/n_z; for i_z in range(1,n_z+1): @@ -376,7 +377,7 @@ def meshMemberForGDF(stations, diameters, rA, rB, dz_max=0, da_max=0, endA=True, # fill in end B if it's requested if endB: - n_r = np.int_(np.ceil( radii[-1] / (0.6*da_max) )) # local panel radial discretization # + n_r = int(np.ceil( radii[-1] / (0.6*da_max) )) # local panel radial discretization # dr = radii[-1] / n_r # local panel radial size for i_r in range(n_r): @@ -386,7 +387,7 @@ def meshMemberForGDF(stations, diameters, rA, rB, dz_max=0, da_max=0, endA=True, # fill in end A if it's requested if endA: - n_r = np.int_(np.ceil( radii[0] / (0.6*da_max) )) # local panel radial discretization # + n_r = int(np.ceil( radii[0] / (0.6*da_max) )) # local panel radial discretization # dr = radii[0] / n_r # local panel radial size for i_r in range(n_r): @@ -402,7 +403,7 @@ def meshMemberForGDF(stations, diameters, rA, rB, dz_max=0, da_max=0, endA=True, z = [] npan =0; - naz = np.int_(8); + naz = int(8); # go through each point of the radius profile, panelizing from top to bottom: for i_rp in range(len(z_rp)-1): @@ -416,13 +417,13 @@ def meshMemberForGDF(stations, diameters, rA, rB, dz_max=0, da_max=0, endA=True, # scale up or down azimuthal discretization as needed while ( (r1*2*np.pi/naz >= da_max/2) and (r2*2*np.pi/naz >= da_max/2) ): - naz = np.int_(2*naz) + naz = int(2*naz) while ( (r1*2*np.pi/naz < da_max/2) and (r2*2*np.pi/naz < da_max/2) ): - naz = np.int_(naz/2) + naz = int(naz/2) # transition - increase azimuthal discretization if ( (r1*2*np.pi/naz < da_max/2) and (r2*2*np.pi/naz >= da_max/2) ): - for ia in range(1, np.int_(naz/2)+1): + for ia in range(1, int(naz/2)+1): th1 = (ia-1 )*2*np.pi/naz*2; th2 = (ia-0.5)*2*np.pi/naz*2; th3 = (ia )*2*np.pi/naz*2; @@ -441,7 +442,7 @@ def meshMemberForGDF(stations, diameters, rA, rB, dz_max=0, da_max=0, endA=True, # transition - decrease azimuthal discretization elif ( (r1*2*np.pi/naz >= da_max/2) and (r2*2*np.pi/naz < da_max/2) ): - for ia in range(1, np.int_(naz/2)+1): + for ia in range(1, int(naz/2)+1): th1 = (ia-1 )*2*np.pi/naz*2; th2 = (ia-0.5)*2*np.pi/naz*2; th3 = (ia )*2*np.pi/naz*2; diff --git a/RAFT/raft/omdao_raft.py b/RAFT/raft/omdao_raft.py index 165977f19..b14ff9ea9 100644 --- a/RAFT/raft/omdao_raft.py +++ b/RAFT/raft/omdao_raft.py @@ -255,10 +255,11 @@ def setup(self): self.add_output('properties_roll inertia at subCG', val=np.zeros(ndim), units='kg*m**2', desc='Roll inertia sub CG') self.add_output('properties_pitch inertia at subCG', val=np.zeros(ndim), units='kg*m**2', desc='Pitch inertia sub CG') self.add_output('properties_yaw inertia at subCG', val=np.zeros(ndim), units='kg*m**2', desc='Yaw inertia sub CG') - self.add_output('properties_Buoyancy (pgV)', val=0.0, units='N', desc='Buoyancy (pgV)') - self.add_output('properties_Center of Buoyancy', val=np.zeros(ndim), units='m', desc='Center of buoyancy') - self.add_output('properties_C stiffness matrix', val=np.zeros((ndof,ndof)), units='Pa', desc='C stiffness matrix') - self.add_output('properties_F_lines0', val=np.zeros(nconnections), units='N', desc='Mean mooring force') + self.add_output('properties_buoyancy (pgV)', val=0.0, units='N', desc='Buoyancy (pgV)') + self.add_output('properties_center of buoyancy', val=np.zeros(ndim), units='m', desc='Center of buoyancy') + self.add_output('properties_C hydrostatic', val=np.zeros((ndof,ndof)), units='Pa', desc='C stiffness matrix') + self.add_output('properties_C system', val=np.zeros((ndof,ndof)), units='Pa', desc='C stiffness matrix of full system') + self.add_output('properties_F_lines0', val=np.zeros(ndof), units='N', desc='Mean mooring force from all lines') self.add_output('properties_C_lines0', val=np.zeros((ndof,ndof)), units='Pa', desc='Mooring stiffness') self.add_output('properties_M support structure', val=np.zeros((ndof,ndof)), units='kg', desc='Mass matrix for platform') self.add_output('properties_A support structure', val=np.zeros((ndof,ndof)), desc='Added mass matrix for platform') @@ -273,7 +274,7 @@ def setup(self): self.add_output('response_roll RAO', val=np.zeros(nfreq), units='rad', desc='Roll RAO') self.add_output('response_yaw RAO', val=np.zeros(nfreq), units='rad', desc='Yaw RAO') self.add_output('response_nacelle acceleration', val=np.zeros(nfreq), units='m/s**2', desc='Nacelle acceleration') - # case specific + # case specific, note: only DLCs supported in RAFT will have non-zero outputs names = ['surge','sway','heave','roll','pitch','yaw','AxRNA','Mbase','omega','torque','power','bPitch','Tmoor'] stats = ['avg','std','max','PSD','DEL'] for n in names: @@ -282,9 +283,9 @@ def setup(self): iout = f'{n}_{s}' if n == 'Tmoor': - myval = np.zeros((n_cases, 2*nlines)) if s not in ['PSD'] else np.zeros((n_cases, 2*nlines, nfreq)) + myval = np.zeros((n_cases, 2*nlines)) if s not in ['PSD'] else np.zeros((n_cases, nfreq, 2*nlines)) elif n == 'Mbase': - myval = np.zeros(n_cases) if s not in ['PSD','std'] else np.zeros((n_cases, nfreq)) + myval = np.zeros(n_cases) if s not in ['PSD'] else np.zeros((n_cases, nfreq)) else: myval = np.zeros(n_cases) if s not in ['PSD'] else np.zeros((n_cases, nfreq)) @@ -301,13 +302,22 @@ def setup(self): # Other case outputs self.add_output('stats_wind_PSD', val=np.zeros((n_cases,nfreq)), desc='Power spectral density of wind input') self.add_output('stats_wave_PSD', val=np.zeros((n_cases,nfreq)), desc='Power spectral density of wave input') - + + # Natural periods + self.add_output('rigid_body_periods', val = np.zeros(6), desc = 'Rigid body natural period', units = 's') + self.add_output('surge_period', val = 0, desc = 'Surge natural period', units = 's') + self.add_output('sway_period', val = 0, desc = 'Sway natural period', units = 's') + self.add_output('heave_period', val = 0, desc = 'Heave natural period', units = 's') + self.add_output('roll_period', val = 0, desc = 'Roll natural period', units = 's') + self.add_output('pitch_period', val = 0, desc = 'Pitch natural period', units = 's') + self.add_output('yaw_period', val = 0, desc = 'Yaw natural period', units = 's') + # Aggregate outputs self.add_output('Max_Offset', val = 0, desc = 'Maximum distance in surge/sway direction', units = 'm') self.add_output('heave_avg', val = 0, desc = 'Average heave over all cases', units = 'm') self.add_output('Max_PtfmPitch', val = 0, desc = 'Maximum platform pitch over all cases', units = 'deg') self.add_output('Std_PtfmPitch', val = 0, desc = 'Average platform pitch std. over all cases', units = 'deg') - self.add_output('max_nacelle_Ax', val = 0, desc = 'Maximum nacelle accelleration over all cases', units = 'm/s**2') + self.add_output('max_nac_accel', val = 0, desc = 'Maximum nacelle accelleration over all cases', units = 'm/s**2') self.add_output('rotor_overspeed', val = 0, desc = 'Fraction above rated rotor speed') self.add_output('max_tower_base', val = 0, desc = 'Maximum tower base moment over all cases', units = 'N*m') @@ -633,7 +643,7 @@ def compute(self, inputs, outputs, discrete_inputs, discrete_outputs): # option to run level 1 load cases if True: #processCases: - model.analyzeCases(runPyHAMS=modeling_opt['runPyHAMS'], meshDir=modeling_opt['BEM_dir']) + model.analyzeCases(meshDir=modeling_opt['BEM_dir']) # get and process results results = model.calcOutputs() @@ -643,34 +653,51 @@ def compute(self, inputs, outputs, discrete_inputs, discrete_outputs): if outs[i][0].startswith('properties_'): name = outs[i][0].split('properties_')[1] outputs['properties_'+name] = results['properties'][name] + ''' + Note: dynamic results should be taken from results['case metrics'] elif outs[i][0].startswith('response_'): name = outs[i][0].split('response_')[1] if np.iscomplex(results['response'][name]).any(): outputs['response_'+name] = np.abs(results['response'][name]) else: outputs['response_'+name] = results['response'][name] - + ''' # Pattern matching for case-by-case outputs - names = ['surge','sway','heave','roll','pitch','yaw','AxRNA','Mbase','omega','torque','power','bPitch','Tmoor'] - stats = ['avg','std','max','PSD','DEL'] + # names = ['surge','sway','heave','roll','pitch','yaw','AxRNA','Mbase','omega','torque','power','bPitch','Tmoor'] # these are not always outputted, need to catch better + names = ['surge','sway','heave','roll','pitch','yaw','AxRNA','Mbase','Tmoor'] + stats = ['avg','std','max','PSD'] case_mask = np.array(case_mask) for n in names: for s in stats: - if s == 'DEL' and not n in ['Tmoor','Mbase']: continue iout = f'{n}_{s}' - outputs['stats_'+iout][case_mask] = np.squeeze( results['case_metrics'][iout] ) + + # use only first rotor/turbine + case_metrics = [cm[0] for cm in results['case_metrics'].values()] + stat = np.squeeze(np.array([cm[iout] for cm in case_metrics])) + outputs['stats_'+iout][case_mask] = stat # Other case outputs - for n in ['wind_PSD','wave_PSD']: - outputs['stats_'+n][case_mask,:] = results['case_metrics'][n] + # for n in ['wind_PSD','wave_PSD']: + # outputs['stats_'+n][case_mask,:] = results['case_metrics'][n] + + # natural periods + model.solveEigen() + outputs["rigid_body_periods"] = 1/results['eigen']['frequencies'] + + outputs["surge_period"] = outputs["rigid_body_periods"][0] + outputs["sway_period"] = outputs["rigid_body_periods"][1] + outputs["heave_period"] = outputs["rigid_body_periods"][2] + outputs["roll_period"] = outputs["rigid_body_periods"][3] + outputs["pitch_period"] = outputs["rigid_body_periods"][4] + outputs["yaw_period"] = outputs["rigid_body_periods"][5] # Compute some aggregate outputs manually outputs['Max_Offset'] = np.sqrt(outputs['stats_surge_max'][case_mask]**2 + outputs['stats_sway_max'][case_mask]**2).max() outputs['heave_avg'] = outputs['stats_heave_avg'][case_mask].mean() outputs['Max_PtfmPitch'] = outputs['stats_pitch_max'][case_mask].max() outputs['Std_PtfmPitch'] = outputs['stats_pitch_std'][case_mask].mean() - outputs['max_nacelle_Ax'] = outputs['stats_AxRNA_std'][case_mask].max() + outputs['max_nac_accel'] = outputs['stats_AxRNA_std'][case_mask].max() outputs['rotor_overspeed'] = (outputs['stats_omega_max'][case_mask].max() - inputs['rated_rotor_speed']) / inputs['rated_rotor_speed'] outputs['max_tower_base'] = outputs['stats_Mbase_max'][case_mask].max() @@ -682,3 +709,24 @@ def compute(self, inputs, outputs, discrete_inputs, discrete_outputs): outputs["platform_I_total"][:3] = np.r_[outputs['properties_roll inertia at subCG'][0], outputs['properties_pitch inertia at subCG'][0], outputs['properties_yaw inertia at subCG'][0]] + + +class RAFT_Group(om.Group): + def initialize(self): + self.options.declare('modeling_options') + self.options.declare('turbine_options') + self.options.declare('mooring_options') + self.options.declare('member_options') + self.options.declare('analysis_options') + + def setup(self): + modeling_opt = self.options['modeling_options'] + analysis_opt = self.options['analysis_options'] + turbine_opt = self.options['turbine_options'] + members_opt = self.options['member_options'] + mooring_opt = self.options['mooring_options'] + self.add_subsystem("raft", RAFT_OMDAO(modeling_options=modeling_opt, + analysis_options=analysis_opt, + turbine_options=turbine_opt, + mooring_options=mooring_opt, + member_options=members_opt), promotes=["*"]) diff --git a/RAFT/raft/raft_fowt.py b/RAFT/raft/raft_fowt.py index 87a3d6400..dc3c3be86 100644 --- a/RAFT/raft/raft_fowt.py +++ b/RAFT/raft/raft_fowt.py @@ -1,14 +1,15 @@ # RAFT's floating wind turbine class import os +import matplotlib.pyplot as plt import numpy as np -from scipy.interpolate import interp1d +from scipy.interpolate import interp1d, interp2d, griddata -import pyhams.pyhams as ph import raft.member2pnl as pnl from raft.helpers import * from raft.raft_member import Member from raft.raft_rotor import Rotor +import moorpy as mp # deleted call to ccblade in this file, since it is called in raft_rotor # also ignoring changes to solveEquilibrium3 in raft_model and the re-addition of n=len(stations) in raft_member, based on raft_patch @@ -18,62 +19,112 @@ class FOWT(): '''This class comprises the frequency domain model of a single floating wind turbine''' - def __init__(self, design, w, mpb, depth=600): + def __init__(self, design, w, mpb, depth=600, x_ref=0, y_ref=0, heading_adjust=0): '''This initializes the FOWT object which contains everything for a single turbine's frequency-domain dynamics. The initializiation sets up the design description. Parameters ---------- design : dict - Dictionary of the design... + Dictionary of the design - must include sections for site, turbine, platform, and mooring w Array of frequencies to be used in analysis (rad/s) mpb A MoorPy Body object that represents this FOWT in MoorPy + mooring : dict + A dictionary describing the mooring system that is specific to this FOWT (to be stored inside this object) depth Water depth, positive-down. (m) + x_ref : float + Reference x location of this fowt in the array [m] + y_ref : float + Reference y location of this fowt in the array [m] + heading_adjust : float + Rotation to the heading of the platform and mooring system to be applied [deg] ''' + print("Making FOWT") + + # from Joep: for muliple HAMS threads and multiple wave headings >>> + #self.numThreads = int(getFromDict(design['settings'],'numThreads', default=8)) # number of threads to run HAMS + #self.headsStored = np.empty(1) + # basic setup self.nDOF = 6 - self.Xi0 = np.zeros(6) # mean offsets of platform, initialized at zero [m, rad] - - # collect numbers of rotors, towers, members, etc. - self.nrotors = getFromDict(design['turbine'], 'nrotors', dtype=int, shape=0, default=1) - if self.nrotors==1: design['turbine']['nrotors'] = 1 - - if isinstance(design['turbine']['tower'], dict): # if we use the entire blade dict list approach - design['turbine']['tower'] = [design['turbine']['tower']]*self.nrotors - - self.ntowers = len(design['turbine']['tower']) - #if self.ntowers != self.nrotors: raise ValueError('One tower is needed per rotor') + self.nw = len(w) # number of frequencies + self.Xi0 = np.zeros( self.nDOF) # mean offsets of platform from its reference point [m, rad] + self.Xi = np.zeros([self.nDOF, self.nw], dtype=complex) # complex response amplitudes as a function of frequency [m, rad] + + # position in the array + self.x_ref = x_ref # reference x position of the FOWT in the array [m] + self.y_ref = y_ref # reference y position of the FOWT in the array [m] + self.r6 = np.zeros(6) # mean position/orientation in absolute/array coordinates [m,rad] + + # count number of platform members self.nplatmems = 0 for platmem in design['platform']['members']: if 'heading' in platmem: + #print(platmem['heading']) self.nplatmems += len(platmem['heading']) else: self.nplatmems += 1 + + # count numbers of rotors and their towers and copy some info + if 'turbine' in design: + + self.nrotors = getFromDict(design['turbine'], 'nrotors', dtype=int, shape=0, default=1) + if self.nrotors==1: design['turbine']['nrotors'] = 1 + + if 'tower' in design['turbine']: + if isinstance(design['turbine']['tower'], dict): # if a single tower is specified (rather than a list) + design['turbine']['tower'] = [design['turbine']['tower']]*self.nrotors # replicate the tower info for each rotor + + self.ntowers = len(design['turbine']['tower']) + + else: + self.ntowers = 0 + + # copy over site info into turbine dictionary + design['turbine']['rho_air' ] = getFromDict(design['site'], 'rho_air', shape=0, default=1.225) + design['turbine']['mu_air' ] = getFromDict(design['site'], 'mu_air', shape=0, default=1.81e-05) + design['turbine']['shearExp_air' ] = getFromDict(design['site'], 'shearExp_air', shape=0, default=0.12) + design['turbine']['rho_water' ] = getFromDict(design['site'], 'rho_water', shape=0, default=1025.0) + design['turbine']['mu_water' ] = getFromDict(design['site'], 'mu_water', shape=0, default=1.0e-03) + design['turbine']['shearExp_water'] = getFromDict(design['site'], 'shearExp_water', shape=0, default=0.12) + + # turbine RNA description + self.mRNA = getFromDict(design['turbine'], 'mRNA' , shape=self.nrotors) + self.IxRNA = getFromDict(design['turbine'], 'IxRNA' , shape=self.nrotors) + self.IrRNA = getFromDict(design['turbine'], 'IrRNA' , shape=self.nrotors) + self.xCG_RNA = getFromDict(design['turbine'], 'xCG_RNA', shape=self.nrotors) + self.hHub = getFromDict(design['turbine'], 'hHub' , shape=self.nrotors) + + else: # no turbines/rotors case + + self.nrotors = 0 # this will ensure RAFT doesn't set up or look for any Rotor objects + self.ntowers = 0 + + # note: RNA descriptions are not defined because there is no turbine self.rotorList = [] - self.rotorCoords = [] self.depth = depth self.w = np.array(w) - self.nw = len(w) # number of frequencies - self.dw = w[1]-w[0] # frequency increment [rad/s] - + self.dw = w[1]-w[0] # frequency increment [rad/s] + self.k = np.array([waveNumber(w, self.depth) for w in self.w]) # wave number [m/rad] self.rho_water = getFromDict(design['site'], 'rho_water', default=1025.0) self.g = getFromDict(design['site'], 'g' , default=9.81) - - # <<<<<<<<<<< do we need this? Should it be something like self.dlsMax? + self.shearExp_water = getFromDict(design['site'], 'shearExp_water', default=0.12) + + # <<<<<<<<<<< Should it be something like self.dlsMax? #design['turbine']['tower']['dlsMax'] = getFromDict(design['turbine']['tower'], 'dlsMax', shape=-1, default=5.0) - # >>>>>>>>>>>>>>>>>>>>>>>>>> potModMaster = getFromDict(design['platform'], 'potModMaster', dtype=int, default=0) + self.potModMaster = potModMaster dlsMax = getFromDict(design['platform'], 'dlsMax' , default=5.0) min_freq_BEM = getFromDict(design['platform'], 'min_freq_BEM', default=self.dw/2/np.pi) self.dw_BEM = 2.0*np.pi*min_freq_BEM @@ -89,66 +140,140 @@ def __init__(self, design, w, mpb, depth=600): for mi in design['platform']['members']: + # prepare member info if potModMaster==1: mi['potMod'] = False elif potModMaster==2: mi['potMod'] = True - - mi['dlsMax'] = dlsMax + + if 'dlsMax' not in mi: # apply the global dlsMax setting to any member that doesn't have its own setting + mi['dlsMax'] = dlsMax headings = getFromDict(mi, 'heading', shape=-1, default=0.) mi['headings'] = headings # differentiating the list of headings/copies of a member from the individual member's heading + + # create member object if np.isscalar(headings): - mi['heading'] = headings - self.memberList.append(Member(mi, self.nw)) + self.memberList.append(Member(mi, self.nw, heading=headings+heading_adjust)) else: for heading in headings: - mi['heading'] = heading - self.memberList.append(Member(mi, self.nw)) - mi['heading'] = headings # set the headings dict value back to the yaml headings value, instead of the last one used - - for t,tower in enumerate(design['turbine']['tower']): - self.memberList.append(Member(design['turbine']['tower'][t], self.nw)) + self.memberList.append(Member(mi, self.nw, heading=heading+heading_adjust)) + + + # add tower(s) to member list if applicable + for ti in range(self.ntowers): + #tower['dlsMax'] = design['turbine']['tower']['dlsMax'] # for when we want to make a list of tower 'members' and have general inputs like dlsMax first + self.memberList.append(Member(design['turbine']['tower'][ti], self.nw)) #TODO: consider putting the tower somewhere else rather than in end of memberList <<< - # mooring system connection + # array-level mooring system connection self.body = mpb # reference to Body in mooring system corresponding to this turbine + # this FOWT's own MoorPy system (may not be used) + if design['mooring']: + + self.ms = mp.System() + self.ms.parseYAML(design['mooring']) + + # ensure proper setup with one coupled Body tied to this FOWT + if len(self.ms.bodyList) == 0: + self.ms.addBody(-1, [0,0,0,0,0,0]) # create a new body if needed + for point in self.ms.pointList: + if point.type == -1: # attached any coupled points to the body + self.ms.bodyList[0].attachPoint(point.number, point.r) + point.type = 1 # now indicate point is fixed (to the body) + + elif len(self.ms.bodyList) == 1: + self.ms.bodyList[0].type = -1 # ensure it's set to coupled type + else: + raise Exception("More than one body detected in FOWT mooring system.") + + # move mooring system according to the FOWT's reference position + self.ms.transform(trans=[x_ref, y_ref], rot=heading_adjust) + self.ms.initialize() + + else: + self.ms = None + + self.F_moor0 = np.zeros(6) # mean mooring forces in a given scenario + self.C_moor = np.zeros([6,6]) # mooring stiffness matrix in a given scenario + if 'yaw_stiffness' in design['platform']: self.yawstiff = design['platform']['yaw_stiffness'] # If you're modeling OC3 spar, for example, import the manual yaw stiffness needed by the bridle config else: self.yawstiff = 0 - # Turbine rotor - design['turbine']['rho_air' ] = design['site']['rho_air'] - design['turbine']['mu_air' ] = design['site']['mu_air'] - design['turbine']['shearExp'] = design['site']['shearExp'] - + # build Rotor list for ir in range(self.nrotors): self.rotorList.append(Rotor(design['turbine'], self.w, ir)) #self.rotorCoords.append(design['turbine']['rotorCoords']) - - # turbine RNA description - self.mRNA = getFromDict(design['turbine'], 'mRNA', shape=self.nrotors) - self.IxRNA = getFromDict(design['turbine'], 'IxRNA', shape=self.nrotors) - self.IrRNA = getFromDict(design['turbine'], 'IrRNA', shape=self.nrotors) - self.xCG_RNA = getFromDict(design['turbine'], 'xCG_RNA', shape=self.nrotors) - self.hHub = getFromDict(design['turbine'], 'hHub', shape=self.nrotors) - + # initialize mean force arrays to zero, so the model can work before we calculate excitation - self.F_aero0 = np.zeros([6, self.nrotors]) + self.f_aero0 = np.zeros([6, self.nrotors]) # mean weight and hydro force arrays are set elsewhere. In future hydro could include current. + self.D_hydro = np.zeros(6) # initialize mean drag force from current - acts as a "static" force, like f_aero0 - # initialize BEM arrays, whether or not a BEM sovler is used + # flag to signal whether any BEM hydro modeling is done + self.potMod = any([member['potMod']==True for member in design['platform']['members'] ]) + + # initialize BEM arrays, whether or not a BEM solver is used + # __, __, nWaveHeadings = getUniqueCaseHeadings(design['cases']['keys'], design['cases']['data']) # identify how many wave headings need to be preprocessed self.A_BEM = np.zeros([6,6,self.nw], dtype=float) # hydrodynamic added mass matrix [kg, kg-m, kg-m^2] self.B_BEM = np.zeros([6,6,self.nw], dtype=float) # wave radiation drag matrix [kg, kg-m, kg-m^2] - self.X_BEM = np.zeros([6, self.nw], dtype=complex) # linaer wave excitation force/moment coefficients vector [N, N-m] - self.F_BEM = np.zeros([6, self.nw], dtype=complex) # linaer wave excitation force/moment complex amplitudes vector [N, N-m] + #self.X_BEM = np.zeros([self.nWaves, 6, self.nw], dtype=complex) # linaer wave excitation force/moment coefficients vector [N, N-m] + #self.F_BEM = np.zeros([self.nWaves, 6, self.nw], dtype=complex) # linaer wave excitation force/moment complex amplitudes vector [N, N-m] + # <<< TODO: Set maximum of amount of headingsm for X_BEM and F_BEM and use interpolation of hydrodynamics. Or not? + + # Add a flag to either not compute 2nd order hydro; read QTF; or compute it with a slender-body approximation + # self.qtf = np.zeros([nw1, nw2, nheads, self.nDOF], dtype=complex) + if 'qtfPath' in design['platform']: + self.secondOrderWaveMod = 1 # <<< temporary, until we implement a flag like this in the inputs + self.qtfPath = design['platform']['qtfPath'] + self.readQTF(self.qtfPath) + self.mu_2nd = self.w - self.w[0] # The frequency array for difference-frequency second-order is the same as self.w, but starting at 0 + else: + self.secondOrderWaveMod = 0 # <<< temporary + def setPosition(self, r6): + '''Updates the FOWT's (mean) position including all components. + + r6 : float array + 6 DOF absolute position of FOWT [m, rad] + ''' + + # if offset provided, set things according to those positions, otherwise zero it + #if r6: + self.r6 = r6 + #else: + # self.r6 = np.array([x_ref, y_ref, 0, 0, 0, 0]) + self.Xi0 = self.r6 - np.array([self.x_ref, self.y_ref, 0, 0, 0, 0]) + + # calculate and save a rotation/orientation matrix + self.Rmat = rotationMatrix(*self.r6[3:]) # rotation matrix for fowt orientation + + # set the positions of the FOWT's members, rotors, and MoorPy system + if self.ms: + self.ms.bodyList[0].setPosition(self.r6) + + for rot in self.rotorList: + rot.setPosition(r6=self.r6) + + for mem in self.memberList: + mem.setPosition(r6=self.r6) + + # solve the mooring system equilibrium of this FOWT's own MoorPy system + if self.ms: + self.ms.solveEquilibrium() + self.C_moor = self.ms.getCoupledStiffnessA() + self.F_moor0 = self.ms.bodyList[0].getForces(lines_only=True) + + def calcStatics(self): - '''Fills in the static quantities of the FOWT and its matrices. - Also adds some dynamic parameters that are constant, e.g. BEM coefficients and steady thrust loads.''' + '''Computes the static properties of the FOWT in terms of mass and hydrostatic-related + matrices and mean force vectors about the FOWT PRP in unrotated directions, based on + the mean offsets of the FOWT, Xi0. + ''' rho = self.rho_water g = self.g @@ -158,8 +283,7 @@ def calcStatics(self): self.B_struc = np.zeros([6,6]) # structure damping matrix [N-s/m, N-s, N-s-m] (may not be used) self.C_struc = np.zeros([6,6]) # structure effective stiffness matrix [N/m, N, N-m] self.W_struc = np.zeros([6]) # static weight vector [N, N-m] - self.C_struc_sub = np.zeros([6,6]) # substructure effective stiffness matrix [N/m, N, N-m] - + # hydrostatic arrays self.C_hydro = np.zeros([6,6]) # hydrostatic stiffness matrix [N/m, N, N-m] self.W_hydro = np.zeros(6) # buoyancy force/moment vector [N, N-m] <<<<< not used yet @@ -172,18 +296,19 @@ def calcStatics(self): # initialize some variables for running totals VTOT = 0. # Total underwater volume of all members combined - mTOT = 0. # Total mass of all members [kg] + m_all = 0. # Total mass of all members [kg] AWP_TOT = 0. # Total waterplane area of all members [m^2] IWPx_TOT = 0 # Total waterplane moment of inertia of all members about x axis [m^4] IWPy_TOT = 0 # Total waterplane moment of inertia of all members about y axis [m^4] Sum_V_rCB = np.zeros(3) # product of each member's buoyancy multiplied by center of buoyancy [m^4] Sum_AWP_rWP = np.zeros(2) # product of each member's waterplane area multiplied by the area's center point [m^3] - Sum_M_center = np.zeros(3) # product of each member's mass multiplied by its center of mass [kg-m] (Only considers the shell mass right now) + m_center_sum = np.zeros(3) # product of each member's mass multiplied by its center of mass [kg-m] (Only considers the shell mass right now) - self.msubstruc = 0 # total mass of just the members that make up the substructure [kg] - self.M_struc_subPRP = np.zeros([6,6]) # total mass matrix of just the substructure about the PRP - msubstruc_sum = 0 # product of each substructure member's mass and CG, to be used to find the total substructure CG [kg-m] - self.mshell = 0 # total mass of the shells/steel of the members in the substructure [kg] + self.m_sub = 0 # total mass of just the members that make up the substructure [kg] + self.C_struc_sub = np.zeros([6,6]) # substructure effective stiffness matrix [N/m, N, N-m] + self.M_struc_sub = np.zeros([6,6]) # total mass matrix of just the substructure about the PRP + m_sub_sum = 0 # product of each substructure member's mass and CG, to be used to find the total substructure CG [kg-m] + self.m_shell = 0 # total mass of the shells/steel of the members in the substructure [kg] mballast = [] # list to store the mass of the ballast in each of the substructure members [kg] pballast = [] # list to store the density of ballast in each of the substructure members [kg] ''' @@ -198,18 +323,20 @@ def calcStatics(self): # loop through each member for i,mem in enumerate(self.memberList): - # calculate member's orientation information (needed for later steps) - mem.calcOrientation() + # calculate member's orientation information (stored in the member and used in later steps) + mem.setPosition(r6=self.r6) # <<< is this redundant, assume fowt.setPosition has been called? + + # note: quantities in the following section are relative to the PRP (but with global direcions) # ---------------------- get member's mass and inertia properties ------------------------------ - mass, center, mshell, mfill, pfill = mem.getInertia() # calls the getInertia method to calcaulte values - + # get member mass and inertia info (including mem.M_struc) <<< still split between converting to PRP in or out of these functions + mass, center, m_shell, mfill, pfill = mem.getInertia(rPRP=self.r6[:3]) # Calculate the mass matrix of the FOWT about the PRP self.W_struc += translateForce3to6DOF( np.array([0,0, -g*mass]), center ) # weight vector self.M_struc += mem.M_struc # mass/inertia matrix about the PRP - - Sum_M_center += center*mass # product sum of the mass and center of mass to find the total center of mass [kg-m] + + m_center_sum += center*mass # product sum of the mass and center of mass to find the total center of mass [kg-m] # Tower calculations if mem.type <= 1: # <<<<<<<<<<<< maybe find a better way to do the if condition @@ -217,10 +344,10 @@ def calcStatics(self): self.rCG_tow.append(center) # center of mass of the tower from the PRP [m] # Substructure calculations if mem.type > 1: - self.msubstruc += mass # mass of the substructure - self.M_struc_subPRP += mem.M_struc # mass matrix of the substructure about the PRP - msubstruc_sum += center*mass # product sum of the substructure members and their centers of mass [kg-m] - self.mshell += mshell # mass of the substructure shell material [kg] + self.m_sub += mass # mass of the substructure + self.M_struc_sub += mem.M_struc # mass matrix of the substructure about the PRP + m_sub_sum += center*mass # product sum of the substructure members and their centers of mass [kg-m] + self.m_shell += m_shell # mass of the substructure shell material [kg] mballast.extend(mfill) # list of ballast masses in each substructure member (list of lists) [kg] pballast.extend(pfill) # list of ballast densities in each substructure member (list of lists) [kg/m^3] ''' @@ -233,18 +360,85 @@ def calcStatics(self): # -------------------- get each member's buoyancy/hydrostatic properties ----------------------- - Fvec, Cmat, V_UW, r_CB, AWP, IWP, xWP, yWP = mem.getHydrostatics(self.rho_water, self.g) # call to Member method for hydrostatic calculations - - # now convert everything to be about PRP (platform reference point) and add to global vectors/matrices <<<<< needs updating (already about PRP) + Fvec, Cmat, V_UW, r_CB, AWP, IWP, xWP, yWP = mem.getHydrostatics(rho=self.rho_water, g=self.g, rPRP=self.r6[:3]) + + # add to fowt's mean force vector and stiffness matrix self.W_hydro += Fvec # translateForce3to6DOF( np.array([0,0, Fz]), mem.rA ) # buoyancy vector self.C_hydro += Cmat # translateMatrix6to6DOF(Cmat, mem.rA) # hydrostatic stiffness matrix - + + # convert other metrics to also be about the PRP (platform reference point) VTOT += V_UW # add to total underwater volume of all members combined AWP_TOT += AWP IWPx_TOT += IWP + AWP*yWP**2 IWPy_TOT += IWP + AWP*xWP**2 Sum_V_rCB += r_CB*V_UW Sum_AWP_rWP += np.array([xWP, yWP])*AWP + + + # ------------- include buoyancy effects of underwater rotors ------------- + # loop through each blade member to calculate rotor buoyancy forces (for underwater turbines) + for i in range(self.nrotors): # for each rotor in the fowt + + rotor = self.rotorList[i] + + if rotor.Zhub < 0: # only do this for underwater rotors + + for j in range(int(rotor.nBlades)): # for each blade on the rotor + + # ensure the blade headings are equally spaced apart (so that the specific heading values are arbitrary) + if all(np.mod(np.diff(rotor.headings, append=rotor.headings[0]),360) != np.mod(np.diff(rotor.headings, append=rotor.headings[0])[0], 360)): + raise ValueError("The headings of the blades need to be equally spaced apart") + + for k,afmem in enumerate(rotor.bladeMemberList): # for each airfoil member in the bladeMemberList + + # store original positions of the airfoil member about the original rotor axis + rA_OG = afmem.rA0 + rB_OG = afmem.rB0 + rOG = np.vstack([rA_OG, rB_OG]) + + # set the heading, or azimuth angle, of the blade member + afmem.heading = rotor.headings[j] + + # find the end nodes of the blade member about the global coordinates (e.g,, if rA_OG = [0,0,0] and rB_OG=[0,1,0], and heading=90, then rA=[0,0,0] and rB=[0,0,1]) + r_new = rotor.getBladeMemberPositions(rotor.headings[j], rOG) + + # save these end node positions in the blade member + afmem.rA0 = r_new[0,:] + afmem.rB0 = r_new[1,:] + + # save the positions of the nodes for each blade + rotor.nodes[j,k,:] = afmem.rA0 + if k==len(rotor.bladeMemberList)-1: # if it's the last blade member, save it's rB position to the last position in the nodes array + rotor.nodes[j,k+1,:] = afmem.rB0 + + # find the actual orientation vectors of the blade member + afmem.setPosition() + + # calculate the mass and inertial properties of the blade members + #mass, center, m_shell, mfill, pfill = afmem.getInertia() + # >>>>>> can be used later if actual rectangular mass properties are desired other than mRNA <<<<<<<< + + # calculate hydrostatic properties of the blade (sub)member and add them to the system matrices + Fvec, Cmat, V_UW, r_CB, AWP, IWP, xWP, yWP = afmem.getHydrostatics(rho=self.rho_water, g=self.g, rPRP=self.r6[:3]) + + # outputs of getHydrostatics should already be about the PRP + self.W_hydro += Fvec # buoyancy vector + self.C_hydro += Cmat # hydrostatic stiffness matrix + + VTOT += V_UW # add to total underwater volume of all members combined + AWP_TOT += AWP + IWPx_TOT += IWP + AWP*yWP**2 + IWPy_TOT += IWP + AWP*xWP**2 + Sum_V_rCB += r_CB*V_UW + Sum_AWP_rWP += np.array([xWP, yWP])*AWP + + # reset original rA and rB values of the airfoil member + afmem.rA0 = rA_OG + afmem.rB0 = rB_OG + afmem.setPosition() + + # Note: it might be possible to streamline the above using new capabilities in setPosition (but not sure). + # ------------------------- include RNA properties ----------------------------- @@ -261,63 +455,40 @@ def calcStatics(self): for i in range(self.nrotors): Mmat = np.diag([self.mRNA[i], self.mRNA[i], self.mRNA[i], self.IxRNA[i], self.IrRNA[i], self.IrRNA[i]]) # create mass/inertia matrix - center = np.array([self.xCG_RNA[i], 0, self.hHub[i]]) # RNA center of mass location + center = np.array([self.xCG_RNA[i], self.rotorList[i].rHub[1], self.hHub[i]]) # RNA center of mass location <<< need to overhaul this! + + # compute rotated RNA mass properties considering current fowt pose <<< need to double check these + Mmat = rotateMatrix6(Mmat, self.Rmat) # adjust the inertia matrix to align with global directions + center = np.matmul(self.Rmat, center) # adjust center offset from PRP along global directions # now convert everything to be about PRP (platform reference point) and add to global vectors/matrices self.W_struc += translateForce3to6DOF(np.array([0,0, -g*self.mRNA[i]]), center ) # weight vector self.M_struc += translateMatrix6to6DOF(Mmat, center) # mass/inertia matrix - Sum_M_center += center*self.mRNA[i] - ''' - if self.nrotors==1: - Mmat = np.diag([self.mRNA, self.mRNA, self.mRNA, self.IxRNA, self.IrRNA, self.IrRNA]) # create mass/inertia matrix - center = np.array([self.xCG_RNA, 0, self.hHub]) # RNA center of mass location - - # now convert everything to be about PRP (platform reference point) and add to global vectors/matrices - self.W_struc += translateForce3to6DOF(np.array([0,0, -g*self.mRNA]), center ) # weight vector - self.M_struc += translateMatrix6to6DOF(Mmat, center) # mass/inertia matrix - Sum_M_center += center*self.mRNA - else: - for i in range(self.nrotors): - Mmat = np.diag([self.mRNA[i], self.mRNA[i], self.mRNA[i], self.IxRNA[i], self.IrRNA[i], self.IrRNA[i]]) # create mass/inertia matrix - center = np.array([self.xCG_RNA[i], 0, self.hHub[i]]) # RNA center of mass location - - # now convert everything to be about PRP (platform reference point) and add to global vectors/matrices - self.W_struc += translateForce3to6DOF(np.array([0,0, -g*self.mRNA[i]]), center ) # weight vector - self.M_struc += translateMatrix6to6DOF(Mmat, center) # mass/inertia matrix - Sum_M_center += center*self.mRNA[i] - ''' + m_center_sum += center*self.mRNA[i] # ----------- process inertia-related totals ---------------- - mTOT = self.M_struc[0,0] # total mass of all the members - self.mTOT = mTOT - rCG_TOT = Sum_M_center/mTOT # total CG of all the members - self.rCG_TOT = rCG_TOT - - self.rCG_sub = msubstruc_sum/self.msubstruc # solve for just the substructure mass and CG - - self.M_struc_subCM = translateMatrix6to6DOF(self.M_struc_subPRP, -self.rCG_sub) # the mass matrix of the substructure about the substruc's CM - # need to make rCG_sub negative here because tM6to6DOF takes a vector that goes from where you want the ref point to be (CM) to the currently ref point (PRP) - - ''' - self.I44 = 0 # moment of inertia in roll due to roll of the substructure about the substruc's CG [kg-m^2] - self.I44B = 0 # moment of inertia in roll due to roll of the substructure about the PRP [kg-m^2] - self.I55 = 0 # moment of inertia in pitch due to pitch of the substructure about the substruc's CG [kg-m^2] - self.I55B = 0 # moment of inertia in pitch due to pitch of the substructure about the PRP [kg-m^2] - self.I66 = 0 # moment of inertia in yaw due to yaw of the substructure about the substruc's centerline [kg-m^2] - - # Use the parallel axis theorem to move each substructure's MoI to the substructure's CG - x = np.linalg.norm([self.rCG_sub[1],self.rCG_sub[2]]) # the normalized distance between the x and x' axes - y = np.linalg.norm([self.rCG_sub[0],self.rCG_sub[2]]) # the normalized distance between the y and y' axes - z = np.linalg.norm([self.rCG_sub[0],self.rCG_sub[1]]) # the normalized distance between the z and z' axes - for i in range(len(I44list)): - self.I44 += I44list[i] - masslist[i]*x**2 - self.I44B += I44list[i] - self.I55 += I55list[i] - masslist[i]*y**2 - self.I55B += I55list[i] - self.I66 += I66list[i] - masslist[i]*z**2 - ''' - + m_all = self.M_struc[0,0] # total mass of all the members + rCG_all = m_center_sum/m_all # total CG of all the members + + self.rCG = rCG_all + self.rCG_sub = m_sub_sum/self.m_sub # solve for just the substructure mass and CG + + + + # get principal moments of inertia (about CG) + # note: these are likely only useful in the unrotated frame, i.e. + # the first time calcStatics is called. + + # the mass matrix of the substructure about the substruc's CM + M_sub = translateMatrix6to6DOF(self.M_struc_sub, -self.rCG_sub) # -rCG_sub due to convention of the function + + # overall structure mass matrix about its CM + M_all = translateMatrix6to6DOF(self.M_struc, -self.rCG) + + # could check that off-diagonals are approximately zero as an error check + + # Solve for the total mass of each type of ballast in the substructure self.pb = [] # empty list to store the unique ballast densities for i in range(len(pballast)): @@ -325,48 +496,69 @@ def calcStatics(self): if self.pb.count(pballast[i]) == 0: # and if that value is not already in pb self.pb.append(pballast[i]) # store that ballast density value - self.mballast = np.zeros(len(self.pb)) # make an empty mballast list with len=len(pb) + self.m_ballast = np.zeros(len(self.pb)) # make an empty m_ballast list with len=len(pb) for i in range(len(self.pb)): # for each ballast density for j in range(len(mballast)): # loop through each ballast mass if float(pballast[j]) == float(self.pb[i]): # but only if the index of the ballast mass (density) matches the value of pb - self.mballast[i] += mballast[j] # add that ballast mass to the correct index of mballast + self.m_ballast[i] += mballast[j] # add that ballast mass to the correct index of mballast # ----------- process key hydrostatic-related totals for use in static equilibrium solution ------------------ - - self.V = VTOT # save the total underwater volume + # save the total underwater volume rCB_TOT = Sum_V_rCB/VTOT # location of center of buoyancy on platform - self.rCB = rCB_TOT - + if VTOT==0: # if you're only working with members above the platform, like modeling the wind turbine zMeta = 0 else: zMeta = rCB_TOT[2] + IWPx_TOT/VTOT # add center of buoyancy and BM=I/v to get z elevation of metecenter [m] (have to pick one direction for IWP) - self.C_struc[3,3] = -mTOT*g*rCG_TOT[2] - self.C_struc[4,4] = -mTOT*g*rCG_TOT[2] - - self.C_struc_sub[3,3] = -self.msubstruc*g*self.rCG_sub[2] - self.C_struc_sub[4,4] = -self.msubstruc*g*self.rCG_sub[2] + self.C_struc[3,3] = -m_all*g*rCG_all[2] + self.C_struc[4,4] = -m_all*g*rCG_all[2] + + self.C_struc_sub[3,3] = -self.m_sub*g*self.rCG_sub[2] + self.C_struc_sub[4,4] = -self.m_sub*g*self.rCG_sub[2] # add relevant properties to this turbine's MoorPy Body # >>> should double check proper handling of mean weight and buoyancy forces throughout model <<< - self.body.m = mTOT - self.body.v = VTOT - self.body.rCG = rCG_TOT - self.body.AWP = AWP_TOT - self.body.rM = np.array([0,0,zMeta]) - # is there any risk of additional moments due to offset CB since MoorPy assumes CB at ref point? <<< - - - - def calcBEM(self, dw=0, wMax=0, wInf=10.0, dz=0, da=0, meshDir=os.path.join(os.getcwd(),'BEM')): + if self.body: # note: this is likely unused now <<< + self.body.m = m_all + self.body.v = VTOT + self.body.rCG = rCG_all + self.body.AWP = AWP_TOT + self.body.rM = np.array([rCB_TOT[0], rCB_TOT[1], zMeta]) # now includes x and y coordinates for center of buoyancy + #is there any risk of additional moments due to offset CB since MoorPy assumes CB at ref point? <<< + self.rCB = rCB_TOT + self.m = m_all + self.V = VTOT + self.AWP = AWP_TOT + self.rM = np.array([rCB_TOT[0], rCB_TOT[1], zMeta]) + + # save things in a dictionary now + self.props = {} + self.props['m'] = self.m + self.props['m_sub'] = self.m_sub + self.props['v'] = self.V + self.props['rCG'] = self.rCG + self.props['rCG_sub'] = self.rCG_sub + self.props['rCB'] = self.rCB + self.props['AWP'] = self.AWP + self.props['rM'] = self.rM + self.props['Ixx'] = M_all[3,3] # principale moments of inertia of entire structure + self.props['Iyy'] = M_all[4,4] + self.props['Izz'] = M_all[5,5] + self.props['Ixx_sub'] = M_sub[3,3] # principale moments of inertia of substructure + self.props['Iyy_sub'] = M_sub[4,4] + self.props['Izz_sub'] = M_sub[5,5] + + + def calcBEM(self, dw=0, wMax=0, wInf=10.0, dz=0, da=0, headings=[0], meshDir=os.path.join(os.getcwd(),'BEM')): '''This generates a mesh for the platform and runs a BEM analysis on it using pyHAMS. It can also write adjusted .1 and .3 output files suitable for use with OpenFAST. The mesh is only made for non-interesecting members flagged with potMod=1. - + Note that this method does not consider mean offsets when calculating coefficients. + PARAMETERS ---------- dw : float @@ -381,8 +573,10 @@ def calcBEM(self, dw=0, wMax=0, wInf=10.0, dz=0, da=0, meshDir=os.path.join(os.g desired longitudinal panel size for potential flow BEM analysis (m) da : float desired azimuthal panel size for potential flow BEM analysis (m) + headings : list of floats + incident wave headings to be considered, default [0] (deg). <<<<<<<< capability still needs to be added, after adjustments to pyHAMS ''' - + # go through members to be modeled with BEM and calculated their nodes and panels lists nodes = [] panels = [] @@ -405,6 +599,8 @@ def calcBEM(self, dw=0, wMax=0, wInf=10.0, dz=0, da=0, meshDir=os.path.join(os.g # only try to save a mesh and run HAMS if some members DO have potMod=True if len(panels) > 0: + + import pyhams.pyhams as ph # import PyHAMS only if we're going to use it pnl.writeMesh(nodes, panels, oDir=os.path.join(meshDir,'Input')) # generate a mesh file in the HAMS .pnl format @@ -424,9 +620,10 @@ def calcBEM(self, dw=0, wMax=0, wInf=10.0, dz=0, da=0, meshDir=os.path.join(os.g nw_HAMS = int(np.ceil(wMax_HAMS/dw_HAMS)) # ensure the upper frequency of the HAMS analysis is large enough ph.write_control_file(meshDir, waterDepth=self.depth, incFLim=1, iFType=3, oFType=4, # inputs are in rad/s, outputs in s - numFreqs=-nw_HAMS, minFreq=dw_HAMS, dFreq=dw_HAMS) - - # Note about zero/infinite frequencies from WAMIT-formatted output files (as per WAMIT v7 manual): + numFreqs=-nw_HAMS, minFreq=dw_HAMS, dFreq=dw_HAMS, + numHeadings=len(headings), headingList=headings) #, numThreads=self.numThreads) <<< + + # Note about zero/infinite frequencies from WAMIT-formatted output files (as per WAMIT v7 manual): # The limiting values of the added-mass coefficients may be evaluated for zero or infinite # period by specifying the values PER= 0:0 and PER< 0:0, respectively. These special values are always # associated with the wave period, irrespective of the value of IPERIN and the corresponding @@ -438,19 +635,51 @@ def calcBEM(self, dw=0, wMax=0, wInf=10.0, dz=0, da=0, meshDir=os.path.join(os.g # read the HAMS WAMIT-style output files addedMass, damping, w1 = ph.read_wamit1(os.path.join(meshDir,'Output','Wamit_format','Buoy.1'), TFlag=True) # first two entries in frequency dimension are expected to be zero-frequency then infinite frequency - M, P, R, I, w3, heads = ph.read_wamit3(os.path.join(meshDir,'Output','Wamit_format','Buoy.3'), TFlag=True) - - # interpole to the frequencies RAFT is using + M, P, R, I, w3, heads = ph.read_wamit3(os.path.join(meshDir,'Output','Wamit_format','Buoy.3'), TFlag=True) + + # process headings and sort frequencies + self.BEM_headings = np.array(heads)%(360) # save headings in range of 0-360 [deg] # interpole to the frequencies RAFT is using + ''' + isort1 = np.argsort(w1) # indices that will sort the radiation results + isort3 = np.argsort(w3) # indices that will sort the diffraction results + w1 = np.take(w1, isort1) + w3 = np.take(w3, isort3) + addedMass = np.take(addedMass, isort1, axis=2) + damping = np.take(damping , isort1, axis=2) + M = np.take(M , isort3, axis=2) + P = np.take(P , isort3, axis=2) + R = np.take(R , isort3, axis=2) + I = np.take(I , isort3, axis=2) + ''' + # interpolate to RAFT model frequencies + # zero frequency values are being stacked on to give smooth results if the requested frequency is below what's available from HAMS addedMassInterp = interp1d(np.hstack([w1[2:], 0.0]), np.dstack([addedMass[:,:,2:], addedMass[:,:,0]]), assume_sorted=False, axis=2)(self.w) dampingInterp = interp1d(np.hstack([w1[2:], 0.0]), np.dstack([ damping[:,:,2:], np.zeros([6,6]) ]), assume_sorted=False, axis=2)(self.w) - fExRealInterp = interp1d(w3, R , assume_sorted=False )(self.w) - fExImagInterp = interp1d(w3, I , assume_sorted=False )(self.w) - + fExRealInterp = interp1d(np.hstack([w3, 0.0]), np.dstack([ R, np.zeros([len(heads),6]) ]), assume_sorted=False, axis=2)(self.w) + fExImagInterp = interp1d(np.hstack([w3, 0.0]), np.dstack([ I, np.zeros([len(heads),6]) ]), assume_sorted=False, axis=2)(self.w) + # note: fEx tensors are sized according to [nHeadings, 6 DOFs, frequencies] + # copy results over to the FOWT's coefficient arrays self.A_BEM = self.rho_water * addedMassInterp - self.B_BEM = self.rho_water * dampingInterp - self.X_BEM = self.rho_water * self.g * (fExRealInterp + 1j*fExImagInterp) - + self.B_BEM = self.rho_water * dampingInterp + X_BEM_temp = self.rho_water * self.g * (fExRealInterp + 1j*fExImagInterp) + + + # transform excitation coefficients so that DOFs are always relative to incident wave heading rather than global frame + self.X_BEM = np.zeros_like(X_BEM_temp) + + for ih in range(len(heads)): + sin_heading = np.sin(np.radians(heads[ih])) + cos_heading = np.cos(np.radians(heads[ih])) + + self.X_BEM[ih,0,:] = cos_heading * X_BEM_temp[ih,0,:] + sin_heading * X_BEM_temp[ih,1,:] + self.X_BEM[ih,1,:] = -sin_heading * X_BEM_temp[ih,0,:] + cos_heading * X_BEM_temp[ih,1,:] + self.X_BEM[ih,2,:] = X_BEM_temp[ih,2,:] + self.X_BEM[ih,3,:] = cos_heading * X_BEM_temp[ih,3,:] + sin_heading * X_BEM_temp[ih,4,:] + self.X_BEM[ih,4,:] = -sin_heading * X_BEM_temp[ih,3,:] + cos_heading * X_BEM_temp[ih,4,:] + self.X_BEM[ih,5,:] = X_BEM_temp[ih,5,:] + + # HAMS results error checks >>> any more we should have? <<< if np.isnan(self.A_BEM).any(): #print("NaN values detected in HAMS calculations for added mass. Check the geometry.") @@ -470,8 +699,9 @@ def calcBEM(self, dw=0, wMax=0, wInf=10.0, dz=0, da=0, meshDir=os.path.join(os.g def calcTurbineConstants(self, case, ptfm_pitch=0): - '''This computes turbine linear terms - + '''This computes turbine linear terms (excluding hydrodynamic added + mass and inertial excitation, which are handled by getHydroConstants). + case dictionary of case information ptfm_pitch @@ -480,90 +710,129 @@ def calcTurbineConstants(self, case, ptfm_pitch=0): ''' #self.rotor.runCCBlade(case['wind_speed'], ptfm_pitch=ptfm_pitch, yaw_misalign=case['yaw_misalign']) + #print(case) + turbine_heading = getFromDict(case, 'turbine_heading', shape=0, dtype = float, default=0.0) # [deg] + turbine_status = getFromDict(case, 'turbine_status', shape=0, dtype=str, default='operating') # initialize arrays (can remain zero if aerodynamics are disabled) self.A_aero = np.zeros([6,6,self.nw,self.nrotors]) # frequency-dependent aero-servo added mass matrix self.B_aero = np.zeros([6,6,self.nw,self.nrotors]) # frequency-dependent aero-servo damping matrix - self.F_aero = np.zeros([6, self.nw,self.nrotors], dtype=complex) # dynamice excitation force and moment amplitude spectra - self.F_aero0 = np.zeros([6, self.nrotors]) # mean aerodynamic forces and moments - - for t in range(self.nrotors): - # only compute the aerodynamics if enabled and windspeed is nonzero - if self.rotorList[t].aeroServoMod > 0 and case['wind_speed'] > 0.0: - - F_aero0, f_aero, a_aero, b_aero = self.rotorList[t].calcAeroServoContributions(case, ptfm_pitch=ptfm_pitch, display=2) # get values about hub - - # hub reference frame relative to PRP <<<<<<<<<<<<<<<<< - rHub = np.array([self.rotorList[t].coords[0], self.rotorList[t].coords[1], self.hHub[t]]) - #rotMatHub = rotationMatrix(0, 0.01, 0) - - # convert coefficients to platform reference frame - for i in range(self.nw): - self.A_aero[:,:,i,t] = translateMatrix3to6DOF( np.diag([a_aero[i], 0, 0]), rHub) - self.B_aero[:,:,i,t] = translateMatrix3to6DOF( np.diag([b_aero[i], 0, 0]), rHub) - #self.C_aero = translateMatrix6to6DOF( rotateMatrix6(C_aero, rotMatHub), rHub) - - # convert forces to platform reference frame - self.F_aero0[:,t] = transformForce(F_aero0, offset=rHub) # mean forces and moments - - for iw in range(self.nw): - #self.F_aero[:,iw] = transformForce(F_aero[:,iw], offset=rHub, orientation=rotMatHub) - self.F_aero[:,iw,t] = translateForce3to6DOF(np.array([f_aero[iw], 0, 0]), rHub) + self.f_aero = np.zeros([6, self.nw,self.nrotors], dtype=complex) # dynamice excitation force and moment amplitude spectra + self.f_aero0 = np.zeros([6, self.nrotors]) # mean aerodynamic forces and moments + #todo: reorder above so that w is last index <<< + + self.B_gyro = np.zeros([6,6,self.nrotors]) # rotor gyroscopic damping matrix + + if turbine_status == 'operating': + + for ir in range(self.nrotors): + # only compute the aerodynamics if enabled and windspeed is nonzero + + if self.rotorList[ir].Zhub < 0: + current = True + speed = getFromDict(case, 'current_speed', shape=0, default=1.0) + else: + current = False + speed = getFromDict(case, 'wind_speed', shape=0, default=10.0) + + if self.rotorList[ir].aeroServoMod > 0 and speed > 0.0: + + # Get mean aero forces and fore-aft coefficients + # Note: these are about hub coordinate in global orientation. + f_aero0, f_aero, a_aero, b_aero = self.rotorList[ir].calcAero(case, current=current) # get values about hub + + # hub reference frame relative to PRP <<<<<<<<<<<<<<<<< + rHub = self.rotorList[ir].rHub # TODO: change the loop to use enumerate to streamline this section, and add mean position support <<< + + # convert coefficients to platform reference frame and populate tensor slice for this rotor + for iw in range(self.nw): + self.A_aero[:,:,iw,ir] = translateMatrix6to6DOF(a_aero[:,:,iw], rHub) + self.B_aero[:,:,iw,ir] = translateMatrix6to6DOF(b_aero[:,:,iw], rHub) + + # convert forces to platform reference frame + self.f_aero0[:,ir] = transformForce(f_aero0, offset=rHub) # mean forces and moments + + for iw in range(self.nw): + self.f_aero[:,iw,ir] = transformForce(f_aero[:,iw], offset=rHub) # excitation + + # calculate cavitation of the rotor (platform motions should already be accounted for in the CCBlade object after running calcAero) + # if rotor is submerged... + # cav = self.rotorList[ir].calcCavitation(case) # TO-DO: wire this to be a result/output, then uncomment <<< + + # ----- calculate rotor gyroscopic effects ----- + # rotor speed [rpm] + Omega_rpm = np.interp(speed, self.rotorList[ir].Uhub, self.rotorList[ir].Omega_rpm) + + rotMat = RotFrm2Vect(np.array([1,0,0]), self.rotorList[ir].q) # rotation matrix from global to rotor axis + Omega_rotor = np.matmul(rotMat, [Omega_rpm*2*np.pi/60, 0, 0]) # rotor angular velocity vector + + # rotating inertia vector [kg-m^2 * rad/s = N-m-s] + IO_rotor = self.rotorList[ir].I_drivetrain * Omega_rotor + + GyroDampingMatrix = getH(IO_rotor) + + self.B_gyro[3:, 3:, ir] = GyroDampingMatrix + + # note, gyroscopic effect is purely rotational so no translation adjustment needed + else: + print(f"Warning: turbine status is '{turbine_status}' so rotor fluid loads are neglected.") - def calcHydroConstants(self, case): - '''This computes the linear strip-theory-hydrodynamics terms, including wave excitation for a specific case.''' - # set up sea state + def calcHydroConstants(self): + '''Compute FOWT hydrodynamic added mass matrix and member-level + inertial excitation coefficients.''' - self.beta = case['wave_heading'] - - # make wave spectrum - if case['wave_spectrum'] == 'unit': - self.zeta = np.tile(1, self.nw) - S = np.tile(1, self.nw) - elif case['wave_spectrum'] == 'JONSWAP': - S = JONSWAP(self.w, case['wave_height'], case['wave_period']) - self.zeta = np.sqrt(S) # wave elevation amplitudes (these are easiest to use) - elif case['wave_spectrum'] in ['none','still']: - self.zeta = np.zeros(self.nw) - S = np.zeros(self.nw) - else: - raise ValueError(f"Wave spectrum input '{case['wave_spectrum']}' not recognized.") rho = self.rho_water g = self.g - - #print(f"significant wave height: {4*np.sqrt(np.sum(S)*self.dw):5.2f} = {4*getRMS(self.zeta, self.dw):5.2f}") # << temporary <<< - - # TODO: consider current and viscous drift - - # ----- calculate potential-flow wave excitation force ----- - - self.F_BEM = self.X_BEM * self.zeta # wave excitation force (will be zero if HAMS wasn't run) - + # --------------------- get constant hydrodynamic values along each member ----------------------------- self.A_hydro_morison = np.zeros([6,6]) # hydrodynamic added mass matrix, from only Morison equation [kg, kg-m, kg-m^2] - self.F_hydro_iner = np.zeros([6,self.nw],dtype=complex) # inertia excitation force/moment complex amplitudes vector [N, N-m] # loop through each member - for mem in self.memberList: + + for i,mem in enumerate(self.memberList): + ''' circ = mem.shape=='circular' # convenience boolian for circular vs. rectangular cross sections -# print(mem.name) + + # find the proper member node positions (mem.r) if this memberList is a bladeMemberList for underwater rotors. Otherwise, skip + if mem.type==3 and Rotor is not None: + + # save specific rotor variables and original positions of the blade member nodes + rotor = Rotor + rOG = [mem.rA0, mem.rB0] + + # (without making any changes to the rest of the hydrodynamics calculations below) + # the input memberList is the rotor.bladeMemberList multiplied by nBlades (e.g. if len(rotor.bladeMemberList)=10, then this len(memberList)=30 for 3 blade rotor) + # adjust the heading/orientation of the each section of blade members by the corresponding heading in rotor.headings based on where in the list you are + j = i // int(len(memberList)/rotor.nBlades) # i (from 0 to 30) // 10, which results in either j = 1, 2, or 3, for each blade heading + + # find the end nodes of the blade member about the global coordinates (e.g,, if rA_OG = [0,0,0] and rB_OG=[0,1,0], and heading=90, then rA=[0,0,0] and rB=[0,0,1]) + rUpdated = rotor.getBladeMemberPositions(rotor.headings[j], rOG) + mem.rA0 = rUpdated[0] + mem.rB0 = rUpdated[-1] + + # apply a blade pitch angle to every blade member if applicable + mem.gamma = mem.gamma + dgamma + + # run calcOrientation to ensure the p1 and p2 axes of the members are oriented the way they should be + mem.setPosition() + + # >>>>>>> TODO (for added mass of underwater rotors) <<<<<<<<<< + # - Do we need to adjust any other methods in raft_fowt to account for added mass? + # - Do we need to make any changes to the pyHAMS code to account for rotor added mass? + # - How should we adjust the inclusion of member end effects of added mass knowing blade members are attached on ends to each other? + # loop through each node of the member for il in range(mem.ns): -# print(il) # only process hydrodynamics if this node is submerged if mem.r[il,2] < 0: -# print("underwater") - - # get wave kinematics spectra given a certain wave spectrum and location - mem.u[il,:,:], mem.ud[il,:,:], mem.pDyn[il,:] = getWaveKin(self.zeta, self.beta, self.w, self.k, self.depth, mem.r[il,:], self.nw) - + # only compute inertial loads and added mass for members that aren't modeled with potential flow if mem.potMod==False: @@ -574,7 +843,7 @@ def calcHydroConstants(self, case): Ca_End = np.interp( mem.ls[il], mem.stations, mem.Ca_End) - # ----- compute side effects --------------------------------------------------------- + # ----- compute side effects (transverse only) ----- if circ: v_i = 0.25*np.pi*mem.ds[il]**2*mem.dls[il] @@ -583,25 +852,13 @@ def calcHydroConstants(self, case): if mem.r[il,2] + 0.5*mem.dls[il] > 0: # if member extends out of water # <<< may want a better appraoch for this... v_i = v_i * (0.5*mem.dls[il] - mem.r[il,2]) / mem.dls[il] # scale volume by the portion that is under water - - + # added mass (axial term explicitly excluded here - we aren't dealing with chains) - Amat = rho*v_i *( Ca_p1*mem.p1Mat + Ca_p2*mem.p2Mat ) # local added mass matrix - #Amat = rho*v_i *( Ca_q*mem.qMat + Ca_p1*mem.p1Mat + Ca_p2*mem.p2Mat ) # local added mass matrix -# print(f"Member side added mass diagonals are {Amat[0,0]:6.2e} {Amat[1,1]:6.2e} {Amat[2,2]:6.2e}") - - self.A_hydro_morison += translateMatrix3to6DOF(Amat, mem.r[il,:]) # add to global added mass matrix for Morison members - + Amat_sides = rho*v_i *( Ca_p1*mem.p1Mat + Ca_p2*mem.p2Mat ) # local added mass matrix + # inertial excitation - Froude-Krylov (axial term explicitly excluded here - we aren't dealing with chains) - Imat = rho*v_i *( (1.+Ca_p1)*mem.p1Mat + (1.+Ca_p2)*mem.p2Mat ) # local inertial excitation matrix (note: the 1 is the Cp, dynamic pressure, term) - #Imat = rho*v_i *( (1.+Ca_q)*mem.qMat + (1.+Ca_p1)*mem.p1Mat + (1.+Ca_p2)*mem.p2Mat ) # local inertial excitation matrix - - for i in range(self.nw): # for each wave frequency... - - mem.F_exc_iner[il,:,i] = np.matmul(Imat, mem.ud[il,:,i]) # add to global excitation vector (frequency dependent) - - self.F_hydro_iner[:,i] += translateForce3to6DOF(mem.F_exc_iner[il,:,i], mem.r[il,:]) # add to global excitation vector (frequency dependent) - + Imat_sides = rho*v_i *( (1.+Ca_p1)*mem.p1Mat + (1.+Ca_p2)*mem.p2Mat ) # local inertial excitation matrix (note: the 1 is the Cp, dynamic pressure, term) + # ----- add axial/end effects for added mass, and excitation including dynamic pressure ------ # note : v_a and a_i work out to zero for non-tapered sections or non-end sections @@ -615,33 +872,242 @@ def calcHydroConstants(self, case): # >>> should support different coefficients or reference volumes for rectangular cross sections <<< # added mass - AmatE = rho*v_i * Ca_End*mem.qMat # local added mass matrix -# print(f"Member END added mass diagonals are {AmatE[0,0]:6.2e} {AmatE[1,1]:6.2e} {AmatE[2,2]:6.2e}") - - self.A_hydro_morison += translateMatrix3to6DOF(AmatE, mem.r[il,:]) # add to global added mass matrix for Morison members - + Amat_end = rho*v_i * Ca_End*mem.qMat # local added mass matrix + # inertial excitation - ImatE = rho*v_i * Ca_End*mem.qMat # local inertial excitation matrix (note, there is no 1 added to Ca_End because dynamic pressure is handled separately) - #ImatE = rho*v_i * (1+Ca_End)*mem.qMat # local inertial excitation matrix + Imat_end = rho*v_i * Ca_End*mem.qMat # local inertial excitation matrix (note, there is no 1 added to Ca_End because dynamic pressure is handled separately) + + + # ----- sum up side and end added mass and inertial excitation coefficient matrices ------ + mem.Amat[il,:,:] = Amat_sides + Amat_end + mem.Imat[il,:,:] = Imat_sides + Imat_end + mem.a_i[il] = a_i + + + # add to global added mass matrix for Morison members, which considers the mean offsets and is relative to the RPP with global orientation + self.A_hydro_morison += translateMatrix3to6DOF(mem.Amat[il,:,:], mem.r[il,:] - self.r6[:3]) + + + # reset the member.r variable if underwater blade members were used + if mem.type==3 and Rotor is not None: + mem.rA0 = rOG[0] + mem.rB0 = rOG[-1] + ''' + # get member added mass matrix about PRP (also saves each member's inertial excitation coefficients) + A_hydro_i = mem.calcHydroConstants(r_ref=self.r6[:3]) + + self.A_hydro_morison += A_hydro_i # add to FOWT added mass matrix + + + # ----- Get hydrodynamic contributions from any underwater rotors ------ + for i, rot in enumerate(self.rotorList): + + # compute rotor hydro added mass/inertia properties + A_hydro_i, I_hydro_i = rot.calcHydroConstants(rho=self.rho_water, g=self.g) + + # make relative to PRP and add to system added mass matrix + self.A_hydro_morison += translateMatrix6to6DOF(A_hydro_i, rot.r3-self.r6[:3]) + + + def calcHydroExcitation(self, case, memberList=[], dgamma=0): + '''This computes the wave kinematics and linear excitation for a given case. + It calculates and F_BEM and F_hydro_iner, each with dimensions [wave headings, DOFs, frequencies]. + ''' + + # ----- set up sea state ----- + + # JvS made support for a second set of case wave info for a different heading. Instead, to generalize, + # we will allow the case wave entries to be lists, with size nHeadings. + + if np.isscalar(case['wave_heading']): # deal with the typical case of just one set of waves specified + self.nWaves = 1 + else: + self.nWaves = len(case['wave_heading']) + + # ensure our inputs are all arrays and of size nWaves (any scalar inputs will be tiled) + case['wave_heading'] = getFromDict(case, 'wave_heading' , shape=self.nWaves, dtype=float, default=0) + case['wave_spectrum']= getFromDict(case, 'wave_spectrum' , shape=self.nWaves, dtype=str, default='JONSWAP') + case['wave_period'] = getFromDict(case, 'wave_period' , shape=self.nWaves, dtype=float) + case['wave_height'] = getFromDict(case, 'wave_height' , shape=self.nWaves, dtype=float) + case['wave_gamma'] = getFromDict(case, 'wave_gamma' , shape=self.nWaves, dtype=float, default=0) + + + self.beta = case['wave_heading'] # [rad] array of wave headings + self.zeta = np.zeros([self.nWaves,self.nw], dtype=complex) + + # make wave spectrum for each heading + # We are actually losing the phase by computing the 2nd order hydrodynamic forces this way, as the amplitudes will always be real + self.Fhydro_2nd = np.zeros([self.nWaves, self.nDOF, self.nw], dtype=complex) + self.Fhydro_2nd_mean = np.zeros([self.nWaves, self.nDOF]) + for ih in range(self.nWaves): + if case['wave_spectrum'][ih] == 'unit': + #self.zeta[ih,:] = np.tile(1, self.nw) + S = np.tile(1, self.nw) + self.zeta[ih,:] = np.sqrt(2*S*self.dw) + elif case['wave_spectrum'][ih] == 'JONSWAP': + S = JONSWAP(self.w, case['wave_height'][ih], case['wave_period'][ih], Gamma=case['wave_gamma'][ih]) + self.zeta[ih,:] = np.sqrt(2*S*self.dw) # wave elevation amplitudes (these are easiest to use) + elif case['wave_spectrum'][ih] in ['none','still']: + self.zeta[ih,:] = np.zeros(self.nw) + S = np.zeros(self.nw) + else: + raise ValueError(f"Wave spectrum input '{case['wave_spectrum'][ih]}' not recognized.") + + if self.secondOrderWaveMod == 1: + self.Fhydro_2nd_mean[ih, :], self.Fhydro_2nd[ih, :, :] = self.calcHydroForce_2ndOrd(case['wave_heading'][ih], S) + - for i in range(self.nw): # for each wave frequency... + #print(f"significant wave height: {4*np.sqrt(np.sum(S)*self.dw):5.2f} = {4*getRMS(self.zeta, self.dw):5.2f}") # << temporary <<< - #F_exc_iner_temp = np.matmul(ImatE, mem.ud[il,:,i]) # local inertial excitation force complex amplitude in x,y,z - mem.F_exc_a[il,:,i] = np.matmul(ImatE, mem.ud[il,:,i]) # local inertial excitation force complex amplitude in x,y,z + # TODO: consider current and viscous drift <<< + + # resize members' wave kinematics arrays for this case's sea states + for i,mem in enumerate(memberList): + mem.u = np.zeros([self.nWaves, mem.ns, 3, self.nw], dtype=complex) + mem.ud = np.zeros([self.nWaves, mem.ns, 3, self.nw], dtype=complex) + mem.pDyn = np.zeros([self.nWaves, mem.ns, self.nw], dtype=complex) + + # also set up wave kinematics arrays for the rotors + for i,rot in enumerate(self.rotorList): + rot.u = np.zeros([self.nWaves, 3, self.nw], dtype=complex) + rot.ud = np.zeros([self.nWaves, 3, self.nw], dtype=complex) + rot.pDyn = np.zeros([self.nWaves, self.nw], dtype=complex) + + # ----- calculate potential-flow wave excitation force ----- - # >>> may want to add a separate dynamic pressure input <<< - mem.F_exc_p[il,:,i] = mem.pDyn[il,i]*a_i *mem.q # add dynamic pressure - positive with q if end A - determined by sign of a_i - #F_exc_iner_temp += mem.pDyn[il,i]*a_i *mem.q # add dynamic pressure - positive with q if end A - determined by sign of a_i + self.F_BEM = np.zeros([self.nWaves,6,self.nw], dtype=complex) + self.F_hydro_iner = np.zeros([self.nWaves, 6, self.nw],dtype=complex) # inertia excitation force/moment complex amplitudes vector [N, N-m] + + # BEM-based wave excitation force on platform for each wave heading (will be zero if HAMS isn't run). This includes heading interpolation. + if self.potMod: + + for ih in range(self.nWaves): + + # phase offset due to FOWT position in array + phase_offset = np.exp(-1j*self.k* ( self.x_ref*np.cos(case['wave_heading'][ih]) + + self.y_ref*np.sin(case['wave_heading'][ih]) ) ) + + beta = np.degrees(self.beta[ih])%360 # heading in range of 0-360 [deg] + + headings = self.BEM_headings # the headings of the available BEM data [deg] + nhs = len(headings) + # find interpolation indices and factors, of format y* = y[iout[0]]*fout[0] + y[iout[1]]*fout[1] + + # this code needs checking! + if (beta <= headings[0]): # when wave heading (beta) is before first BEM heading + hlast = headings[-1] - 360 # make the last BEM heading negative so that it's before beta + i1 = nhs-1 + i2 = 0 + f2 = (beta - hlast)/( headings[0] - hlast ) + + elif (beta >= headings[nhs-1]): # when wave heading (beta) is after last BEM heading + hfirst = headings[0] + 360 # make the fisrt BEM heading positive so that it's after beta + i1 = nhs-1 + i2 = 0 + f2 = (beta - headings[-1])/( hfirst - headings[-1] ) + + else: # normal case + for i in range(nhs-1): + if (headings[i+1] > beta): + i1 = i + i2 = i+1 + f2 = (beta - headings[i] )/( headings[i+1] - headings[i] ) + break + + f1 = 1.0 - f2 + + # interpolate excitation coefficients + X_prime = self.X_BEM[i1,:,:]*f1 + self.X_BEM[i2,:,:]*f2 # excitation coefficients (relative to wave direction) + + #self.beta[ih], self.BEM_headings, self.X_BEM[, period=360) * + + # rotate back to global frame + sin_beta = np.sin(self.beta[ih]) # check that I'm right in assuming HAMS outputs degrees + cos_beta = np.cos(self.beta[ih]) + + self.X_BEM[ih,0,:] = X_prime[0,:]*cos_beta - X_prime[1,:]*sin_beta + self.X_BEM[ih,1,:] = X_prime[0,:]*sin_beta + X_prime[1,:]*cos_beta + self.X_BEM[ih,2,:] = X_prime[2,:] + self.X_BEM[ih,3,:] = X_prime[3,:]*cos_beta - X_prime[4,:]*sin_beta + self.X_BEM[ih,4,:] = X_prime[3,:]*sin_beta + X_prime[4,:]*cos_beta + self.X_BEM[ih,5,:] = X_prime[5,:] + + # multiply excitation coefficients by wave elevation to get excitation forces and moments for this wave heading + self.F_BEM[ih,:,:] = self.X_BEM[ih,:,:] * self.zeta[ih,:] * phase_offset + + + # ----- strip-theory wave excitation force ----- + # loop through each member to compute strip-theory contributions + for i,mem in enumerate(memberList): + + circ = mem.shape=='circular' # convenience boolian for circular vs. rectangular cross sections - F_exc_iner_temp = mem.F_exc_a[il,:,i] + mem.F_exc_p[il,:,i] - mem.F_exc_iner[il,:,i] += F_exc_iner_temp # add to stored member force vector - self.F_hydro_iner[:,i] += translateForce3to6DOF(F_exc_iner_temp, mem.r[il,:]) # add to global excitation vector (frequency dependent) + # loop through each node of the member + for il in range(mem.ns): + + # only process hydrodynamics if this node is submerged + if mem.r[il,2] < 0: + # get wave kinematics spectra given a certain wave spectrum and location + # for each wave direction, calculate this node's frequency-dependent wave velocity, acceleration, and dynamic presure + for ih in range(self.nWaves): + mem.u[ih,il,:,:], mem.ud[ih,il,:,:], mem.pDyn[ih,il,:] = getWaveKin(self.zeta[ih,:], self.beta[ih], + self.w, self.k, self.depth, mem.r[il,:], self.nw) + # Note: the above wave kinematics account for phasing due to the FOWT's mean offset position in the array + + # now sum across wave headings and store these values - not accurate for multidirectional, + # but versatile if we want to visualize something. <<< not currently used + #mem.u[ il,:,:] = np.sum(u , axis=0) + #mem.ud[il,:,:] = np.sum(ud , axis=0) + #mem.pDyn[il,:] = np.sum(pDyn, axis=0) + + + # calculate the linear excitation forces on this node for each wave heading and frequency + for ih in range(self.nWaves): + for i in range(self.nw): + + # add dynamic pressure - positive with q if end A - determined by sign of a_i + F_exc_iner_temp = np.matmul(mem.Imat[il,:,:], mem.ud[ih,il,:,i]) + mem.pDyn[ih,il,i]*mem.a_i[il]*mem.q + + # add the excitation complex amplitude for this heading and frequency to the global excitation vector + self.F_hydro_iner[ih,:,i] += translateForce3to6DOF(F_exc_iner_temp, mem.r[il,:] - self.r6[:3]) # (about PRP) + + + # ----- inertial excitation on rotor(s) ----- + + for i, rot in enumerate(self.rotorList): + if rot.Zhub < 0: # if submerged + + # get wave kinematics spectra given a certain wave spectrum and location + # for each wave direction, calculate the hub wave kinematics + for ih in range(self.nWaves): + rot.u[ih,:,:], rot.ud[ih,:,:], rot.pDyn[ih,:] = getWaveKin(self.zeta[ih,:], self.beta[ih], + self.w, self.k, self.depth, rot.r3, self.nw) + # Note: the above wave kinematics account for phasing due to the FOWT's mean offset position in the array + + # Rotate rotor inertial excitation matrix to align with global + #angles = self.r6[3:] + np.array([0, np.atan2(rot.axis[2], rot.axis[0]), + # np.atan2(rot.axis[1], rot.axis[0])]) + #Rmat = rotationMatrix(*angles) # rotation matrix for rotor+fowt orientation + Rmat = RotFrm2Vect( np.array([1,0,0]), rot.q) + I_hydro = rotateMatrix6(rot.I_hydro, Rmat) # Should check. Only first 3 columns of I_hydro have meaning. + + # compute force across frequency range + for i in range(self.nw): + f3 = np.matmul( I_hydro[:3,:3], rot.ud[ih,:,i] ) # Forces due to acceleration + f6 = translateForce3to6DOF(f3, rot.r3 - self.r6[:3]) # Translate to about PRP (induces some moments) + f6[3:] += np.matmul( I_hydro[3:,:3], rot.ud[ih,:,i] ) # Add moments due to acceleration + self.F_hydro_iner[ih,:,i] += f6 + - def calcLinearizedTerms(self, Xi): - '''The FOWT's dynamics solve iteration method. This calculates the amplitude-dependent linearized coefficients. + def calcHydroLinearization(self, Xi): + '''The FOWT's dynamics solve iteration method. This calculates the amplitude-dependent + linearized coefficients, including the system linearized drag damping matrix. For the + drag-based excitation, call calcDragExcitation after this method. + + Currently hard-coded to only consider the first seastate/heading. Xi : complex array system response (just for this FOWT) - displacement and rotation complex amplitudes [m, rad] @@ -657,6 +1123,7 @@ def calcLinearizedTerms(self, Xi): F_hydro_drag = np.zeros([6,self.nw],dtype=complex) # excitation force/moment complex amplitudes vector [N, N-m] + ih = 0 # we will only consider the first sea state in this linearization process # loop through each member for mem in self.memberList: @@ -666,9 +1133,9 @@ def calcLinearizedTerms(self, Xi): # loop through each node of the member for il in range(mem.ns): + # get node complex velocity spectrum based on platform motion's and relative position from PRP # node displacement, velocity, and acceleration (each [3 x nw]) - drnode, vnode, anode = getVelocity(mem.r[il,:], Xi, self.w) # get node complex velocity spectrum based on platform motion's and relative position from PRP - + drnode, vnode, anode = getKinematics(mem.r[il,:], Xi, self.w) # only process hydrodynamics if this node is submerged if mem.r[il,2] < 0: @@ -688,37 +1155,28 @@ def calcLinearizedTerms(self, Xi): a_i_p2 = mem.ds[il]*mem.dls[il] if circ else mem.ds[il,1] *mem.dls[il] # water relative velocity over node (complex amplitude spectrum) [3 x nw] - vrel = mem.u[il,:] - vnode + vrel = mem.u[ih,il,:] - vnode # break out velocity components in each direction relative to member orientation [nw] - vrel_q = vrel*mem.q[ :,None] # (the ,None is for broadcasting q across all frequencies in vrel) - vrel_p1 = vrel*mem.p1[:,None] - vrel_p2 = vrel*mem.p2[:,None] - + vrel_q = np.sum(vrel*mem.q[ :,None], axis=0)*mem.q[ :,None] # (the ,None is for broadcasting q across all frequencies in vrel) + vrel_p1 = np.sum(vrel*mem.p1[:,None], axis=0)*mem.p1[:,None] + vrel_p2 = np.sum(vrel*mem.p2[:,None], axis=0)*mem.p2[:,None] + # get RMS of relative velocity component magnitudes (real-valued) - vRMS_q = getRMS(vrel_q , self.dw) - vRMS_p1 = getRMS(vrel_p1, self.dw) - vRMS_p2 = getRMS(vrel_p2, self.dw) - - #print(f" {vRMS_q:5.2f} {vRMS_p1:5.2f} {vRMS_p2:5.2f}") - + vRMS_q = getRMS(vrel_q) + vRMS_p1 = getRMS(vrel_p1) + vRMS_p2 = getRMS(vrel_p2) + # linearized damping coefficients in each direction relative to member orientation [not explicitly frequency dependent...] (this goes into damping matrix) Bprime_q = np.sqrt(8/np.pi) * vRMS_q * 0.5*rho * a_i_q * Cd_q Bprime_p1 = np.sqrt(8/np.pi) * vRMS_p1 * 0.5*rho * a_i_p1 * Cd_p1 Bprime_p2 = np.sqrt(8/np.pi) * vRMS_p2 * 0.5*rho * a_i_p2 * Cd_p2 - Bmat = Bprime_q*mem.qMat + Bprime_p1*mem.p1Mat + Bprime_p2*mem.p2Mat # damping matrix for the node based on linearized drag coefficients - - B_hydro_drag += translateMatrix3to6DOF(Bmat, mem.r[il,:]) # add to global damping matrix for Morison members - - for i in range(self.nw): + # form damping matrix for the node based on linearized drag coefficients + Bmat_sides = Bprime_q*mem.qMat + Bprime_p1*mem.p1Mat + Bprime_p2*mem.p2Mat - mem.F_exc_drag[il,:,i] = np.matmul(Bmat, mem.u[il,:,i]) # get local 3d drag excitation force complex amplitude for each frequency [3 x nw] - F_hydro_drag[:,i] += translateForce3to6DOF(mem.F_exc_drag[il,:,i], mem.r[il,:]) # add to global excitation vector (frequency dependent) - - - # ----- add end/axial effects for added mass, and excitation including dynamic pressure ------ + # ----- add end/axial effects for added mass, drag, and excitation including dynamic pressure ------ # note : v_a and a_i work out to zero for non-tapered sections or non-end sections # end/axial area (removing sign for use as drag) @@ -730,114 +1188,383 @@ def calcLinearizedTerms(self, Xi): Bprime_End = np.sqrt(8/np.pi)*vRMS_q*0.5*rho*a_i*Cd_End #print(f" {a_i:5.2f} {vRMS_q:5.2f} {Bprime_End:5.2f}") - Bmat = Bprime_End*mem.qMat # + # form damping matrix for the node based on linearized drag coefficients + Bmat_end = Bprime_End*mem.qMat # + + + # ----- sum up side and end damping matrices ------ + + mem.Bmat[il,:,:] = Bmat_sides + Bmat_end # store in Member object to be called later to get drag excitation for each wave heading + + B_hydro_drag += translateMatrix3to6DOF(mem.Bmat[il,:,:], mem.r[il,:] - self.r6[:3]) # add to global damping matrix for Morison members + + + # ----- calculate wave drag excitation (this may be recalculated later) ----- + + for i in range(self.nw): - B_hydro_drag += translateMatrix3to6DOF(Bmat, mem.r[il,:]) # add to global damping matrix for Morison members + mem.F_exc_drag[il,:,i] = np.matmul(mem.Bmat[il,:,:], mem.u[ih,il,:,i]) # get local 3d drag excitation force complex amplitude for each frequency [3 x nw] + F_hydro_drag[:,i] += translateForce3to6DOF(mem.F_exc_drag[il,:,i], mem.r[il,:] - self.r6[:3]) # add to global excitation vector (frequency dependent) + + ''' for i in range(self.nw): # for each wave frequency... - F_exc_drag_temp = np.matmul(Bmat, mem.u[il,:,i]) # local drag excitation force complex amplitude in x,y,z + F_exc_drag_temp = np.matmul(Bmat, mem.u[ih,il,:,i]) # local drag excitation force complex amplitude in x,y,z mem.F_exc_drag[il,:,i] += F_exc_drag_temp # add to stored member force vector F_hydro_drag[:,i] += translateForce3to6DOF(F_exc_drag_temp, mem.r[il,:]) # add to global excitation vector (frequency dependent) + ''' - - # save the arrays internally in case there's ever a need for the FOWT to solve it's own latest dynamics + # save the arrays internally in case there's ever a need for the FOWT to solve it's own latest dynamics or for visualization self.B_hydro_drag = B_hydro_drag self.F_hydro_drag = F_hydro_drag # return the linearized coefficients - return B_hydro_drag, F_hydro_drag + return B_hydro_drag + + + + def calcDragExcitation(self, ih): + '''Calculated linearized viscous drag excitation for a given sea state (wave heading). calcLinearizedTerms should be called first. + ih : int + index of wave case being evaluated here - def saveTurbineOutputs(self, results, case, iCase, Xi0, Xi): + ''' - # platform motions - results['surge_avg'][iCase] = Xi0[0] - results['surge_std'][iCase] = getRMS(Xi[0,:], self.dw) - results['surge_max'][iCase] = Xi0[0] + 3*results['surge_std'][iCase] - results['surge_PSD'][iCase,:] = getPSD(Xi[0,:]) - - results['sway_avg'][iCase] = Xi0[1] - results['sway_std'][iCase] = getRMS(Xi[1,:], self.dw) - results['sway_max'][iCase] = Xi0[1] + 3*results['heave_std'][iCase] - results['sway_PSD'][iCase,:] = getPSD(Xi[1,:]) - - results['heave_avg'][iCase] = Xi0[2] - results['heave_std'][iCase] = getRMS(Xi[2,:], self.dw) - results['heave_max'][iCase] = Xi0[2] + 3*results['heave_std'][iCase] - results['heave_PSD'][iCase,:] = getPSD(Xi[2,:]) - - roll_deg = rad2deg(Xi[3,:]) - results['roll_avg'][iCase] = rad2deg(Xi0[3]) - results['roll_std'][iCase] = getRMS(roll_deg, self.dw) - results['roll_max'][iCase] = rad2deg(Xi0[3]) + 3*results['roll_std'][iCase] - results['roll_PSD'][iCase,:] = getPSD(roll_deg) - - pitch_deg = rad2deg(Xi[4,:]) - results['pitch_avg'][iCase] = rad2deg(Xi0[4]) - results['pitch_std'][iCase] = getRMS(pitch_deg, self.dw) - results['pitch_max'][iCase] = rad2deg(Xi0[4]) + 3*results['pitch_std'][iCase] - results['pitch_PSD'][iCase,:] = getPSD(pitch_deg) - - yaw_deg = rad2deg(Xi[5,:]) - results['yaw_avg'][iCase] = rad2deg(Xi0[5]) - results['yaw_std'][iCase] = getRMS(yaw_deg, self.dw) - results['yaw_max'][iCase] = rad2deg(Xi0[5]) + 3*results['yaw_std'][iCase] - results['yaw_PSD'][iCase,:] = getPSD(yaw_deg) - - XiHub = np.zeros([len(Xi[0,:]), self.ntowers]) - for i in range(self.ntowers): - XiHub[:,i] = Xi[0,:] + self.hHub[i]*Xi[4,:] # hub fore-aft displacement amplitude (used as an approximation in a number of outputs) + F_hydro_drag = np.zeros([6,self.nw],dtype=complex) # excitation force/moment complex amplitudes vector [N, N-m] + + for mem in self.memberList: # loop through each member + for il in range(mem.ns): # loop through each node of the member + if mem.r[il,2] < 0: # only process hydrodynamics if this node is submerged + for i in range(self.nw): + + # get local 3d drag excitation force complex amplitude for each frequency [3 x nw] + mem.F_exc_drag[il,:,i] = np.matmul(mem.Bmat[il,:,:], mem.u[ih,il,:,i]) + + # add to global excitation vector (frequency dependent) + F_hydro_drag[:,i] += translateForce3to6DOF(mem.F_exc_drag[il,:,i], mem.r[il,:] - self.r6[:3]) - # nacelle acceleration - results['AxRNA_std'][iCase,i] = getRMS(XiHub[:,i]*self.w**2, self.dw) - results['AxRNA_PSD'][iCase,:,i] = getPSD(XiHub[:,i]*self.w**2) + self.F_hydro_drag = F_hydro_drag + + return F_hydro_drag + + + + def calcCurrentLoads(self, case): + '''method to calculate the "static" current loads on each member and save as a current force + Uses a simple power law relationship to calculate the current velocity as a function of member node depth''' + + rho = self.rho_water + g = self.g + + D_hydro = np.zeros(6) # create variable to hold the total drag force + + # extract current variables out of the case dictionary + speed = getFromDict(case, 'current_speed', shape=0, default=0.0) + heading = getFromDict(case, 'current_heading', shape=0, default=0) + + + Zref = 0.0 # reference z elevation for current profile (at the sea surface by default) (reference height set to submerged rotor hub depth if rotor is submerged) + for ti in range(self.nrotors): + if self.rotorList[ti].Zhub < 0: # If there is a submerged rotor, + Zref = self.rotorList[ti].Zhub # use it for the reference current height. + + # loop through each member + for mem in self.memberList: + + circ = mem.shape=='circular' # convenience boolian for circular vs. rectangular cross sections + + # loop through each node of the member + for il in range(mem.ns): + + # only process hydrodynamics if this node is submerged + if mem.r[il,2] < 0: + + # calculate current velocity as a function of node depth [x,y,z] (assumes no vertical current velocity) + v = speed * (((self.depth + Zref) - abs(mem.r[il,2]))/(self.depth + Zref))**self.shearExp_water + vcur = np.array([v*np.cos(np.deg2rad(heading)), v*np.sin(np.deg2rad(heading)), 0]) - # tower base bending moment + # interpolate coefficients for the current strip + Cd_q = np.interp( mem.ls[il], mem.stations, mem.Cd_q ) + Cd_p1 = np.interp( mem.ls[il], mem.stations, mem.Cd_p1 ) + Cd_p2 = np.interp( mem.ls[il], mem.stations, mem.Cd_p2 ) + Cd_End = np.interp( mem.ls[il], mem.stations, mem.Cd_End) + + # current (relative) velocity over node (no complex numbers bc not function of frequency) + vrel = np.array(vcur) + # break out velocity components in each direction relative to member orientation + vrel_q = np.sum(vrel*mem.q[:] )*mem.q[:] + vrel_p1 = np.sum(vrel*mem.p1[:])*mem.p1[:] + vrel_p2 = np.sum(vrel*mem.p2[:])*mem.p2[:] + + # ----- compute side effects ------------------------ + + # member acting area assigned to this node in each direction + a_i_q = np.pi*mem.ds[il]*mem.dls[il] if circ else 2*(mem.ds[il,0]+mem.ds[il,0])*mem.dls[il] + a_i_p1 = mem.ds[il]*mem.dls[il] if circ else mem.ds[il,0] *mem.dls[il] + a_i_p2 = mem.ds[il]*mem.dls[il] if circ else mem.ds[il,1] *mem.dls[il] + + # calculate drag force wrt to each orientation using simple Morison's drag equation + Dq = 0.5 * rho * a_i_q * Cd_q * np.linalg.norm(vrel_q) * vrel_q + Dp1 = 0.5 * rho * a_i_p1 * Cd_p1 * np.linalg.norm(vrel_p1) * vrel_p1 + Dp2 = 0.5 * rho * a_i_p2 * Cd_p2 * np.linalg.norm(vrel_p2) * vrel_p2 + + # ----- end/axial effects drag ------ + + # end/axial area (removing sign for use as drag) + if circ: + a_i_End = np.abs(np.pi*mem.ds[il]*mem.drs[il]) + else: + a_i_End = np.abs((mem.ds[il,0]+mem.drs[il,0])*(mem.ds[il,1]+mem.drs[il,1]) - (mem.ds[il,0]-mem.drs[il,0])*(mem.ds[il,1]-mem.drs[il,1])) + + Dq_End = 0.5 * rho * a_i_End * Cd_End * np.linalg.norm(vrel_q) * vrel_q + + # ----- sum forces and add to total mean drag load about PRP ------ + D = Dq + Dp1 + Dp2 + Dq_End # sum drag forces at node in member's local orientation frame + + D_hydro += translateForce3to6DOF(D, mem.r[il,:] - self.r6[:3]) # sum as forces and moments about PRP + + self.D_hydro = D_hydro # save hydro drag forces/moments to FOWT for later access + + return D_hydro + + + def readQTF(self, flPath): + data = np.loadtxt(flPath) + ULEN = 1 # For now, assume that ULEN = 1 + data[:,0:2] = 2.*np.pi/data[:,0:2] # Input is assumed to be as a function of wave period + + # Consider only unidirectional QTFs + if not (data[:,2] == data[:,3]).all(): + raise ValueError("Only unidirectional QTFs are supported for now.") + self.heads_2nd = np.sort(np.unique(data[:,2])) + nheads = len(self.heads_2nd) + + # Both frequency vectors should contain the same frequencies, + # but they are not necessarily the same as self.w + self.w1_2nd = np.unique(data[:,0]) + self.w2_2nd = np.unique(data[:,1]) + nw1 = len(self.w1_2nd) + nw2 = len(self.w2_2nd) + if not (self.w1_2nd==self.w2_2nd).all(): + raise ValueError("Both frequency columns in the input QTF must contain the same values.") + + self.qtf = np.zeros([nw1, nw2, nheads, self.nDOF], dtype=complex) + for row in data: + indw1, = np.where(self.w1_2nd==row[0]) # index for first frequency + indw2, = np.where(self.w2_2nd==row[1]) # index for second frequency + indhead, = np.where(self.heads_2nd==row[2]) # index for heading + indDOF = round(row[4]-1) # index for degree of freedom. Needs to be an int. -1 is due to being from 1 to 6 in the input file + + # Factor for dimensionalization (except for wave amplitudes) + factor = self.rho_water * self.g * ULEN + if indDOF >= 3: + factor *= ULEN + + self.qtf[indw1[0], indw2[0], indhead[0], indDOF] = factor*(row[7]+1j*row[8]) + + # Fill the other half of the matrix (which is equal to the conjugate of its symmetric element) + if not indw1[0] == indw2[0]: + self.qtf[indw2[0], indw1[0], indhead[0], indDOF] = factor*(row[7]-1j*row[8]) + + + # plt.matshow(np.squeeze(np.abs(self.qtf[:,:,0,0]))) + + + # Change that for a spectrum + def calcHydroForce_2ndOrd(self, beta, S0): + f = np.zeros([self.nDOF, self.nw], dtype=complex) + nw1 = len(self.w1_2nd) + + # Resample wave spectrum (the input is assumed to be in rad/s) + S = np.interp(self.w1_2nd, self.w, S0, left=0, right=0) + + # Interpolate for the wave incidence + if beta < self.heads_2nd[0]: + print(f"Warning in calcHydroForce_2ndOrd: angle {beta} is less than the minimum incidence angle in the QTF. An incidence of {self.heads_2nd[0]} will be considered for 2nd order loads.") + + if beta > self.heads_2nd[-1]: + print(f"Warning in calcHydroForce_2ndOrd: angle {beta} is more than the maximum incidence angle in the QTF. An incidence of {self.heads_2nd[-1]} will be considered for 2nd order loads.") + + if len(self.heads_2nd)==1: + qtf_interpBeta = self.qtf[:,:,0,:] + + else: + qtf_interpBeta = interp1d(self.heads_2nd, self.qtf, assume_sorted=True, axis=2, bounds_error=False, fill_value=(self.qtf[:,:,0,:], self.qtf[:,:,-1,:]))(beta) + + # The number of difference frequencies is the same as the number of frequencies, but starting from frequency mu=0. + mu = self.w1_2nd - self.w1_2nd[0] + Sf = np.zeros([self.nDOF, nw1]) # Second-order force spectrum + Sf_interp = np.zeros([self.nDOF, self.nw]) + for idof in range(0,self.nDOF): + for imu in range(0, nw1): # Loop the difference frequencies + Saux = np.zeros(nw1) + Saux[0:nw1-imu] = S[imu:] # Auxiliar wave spectrum that is dislocated in frequency. See the definition of second-order force spectrum + Qaux = np.zeros(nw1, dtype=complex) + + Qaux[0:nw1-imu] = np.diag(np.squeeze(qtf_interpBeta[:,:,idof]), -imu) # Sum only the lower half of the QTF + Sf[idof, imu] = 8 * np.sum(S*Saux*np.abs(Qaux)**2) * (self.w1_2nd[1]-self.w1_2nd[0]) + + + # Interpolate the force spectrum to the same resolution as the original wave spectrum + Sf_interp[idof, :] = np.interp(self.mu_2nd, mu, Sf[idof,:], left=0, right=0) + + # # TODO: Those lines were here for debugging. Need to delete them after this feature is fully implemented. + f = np.sqrt(2*Sf_interp*self.dw) + f_mean = np.zeros([self.nDOF]) + f_mean[:] = f[:,0] + f[:, 0:-1] = f[:, 1:] # Displace f by one frequency so that it aligns with the frequency vector + f[:, -1] = 0 + + # with open('examples/Sf_2nd.txt', 'w') as file: + # mu_interp = self.w - self.w[0] + # for w, Srow in zip(mu_interp, Sf_interp.T): + # file.write(f'{w:.5f} {Srow[0]:.5f} {Srow[1]:.5f} {Srow[2]:.5f} {Srow[3]:.5f} {Srow[4]:.5f} {Srow[5]:.5f}\n') + + # with open('examples/f_2nd.txt', 'w') as file: + # for w, frow in zip(mu_interp, f.T): + # file.write(f'{w:.5f} {frow[0]:.5f} {frow[1]:.5f} {frow[2]:.5f} {frow[3]:.5f} {frow[4]:.5f} {frow[5]:.5f}\n') + return f_mean, f + + + def saveTurbineOutputs(self, results, case): + '''Calculate and store output metrics of the FOWT response at the current load case. + Note that the FOWT offset, motions, load case info, etc. are taken from what is stored + in the FOWT object. I.e. >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + Load cases may have multiple sources of excitation (such as wind, wave, and another wave + at a different heading). Results are computed by RMS summing across these excitation sources. + ''' + + self.Xi0 = self.r6 - np.array([self.x_ref, self.y_ref,0,0,0,0]) # FOWT's mean offset vector [m, rad] + + # platform motions + results['surge_avg'] = self.Xi0[0] + results['surge_std'] = getRMS(self.Xi[:,0,:]) + results['surge_max'] = self.Xi0[0] + 3*results['surge_std'] + results['surge_PSD'] = getPSD(self.Xi[:,0,:], self.dw) + + results['sway_avg'] = self.Xi0[1] + results['sway_std'] = getRMS(self.Xi[:,1,:]) + results['sway_max'] = self.Xi0[1] + 3*results['sway_std'] + results['sway_PSD'] = getPSD(self.Xi[:,1,:], self.dw) + + results['heave_avg'] = self.Xi0[2] + results['heave_std'] = getRMS(self.Xi[:,2,:]) + results['heave_max'] = self.Xi0[2] + 3*results['heave_std'] + results['heave_PSD'] = getPSD(self.Xi[:,2,:], self.dw) + + roll_deg = rad2deg(self.Xi[:,3,:]) + results['roll_avg'] = rad2deg(self.Xi0[3]) + results['roll_std'] = getRMS(roll_deg) + results['roll_max'] = rad2deg(self.Xi0[3]) + 3*results['roll_std'] + results['roll_PSD'] = getPSD(roll_deg, self.dw) + + pitch_deg = rad2deg(self.Xi[:,4,:]) + results['pitch_avg'] = rad2deg(self.Xi0[4]) + results['pitch_std'] = getRMS(pitch_deg) + results['pitch_max'] = rad2deg(self.Xi0[4]) + 3*results['pitch_std'] + results['pitch_PSD'] = getPSD(pitch_deg, self.dw) + + yaw_deg = rad2deg(self.Xi[:,5,:]) + results['yaw_avg'] = rad2deg(self.Xi0[5]) + results['yaw_std'] = getRMS(yaw_deg) + results['yaw_max'] = rad2deg(self.Xi0[5]) + 3*results['yaw_std'] + results['yaw_PSD'] = getPSD(yaw_deg, self.dw) + + # ----- turbine-level mooring outputs (similar code as array-level) ----- + if self.ms: + nLines = len(self.ms.lineList) + T_moor_amps = np.zeros([self.nWaves+1, 2*nLines, self.nw], dtype=complex) # mooring tension amplitudes for each excitation source and line end + C_moor, J_moor = self.ms.getCoupledStiffness(lines_only=True, tensions=True) # get stiffness matrix and tension jacobian matrix + T_moor = self.ms.getTensions() # get line end mean tensions + + for ih in range(self.nWaves+1): + for iw in range(self.nw): + T_moor_amps[ih,:,iw] = np.matmul(J_moor, self.Xi[ih,:,iw]) # FFT of mooring tensions + + results['Tmoor_avg'] = T_moor + results['Tmoor_std'] = [] + results['Tmoor_max'] = [] + results['Tmoor_PSD'] = np.zeros([ self.nw, 2*nLines]) + for iT in range(2*nLines): + TRMS = getRMS(T_moor_amps[:,iT,:]) # estimated mooring line RMS tension [N] + results['Tmoor_std'].append(TRMS) + results['Tmoor_max'].append( T_moor[iT] + 3*TRMS) + results['Tmoor_PSD'][:,iT] = (getPSD(T_moor_amps[:,iT,:], self.w[0])) # PSD in N^2/(rad/s) + + # log the maximum line tensions predicted by RAFT for MoorPy use + # self.ms.saveMaxTensions(results['Tmoor_max']) + + # hub fore-aft displacement amplitude and acceleration (used as an approximation in a number of outputs) + XiHub = np.zeros([self.Xi.shape[0], self.nrotors, self.nw], dtype=complex) + results['AxRNA_std'] = [] + results['AxRNA_PSD'] = np.zeros([self.nw, self.nrotors]) + results['AxRNA_avg'] = [] + results['AxRNA_max'] = [] + + for ir in range(self.nrotors): + XiHub[:,ir,:] = self.Xi[:,0,:] + self.hHub[ir]*self.Xi[:,4,:] + + # nacelle acceleration + results['AxRNA_std'].append(getRMS(XiHub[:,ir,:]*self.w**2)) + results['AxRNA_PSD'][:,ir] = (getPSD(XiHub[:,ir,:]*self.w**2, self.dw)) + results['AxRNA_avg'].append(abs(np.sin(self.Xi0[4])*9.81)) # @Matt check this! + results['AxRNA_max'].append(results['AxRNA_avg'][ir]+3*results['AxRNA_std'][ir]) + + # tower base bending moment >>> should three-dimensionalize this <<< m_turbine = np.zeros(len(self.mtower)) zCG_turbine = np.zeros_like(m_turbine) zBase = np.zeros_like(m_turbine) hArm = np.zeros_like(m_turbine) - aCG_turbine = np.zeros([len(Xi[0,:]), self.ntowers]) + + aCG_turbine = np.zeros_like(XiHub, dtype=complex) ICG_turbine = np.zeros_like(m_turbine) - M_I = np.zeros_like(aCG_turbine) - M_w = np.zeros_like(aCG_turbine) - M_X_aero = np.zeros_like(aCG_turbine) - dynamic_moment = np.zeros_like(aCG_turbine) - dynamic_moment_RMS = np.zeros_like(aCG_turbine) - - for i in range(len(self.mtower)): - m_turbine[i] = self.mtower[i] + self.mRNA[i] # total masses of each turbine - zCG_turbine[i] = (self.rCG_tow[i][2]*self.mtower[i] # CoG of each turbine - + self.hHub[i]*self.mRNA[i])/m_turbine[i] - zBase[i] = self.memberList[self.nplatmems + i].rA[2] # tower base elevation [m] - hArm[i] = zCG_turbine[i] - zBase[i] # vertical distance from tower base to turbine CG [m] + M_I = np.zeros_like(XiHub) + M_w = np.zeros_like(XiHub) + M_X_aero = np.zeros_like(XiHub) + dynamic_moment = np.zeros_like(XiHub) + dynamic_moment_RMS = np.zeros(self.nrotors) + + results['Mbase_avg'] = [] + results['Mbase_std'] = [] + results['Mbase_PSD'] = np.zeros([self.nw, self.nrotors]) + results['Mbase_max'] = [] + for ir in range(self.nrotors): + # mass and moment arm >>> should three-dimensionalize <<< + m_turbine[ir] = self.mtower[ir] + self.mRNA[ir] # total masses of each turbine + zCG_turbine[ir] = (self.rCG_tow[ir][2]*self.mtower[ir] # CoG of each turbine + + self.hHub[ir]*self.mRNA[ir])/m_turbine[ir] + zBase[ir] = self.memberList[self.nplatmems + ir].rA[2] # tower base elevation [m] + hArm[ir] = zCG_turbine[ir] - zBase[ir] # vertical distance from tower base to turbine CG [m] - aCG_turbine[:,i] = -self.w**2 *( Xi[0,:] + zCG_turbine[i]*Xi[4,:] ) # fore-aft acceleration of turbine CG + aCG_turbine[:,ir,:] = -self.w**2 *( self.Xi[:,0,:] + zCG_turbine[ir]*self.Xi[:,4,:] ) # fore-aft acceleration of turbine CG # turbine pitch moment of inertia about CG [kg-m^2] - ICG_turbine[i] = (translateMatrix6to6DOF(self.memberList[self.nplatmems+i].M_struc, [0,0,-zCG_turbine[i]])[4,4] # tower MOI about turbine CG - + self.mRNA[i]*(self.hHub[i]-zCG_turbine[i])**2 + self.IrRNA[i] ) # RNA MOI with parallel axis theorem + ICG_turbine[ir] = (translateMatrix6to6DOF(self.memberList[self.nplatmems+ir].M_struc, [0,0,-zCG_turbine[ir]])[4,4] # tower MOI about turbine CG + + self.mRNA[ir]*(self.hHub[ir]-zCG_turbine[ir])**2 + self.IrRNA[ir] ) # RNA MOI with parallel axis theorem # moment components and summation (all complex amplitudes) - M_I[:,i] = -m_turbine[i]*aCG_turbine[:,i]*hArm[i] - ICG_turbine[i]*(-self.w**2 *Xi[4,:] ) # tower base inertial reaction moment - M_w[:,i] = m_turbine[i]*self.g * hArm[i]*Xi[4] # tower base weight moment - M_F_aero = 0.0 # <<<>> @@ -858,50 +1585,73 @@ def saveTurbineOutputs(self, results, case, iCase, Xi0, Xi): print(endnow) ''' - phi_w = np.zeros([len(self.w), self.nrotors]) - omega_w = np.zeros_like(phi_w) - torque_w = np.zeros_like(phi_w) - bPitch_w = np.zeros_like(phi_w) - - for t in range(self.nrotors): + # initialize complex amplitudes for rotor response + phi_w = np.zeros([self.nWaves+1, self.nrotors, self.nw], dtype=complex) # rotor azimuth deviation + omega_w = np.zeros([self.nWaves+1, self.nrotors, self.nw], dtype=complex) # rotor speed deviation + torque_w = np.zeros([self.nWaves+1, self.nrotors, self.nw], dtype=complex) # generator torque + bPitch_w = np.zeros([self.nWaves+1, self.nrotors, self.nw], dtype=complex) # blade pitch + + + results['omega_avg'] = [] + results['omega_std'] = [] + results['omega_max'] = [] + results['omega_PSD'] = [] + results['torque_avg'] = [] + results['torque_std'] = [] + results['torque_PSD'] = [] + results['power_avg'] = [] + results['bPitch_avg'] = [] + results['bPitch_std'] = [] + results['bPitch_PSD'] = [] + + + for ir in range(self.nrotors): + + # get inflow speed for wind or current turbine + if self.rotorList[ir].Zhub < 0: + speed = getFromDict(case, 'current_speed', shape=0, default=1.0) + else: + speed = getFromDict(case, 'wind_speed', shape=0, default=10.0) + # rotor-related outputs are only available if aerodynamics modeling is enabled - if self.rotorList[t].aeroServoMod > 1 and case['wind_speed'] > 0.0: - # rotor speed (rpm) - # spectra - phi_w[:,t] = self.rotorList[t].C * (XiHub[:,t] - self.rotorList[t].V_w / (1j *self.w)) - omega_w[:,t] = (1j *self.w) * phi_w[:,t] - - results['omega_avg'][iCase,t] = self.rotorList[t].Omega_case - results['omega_std'][iCase,t] = radps2rpm(getRMS(omega_w[t], self.dw)) - results['omega_max'][iCase,t] = results['omega_avg'][iCase,t] + 2 * results['omega_std'][iCase,t] # this and other _max values will be based on std (avg + 2 or 3 * std) (95% or 99% max) - results['omega_PSD'][iCase,t] = radps2rpm(1)**2 * getPSD(omega_w[t]) - + if self.rotorList[ir].aeroServoMod > 1 and speed > 0.0: + + # compute spectra of rotor azimuth variation, rotor speed, generator torque, and blade pitch + for ih in range(self.nWaves): + phi_w[ih,ir,:] = self.rotorList[ir].C * XiHub[ih,ir,:] + + phi_w[-1,ir,:] = self.rotorList[ir].C * (XiHub[-1,ir,:] - self.rotorList[ir].V_w / (1j *self.w)) + + # TODO + omega_w[ :,ir,:] = 1j*self.w * phi_w[:,ir,:] + torque_w[:,ir,:] = (1j*self.w * self.rotorList[ir].kp_tau + self.rotorList[ir].ki_tau ) * phi_w[:,ir,:] + bPitch_w[:,ir,:] = (1j*self.w * self.rotorList[ir].kp_beta + self.rotorList[ir].ki_beta) * phi_w[:,ir,:] + + # rotor speed (rpm) + results['omega_avg'].append(self.rotorList[ir].Omega_case) + results['omega_std'].append(radps2rpm(getRMS(omega_w[:,ir,:]))) + results['omega_max'].append(results['omega_avg'][ir] + 2 * results['omega_std'][ir]) # this and other _max values will be based on std (avg + 2 or 3 * std) (95% or 99% max) + results['omega_PSD'].append(radps2rpm(1)**2 * getPSD(omega_w[:,ir,:], self.dw)) + # generator torque (Nm) - torque_w[:,t] = (1j * self.w * self.rotorList[t].kp_tau + self.rotorList[t].ki_tau) * phi_w[:,t] - - results['torque_avg'][iCase,t] = self.rotorList[t].aero_torque / self.rotorList[t].Ng # Nm - results['torque_std'][iCase,t] = getRMS(torque_w[t], self.dw) - results['torque_PSD'][iCase,t] = getPSD(torque_w[t]) + results['torque_avg'].append(self.rotorList[ir].aero_torque / self.rotorList[ir].Ng) # Nm + results['torque_std'].append(getRMS(torque_w[:,ir,:])) + results['torque_PSD'].append(getPSD(torque_w[:,ir,:], self.dw)) # results['torque_max'][iCase] # skip, nonlinear - - + # rotor power (W) - results['power_avg'][iCase,t] = self.rotorList[t].aero_power # compute from cc-blade coeffs + results['power_avg'].append(self.rotorList[ir].aero_power) # compute from cc-blade coeffs # results['power_std'][iCase] # nonlinear near rated, covered by torque_ and omega_std # results['power_max'][iCase] # skip, nonlinear - - + # collective blade pitch (deg) - bPitch_w[:,t] = (1j * self.w * self.rotorList[t].kp_beta + self.rotorList[t].ki_beta) * phi_w[:,t] - - results['bPitch_avg'][iCase,t] = self.rotorList[t].pitch_case - results['bPitch_std'][iCase,t] = rad2deg(getRMS(bPitch_w[t], self.dw)) - results['bPitch_PSD'][iCase,t] = rad2deg(1)**2 *getPSD(bPitch_w[t]) + results['bPitch_avg'].append(self.rotorList[ir].pitch_case) + results['bPitch_std'].append(rad2deg(getRMS(bPitch_w[:,ir,:]))) + results['bPitch_PSD'].append(rad2deg(1)**2 *getPSD(bPitch_w[:,ir,:], self.dw)) # results['bPitch_max'][iCase] # skip, not something we'd consider in design - - + # wind PSD for reference - results['wind_PSD'][iCase,:] = getPSD(self.rotorList[t].V_w) # <<< need to confirm + results['wind_PSD'] = getPSD(self.rotorList[ir].V_w, self.dw) # <<< need to confirm ''' @@ -964,21 +1714,53 @@ def saveTurbineOutputs(self, results, case, iCase, Xi0, Xi): self.add_output('tower_maxMy_Mz', val=np.zeros(n_full_tow-1), units='kN*m', desc='distributed moment around tower-aligned x-axis corresponding to maximum fore-aft moment at tower base') ''' - def plot(self, ax, color='k', nodes=0, plot_rotor=True, station_plot=[], airfoils=False): + def plot(self, ax, color=None, nodes=0, plot_rotor=True, station_plot=[], airfoils=False, zorder=2): '''plots the FOWT...''' + R = rotationMatrix(self.r6[3], self.r6[4], self.r6[5]) # note: eventually Rotor could handle orientation internally <<< + + if self.ms: + self.ms.plot(ax=ax, color=color) + + if color==None: + color='k' + if plot_rotor: for rotor in self.rotorList: - coords = np.array([rotor.coords[0], rotor.coords[1], 0]) - rotor.plot(ax, r_ptfm=coords, R_ptfm=self.body.R, color=color) + coords = np.array([rotor.coords[0], rotor.coords[1], 0]) + self.r6[:3] + rotor.plot(ax, r_ptfm=coords, R_ptfm=R, color=color, airfoils=airfoils, zorder=zorder) #rotor.plot(ax, r_ptfm=self.body.r6[:3], R_ptfm=self.body.R, color=color) + ''' + for afmem in rotor.bladeMemberList: + afmem.calcOrientation() + afmem.plot(ax, r_ptfm=self.body.r6[:3], R_ptfm=self.body.R, color=color, nodes=nodes, station_plot=station_plot) + ''' + # loop through each member and plot it for mem in self.memberList: - mem.calcOrientation() # temporary + mem.setPosition() # offsets/rotations could be done in this function rather than in mem.plot <<< - mem.plot(ax, r_ptfm=self.body.r6[:3], R_ptfm=self.body.R, color=color, nodes=nodes, station_plot=station_plot) + mem.plot(ax, r_ptfm=self.r6[:3], R_ptfm=R, color=color, + nodes=nodes, station_plot=station_plot, zorder=zorder) # in future should consider ability to animate mode shapes and also to animate response at each frequency # including hydro excitation vectors stored in each member + + + def plot2d(self, ax, color=None, station_plot=[], Xuvec=[1,0,0], Yuvec=[0,0,1]): + '''plots the FOWT in 2d - only the platform and moorings so far...''' + + R = rotationMatrix(self.r6[3], self.r6[4], self.r6[5]) # note: eventually Rotor could handle orientation internally <<< + + if self.ms: + self.ms.plot2d(ax=ax, color=color, Xuvec=Xuvec, Yuvec=Yuvec) + + if color==None: + color='k' + + # loop through each member and plot it + for mem in self.memberList: + mem.setPosition() + mem.plot(ax, r_ptfm=self.r6[:3], R_ptfm=R, color=color, plot2d=True, Xuvec=Xuvec, Yuvec=Yuvec) diff --git a/RAFT/raft/raft_member.py b/RAFT/raft/raft_member.py index 1775edace..c93e878d6 100644 --- a/RAFT/raft/raft_member.py +++ b/RAFT/raft/raft_member.py @@ -4,24 +4,27 @@ from raft.helpers import * +from moorpy.helpers import transformPosition + ## This class represents linear (for now cylindrical and rectangular) components in the substructure. # It is meant to correspond to Member objects in the WEIS substructure ontology, but containing only # the properties relevant for the Level 1 frequency-domain model, as well as additional data strucutres # used during the model's operation. class Member: - def __init__(self, mi, nw, BEM=[]): + def __init__(self, mi, nw, BEM=[], heading=0): '''Initialize a Member. For now, this function accepts a space-delimited string with all member properties. PARAMETERS ---------- - min : dict + mi : dict Dictionary containing the member description data structure nw : int Number of frequencies in the analysis - used for initializing. heading : float, optional - Rotation to apply to the coordinates when setting up the member - used for circular patterns of members. + Heading rotation to apply to the coordinates when setting up the + member. Used for member arrangements or FOWT heading offsets [deg]. ''' @@ -30,8 +33,12 @@ def __init__(self, mi, nw, BEM=[]): self.name = str(mi['name']) self.type = int(mi['type']) # set the type of the member (for now, just arbitrary numbers: 0,1,2, etc.) - self.rA = np.array(mi['rA'], dtype=np.double) # [x,y,z] coordinates of lower node [m] - self.rB = np.array(mi['rB'], dtype=np.double) # [x,y,z] coordinates of upper node [m] + self.rA0 = np.array(mi['rA'], dtype=np.double) # [x,y,z] coordinates of lower node relative to PRP [m] + self.rB0 = np.array(mi['rB'], dtype=np.double) # [x,y,z] coordinates of upper node relative to PRP [m] + if (self.rA0[2] == 0 or self.rB0[2] == 0) and self.type != 3: + raise ValueError("RAFT Members cannot start or end on the waterplane") + if self.rB0[2] < self.rA0[2]: + raise ValueError(f"The z position of rA is {self.rA0[2]}, and the z position of rB is {self.rB0[2]}. RAFT Members must have their rA position below the rB position. Try changing your input design yaml rA/rB values.") shape = str(mi['shape']) # the shape of the cross section of the member as a string (the first letter should be c or r) @@ -39,28 +46,41 @@ def __init__(self, mi, nw, BEM=[]): # heading feature for rotation members about the z axis (used for rotated patterns) + ''' self.headings = getFromDict(mi, 'headings', shape=-1, default=0.0) self.heading = getFromDict(mi, 'heading', default=0.0) # rotation about z axis to apply to the member [deg] if self.heading != 0.0: c = np.cos(np.deg2rad(self.heading)) s = np.sin(np.deg2rad(self.heading)) + ''' + if heading != 0.0: + c = np.cos(np.deg2rad(heading)) + s = np.sin(np.deg2rad(heading)) rotMat = np.array([[c, -s, 0], [s, c, 0], [0, 0, 1]]) - self.rA = np.matmul(rotMat, self.rA) - self.rB = np.matmul(rotMat, self.rB) + self.rA0 = np.matmul(rotMat, self.rA0) + self.rB0 = np.matmul(rotMat, self.rB0) - rAB = self.rB-self.rA # The relative coordinates of upper node from lower node [m] - self.l = np.linalg.norm(rAB) # member length [m] + rAB = self.rB0-self.rA0 # The relative coordinates of upper node from lower node [m] + self.l = np.linalg.norm(rAB) # member length [m] - # station positions - n = len(mi['stations']) # number of stations + # ----- process station positions and other distributed inputs ----- + + # Station inputs are mapped linearly over the length of the member from + # end A to B. The inputted station list must be in increasing order. + st = np.array(mi['stations'], dtype=float) # station input values (abritrary units/scale) + n = len(st) # number of stations + if n < 2: raise ValueError("At least two stations entries must be provided") - - A = np.array(mi['stations'], dtype=float) - self.stations = (A - A[0])/(A[-1] - A[0])*self.l # calculate station positions along the member axis from 0 to l [m] - + + # ensure the stations are in ascending order (assumed to be from end A to B) + if not sorted(st) == st.tolist(): + raise ValueError(f"Member {self.name}: the station list is not in ascending order.") + + # calculate station positions along the member axis from 0 to l [m] + self.stations = (st - st[0])/(st[-1] - st[0])*self.l # shapes if shape[0].lower() == 'c': @@ -80,16 +100,38 @@ def __init__(self, mi, nw, BEM=[]): raise ValueError('The only allowable shape strings are circular and rectangular') - self.t = getFromDict(mi, 't', shape=n) # shell thickness of the nodes [m] + self.t = getFromDict(mi, 't', shape=n) # shell thickness at each station [m] + self.rho_shell = getFromDict(mi, 'rho_shell', shape=0, default=8500.) # shell mass density [kg/m^3] - self.l_fill = getFromDict(mi, 'l_fill' , shape=-1, default=0.0) # length of member (from end A to B) filled with ballast [m] - self.rho_fill = getFromDict(mi, 'rho_fill', shape=-1, default=0.0) # density of ballast in member [kg/m^3] - if isinstance(self.l_fill, np.ndarray): - if len(self.l_fill) != n-1 or len(self.rho_fill) != n-1: - raise ValueError(f"Member '{self.name}': The number of stations ({n}) should always be 1 greater than the number of ballast sections, l_fill ({len(self.l_fill)}) and rho_fill ({len(self.rho_fill)})") - - self.rho_shell = getFromDict(mi, 'rho_shell', default=8500.) # shell mass density [kg/m^3] + # ----- ballast inputs (for each section between stations) ----- + + # read the ballast fill level of each section (same units/scale as stations list) + st_fill = getFromDict(mi, 'l_fill' , shape=n-1, default=0) + + #ensure each ballast entry is valid (fill level doesn't exceed section length) + for i in range(n-1): + if st_fill[i] < 0: + raise Exception(f"Member {self.name}: ballast level in section {i+1} is negative.") + if st_fill[i] > st[i+1] - st[i]: + raise Exception(f"Member {self.name}: ballast level in section {i+1} exceeds section length." + +f" ({st_fill[i]} > {st[i+1] - st[i]}).") + + # convert ballast fill levels into length units [m] + self.l_fill = st_fill/(st[-1] - st[0])*self.l + + # density of ballast in member [kg/m^3] + rho_fill = getFromDict(mi, 'rho_fill', shape=-1, default=1025) + + if np.isscalar(rho_fill): + self.rho_fill = np.zeros(n-1) + rho_fill + else: + if len(rho_fill) == n-1: + self.rho_fill = np.array(rho_fill) + else: + raise Exception(f"Member {self.name}: the number of provided ballast densities (rho_fill) must be 1 less than the number of stations.") + + # raise ValueError(f"Member '{self.name}': The number of stations ({n}) should always be 1 greater than the number of ballast sections, l_fill ({len(self.l_fill)}) and rho_fill ({len(self.rho_fill)})") # initialize member orientation variables @@ -99,42 +141,52 @@ def __init__(self, mi, nw, BEM=[]): self.R = np.eye(3) # rotation matrix from global x,y,z to member q,p1,p2 - # store end cap and bulkhead info + # ----- end cap and bulkhead info ----- cap_stations = getFromDict(mi, 'cap_stations', shape=-1, default=[]) # station location inputs before scaling - if cap_stations == []: + if len(cap_stations) == 0: self.cap_t = [] self.cap_d_in = [] self.cap_stations = [] else: self.cap_t = getFromDict(mi, 'cap_t' , shape=cap_stations.shape[0]) # thicknesses [m] self.cap_d_in = getFromDict(mi, 'cap_d_in', shape=cap_stations.shape[0]) # inner diameter (if it isn't a solid plate) [m] - self.cap_stations = (cap_stations - A[0])/(A[-1] - A[0])*self.l # calculate station positions along the member axis from 0 to l [m] + self.cap_stations = (cap_stations - st[0])/(st[-1] - st[0])*self.l # calculate station positions along the member axis from 0 to l [m] # Drag coefficients self.Cd_q = getFromDict(mi, 'Cd_q' , shape=n, default=0.0 ) # axial drag coefficient + self.Cd_p1 = getFromDict(mi, 'Cd' , shape=n, default=0.6, index=0) # transverse1 drag coefficient + self.Cd_p2 = getFromDict(mi, 'Cd' , shape=n, default=0.6, index=1) # transverse2 drag coefficient + self.Cd_End = getFromDict(mi, 'CdEnd', shape=n, default=0.6 ) # end drag coefficient + ''' if not np.isscalar(mi['Cd']) and len(mi['Cd'])==2: # special case for rectangular members with directional coefficients self.Cd_p1 = np.tile(float(mi['Cd'][0]), [n]) self.Cd_p2 = np.tile(float(mi['Cd'][1]), [n]) else: self.Cd_p1 = getFromDict(mi, 'Cd' , shape=n, default=0.6 ) # transverse1 drag coefficient self.Cd_p2 = getFromDict(mi, 'Cd' , shape=n, default=0.6 ) # transverse2 drag coefficient - self.Cd_End = getFromDict(mi, 'CdEnd', shape=n, default=0.6 ) # end drag coefficient + ''' # Added mass coefficients self.Ca_q = getFromDict(mi, 'Ca_q' , shape=n, default=0.0 ) # axial added mass coefficient + self.Ca_p1 = getFromDict(mi, 'Ca' , shape=n, default=0.97, index=0) # transverse1 added mass coefficient + self.Ca_p2 = getFromDict(mi, 'Ca' , shape=n, default=0.97, index=1) # transverse2 added mass coefficient + self.Ca_End = getFromDict(mi, 'CaEnd', shape=n, default=0.6 ) # end added mass coefficient + ''' if not np.isscalar(mi['Ca']) and len(mi['Ca'])==2: # special case for rectangular members with directional coefficients self.Ca_p1 = np.tile(float(mi['Ca'][0]), [n]) self.Ca_p2 = np.tile(float(mi['Ca'][1]), [n]) else: self.Ca_p1 = getFromDict(mi, 'Ca' , shape=n, default=0.97) # transverse1 added mass coefficient self.Ca_p2 = getFromDict(mi, 'Ca' , shape=n, default=0.97) # transverse2 added mass coefficient - self.Ca_End = getFromDict(mi, 'CaEnd', shape=n, default=0.6 ) # end added mass coefficient + ''' + # ----- Strip theory discretization ----- # discretize into strips with a node at the midpoint of each strip (flat surfaces have dl=0) dorsl = list(self.d) if self.shape=='circular' else list(self.sl) # get a variable that is either diameter or side length pair - dlsMax = getFromDict(mi, 'dlsMax', shape=-1, default=5.0) + dlsMax = getFromDict(mi, 'dlsMax', shape=1, default=5) + # start things off with the strip for end A ls = [0.0] # list of lengths along member axis where a node is located <<< should these be midpoints instead of ends??? @@ -180,17 +232,19 @@ def __init__(self, mi, nw, BEM=[]): self.mh = np.array(m) self.r = np.zeros([self.ns,3]) # undisplaced node positions along member [m] - for i in range(self.ns): - self.r[i,:] = self.rA + (ls[i]/self.l)*rAB # locations of hydrodynamics nodes + self.r[i,:] = self.rA0 + (ls[i]/self.l)*rAB # locations of hydrodynamics nodes (will later be displaced) [m] #self.slh[i,0] = np.interp(lh[i], self.stations, self.sl1) #self.slh[i,1] = np.interp(lh[i], self.stations, self.sl2) - + + # ----- initialize arrays used later for hydro calculations ----- + self.a_i = np.zeros([self.ns]) # signed axial area vector that dynamic pressure will act on [m2] # complex frequency-dependent amplitudes of quantities at each node along member (to be filled in later) self.dr = np.zeros([self.ns,3,nw], dtype=complex) # displacement self.v = np.zeros([self.ns,3,nw], dtype=complex) # velocity self.a = np.zeros([self.ns,3,nw], dtype=complex) # acceleration + # note: wave quantities below will be the summed values if there is more than one sea state heading self.u = np.zeros([self.ns,3,nw], dtype=complex) # wave velocity self.ud = np.zeros([self.ns,3,nw], dtype=complex) # wave acceleration self.pDyn = np.zeros([self.ns, nw], dtype=complex) # dynamic pressure @@ -198,14 +252,28 @@ def __init__(self, mi, nw, BEM=[]): self.F_exc_a = np.zeros([self.ns,3,nw], dtype=complex) # component due to wave acceleration self.F_exc_p = np.zeros([self.ns,3,nw], dtype=complex) # component due to dynamic pressure self.F_exc_drag= np.zeros([self.ns,3,nw], dtype=complex) # wave excitation from linearized drag + + + # new hydro matrices that are now used? + self.Amat = np.zeros([self.ns,3,3]) + self.Bmat = np.zeros([self.ns,3,3]) + self.Imat = np.zeros([self.ns,3,3]) + def setPosition(self, r6=np.zeros(6)): + '''Calculates member pose -- node positions and vectors q, p1, and p2 + as well as member orientation matrix R based on the end positions and + twist angle gamma along with any mean displacements and rotations. + + Parameters + ---------- + r6 : array, optional + Absolute position/orientation of FOWT to which member is attached. + + ''' + # formerly calcOrientation - def calcOrientation(self): - '''Calculates member direction vectors q, p1, and p2 as well as member orientation matrix R - based on the end positions and twist angle gamma.''' - - rAB = self.rB-self.rA # displacement vector from end A to end B [m] + rAB = self.rB0-self.rA0 # vector from end A to end B, undisplaced [m] q = rAB/np.linalg.norm(rAB) # member axial unit vector beta = np.arctan2(q[1],q[0]) # member incline heading from x axis @@ -223,10 +291,31 @@ def calcOrientation(self): [ c1*s3+c2*c3*s1, c1*c3-c2*s1*s3, s1*s2], [ -c3*s2 , s2*s3 , c2 ]]) #Z1Y2Z3 from https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix - p1 = np.matmul( R, [1,0,0] ) # unit vector that is in the 'beta' plane if gamma is zero p2 = np.cross( q, p1 ) # unit vector orthogonal to both p1 and q + + # apply any platform offset and rotation to the values already obtained + #if r6: + R_platform = rotationMatrix(*r6[3:]) # rotation matrix for the platform roll, pitch, yaw + + R = np.matmul(R_platform, R) + q = np.matmul(R_platform, q) + p1 = np.matmul(R_platform, p1) + p2 = np.matmul(R_platform, p2) + + self.rA = transformPosition(self.rA0, r6) + self.rB = transformPosition(self.rB0, r6) + + #else: # no offset case + # self.rA = self.rA0 + # self.rB = self.rB0 + + # update node positions + rAB = self.rB - self.rA + for i in range(self.ns): + self.r[i,:] = self.rA + (self.ls[i]/self.l)*rAB # locations of hydrodynamics nodes (will later be displaced) [m] + # save direction vectors and matrices self.R = R self.q = q self.p1 = p1 @@ -238,15 +327,21 @@ def calcOrientation(self): self.p2Mat = VecVecTrans(self.p2) - return q, p1, p2 # also return the unit vectors for convenience - - - def getInertia(self): + def getInertia(self, rPRP=np.zeros(3)): '''Calculates member inertia properties: mass, center of mass, moments of inertia. - Assumes that the members are continuous and symmetrical (i.e. no weird shapes)''' + Properties are calculated relative to the platform reference point (PRP) in the + global orientation directions. + + Parameters + ---------- + rPRP : float array + Coordinates of the platform reference point (the first three entries of fowt.Xi0), + which the moment of inertia matrix will be calculated relative to. [m] + ''' - # Moment of Inertia Helper Functions ----------------------- + # Moment of Inertia Helper Functions (to move to helper file) <<< + def FrustumMOI(dA, dB, H, p): '''returns the radial and axial moments of inertia of a potentially tapered circular member about the end node. Previously used equations found in a HydroDyn paper, now it uses newly derived ones. Ask Stein for reference if needed''' @@ -345,7 +440,6 @@ def RectangularFrustumMOI(La, Wa, Lb, Wb, H, p): for i in range(1,len(self.stations)): # start at 1 rather than 0 because we're looking at the sections (from station i-1 to i) # initialize common variables - rA = self.rA + self.q*self.stations[i-1] # lower node position of the submember [m] l = self.stations[i]-self.stations[i-1] # length of the submember [m] if l==0.0: mass = 0 @@ -391,7 +485,6 @@ def RectangularFrustumMOI(La, Wa, Lb, Wb, H, p): mass = m_shell + m_fill # total mass of the submember [kg] hc = ((hc_fill*m_fill) + (hc_shell*m_shell))/mass # total center of mass of the submember from the submember's rA location [m] - center = rA + (self.q*hc) # total center of mass of the member from the PRP [m] # MOMENT OF INERTIA I_rad_end_outer, I_ax_outer = FrustumMOI(dA, dB, l, rho_shell) # radial and axial MoI about the end of the solid outer frustum [kg-m^2] @@ -432,7 +525,6 @@ def RectangularFrustumMOI(La, Wa, Lb, Wb, H, p): mass = m_shell + m_fill # total mass of the submember [kg] hc = ((hc_fill*m_fill) + (hc_shell*m_shell))/mass # total center of mass of the submember from the submember's rA location [m] - center = rA + (self.q*hc) # total center of mass of the member from the PRP [m] # MOMENT OF INERTIA # MoI about each axis at the bottom end node of the solid outer truncated pyramid [kg-m^2] @@ -456,7 +548,8 @@ def RectangularFrustumMOI(La, Wa, Lb, Wb, H, p): Izz_end = Izz_end_shell + Izz_end_fill Izz = Izz_end # the total MoI of the member about the z-axis is the same at any point along the z-axis - + # center of mass of the submember from the PRP in global orientation (note: some of above could streamlined out of the if/else) + center = self.rA + self.q*(self.stations[i-1] + hc) - rPRP # center of mass of the submember relative to the PRP [m] # add/append terms mass_center += mass*center # total sum of mass the center of mass of the member [kg-m] @@ -464,7 +557,7 @@ def RectangularFrustumMOI(La, Wa, Lb, Wb, H, p): self.vfill.append(v_fill) # list of ballast volumes in each submember [m^3] mfill.append(m_fill) # list of ballast masses in each submember [kg] pfill.append(rho_fill) # list of ballast densities in each submember [kg] - + # create a local submember mass matrix Mmat = np.diag([mass, mass, mass, 0, 0, 0]) # submember's mass matrix without MoI tensor # create the local submember MoI tensor in the correct directions @@ -534,15 +627,7 @@ def RectangularFrustumMOI(La, Wa, Lb, Wb, H, p): v_cap = V_outer-V_inner m_cap = v_cap*rho_cap # assume it's made out of the same material as the shell for now (can add in cap density input later if needed) hc_cap = ((hco*V_outer)-(hci*V_inner))/(V_outer-V_inner) - - pos_cap = self.rA + self.q*L # position of the referenced cap station from the PRP - if L==self.stations[0]: # if it's a bottom end cap, the position is at the bottom of the end cap - center_cap = pos_cap + self.q*hc_cap # and the CG of the cap is at hc from the bottom, so this is the simple case - elif L==self.stations[-1]: # if it's a top end cap, the position is at the top of the end cap - center_cap = pos_cap - self.q*(h - hc_cap) # and the CG of the cap goes from the top, to h below the top, to hc above h below the top (wording...sorry) - else: # if it's a middle bulkhead, the position is at the middle of the bulkhead - center_cap = pos_cap - self.q*((h/2) - hc_cap) # so the CG goes from the middle of the bulkhead, down h/2, then up hc - + I_rad_end_outer, I_ax_outer = FrustumMOI(dA, dB, h, rho_cap) I_rad_end_inner, I_ax_inner = FrustumMOI(dAi, dBi, h, rho_cap) I_rad_end = I_rad_end_outer-I_rad_end_inner @@ -600,14 +685,6 @@ def RectangularFrustumMOI(La, Wa, Lb, Wb, H, p): m_cap = v_cap*rho_cap # assume it's made out of the same material as the shell for now (can add in cap density input later if needed) hc_cap = ((hco*V_outer)-(hci*V_inner))/(V_outer-V_inner) - pos_cap = self.rA + self.q*L # position of the referenced cap station from the PRP - if L==self.stations[0]: # if it's a bottom end cap, the position is at the bottom of the end cap - center_cap = pos_cap + self.q*hc_cap # and the CG of the cap is at hc from the bottom, so this is the simple case - elif L==self.stations[-1]: # if it's a top end cap, the position is at the top of the end cap - center_cap = pos_cap - self.q*(h - hc_cap) # and the CG of the cap goes from the top, to h below the top, to hc above h below the top (wording...sorry) - else: # if it's a middle bulkhead, the position is at the middle of the bulkhead - center_cap = pos_cap - self.q*((h/2) - hc_cap) # so the CG goes from the middle of the bulkhead, down h/2, then up hc - Ixx_end_outer, Iyy_end_outer, Izz_end_outer = RectangularFrustumMOI(slA, slB, h, rho_cap) Ixx_end_inner, Iyy_end_inner, Izz_end_inner = RectangularFrustumMOI(slAi, slBi, h, rho_cap) Ixx_end = Ixx_end_outer-Ixx_end_inner @@ -618,7 +695,18 @@ def RectangularFrustumMOI(La, Wa, Lb, Wb, H, p): Izz = Izz_end + # get centerpoint of cap relative to PRP + pos_cap = self.rA + self.q*L - rPRP # position of the referenced cap station from the PRP + if L==self.stations[0]: # if it's a bottom end cap, the position is at the bottom of the end cap + center_cap = pos_cap + self.q*hc_cap # and the CG of the cap is at hc from the bottom, so this is the simple case + elif L==self.stations[-1]: # if it's a top end cap, the position is at the top of the end cap + center_cap = pos_cap - self.q*(h - hc_cap) # and the CG of the cap goes from the top, to h below the top, to hc above h below the top (wording...sorry) + else: # if it's a middle bulkhead, the position is at the middle of the bulkhead + center_cap = pos_cap - self.q*((h/2) - hc_cap) # so the CG goes from the middle of the bulkhead, down h/2, then up hc + + # ----- add properties to relevant variables ----- + mass_center += m_cap*center_cap mshell += m_cap # include end caps and bulkheads in the mass of the shell self.m_cap_list.append(m_cap) @@ -645,9 +733,18 @@ def RectangularFrustumMOI(La, Wa, Lb, Wb, H, p): - def getHydrostatics(self, rho, g): - '''Calculates member hydrostatic properties, namely buoyancy and stiffness matrix''' - + def getHydrostatics(self, rPRP=np.zeros(3), rho=1025, g=9.81): + '''Calculates member hydrostatic properties, namely buoyancy and stiffness matrix. + Properties are calculated relative to the platform reference point (PRP) in the + global orientation directions. + + Parameters + ---------- + rPRP : float array + Coordinates of the platform reference point (the first three entries of fowt.Xi0), + which the moment of inertia matrix will be calculated relative to. [m] + ''' + pi = np.pi # initialize some values that will be returned @@ -667,9 +764,11 @@ def getHydrostatics(self, rho, g): for i in range(1,n): # starting at 1 rather than 0 because we're looking at the sections (from station i-1 to i) - # calculate end locations for this segment only - rA = self.rA + self.q*self.stations[i-1] - rB = self.rA + self.q*self.stations[i ] + # calculate end locations for this segment relative to the point on + # the waterplane directly above the PRP in unrotated directions (rHS_ref) + rHS_ref = np.array([rPRP[0], rPRP[1], 0]) + rA = self.rA + self.q*self.stations[i-1] - rHS_ref + rB = self.rA + self.q*self.stations[i ] - rHS_ref # partially submerged case if rA[2]*rB[2] <= 0: # if member crosses (or touches) water plane @@ -686,9 +785,6 @@ def getHydrostatics(self, rho, g): sinBeta=np.sin(beta) tanBeta=sinBeta/cosBeta - def intrp(x, xA, xB, yA, yB): # little basic interpolation function for 2 values rather than a vector - return yA + (x-xA)*(yB-yA)/(xB-xA) - # -------------------- buoyancy and waterplane area properties ------------------------ xWP = intrp(0, rA[2], rB[2], rA[0], rB[0]) # x coordinate where member axis cross the waterplane [m] @@ -710,7 +806,7 @@ def intrp(x, xA, xB, yA, yB): # little basic interpolation function for 2 value IxWP = I_rot[0,0] IyWP = I_rot[1,1] - LWP = abs(rA[2])/cosPhi # get length of segment along member axis that is underwater [m] + LWP = abs(rA[2]/cosPhi) # get length of segment along member axis that is underwater [m] # Assumption: the areas and MoI of the waterplane are as if the member were completely vertical, i.e. it doesn't account for phi # This can be fixed later on if needed. We're using this assumption since the fix wouldn't significantly affect the outputs @@ -774,7 +870,7 @@ def intrp(x, xA, xB, yA, yB): # little basic interpolation function for 2 value elif self.shape=='rectangular': V_UWi, hc = FrustumVCV(self.sl[i-1], self.sl[i], self.stations[i]-self.stations[i-1]) - r_center = rA + self.q*hc # absolute coordinates of center of volume of this segment[m] + r_center = rA + self.q*hc # center of volume of this segment relative to PRP [m] # buoyancy force (and moment) vector Fvec += translateForce3to6DOF(np.array([0, 0, rho*g*V_UWi]), r_center) @@ -798,8 +894,130 @@ def intrp(x, xA, xB, yA, yB): # little basic interpolation function for 2 value return Fvec, Cmat, V_UW, r_center, AWP, IWP, xWP, yWP - def plot(self, ax, r_ptfm=[0,0,0], R_ptfm=[], color='k', nodes=0, station_plot=[]): - '''Draws the member on the passed axes, and optional platform offset and rotation matrix''' + def calcHydroConstants(self, r_ref=np.zeros(3), sum_inertia=False, rho=1025, g=9.81): + '''Compute the Member's linear strip-theory-hydrodynamics terms, + related to drag and added mass, which are also a precursor to + excitation. All computed quantities are in global orientations. + + Parameters + ---------- + r_ref : size-3 vector + Reference point coordinates to compute matrices about [m]. + sum_inertia : boolean, optional + Flag to calculate and return an overall inertial excitation matrix + (default False). + + Returns + ------- + A_hydro, I_hydro : 3x3 matrices + Hydrodynamic added mass and inertial excitation matrices. + ''' + + # hydrodynamic added mass matrix from strip theory [kg, kg-m, kg-m^2] + A_hydro = np.zeros([6,6]) + I_hydro = np.zeros([6,6]) + + circ = self.shape=='circular' # boolean for circular vs. rectangular + + + # loop through each node of the member + for il in range(self.ns): + + # only process hydrodynamics if this node is submerged + if self.r[il,2] < 0: + + # only compute inertial loads and added mass for members that aren't modeled with potential flow + if self.potMod==False: + + # interpolate coefficients for the current strip + Ca_q = np.interp( self.ls[il], self.stations, self.Ca_q ) + Ca_p1 = np.interp( self.ls[il], self.stations, self.Ca_p1 ) + Ca_p2 = np.interp( self.ls[il], self.stations, self.Ca_p2 ) + Ca_End = np.interp( self.ls[il], self.stations, self.Ca_End) + + + # ----- compute side effects (transverse only) ----- + + # volume assigned to this node + if circ: + v_i = 0.25*np.pi*self.ds[il]**2*self.dls[il] + else: + v_i = self.ds[il,0]*self.ds[il,1]*self.dls[il] + + if self.r[il,2] + 0.5*self.dls[il] > 0: # if member extends out of water + v_i = v_i * (0.5*self.dls[il] - self.r[il,2]) / self.dls[il] # scale volume by the portion that is under water + + # Local added mass matrix (axial term explicitly excluded here - we aren't dealing with chains) + Amat_sides = rho*v_i *( Ca_p1*self.p1Mat + Ca_p2*self.p2Mat ) + + # Local inertial excitation matrix - Froude-Krylov + # (axial term explicitly excluded here - we aren't dealing with chains) + # Note, the 1 is the Cp, dynamic pressure, term. + Imat_sides = rho*v_i *( (1.+Ca_p1)*self.p1Mat + (1.+Ca_p2)*self.p2Mat ) + + + # ----- add axial/end effects for added mass, and excitation including dynamic pressure ------ + # Note : v_a and a_i work out to zero for non-tapered sections or non-end sections + + # compute volume assigned to this end surface, and + # signed end area (positive facing down) = mean diameter of strip * radius change of strip + if circ: + v_i = np.pi/12.0 * abs( (self.ds[il]+self.drs[il])**3 + - (self.ds[il]-self.drs[il])**3 ) + a_i = np.pi*self.ds[il] * self.drs[il] + else: + v_i = np.pi/12.0 * ( (np.mean(self.ds[il]+self.drs[il]))**3 + - (np.mean(self.ds[il]-self.drs[il]))**3 ) # so far just using sphere eqn and taking mean of side lengths as d + a_i = ( (self.ds[il,0]+self.drs[il,0])*(self.ds[il,1]+self.drs[il,1]) + - (self.ds[il,0]-self.drs[il,0])*(self.ds[il,1]-self.drs[il,1])) + # >>> should support different coefficients or reference volumes for rectangular cross sections <<< + + # Local added mass matrix + Amat_end = rho*v_i * Ca_End*self.qMat + + # Local inertial excitation matrix + # Note, there is no 1 added to Ca_End because dynamic pressure is handled separately + Imat_end = rho*v_i * Ca_End*self.qMat + + + # ----- sum up side and end added mass and inertial excitation coefficient matrices ------ + self.Amat[il,:,:] = Amat_sides + Amat_end + self.Imat[il,:,:] = Imat_sides + Imat_end + self.a_i[il] = a_i + + + # add to global added mass and inertial excitation matrices + # which consider the mean offsets and are relative to the ref in global orientation + A_hydro += translateMatrix3to6DOF(self.Amat[il,:,:], self.r[il,:] - r_ref[:3]) + if sum_inertia: + I_hydro += translateMatrix3to6DOF(self.Imat[il,:,:], self.r[il,:] - r_ref[:3]) + + if sum_inertia: + return A_hydro, I_hydro + else: + return A_hydro + + + def getSectionProperties(self, station): + '''Get member cross sectional area and moments of inertia at a user- + specified location along the member.''' + + + + return A, I + + def plot(self, ax, r_ptfm=[0,0,0], R_ptfm=[], color='k', nodes=0, + station_plot=[], plot2d=False, Xuvec=[1,0,0], Yuvec=[0,0,1], zorder=2): + '''Draws the member on the passed axes, and optional platform offset and rotation matrix + + Parameters + ---------- + + plot2d: bool + If true, produces a 2d plot on the axes defined by Xuvec and Yuvec. + Otherwise produces a 3d plot (default). + + ''' # --- get coordinates of member edges in member reference frame ------------------- @@ -841,6 +1059,9 @@ def plot(self, ax, r_ptfm=[0,0,0], R_ptfm=[], color='k', nodes=0, station_plot=[ # ----- move to global frame ------------------------------ + + # Note: the below transformations can probably be replaced by using the new member.setPosition function before calling this. + newcoords = np.matmul(self.R, coords) # relative orientation in platform newcoords = newcoords + self.rA[:,None] # shift to end A location, still relative to platform @@ -855,21 +1076,31 @@ def plot(self, ax, r_ptfm=[0,0,0], R_ptfm=[], color='k', nodes=0, station_plot=[ # plot on the provided axes linebit = [] # make empty list to hold plotted lines, however many there are - for i in range(n): #range(int(len(Xs)/2-1)): - #linebit.append(ax.plot(Xs[2*i:2*i+2],Ys[2*i:2*i+2],Zs[2*i:2*i+2] , color='k')) # side edges - #linebit.append(ax.plot(Xs[[2*i,2*i+2]],Ys[[2*i,2*i+2]],Zs[[2*i,2*i+2]] , color='k')) # end A edges - #linebit.append(ax.plot(Xs[[2*i+1,2*i+3]],Ys[[2*i+1,2*i+3]],Zs[[2*i+1,2*i+3]], color='k')) # end B edges - - linebit.append(ax.plot(Xs[nm*i:nm*i+nm],Ys[nm*i:nm*i+nm],Zs[nm*i:nm*i+nm] , color=color, lw=0.5, zorder=2)) # side edges - - for j in range(nm): - linebit.append(ax.plot(Xs[j::nm], Ys[j::nm], Zs[j::nm] , color=color, lw=0.5, zorder=2)) # station rings - - - # plot nodes if asked - if nodes > 0: - ax.scatter(self.r[:,0], self.r[:,1], self.r[:,2]) - + + if plot2d: # new 2d plotting option + + # apply any 3D to 2D transformation here to provide desired viewing angle + Xs2d = Xs*Xuvec[0] + Ys*Xuvec[1] + Zs*Xuvec[2] + Ys2d = Xs*Yuvec[0] + Ys*Yuvec[1] + Zs*Yuvec[2] + + for i in range(n): + linebit.append(ax.plot(Xs2d[nm*i:nm*i+nm],Ys2d[nm*i:nm*i+nm], color=color, lw=0.5, zorder=zorder)) # side edges + + for j in range(nm): + linebit.append(ax.plot(Xs2d[j::nm], Ys2d[j::nm], color=color, lw=0.5, zorder=zorder)) # station rings + + else: # normal 3d case + + for i in range(n): + linebit.append(ax.plot(Xs[nm*i:nm*i+nm],Ys[nm*i:nm*i+nm],Zs[nm*i:nm*i+nm], color=color, lw=0.5, zorder=zorder)) # side edges + + for j in range(nm): + linebit.append(ax.plot(Xs[j::nm], Ys[j::nm], Zs[j::nm], color=color, lw=0.5, zorder=zorder)) # station rings + + # plot nodes if asked + if nodes > 0: + ax.scatter(self.r[:,0], self.r[:,1], self.r[:,2]) + return linebit diff --git a/RAFT/raft/raft_model.py b/RAFT/raft/raft_model.py index ad48d3b9d..08a44d8fc 100644 --- a/RAFT/raft/raft_model.py +++ b/RAFT/raft/raft_model.py @@ -14,9 +14,10 @@ import pickle import moorpy as mp -import raft.raft_fowt as fowt +import raft.raft_fowt as fowt from raft.helpers import * - +from moorpy.helpers import dsolve2, set_axes_equal, dsolvePlot +import copy #import F6T1RNA as structural # import turbine structural model functions raft_dir = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) @@ -35,12 +36,10 @@ def __init__(self, design, nTurbines=1): could in future be used to set up any number of identical turbines ''' - self.fowtList = [] # assume only 1 FOWT per model - so len(this list) = 1 - self.coords = [] - - self.nDOF = 0 # number of DOFs in system + self.fowtList = [] # list of FOWT objects + self.coords = [] # list of FOWT reference coordinates in x and y (also stored inside each FOWT as x_ref, y_ref [m] - self.design = design # save design dictionary for possible later use/reference + self.nDOF = 0 # number of FOWT-level DOFs in the system - normally will be 6*len(fowtList) # parse settings @@ -54,32 +53,125 @@ def __init__(self, design, nTurbines=1): self.w = np.arange(min_freq, max_freq+0.5*min_freq, min_freq) *2*np.pi # angular frequencies to analyze (rad/s) self.nw = len(self.w) # number of frequencies - - # process mooring information - self.ms = mp.System() - self.ms.parseYAML(design['mooring']) - # depth and wave number + # water depth and wave number self.depth = getFromDict(design['site'], 'water_depth', dtype=float) self.k = np.zeros(self.nw) # wave number for i in range(self.nw): self.k[i] = waveNumber(self.w[i], self.depth) - # set up the FOWT here <<< only set for 1 FOWT for now <<< - self.fowtList.append(fowt.FOWT(design, self.w, self.ms.bodyList[0], depth=self.depth)) - self.coords.append([0.0,0.0]) - self.nDOF += 6 + + # ----- parse array section if it exists ----- + + if 'array' in design: # if array info is given, RAFT will run in array mode + + self.nFOWT = len(design['array']['data']) + + # some checks/updates of the dictionary for compatibility + if 'turbine' in design and not 'turbines' in design: # if a single turbine is listed, make it a list for more consistent parsing + design['turbines'] = [design['turbine']] + if 'platform' in design and not 'platforms' in design: + design['platforms'] = [design['platform']] + if 'mooring' in design and not 'moorings' in design: + design['moorings'] = [design['mooring']] + + # form dictionary of fowt array data + fowtInfo = [dict(zip( design['array']['keys'], row)) for row in design['array']['data']] + + # if array_mooring section exists, create an array-level MoorPy system + if 'array_mooring' in design: + self.ms = mp.System(depth=self.depth) + + # set up a coupled MoorPy body for each FOWT + for i in range(self.nFOWT): + self.ms.addBody(-1, [fowtInfo[i]['x_location'], fowtInfo[i]['y_location'], 0,0,0,0]) + # load the MD style input file (this is the only option supported right now) + if 'file' in design['array_mooring']: + self.ms.load(design['array_mooring']['file'], clear=False) # add the array level mooring system to the already created bodies + else: + raise Exception("When using 'array_mooring', a MoorDyn-style input file must be provided as 'file'.") + else: + self.ms = None + + # go through each turbine in the list and set it up... + for i in range(self.nFOWT): + + x_ref = fowtInfo[i]['x_location'] + y_ref = fowtInfo[i]['y_location'] + headj = fowtInfo[i]['heading_adjust'] + + design_i = {} # just make a temporary design dictionary for the FOWT (could make this a stored list of all) + + design_i['site'] = design['site'] + + if fowtInfo[i]['turbineID'] == 0: + #design_i['turbine'] = None + design_i.pop('turbine', None) # if no turbine, make sure the entry isn't in the design dictionary + else: + design_i['turbine'] = design['turbines'][fowtInfo[i]['turbineID']-1] + + if fowtInfo[i]['platformID'] == 0: + design_i['platform'] = None + print("Warning: platforms MUST be included for the time being.") + else: + design_i['platform'] = design['platforms'][fowtInfo[i]['platformID']-1] + + if fowtInfo[i]['mooringID'] == 0: # no mooring on this FOWT (array-level moorings may be used instead) + design_i['mooring'] = None + else: + design_i['mooring'] = design['moorings'][fowtInfo[i]['mooringID']-1] + + if self.ms: + mpb = self.ms.bodyList[i] # reference to the FOWT's body in the array level MoorPy system + else: + mpb = None + + + self.fowtList.append(fowt.FOWT(design_i, self.w, mpb, depth=self.depth, + x_ref=x_ref, y_ref=y_ref, heading_adjust=headj)) + + self.coords.append([x_ref, y_ref]) + self.nDOF += 6 + + + + else: # normal single-FOWT mode + + # This is the original approach. It assumes a single turbine, platform, and mooring section are given. + + self.nFOWT = 1 + + # Note: its mooring system will be put in the FOWT now rather than existing at the model/array level. + # # process mooring information + # self.ms = mp.System() + # self.ms.parseYAML(design['mooring']) + self.ms = None - self.ms.bodyList[0].type = -1 # need to make sure it's set to a coupled type + # set up the FOWT here + #self.fowtList.append(fowt.FOWT(design, self.w, self.ms.bodyList[0], depth=self.depth)) + self.fowtList.append(fowt.FOWT(design, self.w, None, depth=self.depth)) + self.coords.append([0.0,0.0]) + self.nDOF += 6 + + #self.ms.bodyList[0].type = -1 # need to make sure it's set to a coupled type + + + self.design = design # save design dictionary for possible later use/reference - try: - self.ms.initialize() # reinitialize the mooring system to ensure all things are tallied properly etc. - except Exception as e: - raise RuntimeError('An error occured when initializing the mooring system: '+e.message) + + if self.ms: + self.ms.initialize() + #>>> initialize all the mooring systems? + #try: + # self.ms.initialize() # reinitialize the mooring system to ensure all things are tallied properly etc. + #except Exception as e: + # raise RuntimeError('An error occured when initializing the mooring system: '+e.message) self.results = {} # dictionary to hold all results from the model + + def addFOWT(self, fowt, xy0=[0,0]): @@ -113,13 +205,35 @@ def analyzeUnloaded(self, ballast=0, heave_tol = 1): ballast: flag to ballast the FOWTs to achieve a certain heave offset''' - + # >>> this whole method needs to be updated or possibly removed <<< + + if len(self.fowtList) > 1: + raise Exception('analyzeUnloaded is an old method that only works for a single FOWT.') + + # need to zero out external loads + self.fowtList[0].setPosition(np.zeros(6)) + self.fowtList[0].D_hydr0 = np.zeros(6) + self.fowtList[0].f_aero0 = np.zeros([6,self.fowtList[0].nrotors]) + + # get mooring system characteristics about undisplaced platform position (useful for baseline and verification) - try: - self.C_moor0 = self.ms.getCoupledStiffness(lines_only=True) # this method accounts for eqiuilibrium of free objects in the system - self.F_moor0 = self.ms.getForces(DOFtype="coupled", lines_only=True) - except Exception as e: - raise RuntimeError('An error occured when getting linearized mooring properties in undisplaced state: '+e.message) + self.C_moor0 = np.zeros([6,6]) + self.F_moor0 = np.zeros(6) + + if self.ms: + try: + self.C_moor0 += self.ms.getCoupledStiffness(lines_only=True) + self.F_moor0 += self.ms.getForces(DOFtype="coupled", lines_only=True) + except Exception as e: + raise RuntimeError('An error occured when getting linearized mooring properties in undisplaced state: '+e.message) + + if self.fowtList[0].ms: + try: + self.C_moor0 += self.fowtList[0].ms.getCoupledStiffness(lines_only=True) + self.F_moor0 += self.fowtList[0].ms.getForces(DOFtype="coupled", lines_only=True) + except Exception as e: + raise RuntimeError('An error occured when getting linearized mooring properties in undisplaced state: '+e.message) + # calculate the system's constant properties #self.calcSystemConstantProps() @@ -136,109 +250,45 @@ def analyzeUnloaded(self, ballast=0, heave_tol = 1): # compute FOWT static and constant hydrodynamic properties fowt.calcStatics() #fowt.calcBEM() - fowt.calcHydroConstants(dict(wave_spectrum='still', wave_heading=0)) + fowt.calcHydroConstants() # includes rotor when underwater self.results['properties'] = {} # signal this data is available by adding a section to the results dictionary # calculate platform offsets and mooring system equilibrium state - self.calcMooringAndOffsets() + #self.calcMooringAndOffsets() + self.solveStatics(None) # passing none should imply no load case (no WWC) self.results['properties']['offset_unloaded'] = self.fowtList[0].Xi0 # TODO: add printing of summary info here - mass, stiffnesses, etc - def analyzeCases(self, display=0, runPyHAMS=True, meshDir=os.path.join(os.getcwd(),'BEM')): + def analyzeCases(self, display=0, meshDir=os.path.join(os.getcwd(),'BEM'), RAO_plot=False): '''This runs through all the specified load cases, building a dictionary of results.''' nCases = len(self.design['cases']['data']) - nLines = len(self.ms.lineList) + self.results['properties'] = {} # signal that the properties calcs will be done - # set up output arrays for load cases + # set up output arrays for load cases >>> put these into an initialization function <<< self.results['case_metrics'] = {} - self.results['case_metrics']['surge_avg'] = np.zeros(nCases) - self.results['case_metrics']['surge_std'] = np.zeros(nCases) - self.results['case_metrics']['surge_max'] = np.zeros(nCases) - self.results['case_metrics']['surge_PSD'] = np.zeros([nCases,self.nw]) # adding PSDs as well. Could put behind an if statement if this slows things down - - self.results['case_metrics']['sway_avg'] = np.zeros(nCases) - self.results['case_metrics']['sway_std'] = np.zeros(nCases) - self.results['case_metrics']['sway_max'] = np.zeros(nCases) - self.results['case_metrics']['sway_PSD'] = np.zeros([nCases,self.nw]) - - self.results['case_metrics']['heave_avg'] = np.zeros(nCases) - self.results['case_metrics']['heave_std'] = np.zeros(nCases) - self.results['case_metrics']['heave_max'] = np.zeros(nCases) - self.results['case_metrics']['heave_PSD'] = np.zeros([nCases,self.nw]) - - self.results['case_metrics']['roll_avg'] = np.zeros(nCases) - self.results['case_metrics']['roll_std'] = np.zeros(nCases) - self.results['case_metrics']['roll_max'] = np.zeros(nCases) - self.results['case_metrics']['roll_PSD'] = np.zeros([nCases,self.nw]) - - self.results['case_metrics']['pitch_avg'] = np.zeros(nCases) - self.results['case_metrics']['pitch_std'] = np.zeros(nCases) - self.results['case_metrics']['pitch_max'] = np.zeros(nCases) - self.results['case_metrics']['pitch_PSD'] = np.zeros([nCases,self.nw]) - - self.results['case_metrics']['yaw_avg'] = np.zeros(nCases) - self.results['case_metrics']['yaw_std'] = np.zeros(nCases) - self.results['case_metrics']['yaw_max'] = np.zeros(nCases) - self.results['case_metrics']['yaw_PSD'] = np.zeros([nCases,self.nw]) - - nrotors = self.fowtList[0].nrotors - - # nacelle acceleration - self.results['case_metrics']['AxRNA_avg'] = np.zeros([nCases,nrotors]) # = np.zeros(nCases) - self.results['case_metrics']['AxRNA_std'] = np.zeros([nCases,nrotors]) # = np.zeros(nCases) - self.results['case_metrics']['AxRNA_max'] = np.zeros([nCases,nrotors]) # = np.zeros(nCases) - self.results['case_metrics']['AxRNA_PSD'] = np.zeros([nCases,self.nw, nrotors]) # = np.zeros([nCases,self.nw]) - # tower base bending moment - self.results['case_metrics']['Mbase_avg'] = np.zeros([nCases,nrotors]) # = np.zeros(nCases) - self.results['case_metrics']['Mbase_std'] = np.zeros([nCases,self.nw, nrotors]) # = np.zeros(nCases) - self.results['case_metrics']['Mbase_max'] = np.zeros([nCases,nrotors]) # = np.zeros(nCases) - self.results['case_metrics']['Mbase_PSD'] = np.zeros([nCases,self.nw, nrotors]) # = np.zeros([nCases,self.nw]) - self.results['case_metrics']['Mbase_DEL'] = np.zeros([nCases,nrotors]) # = np.zeros(nCases) - # rotor speed - self.results['case_metrics']['omega_avg'] = np.zeros([nCases,nrotors]) # = np.zeros(nCases) - self.results['case_metrics']['omega_std'] = np.zeros([nCases,nrotors]) # = np.zeros(nCases) - self.results['case_metrics']['omega_max'] = np.zeros([nCases,nrotors]) # = np.zeros(nCases) - self.results['case_metrics']['omega_PSD'] = np.zeros([nCases,self.nw, nrotors]) # = np.zeros([nCases,self.nw]) - # generator torque - self.results['case_metrics']['torque_avg'] = np.zeros([nCases,nrotors]) # = np.zeros(nCases) - self.results['case_metrics']['torque_std'] = np.zeros([nCases,nrotors]) # = np.zeros(nCases) - self.results['case_metrics']['torque_max'] = np.zeros([nCases,nrotors]) # = np.zeros(nCases) - self.results['case_metrics']['torque_PSD'] = np.zeros([nCases,self.nw, nrotors]) # = np.zeros([nCases,self.nw]) - # rotor power - self.results['case_metrics']['power_avg'] = np.zeros([nCases,nrotors]) # = np.zeros(nCases) - self.results['case_metrics']['power_std'] = np.zeros([nCases,nrotors]) # = np.zeros(nCases) - self.results['case_metrics']['power_max'] = np.zeros([nCases,nrotors]) # = np.zeros(nCases) - self.results['case_metrics']['power_PSD'] = np.zeros([nCases,self.nw, nrotors]) # = np.zeros([nCases,self.nw]) - # collective blade pitch - self.results['case_metrics']['bPitch_avg'] = np.zeros([nCases,nrotors]) # = np.zeros(nCases) - self.results['case_metrics']['bPitch_std'] = np.zeros([nCases,nrotors]) # = np.zeros(nCases) - self.results['case_metrics']['bPitch_max'] = np.zeros([nCases,nrotors]) # = np.zeros(nCases) - self.results['case_metrics']['bPitch_PSD'] = np.zeros([nCases,self.nw, nrotors]) # = np.zeros([nCases,self.nw]) - - # mooring tension - self.results['case_metrics']['Tmoor_avg'] = np.zeros([nCases, 2*nLines]) # 2d array, for each line in each case? - self.results['case_metrics']['Tmoor_std'] = np.zeros([nCases, 2*nLines]) - self.results['case_metrics']['Tmoor_max'] = np.zeros([nCases, 2*nLines]) - self.results['case_metrics']['Tmoor_DEL'] = np.zeros([nCases, 2*nLines]) - self.results['case_metrics']['Tmoor_PSD'] = np.zeros([nCases, 2*nLines, self.nw]) - - # wind and wave spectra for reference - self.results['case_metrics']['wind_PSD'] = np.zeros([nCases, self.nw]) - self.results['case_metrics']['wave_PSD'] = np.zeros([nCases, self.nw]) + # calculate the system's constant properties for fowt in self.fowtList: + fowt.setPosition([fowt.x_ref, fowt.y_ref,0,0,0,0]) fowt.calcStatics() - if runPyHAMS: + for i, fowt in enumerate(self.fowtList): fowt.calcBEM(meshDir=meshDir) + + + # w_2nd = np.linspace(self.w[0], self.w[-1], 50) + # k_2nd = np.zeros(len(w_2nd)) + # for i in range(len(w_2nd)): + # k_2nd[i] = waveNumber(w_2nd[i], self.depth) + # fowt.calcQTF_slenderbody(w_2nd=w_2nd, k_2nd=k_2nd, beta=0) # loop through each case for iCase in range(nCases): @@ -249,70 +299,109 @@ def analyzeCases(self, display=0, runPyHAMS=True, meshDir=os.path.join(os.getcwd # form dictionary of case parameters case = dict(zip( self.design['cases']['keys'], self.design['cases']['data'][iCase])) - ''' - # get initial FOWT values assuming no offset - for fowt in self.fowtList: - fowt.Xi0 = np.zeros(6) # zero platform offsets - fowt.calcTurbineConstants(case, ptfm_pitch=0.0) - fowt.calcHydroConstants(case) - - # calculate platform offsets and mooring system equilibrium state - self.calcMooringAndOffsets() + if np.isscalar(case['wave_heading']): # deal with the typical case of just one set of waves specified + nWaves = 1 + else: + nWaves = len(case['wave_heading']) - # update values based on offsets if applicable - for fowt in self.fowtList: - fowt.calcTurbineConstants(case, ptfm_pitch=fowt.Xi0[4]) - # fowt.calcHydroConstants(case) (hydrodynamics don't account for offset, so far) + # initialize dictionary of case results + self.results['case_metrics'][iCase] = {} - # (could solve mooring and offsets a second time, but likely overkill) - ''' - self.solveStatics(case) + # solve system operating point / mean offsets for this load case + self.solveStatics(case, display=display) + # >>> add a flag that stores what case has had solveStatics to ensure consistency <<< + # solve system dynamics - self.solveDynamics(case) + self.solveDynamics(case, RAO_plot=RAO_plot) - # process outputs that are specific to the floating unit - self.fowtList[0].saveTurbineOutputs(self.results['case_metrics'], case, iCase, fowt.Xi0, self.Xi[0:6,:]) - - # process mooring tension outputs - nLine = int(len(self.T_moor)/2) - T_moor_amps = np.zeros([2*nLine, self.nw], dtype=complex) - for iw in range(self.nw): - T_moor_amps[:,iw] = np.matmul(self.J_moor, self.Xi[:,iw]) # FFT of mooring tensions + # >>> need to decide if I want to store Xi0 and Xi in the FOWTs or work with them directly here. <<< - self.results['case_metrics']['Tmoor_avg'][iCase,:] = self.T_moor - for iT in range(2*nLine): - TRMS = getRMS(T_moor_amps[iT,:], self.w[0]) # estimated mooring line RMS tension [N] - self.results['case_metrics']['Tmoor_std'][iCase,iT] = TRMS - self.results['case_metrics']['Tmoor_max'][iCase,iT] = self.T_moor[iT] + 3*TRMS - self.results['case_metrics']['Tmoor_PSD'][iCase,iT,:] = getPSD(T_moor_amps[iT,:]) # PSD in N^2/(rad/s) - #self.results['case_metrics']['Tmoor_DEL'][iCase,iT] = - - if display > 0: + # process outputs that are specific to the floating unit (initialize dictionary for case and turb index) + for i, fowt in enumerate(self.fowtList): + self.results['case_metrics'][iCase][i] = {} + fowt.saveTurbineOutputs(self.results['case_metrics'][iCase][i],case) + nTowers = fowt.ntowers + nRotors = fowt.nrotors + + if display > 0: - metrics = self.results['case_metrics'] - - # print statistics table - print(f"-------------------- Case {iCase+1} Statistics --------------------") - print("Response channel Average RMS Maximum") - print(f"surge (m) {metrics['surge_avg'][iCase] :10.2e} {metrics['surge_std'][iCase] :10.2e} {metrics['surge_max'][iCase] :10.2e}") - print(f"sway (m) {metrics['sway_avg' ][iCase] :10.2e} {metrics['sway_std' ][iCase] :10.2e} {metrics['sway_max' ][iCase] :10.2e}") - print(f"heave (m) {metrics['heave_avg'][iCase] :10.2e} {metrics['heave_std'][iCase] :10.2e} {metrics['heave_max'][iCase] :10.2e}") - print(f"roll (deg) {metrics['roll_avg' ][iCase] :10.2e} {metrics['roll_std' ][iCase] :10.2e} {metrics['roll_max' ][iCase] :10.2e}") - print(f"pitch (deg) {metrics['pitch_avg'][iCase] :10.2e} {metrics['pitch_std'][iCase] :10.2e} {metrics['pitch_max'][iCase] :10.2e}") - print(f"yaw (deg) {metrics[ 'yaw_avg'][iCase] :10.2e} {metrics[ 'yaw_std'][iCase] :10.2e} {metrics['yaw_max' ][iCase] :10.2e}") - print(f"nacelle acc. (m/s) {metrics['AxRNA_avg'][iCase] :10.2e} {metrics['AxRNA_std'][iCase] :10.2e} {metrics['AxRNA_max'][iCase] :10.2e}") - print(f"tower bending (Nm) {metrics['Mbase_avg'][iCase] :10.2e} {metrics['Mbase_std'][iCase] :10.2e} {metrics['Mbase_max'][iCase] :10.2e}") + metrics = self.results['case_metrics'][iCase][i] - print(f"rotor speed (RPM) {metrics['omega_avg'][iCase] :10.2e} {metrics['omega_std'][iCase] :10.2e} {metrics['omega_max'][iCase] :10.2e}") - print(f"blade pitch (deg) {metrics['bPitch_avg'][iCase] :10.2e} {metrics['bPitch_std'][iCase] :10.2e} ") - print(f"rotor power {metrics['power_avg'][iCase] :10.2e} ") - for i in range(nLine): - j = i+nLine - #print(f"line {i} tension A {metrics['Tmoor_avg'][iCase,i]:10.2e} {metrics['Tmoor_std'][iCase,i]:10.2e} {metrics['Tmoor_max'][iCase,i]:10.2e}") - print(f"line {i} tension (N) {metrics['Tmoor_avg'][iCase,j]:10.2e} {metrics['Tmoor_std'][iCase,j]:10.2e} {metrics['Tmoor_max'][iCase,j]:10.2e}") - print(f"-----------------------------------------------------------") - + # print statistics table + print(f"-------------------- FOWT {i+1} Case {iCase+1} Statistics --------------------") + print("Response channel Average RMS Maximum") + print(f"surge (m) {metrics['surge_avg'] :10.2e} {metrics['surge_std'] :10.2e} {metrics['surge_max'] :10.2e}") + print(f"sway (m) {metrics['sway_avg' ] :10.2e} {metrics['sway_std' ] :10.2e} {metrics['sway_max' ] :10.2e}") + print(f"heave (m) {metrics['heave_avg'] :10.2e} {metrics['heave_std'] :10.2e} {metrics['heave_max'] :10.2e}") + print(f"roll (deg) {metrics['roll_avg' ] :10.2e} {metrics['roll_std' ] :10.2e} {metrics['roll_max' ] :10.2e}") + print(f"pitch (deg) {metrics['pitch_avg'] :10.2e} {metrics['pitch_std'] :10.2e} {metrics['pitch_max'] :10.2e}") + print(f"yaw (deg) {metrics[ 'yaw_avg'] :10.2e} {metrics[ 'yaw_std'] :10.2e} {metrics['yaw_max' ] :10.2e}") + for i in range(nTowers): + print(f"nacelle acc. (m/s) {metrics['AxRNA_avg'][i] :10.2e} {metrics['AxRNA_std'][i] :10.2e} {metrics['AxRNA_max'][i] :10.2e}") + for i in range(nTowers): + print(f"tower bending (Nm) {metrics['Mbase_avg'][i] :10.2e} {metrics['Mbase_std'][i] :10.2e} {metrics['Mbase_max'][i] :10.2e}") + for i in range(nRotors): + if fowt.rotorList[i].Zhub < 0: + speed = getFromDict(case, 'current_speed', shape=0, default=1.0) + else: + speed = getFromDict(case, 'wind_speed', shape=0, default=10.0) + if fowt.rotorList[i].aeroServoMod > 1 and speed > 0.0: + print(f"rotor speed (RPM) {metrics['omega_avg'][i] :10.2e} {metrics['omega_std'][i] :10.2e} {metrics['omega_max'][i] :10.2e}") + print(f"blade pitch (deg) {metrics['bPitch_avg'][i] :10.2e} {metrics['bPitch_std'][i] :10.2e} ") + print(f"rotor power {metrics['power_avg'][i] :10.2e} ") + #for i in range(nLine): >>> could have the turbine's own mooring system results here <<< + # j = i+nLine + # print(f"line {i} tension (N) {metrics['Tmoor_avg'][iCase,j]:10.2e} {metrics['Tmoor_std'][iCase,j]:10.2e} {metrics['Tmoor_max'][iCase,j]:10.2e}") + print(f"-----------------------------------------------------------") + + + + # process array-level mooring tension outputs + if self.ms: + + self.results['case_metrics'][iCase]['array_mooring'] = {} + + nLines = len(self.ms.lineList) + T_moor_amps = np.zeros([nWaves+1, 2*nLines, self.nw], dtype=complex) # mooring tension amplitudes for each excitation source and line end + + C_moor, J_moor = self.ms.getCoupledStiffness(lines_only=True, tensions=True) # get stiffness matrix and tension jacobian matrix + T_moor = self.ms.getTensions() # get line end mean tensions + + + for ih in range(nWaves+1): + for iw in range(self.nw): + T_moor_amps[ih,:,iw] = np.matmul(J_moor, self.Xi[ih,:,iw]) # FFT of mooring tensions + + self.results['case_metrics'][iCase]['array_mooring']['Tmoor_avg'] = T_moor + self.results['case_metrics'][iCase]['array_mooring']['Tmoor_std'] = np.zeros(2*nLines) + self.results['case_metrics'][iCase]['array_mooring']['Tmoor_max'] = np.zeros(2*nLines) + self.results['case_metrics'][iCase]['array_mooring']['Tmoor_PSD'] = np.zeros([ 2*nLines, self.nw ]) + + + for iT in range(2*nLines): + TRMS = getRMS(T_moor_amps[:,iT,:]) # estimated mooring line RMS tension [N] + self.results['case_metrics'][iCase]['array_mooring']['Tmoor_std'][iT] = TRMS + self.results['case_metrics'][iCase]['array_mooring']['Tmoor_max'][iT] = T_moor[iT] + 3*TRMS + self.results['case_metrics'][iCase]['array_mooring']['Tmoor_PSD'][iT,:] = getPSD(T_moor_amps[:,iT,:], self.w[0]) # PSD in N^2/(rad/s) + #self.results['case_metrics']['array_mooring']['Tmoor_DEL'][iCase,iT] = + + # log the maximum line tensions predicted by RAFT for MoorPy use + # self.ms.saveMaxTensions(self.results['case_metrics'][iCase]['array_mooring']['Tmoor_max']) + + if display > 0: + + metrics = self.results['case_metrics'][iCase]['array_mooring'] + + # print statistics table + print(f"-------------------- Mooring Case {iCase+1} Statistics --------------------") + print("Response channel Average RMS Maximum") + for i in range(nLines): + j = i+nLines + print(f"line {i} tension (N) {metrics['Tmoor_avg'][j]:10.2e} {metrics['Tmoor_std'][j]:10.2e} {metrics['Tmoor_max'][j]:10.2e}") + print(f"-----------------------------------------------------------") + + self.T_moor_amps = T_moor_amps # save for future processing! """ @@ -334,78 +423,7 @@ def calcSystemConstantProps(self): self.results['properties'] = {} # signal this data is available by adding a section to the results dictionary """ - def calcMooringAndOffsets(self): - '''Calculates mean offsets and linearized mooring properties for the current load case. - setEnv and calcSystemProps must be called first. This will ultimately become a method for solving mean operating point. - ''' - - # apply any mean aerodynamic and hydrodynamic loads - #F_PRP = self.fowtList[0].F_aero0 - F_PRP = np.sum(self.fowtList[0].F_aero0, axis=1) - # + self.fowtList[0].F_hydro0 <<< hydro load would be nice here eventually - self.ms.bodyList[0].f6Ext = np.array(F_PRP) - - - # Now find static equilibrium offsets of platform and get mooring properties about that point - # (This assumes some loads have been applied) - #self.ms.display=2 - - try: - self.ms.solveEquilibrium3(DOFtype="both", tol=0.01) #, rmsTol=1.0E-5) # get the system to its equilibrium - except Exception as e: #mp.MoorPyError - print('An error occured when solving system equilibrium: '+e.message) - #raise RuntimeError('An error occured when solving unloaded equilibrium: '+error.message) - - # ::: a loop could be added here for an array ::: - fowt = self.fowtList[0] - - #print("Equilibrium'3' platform positions/rotations:") - #printVec(self.ms.bodyList[0].r6) - - r6eq = self.ms.bodyList[0].r6 - fowt.Xi0 = np.array(r6eq) # save current mean offsets for the FOWT - - #self.ms.plot() - - print(f"Found mean offets with with surge = {r6eq[0]:.2f} m and pitch = {r6eq[4]*180/np.pi:.2f} deg.") - - try: - C_moor, J_moor = self.ms.getCoupledStiffness(lines_only=True, tensions=True) # get stiffness matrix and tension jacobian matrix - F_moor = self.ms.getForces(DOFtype="coupled", lines_only=True) # get net forces and moments from mooring lines on Body - T_moor = self.ms.getTensions() - except Exception as e: - raise RuntimeError('An error occured when getting linearized mooring properties in offset state: '+e.message) - - # add any additional yaw stiffness that isn't included in the MoorPy model (e.g. if a bridle isn't modeled) - C_moor[5,5] += fowt.yawstiff - - self.C_moor = C_moor - self.J_moor = J_moor # jacobian of mooring line tensions w.r.t. coupled DOFs - self.F_moor = F_moor - self.T_moor = T_moor - - # store results - self.results['means'] = {} # signal this data is available by adding a section to the results dictionary - self.results['means']['aero force' ] = self.fowtList[0].F_aero0 - self.results['means']['platform offset' ] = r6eq - self.results['means']['mooring force' ] = F_moor - self.results['means']['fairlead tensions'] = np.array([np.linalg.norm(self.ms.pointList[id-1].getForces()) for id in self.ms.bodyList[0].attachedP]) - - # tower base bending moment - m_turbine = np.zeros([len(self.fowtList), max([len(self.fowtList[j].mtower) for j in range(len(self.fowtList))])]) - zCG_turbine = np.zeros_like(m_turbine) - zBase = np.zeros_like(m_turbine) - hArm = np.zeros_like(m_turbine) - self.results['means']['Mbase'] = np.zeros_like(m_turbine) - for j in range(len(self.fowtList)): - for i in range(len(self.fowtList[j].mtower)): - m_turbine[j,i] = self.fowtList[j].mtower[i] + self.fowtList[j].mRNA[i] # total masses of each turbine - zCG_turbine[j,i] = (self.fowtList[j].rCG_tow[i][2]*self.fowtList[j].mtower[i] # CoG of each turbine - + self.fowtList[j].hHub[i]*self.fowtList[j].mRNA[i])/m_turbine[j,i] - zBase[j,i] = self.fowtList[j].memberList[self.fowtList[j].nplatmems + i].rA[2] # tower base elevation [m] - hArm[j,i] = zCG_turbine[j,i] - zBase[j,i] # vertical distance from tower base to turbine CG [m] - self.results['means']['Mbase'][j,i] = m_turbine[j,i]*self.fowtList[j].g * hArm[j,i]*np.sin(r6eq[4]) + transformForce(self.fowtList[j].F_aero0[:,i], offset=[0,0,-hArm[j,i]])[4] # mean moment from weight and thrust - + def solveEigen(self): @@ -516,25 +534,399 @@ def solveEigen(self): self.results['eigen']['modes' ] = modes - def solveStatics(self, case): + def solveStatics(self, case, display=0): + ''' + + Old notes: To support nonlinear hydrostatics and multiple moorpy instances, this needs to + become its own solve equilibrium process - # get initial FOWT values assuming no offset + hopefully can just use dsolve2 and its default step func rather than something special + + the eval_func will involve: + - mooring eq (array level and each turbine if applicable) + - hydrostatics update (should roll,pitch,heave be solved separate from surge sway yaw?) + - one of the prior two steps should also give device orientation and heave + - get loads from wind (eventually floris), wave drift, and current (affected by submergence) + - return total loads + + + statics_mod - 0: linearized hydrostatics; 1: hydrostatics are updated each iteration based on new poses + forcing_mod - 0: don't update environmental loads; 1: loads are updated each iteration based on new poses + + New change: supports either a single wind speed or a list (where there is one wind speed per turbine) + ''' + + statics_mod = 0 + forcing_mod = 0 + + if statics_mod == 0: # if using linearized hydrostatics approach, get the matrices + K_hydrostatic = [] #np.zeros([self.nDOF, self.nDOF]) # this will be the constant hydrostatic stiffness matrix--buoyancy and weight terms + F_undisplaced = np.zeros(self.nDOF) # force and moment vector before any displacements + if forcing_mod == 0: # if using constant environmental mean forcing + F_env_constant = np.zeros(self.nDOF) # constant environmental force and moment vector + + + X_initial = np.zeros(self.nDOF) # position vector of all FOWTs + + if case: + caseorig = copy.deepcopy(case) # save original case data in new dict + if type(case['wind_speed']) == list : + print('List of wind speeds found!') + + if len(case['wind_speed']) != len(self.fowtList): + raise IndexError("List of wind speeds must be the same length as the list of wind turbines") + + # set initial values before solving + for i, fowt in enumerate(self.fowtList): + + if display > 0: print(f"FOWT {i+1:}") + + #X_initial[6*i:6*i+6] = fowt.r6 - np.array([fowt.xref, fowt.yref,0,0,0,0]) + X_initial[6*i:6*i+6] = np.array([fowt.x_ref, fowt.y_ref,0,0,0,0]) + fowt.setPosition(X_initial[6*i:6*i+6]) # zero platform offsets + fowt.calcStatics() + + if statics_mod == 0: + #K_hydrostatic[6*i:6*i+6, 6*i:6*i+6] += fowt.C_struc + fowt.C_hydro + K_hydrostatic.append(fowt.C_struc + fowt.C_hydro) + F_undisplaced[6*i:6*i+6 ] += fowt.W_struc + fowt.W_hydro + + if display > 0: print(" F_undisplaced "+" ".join(["{:+8.2e}"]*6).format(*F_undisplaced[6*i:6*i+6])) + + if forcing_mod == 0 and case: + + # If list of wind speeds, set each turbine case with corresponding wind speed + if type(caseorig['wind_speed']) == list : + case['wind_speed'] = caseorig['wind_speed'][i] + print('Fowt ' + str(i)) + print(case) + + fowt.calcTurbineConstants(case, ptfm_pitch=0) # for turbine forces >>> still need to update to use current fowt pose <<< + fowt.calcHydroConstants() + #for rotor in fowt.rotorList: # for blade members (bladeMemberList will be empty if rotors are not underwater) ?? + #fowt.calcHydroConstants(case, memberList=rotor.bladeMemberList*rotor.nBlades, Rotor=rotor) ?? + # wave mean drift to be added + F_env_constant[6*i:6*i+6] = np.sum(fowt.f_aero0, axis=1) + fowt.calcCurrentLoads(case) + + if display > 0: print(" F_env_constant"+" ".join(["{:+8.2e}"]*6).format(*F_env_constant[6*i:6*i+6])) + + # preliminary approach to provide uniform currents on the mooring system(s) + currentMod = 0 + currentU = np.zeros(3) + if case: + cur_speed = getFromDict(case, 'current_speed', shape=0, default=0.0) + cur_heading = getFromDict(case, 'current_heading', shape=0, default=0) + if cur_speed > 0: + currentMod = 1 + currentU = np.array([cur_speed*np.cos(np.radians(cur_heading)), + cur_speed*np.sin(np.radians(cur_heading)), 0]) + + if self.ms: + self.ms.currentMod = currentMod + self.ms.current = currentU + for fowt in self.fowtList: - fowt.Xi0 = np.zeros(6) # zero platform offsets - fowt.calcTurbineConstants(case, ptfm_pitch=0.0) - fowt.calcHydroConstants(case) + if fowt.ms: + fowt.ms.currentMod = currentMod + fowt.ms.current = currentU - # calculate platform offsets and mooring system equilibrium state - self.calcMooringAndOffsets() + # ----- calculate platform offsets and mooring system equilibrium state ----- + + # figure out some settings to the equilibrium solve + db = np.array([30, 30, 5, 0.1, 0.1, 0.1]*len(self.fowtList)) # array for max step size (used manually in step func) + tols = np.array([0.05,0.05,0.05, 0.005,0.005,0.005]*len(self.fowtList)) # create vector of tolerances - tol = 0.05 rtol = tol/10 + + + # formerly def calcMooringAndOffsets(self, iCase=0): + '''Calculates mean offsets and linearized mooring properties for the current load case. + setEnv and calcSystemProps must be called first. This will ultimately become a method for solving mean operating point. + Mean offsets are saved in the FOWT object. + ''' + + def eval_func_equil(X, args): + + display = args['display'] + + # set latest positions of each FOWT + for i, fowt in enumerate(self.fowtList): + r6 = X[6*i:6*i+6] + fowt.setPosition(r6) # this updates the fowt's position and its own MoorPy system's state (including new F and K) + if self.ms: + self.ms.bodyList[i].setPosition(r6) # FOWT body in array level MoorPy system + + # update array-level mooring system's internal equilibrium (free DOFs only) + if self.ms: + self.ms.solveEquilibrium() + + + # get updated forces on each FOWT and sum them up + Fnet = np.zeros(self.nDOF) # net forces and moments on each DOF across all platforms [N,N,N,Nm,Nm,Nm,N...] + + for i, fowt in enumerate(self.fowtList): + + Xi0 = X[6*i:6*i+6] - np.array([fowt.x_ref, fowt.y_ref,0,0,0,0]) # fowt mean offset from its reference position + + # update FOWT hydrostatic loads + if statics_mod == 0 : # constant linear hydrostatics option + Fnet[6*i:6*i+6] += F_undisplaced[6*i:6*i+6] # add original hydrostatics forces + Fnet[6*i:6*i+6] += -np.matmul(K_hydrostatic[i], Xi0) # use stiffness matrix to add hydrostatic reaction forces based on offsets + elif statics_mod == 1: # switch for whether to recompute hydrostatics + fowt.calcStatics() + Fnet[6*i:6*i+6] += fowt.W_struc # weight + Fnet[6*i:6*i+6] += fowt.W_hydro # buoyancy + #breakpoint() + else: + raise Exception('Invalid statics_mod value') + + #print("W_hydro") + #printVec(fowt.W_hydro) + + # if it's a loaded case, include mean environmental loads + if case: # <<<<<< + + if forcing_mod == 0: # constant loads approach + Fnet[6*i:6*i+6] += F_env_constant[6*i:6*i+6] + + elif forcing_mod == 1: # updated loads approach + + # If list of wind speeds, set each turbine case with corresponding wind speed + if type(caseorig['wind_speed']) == list : + case['wind_speed'] = caseorig['wind_speed'][i] + + fowt.calcTurbineConstants(case, ptfm_pitch=r6[4]) # for turbine forces >>> still need to update to use current fowt pose <<< + fowt.calcHydroConstants(case, memberList=fowt.memberList) # prep for drag force (and eventually mean drift) + #for rotor in fowt.rotorList: # for blade members (bladeMemberList will be empty if rotors are not underwater) ?? + #fowt.calcHydroConstants(case, memberList=rotor.bladeMemberList*rotor.nBlades, Rotor=rotor) ?? + + Fnet[6*i:6*i+6] += np.sum(fowt.f_aero0, axis=1) # sum mean turbine force across turbines + # F_meanDrift = self.fowtList[0].Fhydro_2nd_mean[iCase, :] # wave mean drift to be added + Fnet[6*i:6*i+6] += fowt.calcCurrentLoads(case) # current drag force i.e. fowt.D_hydro + + + # This could eventually include FLORIS. If it's slow, FLORIS could be updated only every 5 or 10 iterations... + + # mooring forces (includes if currents were updated above) + Fnet[6*i:6*i+6] += fowt.F_moor0 # fowt.ms.bodyList[0].getForces(lines_only=True) # individual mooring forces + if self.ms: + Fnet[6*i:6*i+6] += self.ms.bodyList[i].getForces(lines_only=True) # array-level mooring forces + + + # note that the above also calculates many stiffnes terms that are used in step_func_equil + + + if display > 1: + print("Net forces") + printVec(Fnet) + + Y = Fnet + + oths = dict(status=1) # other outputs - returned as dict for easy use + + if display > 0: + RMSeForce = np.linalg.norm([Y[6*i :6*i+3] for i in range(self.nFOWT)]) + RMSeMoment = np.linalg.norm([Y[6*i+3:6*i+6] for i in range(self.nFOWT)]) + print(f"Iteration RMS force and moment errors: {RMSeForce:8.2e} {RMSeMoment:8.2e}") + if RMSeForce < 100 and RMSeMoment < 100: + if display > 1: + breakpoint() + else: + print('Warning: RMS error of equilibrium forces or moments exceeds 100.') + + + return Y, oths, False + + + def step_func_equil(X, args, Y, oths, Ytarget, err, tol_, iter, maxIter): + '''This function will get the stiffness of the array, ideally analytically. + Most stiffness terms should have already been calculated during RAFT functions + called by eval_func_equil for the current position iteration. + ''' + + K = np.zeros ([self.nDOF,self.nDOF]) # total stiffness matrix to be filled in + + # add array mooring system stiffness (if applicable) + if self.ms: + Kmoor = self.ms.getCoupledStiffnessA(lines_only=True) + K += Kmoor + + # get stiffness of each fowt (hydrostatics, individual mooring, etc.) + for i, fowt in enumerate(self.fowtList): + K6 = np.zeros([6,6]) + + if statics_mod == 0: + K6 += K_hydrostatic[i] + else: + K6 += fowt.C_struc + fowt.C_hydro + + if fowt.ms: + K6 += fowt.ms.getCoupledStiffnessA(lines_only=True) + + K[6*i:6*i+6, 6*i:6*i+6] += K6 + + # could get any stiffness effects from wakes or currents, though probably negligible + + # TODO: if there isn't any array-level stiffness coupling, could simply solve each fowt individually <<< + + + # --- adjust positions according to stiffness matrix to move toward net zero forces --- + + kmean = np.mean(K.diagonal()) # mean value of diagonal stiffness entries + + for i in range(self.nDOF): # go through DOFs and adjust any zero stiffness diagonals + if K[i,i] == 0: + K[i,i] = kmean # apply some stifness just to keep things working... + elif K[i,i] < 0: + pass #breakpoint() <<< + + try: + if self.nDOF > 36: # if huge, count on the system being sparse and use a sparse solver + # import relevant packages + import warnings + from scipy.sparse import csr_matrix + from scipy.sparse.linalg import spsolve, MatrixRankWarning + + with warnings.catch_warnings(): + warnings.simplefilter("error", category=MatrixRankWarning) + Kcsr = csr_matrix(K) + dX = spsolve(Kcsr, Y) + + else: # normal approach + dX = np.linalg.solve(K, Y) # calculate position adjustment according to Newton's method + + if np.linalg.det(K) < 0: + print(f" XXXX Determinant is {np.linalg.det(K)} while sum of dx*y is {sum(dX*Y)}") + + # check sign for backward result (potentially a result of bad numerics?) and strengthen diagonals if so to straighten it out + for iTry in range(10): + if sum(dX*Y) < 0: + print(" XXXX sum(dX*Y) is negative so enlarging the diagonals") + for i in range(self.nDOF): + K[i,i] += 0.1*abs(K[i,i]) # increase the diagonal entries as a hack + + dX = np.linalg.solve(K, Y) + + else: # (this is when things are good) + #print(f" UPDATEdet is {np.linalg.det(K)} while sum of dx*y is {sum(dX*Y)} after {iTry} adjustments") + break + + except Exception as ex: + print(f"EXCEPTION "+str(ex)) + + print("trying to enlarge the diagonals") + for i in range(self.nDOF): + K[i,i] += K[i,i] # double the diagonal entries as a hack + + try: + with warnings.catch_warnings(): + warnings.simplefilter("error", category=MatrixRankWarning) + Kcsr = csr_matrix(K) + dX = spsolve(Kcsr, Y) + print('worked') + except Exception as e2: + dX = Y/np.diag(K) + print('failed'+str(e2)+" after "+str(ex)) + + return dX + + + # Now find static equilibrium offsets + X, Y, info = dsolve2(eval_func_equil, X_initial, step_func=step_func_equil, + tol=tols, a_max=1.6, maxIter=20, display=0, args={'display': display} ) #, dodamping=True) + #X, Y, info = dsolve2(eval_func_equil, X_initial, step_func=step_func_equil, + # ytol=1e4, a_max=1.6, maxIter=20, display=0 ) #, dodamping=True) + + if display > 0: + print('New Equilibrium Position', X) + print('Remaining Forces on the Model (N)', Y) + + self.Xs2 = info['Xs'] # List of positions as it finds equilibrium for every iteration + self.Es2 = info['Es'] # List of errors that the forces are away from 0, which in this case, is the same as the forces + + + + + ''' + >>> old approach >>> + + try: + self.ms.solveEquilibrium3(DOFtype="both", tol=0.01) #, rmsTol=1.0E-5) # get the system to its equilibrium + except Exception as e: #mp.MoorPyError + print('An error occured when solving system equilibrium: '+e.message) + #raise RuntimeError('An error occured when solving unloaded equilibrium: '+error.message) + ''' + + # ::: a loop could be added here for an array ::: + for i, fowt in enumerate(self.fowtList): + + #print("Equilibrium'3' platform positions/rotations:") + #printVec(self.ms.bodyList[0].r6) + + #r6eq = X[6*i:6*i+6] + #fowt.Xi0 = r6eq[0:6] # save current mean offsets for the FOWT + + #self.ms.plot() + + print(f"Found mean offets of FOWT {i+1} with with surge = {fowt.Xi0[0]:.2f} m and pitch = {fowt.Xi0[4]*180/np.pi:.2f} deg.") + + #dsolvePlot(info) # plot solver convergence trajectories + + #breakpoint() + + ''' TODO: following sections should be checked and streamlined >>> + + + try: + C_moor, J_moor = self.ms.getCoupledStiffness(lines_only=True, tensions=True) # get stiffness matrix and tension jacobian matrix + F_moor = self.ms.getForces(DOFtype="coupled", lines_only=True) # get net forces and moments from mooring lines on Body + T_moor = self.ms.getTensions() + except Exception as e: + raise RuntimeError('An error occured when getting linearized mooring properties in offset state: '+e.message) + + # add any additional yaw stiffness that isn't included in the MoorPy model (e.g. if a bridle isn't modeled) + C_moor[5,5] += fowt.yawstiff + + self.C_moor = C_moor + self.J_moor = J_moor # jacobian of mooring line tensions w.r.t. coupled DOFs + self.F_moor = F_moor + self.T_moor = T_moor + + # store results + self.results['means'] = [] # signal this data is available by adding a section to the results dictionary + for i, fowt in enumerate(self.fowtList): + self.results['means'].append({}) + self.results['means'][i]['aero force' ] = fowt.f_aero0 + self.results['means'][i]['platform offset' ] = fowt.r6 + self.results['means'][i]['mooring force' ] = F_moor + self.results['means'][i]['fairlead tensions'] = np.array([np.linalg.norm(self.ms.pointList[id-1].getForces()) for id in self.ms.bodyList[0].attachedP]) + + + # mean tower base bending moment + m_turbine = np.zeros([len(self.fowtList), max([len(self.fowtList[j].mtower) for j in range(len(self.fowtList))])]) + zCG_turbine = np.zeros_like(m_turbine) + zBase = np.zeros_like(m_turbine) + hArm = np.zeros_like(m_turbine) + self.results['means']['Mbase'] = np.zeros_like(m_turbine) + for j in range(len(self.fowtList)): + for i in range(len(self.fowtList[j].mtower)): + m_turbine[j,i] = self.fowtList[j].mtower[i] + self.fowtList[j].mRNA[i] # total masses of each turbine + zCG_turbine[j,i] = (self.fowtList[j].rCG_tow[i][2]*self.fowtList[j].mtower[i] # CoG of each turbine + + self.fowtList[j].hHub[i]*self.fowtList[j].mRNA[i])/m_turbine[j,i] + zBase[j,i] = self.fowtList[j].memberList[self.fowtList[j].nplatmems + i].rA[2] # tower base elevation [m] + hArm[j,i] = zCG_turbine[j,i] - zBase[j,i] # vertical distance from tower base to turbine CG [m] + self.results['means']['Mbase'][j,i] = m_turbine[j,i]*self.fowtList[j].g * hArm[j,i]*np.sin(r6eq[4]) + transformForce(self.fowtList[j].f_aero0[:,i], offset=[0,0,-hArm[j,i]])[4] # mean moment from weight and thrust + + # update values based on offsets if applicable for fowt in self.fowtList: fowt.calcTurbineConstants(case, ptfm_pitch=fowt.Xi0[4]) - # fowt.calcHydroConstants(case) (hydrodynamics don't account for offset, so far) + # fowt.calcHydroConstants(case) (hydrodynamics don't account for offset, so far) + # <<<<< can change the above once we support nonlinear hydrostatics # (could solve mooring and offsets a second time, but likely overkill) # self.calcMooringAndOffsets() - + ''' + def solveDynamics(self, case, tol=0.01, conv_plot=0, RAO_plot=0): '''After all constant parts have been computed, call this to iterate through remaining terms @@ -545,9 +937,12 @@ def solveDynamics(self, case, tol=0.01, conv_plot=0, RAO_plot=0): nIter = int(self.nIter) + 1 # maybe think of a better name for the first nIter XiStart = self.XiStart - - # total system complex response amplitudes (this gets updated each iteration) - XiLast = np.zeros([self.nDOF,self.nw], dtype=complex) + XiStart # displacement and rotation complex amplitudes [m, rad] + + # fowt matrices + M_lin = [] + B_lin = [] + C_lin = [] + F_lin = [] if conv_plot: fig, ax = plt.subplots(3,1,sharex=True) @@ -555,120 +950,233 @@ def solveDynamics(self, case, tol=0.01, conv_plot=0, RAO_plot=0): c = cm.jet((c-np.min(c))/(np.max(c)-np.min(c))) # set up colormap to use to plot successive iteration results # ::: a loop could be added here for an array ::: - fowt = self.fowtList[0] - i1 = 0 # range of DOFs for the current turbine - i2 = 6 - - # >>>> NOTE: Turbulent wind excitation is currently disabled pending formulation checks/fixes <<<< - print('Solving for system response to wave excitation') - fowt.F_aero = fowt.F_aero*0 # <<<< a separate solve needs to be added for wind-driven response <<<< - - # sum up all linear (non-varying) matrices up front - M_lin = np.sum(fowt.A_aero, axis=3) + fowt.M_struc[:,:,None] + fowt.A_BEM + fowt.A_hydro_morison[:,:,None] # mass - B_lin = np.sum(fowt.B_aero, axis=3) + fowt.B_struc[:,:,None] + fowt.B_BEM # damping - C_lin = fowt.C_struc + self.C_moor + fowt.C_hydro # stiffness - F_lin = np.sum(fowt.F_aero, axis=2) + fowt.F_BEM + fowt.F_hydro_iner # excitation - - # start fixed point iteration loop for dynamics - for iiter in range(nIter): + # Loop through each fowt to calculate its independent response to wave excitation. + # This is the iterative linearization stage to get individual impedance matrices. + for i, fowt in enumerate(self.fowtList): + i1 = i*6 # range of DOFs for the current turbine + i2 = i*6+6 - # initialize/zero total system coefficient arrays - M_tot = np.zeros([self.nDOF,self.nDOF,self.nw]) # total mass and added mass matrix [kg, kg-m, kg-m^2] - B_tot = np.zeros([self.nDOF,self.nDOF,self.nw]) # total damping matrix [N-s/m, N-s, N-s-m] - C_tot = np.zeros([self.nDOF,self.nDOF,self.nw]) # total stiffness matrix [N/m, N, N-m] - F_tot = np.zeros([self.nDOF,self.nw], dtype=complex) # total excitation force/moment complex amplitudes vector [N, N-m] - - Z = np.zeros([self.nDOF,self.nDOF,self.nw], dtype=complex) # total system impedance matrix - - - # a loop could be added here for an array - fowt = self.fowtList[0] + # total FOWT complex response amplitudes (this gets updated each iteration) + XiLast = np.zeros([fowt.nDOF,self.nw], dtype=complex) + XiStart # displacement and rotation complex amplitudes [m, rad] - # get linearized terms for the current turbine given latest amplitudes - B_linearized, F_linearized = fowt.calcLinearizedTerms(XiLast) + # calculate linear wave excitation forces for this case (THIS IS A NEW WAY OF DOING THIS)<<< + fowt.calcHydroExcitation(case, memberList=fowt.memberList) - # calculate the response based on the latest linearized terms - Xi = np.zeros([self.nDOF,self.nw], dtype=complex) # displacement and rotation complex amplitudes [m, rad] + # add up coefficients for any number of turbines + if fowt.nrotors> 0: + M_turb = np.sum(fowt.A_aero, axis=3) + B_turb = np.sum(fowt.B_aero, axis=3) + else: + M_turb = np.zeros([6,6,self.nw]) + B_turb = np.zeros([6,6,self.nw]) + + # >>>> NOTE: Turbulent wind excitation is currently disabled pending formulation checks/fixes <<<< + print('Solving for system response to wave excitation in primary wave direction') + + # sum up all linear (non-varying) matrices up front, including potential summation across multiple rotors + M_lin.append( M_turb + fowt.M_struc[:,:,None] + fowt.A_BEM + fowt.A_hydro_morison[:,:,None] ) # mass + B_lin.append( B_turb + fowt.B_struc[:,:,None] + fowt.B_BEM + np.sum(fowt.B_gyro, axis=2)[:,:,None] ) # damping + C_lin.append( fowt.C_struc + fowt.C_moor + fowt.C_hydro ) # stiffness + F_lin.append( fowt.F_BEM[0,:,:] + fowt.F_hydro_iner[0,:,:] ) # consider only excitation from the primary sea state in the load case for now + + #F_lin = np.sum(fowt.F_aero, axis=2) + fowt.F_BEM + np.sum(fowt.F_hydro_iner, axis=0) # excitation + + # start fixed point iteration loop for dynamics of the individual FOWT + for iiter in range(nIter): + + # initialize/zero total system coefficient arrays + M_tot = np.zeros([fowt.nDOF,fowt.nDOF,self.nw]) # total mass and added mass matrix [kg, kg-m, kg-m^2] + B_tot = np.zeros([fowt.nDOF,fowt.nDOF,self.nw]) # total damping matrix [N-s/m, N-s, N-s-m] + C_tot = np.zeros([fowt.nDOF,fowt.nDOF,self.nw]) # total stiffness matrix [N/m, N, N-m] + F_tot = np.zeros([fowt.nDOF,self.nw], dtype=complex) # total excitation force/moment complex amplitudes vector [N, N-m] - # add fowt's terms to system matrices (BEM arrays are not yet included here) - M_tot[:,:,:] = M_lin - B_tot[:,:,:] = B_lin + B_linearized[:,:,None] - C_tot[:,:,:] = C_lin[:,:,None] - F_tot[: ,:] = F_lin + F_linearized + Z = np.zeros([fowt.nDOF,fowt.nDOF,self.nw], dtype=complex) # total fowt impedance matrix - for ii in range(self.nw): - # form impedance matrix - Z[:,:,ii] = -self.w[ii]**2 * M_tot[:,:,ii] + 1j*self.w[ii]*B_tot[:,:,ii] + C_tot[:,:,ii] + # a loop could be added here for an array + # fowt = self.fowtList[0] <<< so far I'm thinking iterative for individual FOWTs rather than whole system... exception would be very stiff shared moorings + + # get linearized terms for the current turbine given latest amplitudes + B_linearized = fowt.calcHydroLinearization(XiLast) + F_linearized = fowt.calcDragExcitation(0) # just looking at first sea state (wave heading) for the sake of linearization - # solve response (complex amplitude) - Xi[:,ii] = np.linalg.solve(Z[:,:,ii], F_tot[:,ii]) + # calculate the response based on the latest linearized terms + Xi = np.zeros([fowt.nDOF,self.nw], dtype=complex) # displacement and rotation complex amplitudes [m, rad] + + # add fowt's terms to system matrices (BEM arrays are not yet included here) + M_tot[:,:,:] = M_lin[i] + B_tot[:,:,:] = B_lin[i] + B_linearized[:,:,None] + C_tot[:,:,:] = C_lin[i][:,:,None] + F_tot[: ,:] = F_lin[i] + F_linearized + + + for ii in range(self.nw): + # form impedance matrix + Z[:,:,ii] = -self.w[ii]**2 * M_tot[:,:,ii] + 1j*self.w[ii]*B_tot[:,:,ii] + C_tot[:,:,ii] + + # solve response (complex amplitude) + Xi[:,ii] = np.linalg.solve(Z[:,:,ii], F_tot[:,ii]) + if conv_plot: + # Convergence Plotting + # plots of surge response at each iteration for observing convergence + ax[0].plot(self.w, np.abs(Xi[0,:]) , color=c[iiter], label=f"iteration {iiter}") + ax[1].plot(self.w, np.real(Xi[0,:]), color=c[iiter], label=f"iteration {iiter}") + ax[2].plot(self.w, np.imag(Xi[0,:]), color=c[iiter], label=f"iteration {iiter}") + + # check for convergence + tolCheck = np.abs(Xi - XiLast) / ((np.abs(Xi)+tol)) + if (tolCheck < tol).all(): + print(f" Iteration {iiter}, converged (largest change is {np.max(tolCheck):.5f} < {tol})") + break + else: + XiLast = 0.2*XiLast + 0.8*Xi # use a mix of the old and new response amplitudes to use for the next iteration + # (uses hard-coded successive under relaxation for now) + print(f" Iteration {iiter}, unconverged (largest change is {np.max(tolCheck):.5f} >= {tol})") + + if iiter == nIter-1: + print("WARNING - solveDynamics iteration did not converge to the tolerance.") + + if conv_plot: - # Convergence Plotting - # plots of surge response at each iteration for observing convergence - ax[0].plot(self.w, np.abs(Xi[0,:]) , color=c[iiter], label=f"iteration {iiter}") - ax[1].plot(self.w, np.real(Xi[0,:]), color=c[iiter], label=f"iteration {iiter}") - ax[2].plot(self.w, np.imag(Xi[0,:]), color=c[iiter], label=f"iteration {iiter}") - - # check for convergence - tolCheck = np.abs(Xi - XiLast) / ((np.abs(Xi)+tol)) - if (tolCheck < tol).all(): - print(f" Iteration {iiter}, converged (largest change is {np.max(tolCheck):.5f} < {tol})") - break - else: - XiLast = 0.2*XiLast + 0.8*Xi # use a mix of the old and new response amplitudes to use for the next iteration - # (uses hard-coded successive under relaxation for now) - print(f" Iteration {iiter}, unconverged (largest change is {np.max(tolCheck):.5f} >= {tol})") - - if iiter == nIter-1: - print("WARNING - solveDynamics iteration did not converge to the tolerance.") + # labels for convergence plots + ax[1].legend() + ax[0].set_ylabel("response magnitude") + ax[1].set_ylabel("response, real") + ax[2].set_ylabel("response, imag") + ax[2].set_xlabel("frequency (rad/s)") + fig.suptitle("Response convergence") + + + # Save the FOWT's impedance matrix + fowt.Z = Z + + # Now that invididual FOWT impedences matrices have been found, construct the + # system-level matrices (in case of couplings) and compute the total response + # including multiple excitation sources. + + # 0. Construct full system matrices + + Z_sys = np.zeros([self.nDOF,self.nDOF,self.nw], dtype=complex) # total system impedance matrix + #M_sys = np.zeros([self.nDOF,self.nDOF,self.nw]) # total mass and added mass matrix [kg, kg-m, kg-m^2] + #B_sys = np.zeros([self.nDOF,self.nDOF,self.nw]) # total damping matrix [N-s/m, N-s, N-s-m] + #C_sys = np.zeros([self.nDOF,self.nDOF,self.nw]) # total stiffness matrix [N/m, N, N-m] + #F_sys = np.zeros([self.nDOF,self.nw], dtype=complex) + + # include each FOWT's individual impedance matrix + for i, fowt in enumerate(self.fowtList): + i1 = i*6 # range of DOFs for the current turbine + i2 = i*6+6 + Z_sys[i1:i2, i1:i2] += fowt.Z + #M_sys[i1:i2, i1:i2] += fowt. + #B_sys[i1:i2, i1:i2] += fowt. + #C_sys[i1:i2, i1:i2] += fowt. + + # include array-level mooring stiffness + if self.ms: + Z_sys += self.ms.getCoupledStiffnessA(lines_only=True)[:,:,None] + + + # >>> For arrays, we would want a sparse solver for Zinv. <<< + + # 1. get latest impedence matrix and invert it + #Z = Z (already done) + Zinv = np.zeros([self.nDOF,self.nDOF,self.nw], dtype=complex) # total system impedance matrix + for iw in range(self.nw): + Zinv[:,:,iw] = np.linalg.inv(Z_sys[:,:,iw]) + + # 2. calculate response for each source of excitation + # This is the sytem response tensor, including for each excitation type. + self.Xi = np.zeros([self.fowtList[0].nWaves+1,self.nDOF,self.nw], dtype=complex) + + # >>> TODO: need to make a system-level wave description, and nWaves value <<< + + # wave excitation + for ih in range(fowt.nWaves): + + F_wave = np.zeros([self.nDOF, self.nw], dtype=complex) # system wave excitation vector for this wave + + for i, fowt in enumerate(self.fowtList): + # calculate linear and nonlinear wave excitation for this FOWT and case (consider phasing due to position in array) + fowt.calcHydroExcitation(case, memberList=fowt.memberList) + F_linearized = fowt.calcDragExcitation(ih) + F_wave[i*6:i*6+6] = fowt.F_BEM[ih,:,:] + fowt.F_hydro_iner[ih,:,:] + F_linearized #+ fowt.Fhydro_2nd[ih,:,:] + + # compute system response + for iw in range(self.nw): + self.Xi[ih,:,iw] = np.matmul(Zinv[:,:,iw], F_wave[:,iw]) + + # rotor excitation + ''' + F_rotor = np.zeros([self.nDOF, self.nw], dtype=complex) + + for i, fowt in enumerate(self.fowtList): + F_rotor[i*6:i*6+6] = np.sum(fowt.F_aero, axis=2) + + for iw in range(self.nw): + self.Xi[-1,:,iw] = np.matmul(Zinv[:,:,iw], F_rotor[:,iw]) + ''' + + # store all the results in the FOWT object + for i, fowt in enumerate(self.fowtList): + fowt.Xi = self.Xi[:, i*6:i*6+6, :] # this overwrites the response in the FOWT with what's been calculated + + + # XXX 3. calculate overall response spectrum with Stot = |Hw|^2 Sw + |Hi|^2 Si + ... + # XXX Stot = np.sum(np.abs(Xi)**2, axis=0) - if conv_plot: - # labels for convergence plots - ax[1].legend() - ax[0].set_ylabel("response magnitude") - ax[1].set_ylabel("response, real") - ax[2].set_ylabel("response, imag") - ax[2].set_xlabel("frequency (rad/s)") - fig.suptitle("Response convergence") # ------------------------------ preliminary plotting of response --------------------------------- if RAO_plot: - # RAO plotting - fig, ax = plt.subplots(3,1, sharex=True) - - fowt = self.fowtList[0] - - ax[0].plot(self.w, np.abs(Xi[0,:]) , 'b', label="surge") - ax[0].plot(self.w, np.abs(Xi[1,:]) , 'g', label="sway") - ax[0].plot(self.w, np.abs(Xi[2,:]) , 'r', label="heave") - ax[1].plot(self.w, np.abs(Xi[3,:])*180/np.pi, 'b', label="roll") - ax[1].plot(self.w, np.abs(Xi[4,:])*180/np.pi, 'g', label="pitch") - ax[1].plot(self.w, np.abs(Xi[5,:])*180/np.pi, 'r', label="yaw") - ax[2].plot(self.w, fowt.zeta, 'k', label="wave amplitude (m)") - - ax[0].legend() - ax[1].legend() - ax[2].legend() - - #ax[0].set_ylim([0, 1e6]) - #ax[1].set_ylim([0, 1e9]) - - ax[0].set_ylabel("response magnitude (m)") - ax[1].set_ylabel("response magnitude (deg)") - ax[2].set_ylabel("wave amplitude (m)") - ax[2].set_xlabel("frequency (rad/s)") - + # response amplitude plotting (for first wave heading) + + for i, fowt in enumerate(self.fowtList): + + fig, ax = plt.subplots(7,1, sharex=True) + + ax[0].plot(self.w, np.abs(fowt.Xi[0,0,:]) , 'k' , label="magnitude") + ax[1].plot(self.w, np.abs(fowt.Xi[0,1,:]) , 'k' ) + ax[2].plot(self.w, np.abs(fowt.Xi[0,2,:]) , 'k' ) + ax[3].plot(self.w, np.abs(fowt.Xi[0,3,:])*180/np.pi, 'k' ) + ax[4].plot(self.w, np.abs(fowt.Xi[0,4,:])*180/np.pi, 'k' ) + ax[5].plot(self.w, np.abs(fowt.Xi[0,5,:])*180/np.pi, 'k' ) + ax[6].plot(self.w, fowt.zeta[0,:] , 'k' ) + + ax[0].plot(self.w, np.real(fowt.Xi[0,0,:]) , ':g', label='real') + ax[1].plot(self.w, np.real(fowt.Xi[0,1,:]) , ':g') + ax[2].plot(self.w, np.real(fowt.Xi[0,2,:]) , ':g') + ax[3].plot(self.w, np.real(fowt.Xi[0,3,:])*180/np.pi, ':g') + ax[4].plot(self.w, np.real(fowt.Xi[0,4,:])*180/np.pi, ':g') + ax[5].plot(self.w, np.real(fowt.Xi[0,5,:])*180/np.pi, ':g') + + ax[0].plot(self.w, np.imag(fowt.Xi[0,0,:]) , ':r', label='imag') + ax[1].plot(self.w, np.imag(fowt.Xi[0,1,:]) , ':r') + ax[2].plot(self.w, np.imag(fowt.Xi[0,2,:]) , ':r') + ax[3].plot(self.w, np.imag(fowt.Xi[0,3,:])*180/np.pi, ':r') + ax[4].plot(self.w, np.imag(fowt.Xi[0,4,:])*180/np.pi, ':r') + ax[5].plot(self.w, np.imag(fowt.Xi[0,5,:])*180/np.pi, ':r') + + ax[0].legend() - self.Xi = Xi + #ax[0].set_ylim([0, 1e6]) + #ax[1].set_ylim([0, 1e9]) + + ax[0].set_ylabel("Surge (m)") + ax[1].set_ylabel("Sway (m)") + ax[2].set_ylabel("Heave (m)") + ax[3].set_ylabel("Roll (deg)") + ax[4].set_ylabel("Pitch (deg)") + ax[5].set_ylabel("Yaw (deg)") + ax[6].set_ylabel("wave amplitude (m)") + ax[6].set_xlabel("frequency (rad/s)") + self.results['response'] = {} # signal this data is available by adding a section to the results dictionary - return Xi # currently returning the response rather than saving in the model object + return self.Xi # is it better to return the response or save it in the model object? Or in the FOWT objects? <<< @@ -685,23 +1193,21 @@ def calcOutputs(self): self.results['properties']['tower mass'] = fowt.mtower self.results['properties']['tower CG'] = fowt.rCG_tow - self.results['properties']['substructure mass'] = fowt.msubstruc + self.results['properties']['substructure mass'] = fowt.m_sub self.results['properties']['substructure CG'] = fowt.rCG_sub - self.results['properties']['shell mass'] = fowt.mshell - self.results['properties']['ballast mass'] = fowt.mballast + self.results['properties']['shell mass'] = fowt.m_shell + self.results['properties']['ballast mass'] = fowt.m_ballast self.results['properties']['ballast densities'] = fowt.pb self.results['properties']['total mass'] = fowt.M_struc[0,0] - self.results['properties']['total CG'] = fowt.rCG_TOT - #self.results['properties']['roll inertia at subCG'] = fowt.I44 - #self.results['properties']['pitch inertia at subCG'] = fowt.I55 - #self.results['properties']['yaw inertia at subCG'] = fowt.I66 - self.results['properties']['roll inertia at subCG'] = fowt.M_struc_subCM[3,3] - self.results['properties']['pitch inertia at subCG'] = fowt.M_struc_subCM[4,4] - self.results['properties']['yaw inertia at subCG'] = fowt.M_struc_subCM[5,5] - - self.results['properties']['Buoyancy (pgV)'] = fowt.rho_water*fowt.g*fowt.V - self.results['properties']['Center of Buoyancy'] = fowt.rCB - self.results['properties']['C stiffness matrix'] = fowt.C_hydro + self.results['properties']['total CG'] = fowt.rCG + self.results['properties']['roll inertia at subCG'] = fowt.props['Ixx_sub'] + self.results['properties']['pitch inertia at subCG'] = fowt.props['Iyy_sub'] + self.results['properties']['yaw inertia at subCG'] = fowt.props['Izz_sub'] + + self.results['properties']['buoyancy (pgV)'] = fowt.rho_water*fowt.g*fowt.V + self.results['properties']['center of buoyancy'] = fowt.rCB + self.results['properties']['C hydrostatic'] = fowt.C_hydro + self.results['properties']['C system'] = fowt.C_struc + fowt.C_hydro + self.C_moor0 # unloaded equilibrium <<< @@ -709,14 +1215,14 @@ def calcOutputs(self): self.results['properties']['C_lines0'] = self.C_moor0 # 6DOF matrices for the support structure (everything but turbine) including mass, hydrostatics, and mooring reactions - self.results['properties']['M support structure'] = fowt.M_struc_subCM # mass matrix + self.results['properties']['M support structure'] = fowt.M_struc_sub # mass matrix (about PRP) self.results['properties']['A support structure'] = fowt.A_hydro_morison + fowt.A_BEM[:,:,-1] # hydrodynamic added mass (currently using highest frequency of BEM added mass) self.results['properties']['C support structure'] = fowt.C_struc_sub + fowt.C_hydro + self.C_moor0 # stiffness # ----- response outputs (always in standard units) --------------------------------------- - + ''' if 'response' in self.results: RAOmag = abs(self.Xi /fowt.zeta) # magnitudes of motion RAO @@ -724,6 +1230,7 @@ def calcOutputs(self): self.results['response']['frequencies'] = self.w/2/np.pi # Hz self.results['response']['wave elevation'] = fowt.zeta self.results['response']['Xi' ] = self.Xi + self.results['response']['surge RAO' ] = RAOmag[0,:] self.results['response'][ 'sway RAO' ] = RAOmag[1,:] self.results['response']['heave RAO' ] = RAOmag[2,:] @@ -734,7 +1241,7 @@ def calcOutputs(self): # save dynamic derived quantities #self.results['response']['mooring tensions'] = ... self.results['response']['nacelle acceleration'] = self.w**2 * (self.Xi[0] + self.Xi[4]*fowt.hHub) - + ''' return self.results @@ -745,22 +1252,25 @@ def calcOutputs(self): def plotResponses(self): '''Plots the power spectral densities of the available response channels for each case.''' - fig, ax = plt.subplots(6, 1, sharex=True) - - metrics = self.results['case_metrics'] - nCases = len(metrics['surge_avg']) + fig, ax = plt.subplots(6, 1, sharex=True, figsize=(6,6)) - for iCase in range(nCases): + # loop through each FOWT and plot its response (on the same figure for now) + for i in range(self.nFOWT): - ax[0].plot(self.w/TwoPi, TwoPi*metrics['surge_PSD'][iCase,:] ) # surge - ax[1].plot(self.w/TwoPi, TwoPi*metrics['heave_PSD'][iCase,:] ) # heave - ax[2].plot(self.w/TwoPi, TwoPi*metrics['pitch_PSD'][iCase,:] ) # pitch [deg] - ax[3].plot(self.w/TwoPi, TwoPi*metrics['AxRNA_PSD'][iCase,:] ) # nacelle acceleration - ax[4].plot(self.w/TwoPi, TwoPi*metrics['Mbase_PSD'][iCase,:] ) # tower base bending moment (using FAST's kN-m) - ax[5].plot(self.w/TwoPi, TwoPi*metrics['wave_PSD' ][iCase,:], label=f'case {iCase+1}') # wave spectrum - - # need a variable number of subplots for the mooring lines - #ax2[3].plot(model.w/2/np.pi, TwoPi*metrics['Tmoor_PSD'][0,3,:] ) # fairlead tension + + nCases = len(self.results['case_metrics']) + + for iCase in range(nCases): + metrics = self.results['case_metrics'][iCase][i] + ax[0].plot(self.w/TwoPi, TwoPi*metrics['surge_PSD'] ) # surge + ax[1].plot(self.w/TwoPi, TwoPi*metrics['heave_PSD'] ) # heave + ax[2].plot(self.w/TwoPi, TwoPi*metrics['pitch_PSD'] ) # pitch [deg] + ax[3].plot(self.w/TwoPi, TwoPi*metrics['AxRNA_PSD'] ) # nacelle acceleration + ax[4].plot(self.w/TwoPi, TwoPi*metrics['Mbase_PSD'] ) # tower base bending moment (using FAST's kN-m) + ax[5].plot(self.w/TwoPi, TwoPi*metrics['wave_PSD' ], label=f'FOWT {i+1}; Case {iCase+1}') # wave spectrum + + # need a variable number of subplots for the mooring lines + #ax2[3].plot(model.w/2/np.pi, TwoPi*metrics['Tmoor_PSD'][0,3,:] ) # fairlead tension ax[0].set_ylabel('surge \n'+r'(m$^2$/Hz)') ax[1].set_ylabel('heave \n'+r'(m$^2$/Hz)') @@ -778,6 +1288,83 @@ def plotResponses(self): #if nCases > 1: ax[-1].legend() fig.suptitle('RAFT power spectral densities') + fig.tight_layout() + + + def saveResponses(self, outPath): + '''Save the power spectral densities of the available response channels for each case to an output file.''' + + chooseMetrics = ['wave_PSD', 'surge_PSD', 'heave_PSD', 'pitch_PSD', 'AxRNA_PSD', 'Mbase_PSD'] + metricUnit = ['m^2/Hz', 'm^2/Hz', 'm^2/Hz', 'deg^2/Hz', '(m/s^2)^2/Hz', '(Nm)^2/Hz'] + + for i in range(self.nFOWT): + + nCases = len(self.results['case_metrics']) + + for iCase in range(nCases): + metrics = self.results['case_metrics'][iCase][i] + with open(f'{outPath}_Case{iCase}_WT{i}.txt', 'w') as file: + # Write the header + file.write('Frequency [rad/s] \t') + for metric, unit in zip(chooseMetrics, metricUnit): + file.write(f'{metric} [{unit}] \t') + file.write('\n') + + # Write the data + for iFreq in range(len(self.w)): + file.write(f'{self.w[iFreq]:.5f} \t') + for metric in chooseMetrics: + file.write(f'{np.squeeze(metrics[metric][iFreq]):.5f} \t') + file.write('\n') + + + def plotResponses_extended(self): + '''Plots more power spectral densities of the available response channels for each case.''' + + fig, ax = plt.subplots(9, 1, sharex=True) + + # loop through each FOWT and plot its response (on the same figure for now) + for i in range(self.nFOWT): + + nCases = len(self.results['case_metrics']) + + for iCase in range(nCases): + metrics = self.results['case_metrics'][iCase][i] + ax[0].plot(self.w / TwoPi, TwoPi * metrics['surge_PSD'][:]) # surge + ax[1].plot(self.w / TwoPi, TwoPi * metrics['sway_PSD'][:]) # surge + ax[2].plot(self.w / TwoPi, TwoPi * metrics['heave_PSD'][:]) # heave + ax[3].plot(self.w / TwoPi, TwoPi * metrics['pitch_PSD'][:]) # pitch [deg] + ax[4].plot(self.w / TwoPi, TwoPi * metrics['roll_PSD'][:]) # pitch [deg] + ax[5].plot(self.w / TwoPi, TwoPi * metrics['yaw_PSD'][:]) # pitch [deg] + ax[6].plot(self.w / TwoPi, TwoPi * metrics['AxRNA_PSD'][:]) # nacelle acceleration + ax[7].plot(self.w / TwoPi, + TwoPi * metrics['Mbase_PSD'][:]) # tower base bending moment (using FAST's kN-m) + ax[8].plot(self.w / TwoPi, TwoPi * metrics['wave_PSD'][ :], + label=f'case {iCase + 1}') # wave spectrum + + # need a variable number of subplots for the mooring lines + # ax2[3].plot(model.w/2/np.pi, TwoPi*metrics['Tmoor_PSD'][0,3,:] ) # fairlead tension + + ax[0].set_ylabel('surge \n' + r'(m$^2$/Hz)') + ax[1].set_ylabel('sway \n' + r'(m$^2$/Hz)') + ax[2].set_ylabel('heave \n' + r'(m$^2$/Hz)') + ax[3].set_ylabel('pitch \n' + r'(deg$^2$/Hz)') + ax[4].set_ylabel('roll \n' + r'(deg$^2$/Hz)') + ax[5].set_ylabel('yaw \n' + r'(deg$^2$/Hz)') + ax[6].set_ylabel('nac. acc. \n' + r'((m/s$^2$)$^2$/Hz)') + ax[7].set_ylabel('twr. bend \n' + r'((Nm)$^2$/Hz)') + ax[8].set_ylabel('wave elev.\n' + r'(m$^2$/Hz)') + + # ax[0].set_ylim([0.0, 25]) + # ax[1].set_ylim([0.0, 15]) + # ax[2].set_ylim([0.0, 4]) + # ax[-1].set_xlim([0.03, 0.15]) + ax[-1].set_xlabel('frequency (Hz)') + + # if nCases > 1: + ax[-1].legend() + fig.suptitle('RAFT power spectral densities') + @@ -804,9 +1391,10 @@ def preprocess_HAMS(self, dw=0, wMax=0, dz=0, da=0): self.fowtList[0].calcBEM(dw=dw, wMax=wMax, dz=dz, da=da) - def plot(self, ax=None, hideGrid=False, draw_body=True, color='k', nodes=0, - xbounds=None, ybounds=None, zbounds=None, plot_rotor=True, airfoils=False, station_plot=[], - plot_water=False, plot_soil=False): + def plot(self, ax=None, hideGrid=False, draw_body=True, color=None, nodes=0, + xbounds=None, ybounds=None, zbounds=None, plot_rotor=True, airfoils=False, + station_plot=[], zorder=2, figsize=(6,4), plot_water=False, plot_soil=False): + '''plots the whole model, including FOWTs and mooring system...''' # for now, start the plot via the mooring system, since MoorPy doesn't yet know how to draw on other codes' plots @@ -816,17 +1404,28 @@ def plot(self, ax=None, hideGrid=False, draw_body=True, color='k', nodes=0, #fig = plt.figure(figsize=(20/2.54,12/2.54)) #ax = Axes3D(fig) - # if axes not passed in, make a new figure + # if axes not passed in, make a new figure if ax == None: - fig, ax = self.ms.plot(color=color, draw_body=draw_body, xbounds=xbounds, ybounds=ybounds, zbounds=zbounds) + if self.ms: + fig, ax = self.ms.plot(color=color, draw_body=draw_body,figsize=figsize, + xbounds=xbounds, ybounds=ybounds, zbounds=zbounds) + else: + fig = plt.figure(figsize=figsize) + ax = plt.axes(projection='3d') + else: fig = ax.get_figure() - self.ms.plot(ax=ax, color=color, draw_body=draw_body, xbounds=xbounds, ybounds=ybounds, zbounds=zbounds) + if self.ms: + self.ms.plot(ax=ax, color=color, draw_body=draw_body, xbounds=xbounds, ybounds=ybounds, zbounds=zbounds) # plot each FOWT - for ifowt in self.fowtList: - ifowt.plot(ax, color=color, nodes=nodes, plot_rotor=plot_rotor, station_plot=station_plot, airfoils=airfoils) - + for fowt in self.fowtList: + fowt.plot(ax, color=color, zorder=zorder, nodes=nodes, + plot_rotor=plot_rotor, station_plot=station_plot, + airfoils=airfoils) + + set_axes_equal(ax) + if hideGrid: ax.set_xticks([]) # Hide axes ticks ax.set_yticks([]) @@ -854,6 +1453,45 @@ def plot(self, ax=None, hideGrid=False, draw_body=True, color='k', nodes=0, return fig, ax + def plot2d(self, ax=None, hideGrid=False, draw_body=True, color=None, + station_plot=[], Xuvec=[1,0,0], Yuvec=[0,0,1], figsize=(6,4)): + '''plots the whole model, including FOWTs and mooring system...''' + + # for now, start the plot via the mooring system, since MoorPy doesn't yet know how to draw on other codes' plots + #self.ms.bodyList[0].setPosition(np.zeros(6)) + #self.ms.initialize() + + #fig = plt.figure(figsize=(20/2.54,12/2.54)) + #ax = Axes3D(fig) + + # if axes not passed in, make a new figure + if ax == None: + if self.ms: + fig, ax = self.ms.plot2d(color=color, draw_body=draw_body, Xuvec=Xuvec, Yuvec=Yuvec, figsize=figsize) + else: + fig, ax = plt.subplots(1,1, figsize=figsize) + + else: + fig = ax.get_figure() + if self.ms: + self.ms.plot2d(ax=ax, color=color, draw_body=draw_body, Xuvec=Xuvec, Yuvec=Yuvec) + + # plot each FOWT + for fowt in self.fowtList: + fowt.plot2d(ax, color=color, station_plot=station_plot, Xuvec=Xuvec, Yuvec=Yuvec) + + ax.axis("equal") + + if hideGrid: + ax.set_xticks([]) # Hide axes ticks + ax.set_yticks([]) + ax.grid(False) # Hide grid lines + ax.grid(b=None) + ax.axis('off') + ax.set_frame_on(False) + + return fig, ax + def adjustBallast(self, fowt, heave_tol=1, l_fill_adj=1e-2, rtn=0, display=0): '''function to add or subtract the fill level of ballast in a member to get equilibrium heave close to 0 @@ -870,7 +1508,7 @@ def adjustBallast(self, fowt, heave_tol=1, l_fill_adj=1e-2, rtn=0, display=0): mass = (fowt.V*fowt.rho_water*fowt.g + self.F_moor0[2])/fowt.g dmass = mass - fowt.M_struc[0,0] sumFz = -fowt.M_struc[0,0]*fowt.g + fowt.V*fowt.rho_water*fowt.g + self.F_moor0[2] - heave = sumFz/(fowt.rho_water*fowt.g*fowt.body.AWP) + heave = sumFz/(fowt.rho_water*fowt.g*fowt.AWP) if display==1: print(mass, dmass, heave) # loop through each member and adjust the l_fill of each to match the volume needed to balance the mass @@ -972,7 +1610,7 @@ def adjustBallast(self, fowt, heave_tol=1, l_fill_adj=1e-2, rtn=0, display=0): # check if heave equilibrium was reached by only changing this ballast section of the member fowt.calcStatics() sumFz = -fowt.M_struc[0,0]*fowt.g + fowt.V*fowt.rho_water*fowt.g + self.F_moor0[2] - heave = sumFz/(fowt.rho_water*fowt.g*fowt.body.AWP) + heave = sumFz/(fowt.rho_water*fowt.g*fowt.AWP) if display==1: print('heave', heave, heave_tol) if abs(heave) < heave_tol: # congrats, you've ballasted to achieve the given heave tolerance member_break_flag=True # break out of the outer member for loop as well @@ -991,7 +1629,7 @@ def adjustBallast(self, fowt, heave_tol=1, l_fill_adj=1e-2, rtn=0, display=0): """ fowt.calcStatics() sumFz = -fowt.M_struc[0,0]*fowt.g + fowt.V*fowt.rho_water*fowt.g + self.F_moor0[2] - heave = sumFz/(fowt.rho_water*fowt.g*fowt.body.AWP) + heave = sumFz/(fowt.rho_water*fowt.g*fowt.AWP) while abs(heave) > 0.5: #print(f'Adjusting ballast since the heave is {heave:6.2f} m') for i in range(len(fowt.memberList)): @@ -1003,7 +1641,7 @@ def adjustBallast(self, fowt, heave_tol=1, l_fill_adj=1e-2, rtn=0, display=0): # >>>>>> fyi there could be an else case where no members have ballast initially <<<<< fowt.calcStatics() sumFz = -fowt.M_struc[0,0]*fowt.g + fowt.V*fowt.rho_water*fowt.g + self.F_moor0[2] - heave = sumFz/(fowt.rho_water*fowt.g*fowt.body.AWP) + heave = sumFz/(fowt.rho_water*fowt.g*fowt.AWP) """ if rtn: @@ -1030,7 +1668,7 @@ def adjustBallastDensity(self, fowt): # compute ballast and check initial offset fowt.calcStatics() sumFz = -fowt.M_struc[0,0]*fowt.g + fowt.V*fowt.rho_water*fowt.g + self.F_moor0[2] - heave = sumFz/(fowt.rho_water*fowt.g*fowt.body.AWP) + heave = sumFz/(fowt.rho_water*fowt.g*fowt.AWP) print(f" Original sumFz is {sumFz/1000:.0f} kN and heave is ~{heave:.3f} m") # total up the ballast volume @@ -1060,7 +1698,7 @@ def adjustBallastDensity(self, fowt): # recompute ballast and check adjusted offset fowt.calcStatics() sumFz = -fowt.M_struc[0,0]*fowt.g + fowt.V*fowt.rho_water*fowt.g + self.F_moor0[2] - heave = sumFz/(fowt.rho_water*fowt.g*fowt.body.AWP) + heave = sumFz/(fowt.rho_water*fowt.g*fowt.AWP) print(f" New sumFz is {sumFz/1000:.0f} kN and heave is ~{heave:.3f} m") @@ -1115,17 +1753,307 @@ def adjustWISDEM(self, old_wisdem_file, new_wisdem_file): with open(new_wisdem_file, "w", encoding="utf-8") as f: yaml.dump(wisdem_design, f) + def powerThrustCurve(self,nfowt, nrotor, uhubs, heading, yaw, plot = False ): + ''' + Parameters + ---------- + vhubs : array + Array of wind speeds for power thrust curves. + Returns + ------- + None. + + ''' + #store case data then delete for now + casedata = self.design['cases']['data'] + self.design['cases']['data'] = [] + cp = [] + ct = [] + pitch = [] + + power = [] + thrust = [] + for uhub in uhubs: + if uhub >= 3 and uhub <=25: + self.design['cases']['data'] = [[uhub, heading, 0.1, 'operating', yaw, 'JONSWAP', 0,0,0]] + else: + self.design['cases']['data'] = [[uhub, heading, 0.1, 'parked', yaw, 'JONSWAP', 0,0,0]] + case = dict(zip( self.design['cases']['keys'], self.design['cases']['data'][0])) + self.solveStatics(case=case) + + + # Calculate platform pitch + rot = self.fowtList[nfowt].rotorList[nrotor] + turbine_tilt = np.arctan2(rot.q[2], rot.q[0]) # [rad] front facing up is positive + + + + # Not sure how the pitch angle should be handled if wind comes at angle..... + loads, derivs = self.fowtList[nfowt].rotorList[nrotor].runCCBlade(uhub, ptfm_pitch=turbine_tilt, ) + cp.append(loads["CP"][0]) + ct.append(loads["CT"][0]) + pitch.append(rad2deg(self.fowtList[nfowt].Xi0[4])) + + power.append(self.fowtList[nfowt].rotorList[nrotor].aero_power) + thrust.append(self.fowtList[nfowt].rotorList[nrotor].aero_thrust) + + if plot: + fig, ax = plt.subplots(3,1, sharex = True) + plotvars = [cp, ct,pitch] + ylabels = ["Power Coef", "Thrust Coef", "Ptfm Pitch (deg)"] + for i in range(0, 3): + ax[i].plot(uhubs, plotvars[i]) + ax[i].set_ylabel(ylabels[i]) + ax[2].set_xlabel('Wind Speed (m/s)') + + + fig, ax = plt.subplots(2,1, sharex = True) + plotvars = [power, thrust] + ylabels = ["Power", "Thrust"] + for i in range(0, 2): + ax[i].plot(uhubs, plotvars[i]) + ax[i].set_ylabel(ylabels[i]) + ax[1].set_xlabel('Wind Speed (m/s)') + + self.design['cases']['data'] = casedata + + return cp, ct, pitch + + + def florisCoupling(self, config, turbconfig, path ): + ''' + Function to set up FLORIS interface, using parameters from the RAFT model. + Takes in base yaml files for floris configuration and turbine configuration and updates the + turbine locations, shear, air density, rotor diameter, power-thrust curve. Iterates through each + RAFT case and calculates turbine power matrix + + NOTE: this function writes a new turbine yaml file for each turbine. + Parameters + ---------- + config : str + Name of floris config yaml file for basis of floris interface + turbconfig : List of str + List of turbine yaml files that corresponds to RAFT turbine IDs + path : str + Path to turbine library of yaml files + ''' + from floris.tools import FlorisInterface + + # Setup FLORIS interface using base yaml file + self.fi = FlorisInterface(config) + + # Update floris interface settings to match RAFT design + self.fi.reinitialize(air_density = self.design["site"]["rho_air"], wind_shear = self.design["site"]["shearExp"]) + fowtInfo = [dict(zip( self.design['array']['keys'], row)) for row in self.design['array']['data']] + self.fi.reinitialize(layout_x=[fowtInfo[j]["x_location"] for j in range(0,len(fowtInfo))], layout_y=[fowtInfo[j]["y_location"] for j in range(0,len(fowtInfo))]) + + # create new turbine yaml file for each turbine with a unique turbine, platform, mooring, or heading adjustment + # this is because these effect the pitch of the platform in the power-thrust curve + # FLORIS reinitialize function calls on the turbine yaml files whenever reinitialize is called + + turblist = [] + uniqueLists =[] + for l in range(len(self.design['cases']['data'])): + case = dict(zip( self.design['cases']['keys'], self.design['cases']['data'][l])) + + #list of lists for turbine yaml references + turblist.append([]) + uniqueLists.append([]) + + for i in range(self.nFOWT): + turbID = fowtInfo[i]['turbineID'] + + #Check if turbine has unique platform, turbine, mooring, or rotation ... if so, calculate new power thrust curve + IDList = [fowtInfo[i]['turbineID'], fowtInfo[i]['platformID'], fowtInfo[i]['mooringID'], fowtInfo[i]['heading_adjust']] + if IDList in uniqueLists[l]: + for j, ulist in enumerate(uniqueLists[l]): + if IDList == ulist: + ID = j + print('Turbine ' +str(i+1) +' is not unqiue, using Turbine ' + str(ID)+" input") + else: + + # If turbine is unique then create new ID/input file + uniqueLists[l].append(IDList) + ID = len(uniqueLists[l]) - 1 + print('Turbine ' +str(i+1) +' is unqiue, creating Turbine ' + str(ID)+ " input") + + with open(turbconfig[turbID - 1]) as file: + turbData = yaml.safe_load(file) + + #Find turbine ID and use yaml file associated with that ID as basis + turbData['hub_height'] = self.design["turbines"][turbID - 1]["hHub"] + turbData['rotor_diameter'] = self.design["turbines"][turbID - 1]["blade"][0]["Rtip"]*2 # Check this (takes the rotor radius from first blade) + turbData['ref_density_cp_ct'] = self.design["site"]["rho_air"] + + #RAFT may want to name the turbines + turbData['turbine_type'] ='turb'+str(ID)+'_case'+str(l) +'_floating' + + #Cp and Ct curves already incorporate the floating tilt... so FLORIS can ignore + turbData['floating_correct_cp_ct_for_tilt'] = False + + #set up list of hub velocities to match floris + uhubs=list(np.arange(3,25,0.5)) + #uhubs.insert(0, 0) + uhubs.append(25.02) + uhubs.append(50) + + #Currently only setup to handle one rotor + #FLORIS inputs Cp, Ct, Cq curves with a yaw misalignment of 0 and wind heading of 0 + #In reality, the mooring system stiffness would slightly change the Cp curve based on heading (because the pitch angle would change) + power, thrust, pitch = self.powerThrustCurve(i, 0, uhubs, 0, yaw = 0) + turbData['power_thrust_table']['power'] = np.array(power).tolist() + turbData['power_thrust_table']['thrust'] = np.array(thrust).tolist() + turbData['power_thrust_table']['wind_speed'] = np.array(uhubs).tolist() + + print('len winds ', len(uhubs)) + print('len pitch ', len(pitch)) + + + #Set floating tilt table only for use in Empirical Gaussian wake model (wake deflection for pitch angle) + turbData['floating_tilt_table']['wind_speeds'] = np.array(uhubs).tolist() # match roughly the wind speeds in example files + turbData['floating_tilt_table']['tilt'] = np.array(pitch).tolist() + + with open(path+'\\'+'turb'+str(ID)+'case'+str(l)+'.yaml', 'w') as file: + yaml.dump(turbData, file, sort_keys=False, default_flow_style=None) + turblist[l].append('turb'+str(ID)+'case'+str(l)+'.yaml') + + #reinitialize floris interface with updated turbine yaml files + self.fi.reinitialize(turbine_type= turblist[l], turbine_library_path= path) + + #Update for given case + self.fi.reinitialize(wind_directions = [case['wind_heading']+270], wind_speeds = [case['wind_speed']], turbulence_intensity= case['turbulence']) + + yaw_angles = np.ones([1,1,self.nFOWT]) * case['yaw_misalign'] + self.fi.calculate_wake(yaw_angles=yaw_angles) + + # Get the turbine powers + turbine_powers = self.fi.get_turbine_powers()/1000. + print('The turbine power matrix should be of dimensions 1 WD X 1 WS X '+str(self.nFOWT)+' Turbines') + print('Turbine powers for case '+str(l+1)) + print(turbine_powers) + print("Shape: ",turbine_powers.shape) + + self.turblist = turblist + + def florisFindEquilibrium(self, path, plotting = True): + + if not hasattr(self, 'fi'): + raise AttributeError("Need to initialize floris coupling first") + + fowtInfo = [dict(zip( self.design['array']['keys'], row)) for row in self.design['array']['data']] + #iterate through load cases + for i in range(len(self.design['cases']['data'])): + case = dict(zip( self.design['cases']['keys'], self.design['cases']['data'][i])) + + #Reintiailize turbine yaml files (for correct case heading) + self.fi.reinitialize(turbine_type= self.turblist[i], turbine_library_path= path) + + #FLORIS inputs the wind direction as direction wind is coming from (where the -X axis is 0) + self.fi.reinitialize(wind_directions = [-case['wind_heading']+270], wind_speeds = [case['wind_speed']], turbulence_intensity= case['turbulence']) + yaw_angles = np.ones([1,1,self.nFOWT]) + + + #calc yaw misalignment to input into FLORIS + heading = case['wind_heading'] + for nfowt in range(0, (self.nFOWT)): + rot = self.fowtList[nfowt].rotorList[0] + + if rot.yaw_mode == 0: # assume aligned + nac_yaw = np.radians(heading) + + elif rot.yaw_mode == 1: # use case info + turbine_heading = getFromDict(case, 'turbine_heading', shape=0, default=0.0) # [deg] + nac_yaw = np.radians(turbine_heading - heading) + + elif rot.yaw_mode == 2: # use self.yaw value + nac_yaw = rot.yaw + else: + raise Exception('Unsupported yaw_mode value. Must be 0, 1, or 2.') + + rot.yaw = nac_yaw # save the nacelle yaw value just in case it's useful later + + # find turbine global heading and tilt + turbine_heading = np.arctan2(rot.q[1], rot.q[0]) + nac_yaw # [rad] + + # inflow misalignment heading relative to turbine heading [deg] + yaw_misalign = turbine_heading - np.radians(heading) + yaw_angles[0,0,nfowt] = np.degrees(yaw_misalign) + + print('Yaw misalignment angles: ', yaw_angles) + + + winds = [] + xpositions = [] + ypositions = [] + for n in range(0, 2): + + #solve statics to find updated turbine positions + self.solveStatics(case=case, display = 1) + + + #update floris turbine positions + self.fi.reinitialize(layout_x=[self.fowtList[nfowt].Xi0[0] + fowtInfo[nfowt]["x_location"] for nfowt in range(len(self.fowtList))], layout_y=[self.fowtList[nfowt].Xi0[1] + fowtInfo[nfowt]["y_location"] for nfowt in range(len(self.fowtList))]) + self.fi.calculate_wake(yaw_angles=yaw_angles) + print('Turbine avg vels ', self.fi.turbine_average_velocities[0][0]) + + #update wind speed list for RAFT + case['wind_speed'] = list(self.fi.turbine_average_velocities[0][0]) + winds.append(self.fi.turbine_average_velocities) + xpositions.append([self.fowtList[nfowt].Xi0[0] + fowtInfo[nfowt]["x_location"] for nfowt in range(len(self.fowtList))]) + ypositions.append( [self.fowtList[nfowt].Xi0[1] + fowtInfo[nfowt]["y_location"] for nfowt in range(len(self.fowtList))]) + + #return FLORIS turbine powers (in order of turbine list) + turbine_powers = self.fi.get_turbine_powers() + + if plotting: + import floris.tools.visualization as wakeviz + horizontal_plane = self.fi.calculate_horizontal_plane( + x_resolution=200, + y_resolution=100, + height=90.0, + yaw_angles=yaw_angles, + ) + + y_plane = self.fi.calculate_y_plane( + x_resolution=200, + z_resolution=100, + crossstream_dist=0.0, + yaw_angles=yaw_angles, + ) + cross_plane = self.fi.calculate_cross_plane( + y_resolution=100, + z_resolution=100, + downstream_dist=630.0, + yaw_angles=yaw_angles, + ) + + # Create the plots + fig, ax_list = plt.subplots(1, 1, figsize=(10, 8)) + #ax_list = ax_list.flatten() + wakeviz.visualize_cut_plane(horizontal_plane, ax=ax_list) + + cmap = plt.cm.get_cmap('viridis_r') + + #plot offset turbine positions for all iterations + for step in range(0, len(xpositions)): + ax_list.scatter(xpositions[step], ypositions[step], c=[ + cmap(step/len(xpositions))], s=100) + + #plot neutral turbine positions + for i in range(0, self.nFOWT): + ax_list.scatter(self.design['array']['data'][i][3], self.design['array']['data'][i][4],color = 'black',s = 100, marker = "x") + + return(winds,xpositions, ypositions, turbine_powers) def runRAFT(input_file, turbine_file="", plot=0, ballast=False, station_plot=[]): ''' This will set up and run RAFT based on a YAML input file. ''' - if input_file[-3:]=='pkl' or input_file[-6:]=='pickle': with open(input_file, 'rb') as pfile: design = pickle.load(pfile) @@ -1155,24 +2083,74 @@ def runRAFT(input_file, turbine_file="", plot=0, ballast=False, station_plot=[]) print(" --- analyzing unloaded ---") model.analyzeUnloaded(ballast=ballast) print(" --- analyzing cases ---") - model.analyzeCases() + model.analyzeCases(display=1) + + model.calcOutputs() if plot: - model.plot(station_plot=station_plot) + #model.plot(station_plot=station_plot, zbounds=[-model.ms.depth, model.ms.depth + 2*model.ms.bodyList[0].r6[2]], hideGrid=True, draw_body=True) + model.plot(station_plot=station_plot) model.plotResponses() #model.preprocess_HAMS("testHAMSoutput", dw=0.1, wMax=10) return model + + + +def runRAFTFarm(input_file, plot=0): + ''' + This will set up and run RAFT "Farm" based on a YAML input file. + ''' + + if input_file[-3:]=='pkl' or input_file[-6:]=='pickle': + with open(input_file, 'rb') as pfile: + design = pickle.load(pfile) + elif not isinstance(input_file, dict): + # open the design YAML file and parse it into a dictionary for passing to raft + print("\n\nLoading RAFTFarm input file: "+input_file) + with open(input_file) as file: + design = yaml.load(file, Loader=yaml.FullLoader) + else: + design = input_file + print(f"'{design['name']}'") + + # Create and run the model + print(" --- making model ---") + model = Model(design) + print('**Note: RAFTFarm cannot run model.analyzeUnloaded()') + print(" --- analyzing cases ---") + model.analyzeCases(display=1) + + print('**Note: model.calcOutputs is not supported yet for multi-turbine Farm configurations') + + if plot: + model.plot() + model.plotResponses() + + return model if __name__ == "__main__": - model = runRAFT(os.path.join(raft_dir,'designs/OC3spar.yaml'), plot=1) - model = runRAFT(os.path.join(raft_dir,'designs/OC4semi.yaml'), plot=1) - model = runRAFT(os.path.join(raft_dir,'designs/VolturnUS-S.yaml'), ballast=True, plot=1) - + ### Run a Simple Model ### + #model = runRAFT(os.path.join(raft_dir,'designs/Vertical_cylinder.yaml'), plot=1) + + ### Run a Reference FOWT Model ### + #model = runRAFT(os.path.join(raft_dir,'designs/OC3spar.yaml'), plot=1) + #model = runRAFT(os.path.join(raft_dir,'designs/OC4semi.yaml'), plot=1) + model = runRAFT(os.path.join(raft_dir,'designs/VolturnUS-S.yaml'), plot=1) + + ### Run a MHK Model ### + #model = runRAFT(os.path.join(raft_dir,'designs/FOCTT_example.yaml'), plot=1) + #model = runRAFT(os.path.join(raft_dir,'designs/RM1_Floating.yaml'), plot=1) + #model = runRAFT(os.path.join(raft_dir,'designs/test2.yaml'), plot=1) + #model = runRAFT(os.path.join(raft_dir,'designs/test2.yaml'), plot=1) + + ### Run a RAFT Farm Model ### + #model = runRAFTFarm(os.path.join(raft_dir,'designs/VolturnUS-S_farm.yaml'), plot=1) + plt.show() diff --git a/RAFT/raft/raft_rotor.py b/RAFT/raft/raft_rotor.py index 7504112f1..fe8c95248 100644 --- a/RAFT/raft/raft_rotor.py +++ b/RAFT/raft/raft_rotor.py @@ -5,14 +5,14 @@ import numpy as np import matplotlib.pyplot as plt - from raft.pyIECWind import pyIECWind_extreme +from raft.raft_member import Member from scipy.interpolate import PchipInterpolator from scipy.special import modstruve, iv -from raft.helpers import rotationMatrix, getFromDict +from raft.helpers import rotationMatrix, getFromDict, rotateMatrix3, rotateMatrix6, RotFrm2Vect try: from ccblade.ccblade import CCBlade, CCAirfoil @@ -34,7 +34,7 @@ # a class for the rotor structure, aerodynamics, and control in RAFT class Rotor: - def __init__(self, turbine, w, ir, old=False): + def __init__(self, turbine, w, ir): ''' >>>> add mean offset parameters add move this to runCCBlade<<<< ir = the index of the values in the arrays of the input file for multiple rotors @@ -42,17 +42,40 @@ def __init__(self, turbine, w, ir, old=False): # Should inherit these from raft_model or _env? self.w = np.array(w) + self.nw = len(self.w) + self.turbine = turbine # store dictionary for later use self.coords = getFromDict(turbine, 'rotorCoords', dtype=list, shape=turbine['nrotors'], default=[[0,0]])[ir] + self.speed_gain = getFromDict(turbine, 'speed_gain', shape=turbine['nrotors'], default=1.0)[ir] + + self.nBlades = getFromDict(turbine, 'nBlades', shape=turbine['nrotors'], dtype=int)[ir] # [-] - self.nBlades = getFromDict(turbine, 'nBlades', shape=turbine['nrotors'])[ir] # [-] - self.Zhub = getFromDict(turbine, 'Zhub', shape=turbine['nrotors'])[ir] # [m] + default_headings = list(np.arange(self.nBlades) * 360 / self.nBlades) # equally distribute blades + self.headings = getFromDict(turbine, 'headings', shape=-1, default=default_headings) # [deg] + + self.axis = getFromDict(turbine, 'axis', shape=turbine['nrotors'], default=[1,0,0])[ir] # unit vector of rotor axis, facing downflow [-] + + self.Zhub = getFromDict(turbine, 'hHub', shape=turbine['nrotors'])[ir] # [m] self.Rhub = getFromDict(turbine, 'Rhub', shape=turbine['nrotors'])[ir] # [m] self.precone = getFromDict(turbine, 'precone', shape=turbine['nrotors'])[ir] # [m] - self.shaft_tilt = getFromDict(turbine, 'shaft_tilt', shape=turbine['nrotors'])[ir] # [deg] + self.shaft_tilt = getFromDict(turbine, 'shaft_tilt', shape=turbine['nrotors'])[ir]*np.pi/180 # [rad] self.overhang = getFromDict(turbine, 'overhang', shape=turbine['nrotors'])[ir] # [m] self.aeroServoMod = getFromDict(turbine, 'aeroServoMod', shape=turbine['nrotors'], default=1)[ir] # flag for aeroservodynamics (0=none, 1=aero only, 2=aero and control) + self.yaw = 0 # the relative yaw rotation of this rotor, as from a yaw drive [rad] + + # how nacelle yaw is handled: 0=assume aligned, 1=use case info, 2=use self.yaw value + self.yaw_mode = getFromDict(turbine, 'yaw_mode', shape=turbine['nrotors'], dtype=int, default=0)[ir] + + # initialize absolute position/orientation variables + self.r3 = np.zeros(3) # instantaneous global position of rotor hub location + self.q = np.array([1,0,0]) # instantaneous unit vector of rotor axis, downflow + self.R = np.ones(3) # rotation matrix for platform orientation + + self.rHub = np.array([self.coords[0], self.coords[1], self.Zhub]) # save the rotor's hub coordinates in the platform reference frame [m] + + # support if blade and wt_ops are each a single dictionary or a list of dictionaries for each rotor + # note: this would only be done on the first turbine >>> we may want to move this stuff up a level, outside of each Rotor object if isinstance(turbine['blade'], dict): # if we use the entire blade dict list approach turbine['blade'] = [turbine['blade']]*turbine['nrotors'] if isinstance(turbine['wt_ops'], dict): @@ -60,8 +83,24 @@ def __init__(self, turbine, w, ir, old=False): self.R_rot = getFromDict(turbine['blade'][ir], 'Rtip', shape=-1) # otherwise, we can avoid the if statment if we use the list approach within each dict value of the blade dict + + + # Ensure the blade geometry inputs are inputted correctly + nb = len(turbine['blade']) # the number of blade types in the system. + # Reminder: Assumption is that all blades on a rotor will be the same. You can input nrotors blade types for multiple rotors, or input one blade type and have it be used for all rotors in the system + for ib in range(nb): + nr = len(turbine['blade'][0]['geometry']) # the number of nodes along the length of the blade + r0 = turbine['blade'][ib]['geometry'][0][0] # the first radius value of the blade + rtip = turbine['blade'][ib]['geometry'][-1][0] # the last radius value of the blade + if r0 >= self.Rhub and rtip <= self.R_rot: # if the geometry range lies between the hub radius and the blade length, do nothing, this is normal + pass + #elif rtip-r0 == self.R_rot-self.Rhub and r0 < self.Rhub: # if the geometry range is the right length, but starts inside the hub radius [0,length-Rhub], shift values to outside the hub [Rhub,length] + #print("WARNING: The input blade geometry radii start inside the hub, when they need to be defined outside of the hub") + #for i in range(nr): + #turbine['blade'][ib]['geometry'][i][0] += self.Rhub-r0 + elif r0 < self.Rhub or rtip > self.R_rot: # if none of the above works, then something is off with the input blade radii + raise ValueError(f"Input blade geometry is invalid. First node radius needs to be >= Rhub ({self.Rhub}) or last node radius needs to be <= Rtip ({self.R_rot})") - #yaw = 0 self.Uhub = getFromDict(turbine['wt_ops'][ir], 'v', shape=-1) self.Omega_rpm = getFromDict(turbine['wt_ops'][ir], 'omega_op', shape=-1) @@ -69,8 +108,6 @@ def __init__(self, turbine, w, ir, old=False): self.I_drivetrain = getFromDict(turbine, 'I_drivetrain', shape=turbine['nrotors'])[ir] - #self.aeroServoMod = getFromDict(turbine, 'aeroServoMod', default=1) # flag for aeroservodynamics (0=none, 1=aero only, 2=aero and control) - # Add parked pitch, rotor speed, assuming fully shut down by 40% above cut-out self.Uhub = np.r_[self.Uhub, self.Uhub.max()*1.4, 100] self.Omega_rpm = np.r_[self.Omega_rpm, 0, 0] @@ -81,6 +118,11 @@ def __init__(self, turbine, w, ir, old=False): self.ki_0 = np.zeros_like(self.Uhub) self.k_float = 0 # np.zeros_like(self.Uhub), right now this is a single value, but this may change <<< what is this? + # arrays to hold water wave velocities and accelerations if applicable + self.u = np.array([[[]]]) + self.ud = np.array([[[]]]) + + self.f0 = np.zeros(6) # mean forces and moments about hub (aligned with platform local directions) # Set CCBlade flags tiploss = True # Tip loss model True/False @@ -88,44 +130,46 @@ def __init__(self, turbine, w, ir, old=False): wakerotation = True # Wake rotation, True/False usecd = True # Use drag coefficient within BEMT, True/False - # Set discretization parameters - nSector = 4 # [-] - number of equally spaced azimuthal positions where CCBlade should be interrogated. The results are averaged across the n positions. 4 is a good first guess - n_span = 30 # [-] - number of blade stations along span - grid = np.linspace(0., 1., n_span) # equally spaced grid along blade span, root=0 tip=1 - # ----- AIRFOIL STUFF ------ - n_aoa = 200 # [-] - number of angles of attack to discretize airfoil polars - MUST BE MULTIPLE OF 4 - #n_af = len(turbine["airfoils"]) - af_used = [ b for [a,b] in turbine['blade'][ir]["airfoils"] ] - af_position = [ a for [a,b] in turbine['blade'][ir]["airfoils"] ] - n_af = len(np.unique(af_used)) - #af_used = turbine['blade']["airfoils"]["labels"] - #af_position = turbine['blade']["airfoils"]["grid"] - n_af_span = len(af_used) + + # compile info for airfoil station points along the blade + #nStations = len(turbine['blade'][ir]["airfoils"]) + station_airfoil = [ b for [a,b] in turbine['blade'][ir]["airfoils"] ] # airfoil name + station_position = [ a for [a,b] in turbine['blade'][ir]["airfoils"] ] # airfoil relative position from blade root to tip [0-1] + nStations = len(station_airfoil) # One fourth of the angles of attack from -pi to -pi/6, half between -pi/6 to pi/6, and one fourth from pi/6 to pi + n_aoa = 200 # [-] - number of angles of attack to discretize airfoil polars - MUST BE MULTIPLE OF 4 aoa = np.unique(np.hstack([np.linspace(-180, -30, int(n_aoa/4.0 + 1)), np.linspace( -30, 30, int(n_aoa/2.0),), np.linspace( 30, 180, int(n_aoa/4.0 + 1))])) - af_name = n_af * [""] - r_thick = np.zeros(n_af) + # compile info for individual airfoils + n_af = len(turbine["airfoils"]) #len(np.unique(station_airfoil)) # number of airfoils that are used in the rotor + airfoil_name = n_af * [""] # name of each listed airfoil + airfoil_thickness = np.zeros(n_af) # relative thickness of each listed airfoil (thickness/chord) + Ca = np.zeros([n_af, 2]) # added mass coefficient [edgewise, flapwise] of each airfoil for i in range(n_af): - af_name[i] = turbine["airfoils"][i]["name"] - r_thick[i] = turbine["airfoils"][i]["relative_thickness"] - + airfoil_name[i] = turbine["airfoils"][i]["name"] + airfoil_thickness[i] = turbine["airfoils"][i]["relative_thickness"] + if 'added_mass_coeff' in turbine["airfoils"][i].keys(): + Ca[i,:] = turbine["airfoils"][i]["added_mass_coeff"] + else: + Ca[i,:] = [0.5, 1.0] # default added mass coefficients if not supplied + cl = np.zeros((n_af, n_aoa, 1)) cd = np.zeros((n_af, n_aoa, 1)) cm = np.zeros((n_af, n_aoa, 1)) + cpmin = np.zeros((n_af, n_aoa, 1)) + if len(np.array(turbine["airfoils"][i]['data'])[0]) > 4: + cpmin_flag = True + else: + cpmin_flag = False # Interp cl-cd-cm along predefined grid of angle of attack for i in range(n_af): - - #cl[i, :, 0] = np.interp(aoa, turbine["airfoils"][i]["alpha"], turbine["airfoils"][i]["c_l"]) - #cd[i, :, 0] = np.interp(aoa, turbine["airfoils"][i]["alpha"], turbine["airfoils"][i]["c_d"]) - #cm[i, :, 0] = np.interp(aoa, turbine["airfoils"][i]["alpha"], turbine["airfoils"][i]["c_m"]) polar_table = np.array(turbine["airfoils"][i]['data']) @@ -133,83 +177,139 @@ def __init__(self, turbine, w, ir, old=False): cl[i, :, 0] = np.interp(aoa, polar_table[:,0], polar_table[:,1]) cd[i, :, 0] = np.interp(aoa, polar_table[:,0], polar_table[:,2]) cm[i, :, 0] = np.interp(aoa, polar_table[:,0], polar_table[:,3]) + if cpmin_flag: + cpmin[i, :, 0] = np.interp(aoa, polar_table[:,0], polar_table[:,4]) + #plt.figure() #plt.plot(polar_table[:,0], polar_table[:,1]) #plt.plot(polar_table[:,0], polar_table[:,2]) - #plt.title(af_name[i]) + #plt.title(airfoil_name[i]) if abs(cl[i, 0, 0] - cl[i, -1, 0]) > 1.0e-5: - print("WARNING: Ai " + af_name[i] + " has the lift coefficient different between + and - pi rad. This is fixed automatically, but please check the input data.") + print("WARNING: Ai " + airfoil_name[i] + " has the lift coefficient different between + and - pi rad. This is fixed automatically, but please check the input data.") cl[i, 0, 0] = cl[i, -1, 0] if abs(cd[i, 0, 0] - cd[i, -1, 0]) > 1.0e-5: - print("WARNING: Airfoil " + af_name[i] + " has the drag coefficient different between + and - pi rad. This is fixed automatically, but please check the input data.") + print("WARNING: Airfoil " + airfoil_name[i] + " has the drag coefficient different between + and - pi rad. This is fixed automatically, but please check the input data.") cd[i, 0, 0] = cd[i, -1, 0] if abs(cm[i, 0, 0] - cm[i, -1, 0]) > 1.0e-5: - print("WARNING: Airfoil " + af_name[i] + " has the moment coefficient different between + and - pi rad. This is fixed automatically, but please check the input data.") + print("WARNING: Airfoil " + airfoil_name[i] + " has the moment coefficient different between + and - pi rad. This is fixed automatically, but please check the input data.") cm[i, 0, 0] = cm[i, -1, 0] + if cpmin_flag and abs(cpmin[i, 0, 0] - cpmin[i, -1, 0]) > 1.0e-5: + print("WARNING: Airfoil " + airfoil_name[i] + " has the minimum pressure coefficient different between + and - pi rad. This is fixed automatically, but please check the input data.") + cpmin[i, 0, 0] = cpmin[i, -1, 0] - # Interpolate along blade span using a pchip on relative thickness - r_thick_used = np.zeros(n_af_span) - cl_used = np.zeros((n_af_span, n_aoa, 1)) - cd_used = np.zeros((n_af_span, n_aoa, 1)) - cm_used = np.zeros((n_af_span, n_aoa, 1)) - for i in range(n_af_span): + # Set discretization parameters + nSector = getFromDict(turbine['blade'][ir], 'nSector', default=4) # number of equally spaced azimuthal positions for CCblade to compute and average over + nr = getFromDict(turbine['blade'][ir], 'nr', default=20) # number of radial blade stations (or blade elements) to use + + grid = np.linspace(0., 1., nr, endpoint=False) + 0.5/nr # equally spaced grid along blade span, root=0 tip=1 + + + # ----- Interpolate airfoil coefficients over the blade span using a pchip on relative thickness ----- + + station_thickness = np.zeros(nStations) + station_Ca = np.zeros((nStations, 2)) + station_cl = np.zeros((nStations, n_aoa, 1)) + station_cd = np.zeros((nStations, n_aoa, 1)) + station_cm = np.zeros((nStations, n_aoa, 1)) + station_cpmin = np.zeros((nStations, n_aoa, 1)) + + # copy-paste coefficient values from airfoil database to each station point along the blade + for i in range(nStations): for j in range(n_af): - if af_used[i] == af_name[j]: - r_thick_used[i] = r_thick[j] - cl_used[i, :, :] = cl[j, :, :] - cd_used[i, :, :] = cd[j, :, :] - cm_used[i, :, :] = cm[j, :, :] + if station_airfoil[i] == airfoil_name[j]: + station_thickness[i] = airfoil_thickness[j] + station_Ca[i,:] = Ca[j,:] + station_cl[i, :, :] = cl[j, :, :] + station_cd[i, :, :] = cd[j, :, :] + station_cm[i, :, :] = cm[j, :, :] + station_cpmin[i, :, :] = cpmin[j, :, :] break - # Pchip does have an associated derivative method built-in: - # https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.PchipInterpolator.derivative.html#scipy.interpolate.PchipInterpolator.derivative - spline = PchipInterpolator - rthick_spline = spline(af_position, r_thick_used) - # GB: HAVE TO TALK TO PIETRO ABOUT THIS - #r_thick_interp = rthick_spline(grid[1:-1]) - r_thick_interp = rthick_spline(grid) - - # Spanwise interpolation of the airfoil polars with a pchip - r_thick_unique, indices = np.unique(r_thick_used, return_index=True) - cl_spline = spline(r_thick_unique, cl_used[indices, :, :]) - self.cl_interp = np.flip(cl_spline(np.flip(r_thick_interp)), axis=0) - cd_spline = spline(r_thick_unique, cd_used[indices, :, :]) - self.cd_interp = np.flip(cd_spline(np.flip(r_thick_interp)), axis=0) - cm_spline = spline(r_thick_unique, cm_used[indices, :, :]) - self.cm_interp = np.flip(cm_spline(np.flip(r_thick_interp)), axis=0) - + if np.all(station_thickness == np.flip(sorted(station_thickness))): # if the airfoils get consistently thinner toward the tip + + # Spanwise interpolation of the airfoil polars with a pchip + spline = PchipInterpolator # select spline interpolation method + + # spline interpolate airfoil thickness over evenly spaced element locations along span + rthick_spline = spline(station_position, station_thickness) + self.r_thick_interp = rthick_spline(grid) + + # make nonredundant (and sorted) list of airfoil thicknesses (and indices) + r_thick_unique, indices = np.unique(station_thickness, return_index=True) + + Ca_spline = spline(station_position, station_Ca) + self.Ca_interp = Ca_spline(grid) + + cl_spline = spline(r_thick_unique, station_cl[indices, :, :]) + self.cl_interp = np.flip(cl_spline(np.flip(self.r_thick_interp)), axis=0) + + cd_spline = spline(r_thick_unique, station_cd[indices, :, :]) + self.cd_interp = np.flip(cd_spline(np.flip(self.r_thick_interp)), axis=0) + + cm_spline = spline(r_thick_unique, station_cm[indices, :, :]) + self.cm_interp = np.flip(cm_spline(np.flip(self.r_thick_interp)), axis=0) + + cpmin_spline = spline(r_thick_unique, station_cpmin[indices, :, :]) + self.cpmin_interp = np.flip(cpmin_spline(np.flip(self.r_thick_interp)), axis=0) + + else: # if it's an atypical case with non-ordered airfoil thicknesses + # do simple span-based interpolation + breakpoint() + self.Ca_interp = np.interp(grid, station_position, station_Ca) + self.cl_interp = np.interp(grid, station_position, station_cl) + self.cd_interp = np.interp(grid, station_position, station_cd) + self.cm_interp = np.interp(grid, station_position, station_cm) + self.cpmin_interp = np.interp(grid, station_position, station_cpmin) + self.aoa = aoa # split out blade geometry info from table geometry_table = np.array(turbine['blade'][ir]['geometry']) - blade_r = geometry_table[:,0] - blade_chord = geometry_table[:,1] - blade_theta = geometry_table[:,2] - blade_precurve = geometry_table[:,3] - blade_presweep = geometry_table[:,4] + r_input = geometry_table[:,0] + self.dr = (rtip - self.Rhub)/nr + + # radial locations of blade elements for BEM + self.blade_r = np.linspace(self.Rhub, rtip, nr, endpoint=False) + self.dr/2 + + self.blade_chord = np.interp(self.blade_r, r_input, geometry_table[:,1]) + self.blade_theta = np.interp(self.blade_r, r_input, geometry_table[:,2]) + blade_precurve = np.interp(self.blade_r, r_input, geometry_table[:,3]) + blade_presweep = np.interp(self.blade_r, r_input, geometry_table[:,4]) + # <<<<<< move this to beginning, then do some interpolating to unify grid and blade_r <<<<<<< and go from above 0 to below 1 + + if self.Zhub < 0: + self.rho = turbine['rho_water'] + self.mu = turbine['mu_water'] + self.shearExp = turbine['shearExp_water'] + else: + self.rho = turbine['rho_air'] + self.mu = turbine['mu_air'] + self.shearExp = turbine['shearExp_air'] af = [] for i in range(self.cl_interp.shape[0]): af.append(CCAirfoil(self.aoa, [], self.cl_interp[i,:,:],self.cd_interp[i,:,:],self.cm_interp[i,:,:])) + # >>> There is an inconsistency between the geometric and airfoil inputs that needs to be corrected! <<< + self.ccblade = CCBlade( - blade_r, # (m) locations defining the blade along z-axis of blade coordinate system - blade_chord, # (m) corresponding chord length at each section - blade_theta, # (deg) corresponding :ref:`twist angle ` at each section---positive twist decreases angle of attack. + self.blade_r, # (m) locations defining the blade along z-axis of blade coordinate system + self.blade_chord, # (m) corresponding chord length at each section + self.blade_theta, # (deg) corresponding :ref:`twist angle ` at each section---positive twist decreases angle of attack. af, # CCAirfoil object self.Rhub, # (m) radius of hub turbine['blade'][ir]['Rtip'], # (m) radius of tip self.nBlades, # number of blades - turbine['rho_air'], # (kg/m^3) freestream fluid density - turbine['mu_air'], # (kg/m/s) dynamic viscosity of fluid + self.rho, # (kg/m^3) freestream fluid density + self.mu, # (kg/m/s) dynamic viscosity of fluid self.precone, # (deg) hub precone angle - self.shaft_tilt, # (deg) hub tilt angle + np.degrees(self.shaft_tilt), # (deg) hub tilt angle 0.0, # (deg) nacelle yaw angle - turbine['shearExp'], # shear exponent for a power-law wind profile across hub + self.shearExp, # shear exponent for a power-law wind profile across hub self.Zhub, # (m) hub height used for power-law wind profile. U = Uref*(z/hubHt)**shearExp nSector, # number of azimuthal sectors to descretize aerodynamic calculation. automatically set to 1 if tilt, yaw, and shearExp are all 0.0. Otherwise set to a minimum of 4. blade_precurve, # (m) location of blade pitch axis in x-direction of :ref:`blade coordinate system ` @@ -222,36 +322,362 @@ def __init__(self, turbine, w, ir, old=False): usecd=usecd, # If True, use drag coefficient in computing induction factors (always used in evaluating distributed loads from the induction factors). derivatives=True, # if True, derivatives along with function values will be returned for the various methods ) - + # pull control gains out of dictionary self.setControlGains(turbine) + # create a member list of blade sections, only if rotor is underwater + if self.Zhub + self.R_rot < 0: + #self.bladeAirfoil2Member() + self.bladeGeometry2Member() + else: + self.bladeMemberList = [] + + + def setPosition(self, r6=np.zeros(6), R=None): + '''Calculate rotor pose based on FOWT pose. + + Parameters + ---------- + r6 : array, optional + Absolute position/orientation of FOWT to which member is attached. + ''' + + # store rotation matrix for platform roll, pitch, yaw + if R: + self.R = np.array(R) + else: + self.R = rotationMatrix(*r6[3:]) + + # apply platform rotation to rotor axis and position relative to PRP + self.q = np.matmul(self.R, self.axis) # axis unit vector in global orientation + r3_rel = np.matmul(self.R, self.rHub) + + self.r3 = r6[:3] + self.rHub # absolute hub coordinate [m] + + + """ + def bladeAirfoil2Member(self, Ca_edge=0.5, Ca_flap=1.0): + '''First iteration of a method to create RAFT members for the rotor blades (not used right now). + + Method to create members for each airfoil in the turbine blade + To be used for added mass and buoyancy calculations of underwater turbines''' + + self.bladeMemberList = [] + blade_length = self.R_rot-self.Rhub + blade_r = np.array(station_position)*blade_length + + airfoil_name_dict = [foil['name'] for foil in self.turbine['airfoils']] + + for i,af in enumerate(station_airfoil[:-1]): + airfoil = {} # dictionary to hold properties of blade sub-member = each airfoil + airfoil['name'] = af+'-'+str(i+1)+'/'+str(len(station_airfoil)) + airfoil['type'] = 3 + + # started a fancy method to determine the axis that the airfoil blades will have different headings about + # ideally, I want to find a vector (r) orthogonal to the rotor axis vector (n), which has infinite solutions (r dot n = 0) + # the way I set it up below rotates the rotor axis vector 90 degrees, but breaks down if rotor.axis[2] != 0 since the rotation metrix used here is about the z axis + airfoil_zero_heading = np.matmul(np.array([[0, -1, 0],[1, 0, 0],[0, 0, 1]]), self.axis) + airfoil['rA'] = np.array(airfoil_zero_heading)*(self.Rhub+(station_position[i]*blade_length)) + airfoil['rB'] = airfoil['rA'] + np.array(airfoil_zero_heading)*((station_position[i+1]-station_position[i])*blade_length) + + #airfoil['rA'] = rHub + np.array([0,0,self.Rhub]) + np.array([0,0,(station_position[i])*blade_length]) + #airfoil['rB'] = airfoil['rA'] + np.array([0,0, (station_position[i+1]-station_position[i])*blade_length]) + # >>>>>>>> don't need to specify direction of blade; just assume vertical and then can transform in later operations <<<<<<<<<<<<< + airfoil['shape'] = 'rect' + airfoil['stations'] = [0,1] + + chord = np.interp(blade_r[i], self.blade_r, self.blade_chord) + rel_t = self.turbine["airfoils"][airfoil_name_dict.index(af)]["relative_thickness"] + A = (np.pi/4)*chord**2 * rel_t + sideB = A/chord # the length of the imaginary side length of the rectange that gives the same area + + airfoil['d'] = [chord, sideB] + #airfoil['d'] = np.interp(blade_r[i:i+2], self.blade_r, self.blade_chord) + airfoil['gamma'] = np.interp(blade_r[i], self.blade_r, self.blade_theta) + airfoil['potMod'] = False + + airfoil['Cd'] = 0.0 + if 'added_mass_coeff' in self.turbine["airfoils"][airfoil_name_dict.index(af)]: + added_mass_coeff = self.turbine["airfoils"][airfoil_name_dict.index(af)]['added_mass_coeff'] + else: + added_mass_coeff = [Ca_edge, Ca_flap] + airfoil['Ca'] = added_mass_coeff + #airfoil['Ca'] = self.turbine["airfoils"][airfoil_name_dict.index(af)]["added_mass_coeff"] + airfoil['CdEnd'] = 0.0 + airfoil['CaEnd'] = 0.0 + + airfoil['t'] = 0.01 + airfoil['rho_shell'] = 1850 + + self.bladeMemberList.append(Member(airfoil, len(self.w))) + """ + + + + def bladeGeometry2Member(self): + '''Second iteration of a function to create RAFT members based on rotor blades (is currently used). + + Method to create members for each "node" that is specified in turbine['blade']['geometry'] + To be used for added mass and buoyancy calculations of underwater turbines''' + + self.bladeMemberList = [] + + for i in range(len(self.blade_r)-1): + blademem = {} + blademem['name'] = i + blademem['type'] = 3 + + airfoil_zero_heading = np.matmul(np.array([[0, -1, 0],[1, 0, 0],[0, 0, 1]]), self.axis) # see comments in bladeAirfoil2Member() + blademem['rA'] = np.array(airfoil_zero_heading) * (self.blade_r[i] - self.dr/2) + blademem['rB'] = np.array(airfoil_zero_heading) * (self.blade_r[i] + self.dr/2) + + blademem['shape'] = 'rect' + blademem['stations'] = [0,1] + + chord = self.blade_chord[i] + rel_thick = self.r_thick_interp[i] + area = (np.pi/4)*chord**2 * rel_thick + rect_thick = area/chord # thickness of rectange with same chord length to achieve same cross sectional area + blademem['d'] = [[chord, rect_thick],[chord, rect_thick]] + + blademem['gamma'] = self.blade_theta[i] + + blademem['potMod'] = False + + blademem['Cd'] = 0.0 + blademem['Ca'] = self.Ca_interp[i,:] + blademem['CdEnd'] = 0.0 + blademem['CaEnd'] = 0.0 + + blademem['t'] = 0.01 + blademem['rho_shell'] = 1850 + + self.bladeMemberList.append(Member(blademem, len(self.w))) + + self.nodes = np.zeros([int(self.nBlades), len(self.bladeMemberList)+1, 3]) # array to hold xyz positions of each node along a blade for each blade (filled in later) + + + def getBladeMemberPositions(self, azimuth, r_OG): + ''' Returns the node positions of blade members as it is rotated by an azimuth angle about the rotor's axis. + rOG is a matrix of n number of rows and 3 columns, where each row is a position vector that needs rotating''' + + # create rotation matrix based on the rotor's axis (default axis=[1,0,0]) + c = np.cos(np.deg2rad(azimuth)) + s = np.sin(np.deg2rad(azimuth)) + a = self.axis # each rotor is given a default axis of rotation about the x-direction + R = np.array([[c + a[0]**2*(1-c), a[0]*a[1]*(1-c)-a[2]*s, a[0]*a[2]*(1-c)+a[1]*s], + [a[1]*a[0]*(1-c)+a[2]*s, c + a[1]**2*(1-c), a[1]*a[2]*(1-c)-a[0]*s], + [a[2]*a[0]*(1-c)-a[1]*s, a[2]*a[1]*(1-c)+a[0]*s, c + a[2]**2*(1-c)]]) + #rotMatx = np.array([[1, 0, 0], [0, c, -s], [0, s, c]]) + + # find the new node positions of the blade member + r_new = np.zeros_like(r_OG) + for i in range(r_OG.shape[0]): + r_from_Zhub = np.matmul(R, r_OG[i,:]) # wrt to the hub center + r_new[i,:] = r_from_Zhub + self.rHub # wrt to the global coordinates + + return r_new + + + def calcHydroConstants(self, dgamma=0, rho=1025, g=9.81): + '''Compute hydrodynamic added mass and inertial excitation coefficients + for the rotor as a whole. Stores and returns results in local reference + frame about hub location. + + Parameters + ---------- + dgamma : float + Blade pitch angle to be applied to the rotor. + + Returns + ------- + A_hydro, I_hydro : 3x3 matrices + Hydrodynamic added mass and inertial excitation matrices. + ''' + + A_hydro = np.zeros([6,6]) + I_hydro = np.zeros([6,6]) + + + ''' --- manual temporary option --- + # make a temporary set of members for a blade (coordinates relative to hub) + + bladeMemberList = [] + + for i in range(len(self.blade_r)-1): + blademem = dict(name=i, type=3, shape='rect', potMod=False) - def runCCBlade(self, Uhub, ptfm_pitch=0, yaw_misalign=0): + q = np.matmul(np.array([[0, -1, 0],[1, 0, 0],[0, 0, 1]]), self.axis) + blademem['rA'] = q * (self.blade_r[i] - self.dr/2) + blademem['rB'] = q * (self.blade_r[i] + self.dr/2) + + blademem['stations'] = [0,1] + + chord = self.blade_chord[i] + rel_thick = self.r_thick_interp[i] + area = (np.pi/4)*chord**2 * rel_thick + rect_thick = area/chord # thickness of rectange with same chord length to achieve same cross sectional area + blademem['d'] = [[chord, rect_thick],[chord, rect_thick]] + + blademem['gamma'] = self.blade_theta[i] + + blademem['Cd'] = 0.0 + blademem['Ca'] = self.Ca_interp[i,:] + blademem['CdEnd'] = 0.0 + blademem['CaEnd'] = 0.0 + + blademem['t'] = 0.01 + blademem['rho_shell'] = 0 + + bladeMemberList.append(Member(blademem, len(self.w))) + + # sum up hydro coefficients + A_hydro_morison = np.zeros([6,6]) + for i, mem in enumerate(bladeMemberList): + + A_hydro_i, I_hydro_i = mem.calcHydroConstants(sum_inertia=True) + + A_hydro += A_hydro_i + I_hydro += I_hydro_i + + + # duplicate for number of blades and compute whole-rotor terms! + self.A_11 = A_hydro[0,0] * self.nBlades # thrust + self.A_44 = A_hydro[3,3] * self.nBlades # torque + self.A_14 = A_hydro[0,3] * self.nBlades # torque-thrust coupling + elf.A_55 = A_hydro[0,3] * self.nBlades * 0.707 # torque-thrust coupling <<< need to azimuthally average <<< + self.I_11 = I_hydro[0,0] * self.nBlades # thrust (neglect the others for now) + self.I_14 = I_hydro[0,3] * self.nBlades # thrust-torque coupling + then populate full matrices? + + ''' + + # --- whole-rotor members approach --- + for i,mem in enumerate(self.bladeMemberList): + # the input memberList is the rotor.bladeMemberList multiplied by nBlades (e.g. if len(rotor.bladeMemberList)=10, then this len(memberList)=30 for 3 blade rotor) + # adjust the heading/orientation of the each section of blade members by the corresponding heading in rotor.headings based on where in the list you are + j = i // int(len(self.bladeMemberList)/self.nBlades) # i (from 0 to 30) // 10, which results in either j = 1, 2, or 3, for each blade heading + + rOG = np.array([mem.rA0, mem.rB0]) + + # find the end nodes of the blade member about the global coordinates (e.g,, if rA_OG = [0,0,0] and rB_OG=[0,1,0], and heading=90, then rA=[0,0,0] and rB=[0,0,1]) + rUpdated = self.getBladeMemberPositions(self.headings[j], rOG) # blade node coords relative to hub + mem.rA0 = rUpdated[0] + mem.rB0 = rUpdated[-1] + + # apply a blade pitch angle to every blade member if applicable + mem.gamma = mem.gamma + dgamma + + # run calcOrientation to ensure the p1 and p2 axes of the members are oriented the way they should be + mem.setPosition() + + # compute hydro added mass and inertial excitation terms relative to hub + A_hydro_i, I_hydro_i = mem.calcHydroConstants(sum_inertia=True, rho=rho, g=g) + + A_hydro += A_hydro_i + I_hydro += I_hydro_i + + # --- save hydro matrices (these are in global orientations) --- + self.A_hydro = A_hydro + self.I_hydro = I_hydro + + return A_hydro, I_hydro + + + def calcCavitation(self, case, azimuth=0, clearance_margin=1.0, Patm=101325, Pvap=2500, error_on_cavitation=False): + ''' Method to calculate the cavitation number of the rotor + (wind speed (m/s), rotor speed (RPM), pitch angle (deg), azimuth (deg)) + + Can later move Patm and Pvap to some kind of input file + ''' + # -------------- calculate worst case clearance below waterline (less precise) --------------- + # calculate the worst-case scenario depth below the free surface where cavitation can occur + if self.Zhub < 0: + clearance = self.Zhub + self.R_rot + else: + raise ValueError("Hub Depth must be below the water surface to calculate cavitation") + # add a margin to the depth clearance (either by user input or based on platform motions) + clearance = clearance*clearance_margin + + # >>> note: above currently not used <<< + + #--------------- calculate clearance (depth) of each node of each blade (more precise) -------------- + # collect minimum pressure coefficient values + cpmin = self.cpmin_interp # array of size [len(bladeMemberList), len(self.aoa), 1] where each row is the cpmin as a function of aoa (columns) + + # set wind speed, rotor speed, and blade pitch angle based on wind speed an turbine inputs + Uhub = case['current_speed'] + Omega_rpm = np.interp(Uhub, self.Uhub, self.Omega_rpm) # rotor speed [rpm] + pitch_deg = np.interp(Uhub, self.Uhub, self.pitch_deg) # blade pitch angle [deg] + + # create array to store cavitation values for each node for each blade + cav_check = np.zeros([len(self.headings), len(self.blade_r)]) + + # calculate the critial sigma caviatation parameter for each blade node and compare to the sigma_l caviatation parameter to determine if cavitation occurs + for a,azi in enumerate(self.headings): # do this for each blade (aoa and relative velocity change for different blade azimuth angles) + + loads, derivs = self.ccblade.distributedAeroLoads(Uhub, Omega_rpm, pitch_deg, azi) # run CCBlade with variable azimuth angles + vrel = loads["W"] # pull out the relative velocity at each node along the blade at that azimuth angle + aoa = loads["alpha"] # pull out the angle of attack at each node along the blade at that azimuth angle + + for n in range(len(vrel)): # for each blade node + + # find the minimum pressure coefficient at that node at the given angle of attack + cpmin_node = np.interp(aoa[n], self.aoa, cpmin[n,:,0]) + + # extract the depth of the node using the node position array + clearance = self.nodes[a, n, 2] # a=which blade, n=which node, 2=z-position=depth + + # calculate the critial sigma cavitation parameter + sigma_crit = (Patm + self.ccblade.rho*9.81*abs(clearance) - Pvap)/(0.5*self.ccblade.rho*vrel[n]**2) + + # if sigma_crit is less than sigma_l (sigma_l = -cpmin), then cavitation occurs + if error_on_cavitation: + if sigma_crit < -cpmin_node: + raise ValueError(f"Cavitation occured at node {n} (first node = 0)") + + cav_check[a,n] = sigma_crit + cpmin_node # if this value is negative, then cavitation occurs (sigma_crit - sigma_l < 0 -> cav occurs; sigma_l = -cpmin_node) + + + return cav_check + + + def runCCBlade(self, U0, ptfm_pitch=0, yaw_misalign=0): '''This performs a single CCBlade evaluation at specified conditions. + U0 + Freestream flow speed [m/s]. ptfm_pitch mean platform pitch angle to be included in rotor tilt angle [rad] yaw_misalign - turbine yaw misalignment angle [deg] + turbine yaw misalignment angle [rad] + + In future could add options to specify rotor speed and blade pitch values + that override the default scheduled values, for controls applications. ''' + # apply inflow speed gain factor (for any confinement/blockage effects) + Uhub = U0*self.speed_gain + # find turbine operating point at the provided wind speed Omega_rpm = np.interp(Uhub, self.Uhub, self.Omega_rpm) # rotor speed [rpm] pitch_deg = np.interp(Uhub, self.Uhub, self.pitch_deg) # blade pitch angle [deg] - # adjust rotor angles based on provided info (I think this intervention in CCBlade should work...) - self.ccblade.tilt = np.deg2rad(self.shaft_tilt) + ptfm_pitch - self.ccblade.yaw = np.deg2rad(yaw_misalign) + # Adjust rotor angles based on provided info + # Note: this adjusts internal CCBlade angles (which are in radians) + self.ccblade.tilt = self.shaft_tilt + ptfm_pitch + self.ccblade.yaw = yaw_misalign # evaluate aero loads and derivatives with CCBlade loads, derivs = self.ccblade.evaluate(Uhub, Omega_rpm, pitch_deg, coefficients=True) - + # organize and save the relevant outputs... self.U_case = Uhub self.Omega_case = Omega_rpm self.aero_torque = loads["Q"][0] self.aero_power = loads["P"][0] + self.aero_thrust = loads["T"][0] self.pitch_case = pitch_deg outputs = {} @@ -266,28 +692,13 @@ def runCCBlade(self, Uhub, ptfm_pitch=0, yaw_misalign=0): outputs["CMhub"] = np.array([loads["CQ"][0], loads["CMy"][0], loads["CMz"][0]]) - print(f"Wind speed: {Uhub} m/s, Aerodynamic power coefficient: {loads['CP'][0]:4.3f}") - + print(f"Wind speed: {Uhub:.2f} m/s, Omega: {Omega_rpm:.2f} rpm, Cp: {loads['CP'][0]:4.3f}, T: {loads['T'][0]/1e3:.0f} kN") + + # save select derivatives J={} # Jacobian/derivatives dP = derivs["dP"] J["P", "r"] = dP["dr"] - # J["P", "chord"] = dP["dchord"] - # J["P", "theta"] = dP["dtheta"] - # J["P", "Rhub"] = np.squeeze(dP["dRhub"]) - # J["P", "Rtip"] = np.squeeze(dP["dRtip"]) - # J["P", "hub_height"] = np.squeeze(dP["dhubHt"]) - # J["P", "precone"] = np.squeeze(dP["dprecone"]) - # J["P", "tilt"] = np.squeeze(dP["dtilt"]) - # J["P", "yaw"] = np.squeeze(dP["dyaw"]) - # J["P", "shearExp"] = np.squeeze(dP["dshear"]) - # J["P", "V_load"] = np.squeeze(dP["dUinf"]) - # J["P", "Omega_load"] = np.squeeze(dP["dOmega"]) - # J["P", "pitch_load"] = np.squeeze(dP["dpitch"]) - # J["P", "precurve"] = dP["dprecurve"] - # J["P", "precurveTip"] = dP["dprecurveTip"] - # J["P", "presweep"] = dP["dpresweep"] - # J["P", "presweepTip"] = dP["dpresweepTip"] dQ = derivs["dQ"] J["Q","Uhub"] = np.atleast_1d(np.diag(dQ["dUinf"])) @@ -299,28 +710,9 @@ def runCCBlade(self, Uhub, ptfm_pitch=0, yaw_misalign=0): J["T","pitch_deg"] = np.atleast_1d(np.diag(dT["dpitch"])) J["T","Omega_rpm"] = np.atleast_1d(np.diag(dT["dOmega"])) - # dT = derivs["dT"] - # .J["Fhub", "r"][0,:] = dT["dr"] # 0 is for thrust force, 1 would be y, 2 z - # .J["Fhub", "chord"][0,:] = dT["dchord"] - # .J["Fhub", "theta"][0,:] = dT["dtheta"] - # .J["Fhub", "Rhub"][0,:] = np.squeeze(dT["dRhub"]) - # .J["Fhub", "Rtip"][0,:] = np.squeeze(dT["dRtip"]) - # .J["Fhub", "hub_height"][0,:] = np.squeeze(dT["dhubHt"]) - # .J["Fhub", "precone"][0,:] = np.squeeze(dT["dprecone"]) - # .J["Fhub", "tilt"][0,:] = np.squeeze(dT["dtilt"]) - # .J["Fhub", "yaw"][0,:] = np.squeeze(dT["dyaw"]) - # .J["Fhub", "shearExp"][0,:] = np.squeeze(dT["dshear"]) - # .J["Fhub", "V_load"][0,:] = np.squeeze(dT["dUinf"]) - # .J["Fhub", "Omega_load"][0,:] = np.squeeze(dT["dOmega"]) - # .J["Fhub", "pitch_load"][0,:] = np.squeeze(dT["dpitch"]) - # .J["Fhub", "precurve"][0,:] = dT["dprecurve"] - # .J["Fhub", "precurveTip"][0,:] = dT["dprecurveTip"] - # .J["Fhub", "presweep"][0,:] = dT["dpresweep"] - # .J["Fhub", "presweepTip"][0,:] = dT["dpresweepTip"] - self.J = J - return loads, derivs + return loads, derivs def setControlGains(self,turbine): @@ -341,51 +733,139 @@ def setControlGains(self,turbine): - def calcAeroServoContributions(self, case, ptfm_pitch=0, display=0): + def calcAero(self, case, current=False, display=0): '''Calculates stiffness, damping, added mass, and excitation coefficients from rotor aerodynamics coupled with turbine controls. - Results are w.r.t. nonrotating hub reference frame. + Results are w.r.t. the hub coordinate on the nacelle reference frame (may be yawed) Currently returning 6 DOF mean loads, but other terms are just hub fore-aft scalars. - - ptfm_pitch - mean platform pitch angle to be included in rotor tilt angle [rad] ''' - loads, derivs = self.runCCBlade(case['wind_speed'], ptfm_pitch=ptfm_pitch, yaw_misalign=case['yaw_misalign']) + # added mass, damping, excitation, mean force arrays to be filled in (6 DOF) + self.a = np.zeros([6,6,self.nw]) + self.b = np.zeros([6,6,self.nw]) + self.f = np.zeros([6 ,self.nw], dtype=complex) + self.f0 = np.zeros(6) + + # get inflow + if current: + speed = getFromDict(case, 'current_speed', shape=0, default=1.0) + heading = getFromDict(case, 'current_heading', shape=0, default=0.0) + else: + speed = getFromDict(case, 'wind_speed', shape=0, default=10) + heading = getFromDict(case, 'wind_heading', shape=0, default=0.0) + + # Figure out relative inflow angles considering platform orientation, + # rotor axis angles, nacelle yaw, and inflow direction + + # Apply nacelle yaw depending on the yaw mode + # (this does not consider if the axis has a permanent lateral angle) + if self.yaw_mode == 0: # assume aligned + nac_yaw = np.radians(heading) + + elif self.yaw_mode == 1: # use case info + turbine_heading = getFromDict(case, 'turbine_heading', shape=0, default=0.0) # [deg] + nac_yaw = np.radians(turbine_heading - heading) + + elif self.yaw_mode == 2: # use self.yaw value + nac_yaw = self.yaw + else: + raise Exception('Unsupported yaw_mode value. Must be 0, 1, or 2.') + + self.yaw = nac_yaw # save the nacelle yaw value just in case it's useful later + + # find turbine global heading and tilt + turbine_heading = np.arctan2(self.q[1], self.q[0]) + nac_yaw # [rad] + turbine_tilt = np.arctan2(self.q[2], self.q[0]) # [rad] front facing up is positive + + # inflow misalignment heading relative to turbine heading [deg] + yaw_misalign = turbine_heading - np.radians(heading) + turbine_tilt = turbine_tilt + + # call CCBlade + loads, derivs = self.runCCBlade(speed, ptfm_pitch=turbine_tilt, + yaw_misalign=yaw_misalign) + + + # ----- Set up rotation matrices to re-orient the results ----- + + # Rotation matrix from rotor axis orientation to wind inflow direction + R_inflow = rotationMatrix(0, turbine_tilt, yaw_misalign) # <<< double check directions/signs - Uinf = case['wind_speed'] # inflow wind speed (m/s) <<< eventually should be consistent with rest of RAFT + # Rotation matrix from FOWT orientation to rotor axis oriention + R_axis = rotationMatrix(0, np.arctan2(self.axis[2], self.axis[0]), + np.arctan2(self.axis[1], self.axis[0]) ) - # extract derivatives of interest + # ----- Process derivatives of interest ----- dT_dU = np.atleast_1d(np.diag(derivs["dT"]["dUinf"])) dT_dOm = np.atleast_1d(np.diag(derivs["dT"]["dOmega"])) / rpm2radps dT_dPi = np.atleast_1d(np.diag(derivs["dT"]["dpitch"])) * rad2deg dQ_dU = np.atleast_1d(np.diag(derivs["dQ"]["dUinf"])) dQ_dOm = np.atleast_1d(np.diag(derivs["dQ"]["dOmega"])) / rpm2radps dQ_dPi = np.atleast_1d(np.diag(derivs["dQ"]["dpitch"])) * rad2deg + # note: orientation corrections still need to be applied on these! <<< - # calculate steady aero forces and moments - F_aero0 = np.array([loads["T" ][0], loads["Y" ][0], loads["Z" ][0], - loads["My" ][0], loads["Q" ][0], loads["Mz" ][0] ]) + # ----- Process steady rotor forces and moments ----- + + # Set up vectors in axis frame (Assuming CCBlade forces (but not + # moments) are relative to inflow direction. + forces_inflow = np.array([loads["T"][0], loads["Y"][0], loads["Z" ][0]]) + moments_axis = np.array([loads["My"][0], loads["Q"][0], loads["Mz"][0]]) + forces_axis = np.matmul(R_inflow, forces_inflow) + + # Rotate forces and moments to be relative to FOWT orientations + self.f0[:3] = np.matmul(R_axis, forces_axis) + self.f0[3:] = np.matmul(R_axis, moments_axis) + + + # ----- Dynamic rotor forces and reaction matrices ----- + + # Note: this is currently looking at the inflow direction and then + # rotating to the global frame, but this needs to be checked. + R_global2inflow = np.matmul(self.R, np.matmul(R_axis, R_inflow)) + # calculate rotor-averaged turbulent wind spectrum - _,_,_,S_rot = self.IECKaimal(case) # PSD [(m/s)^2/rad] - self.V_w = np.sqrt(S_rot) # convert from power spectral density to complex amplitudes (FFT) + _,_,_,S_rot = self.IECKaimal(case, current=current) # PSD [(m/s)^2/rad] + + # convert from power spectral density to complex amplitudes (FFT) + self.V_w = np.array(np.sqrt(S_rot), dtype=complex) + + # Do we need to worry about scaling by dot prod of rotor axis and + # inflow direction? *np.cos(turbine_tilt)*np.cos(yaw_misalign) <<< + # prepare rotated hydro inertial excitation matrix for the rotor + if current: + I_hydro = rotateMatrix6(self.I_hydro, self.R) # no-control option if self.aeroServoMod == 1: - a_aero = np.zeros(len(self.w)) - b_aero = np.zeros(len(self.w)) + dT_dU - - f_aero = dT_dU * np.sqrt(S_rot) + # Edded mass matrix is empty + a_inflow = np.zeros([6,6,len(self.w)]) + + # Damping matrix has just windspeed-thrust derivative + b_inflow = np.zeros([6,6,len(self.w)]) + b_inflow[0,0,:] = dT_dU + + # Excitation vector + f_inflow = np.zeros([6,len(self.w)]) + f_inflow[0,:] = dT_dU*self.V_w + + # Rotate to global orientations + self.a = rotateMatrix6(a_inflow, R_global2inflow) + self.b = rotateMatrix6(b_inflow, R_global2inflow) + self.f[:3,:] = np.matmul(R_global2inflow, f_inflow[:3,:]) + #self.f[3:,:] = np.matmul(R_global2inflow, f_inflow[3:,:]) zero for now + # control option elif self.aeroServoMod == 2: - # Pitch control gains at Uinf (Uinf), flip sign to translate ROSCO convention to this one - self.kp_beta = -np.interp(Uinf, self.Uhub, self.kp_0) - self.ki_beta = -np.interp(Uinf, self.Uhub, self.ki_0) + # include added mass somewhere? and maybe even effect of inertial excitation on control? + + # Pitch control gains at the inflow speed (flip sign due to ROSCO convention) + self.kp_beta = -np.interp(speed, self.Uhub, self.kp_0) + self.ki_beta = -np.interp(speed, self.Uhub, self.ki_0) # Torque control gains, need to get these from somewhere kp_tau = self.kp_tau * (self.kp_beta == 0) # -38609162.66552 ! VS_KP - Proportional gain for generator PI torque controller [1/(rad/s) Nm]. (Only used in the transitional 2.5 region if VS_ControlMode =/ 2) @@ -399,8 +879,8 @@ def calcAeroServoContributions(self, case, ptfm_pitch=0, display=0): E = np.zeros_like(self.w,dtype=np.complex_) # Roots of characteristic equation, helps w/ debugging - p = np.array([-self.I_drivetrain, (dQ_dOm + self.kp_beta * dQ_dPi - self.Ng * kp_tau), self.ki_beta* dQ_dPi - self.Ng * ki_tau]) - r = np.roots(p) + # p = np.array([-self.I_drivetrain, (dQ_dOm + self.kp_beta * dQ_dPi - self.Ng * kp_tau), self.ki_beta* dQ_dPi - self.Ng * ki_tau]) + # r = np.roots(p) for iw, omega in enumerate(self.w): @@ -452,6 +932,10 @@ def calcAeroServoContributions(self, case, ptfm_pitch=0, display=0): b3 = np.real( dT_dU - H_QT*dQ_dU ) # damping a3 = np.real( (dT_dU - H_QT*dQ_dU)/(1j*self.w)) # added mass + # Add hydrodynamic inertial excitation for underwater rotors + # (thrust only, neglecting rotor dynamics) + #if current: + # f2 += self.I_hydro[0,0] * 1j*self.w*self.V_w if display > 1: ''' @@ -498,15 +982,23 @@ def calcAeroServoContributions(self, case, ptfm_pitch=0, display=0): plt.show() - - f_aero = f2 # wind thrust force excitation spectrum - a_aero = a2 - b_aero = b2 + # Rotate to global orientations + for iw in range(self.nw): + self.a[:3,:3, iw] = rotateMatrix3(np.diag([a2[iw],0,0]), R_global2inflow) + self.b[:3,:3, iw] = rotateMatrix3(np.diag([b2[iw],0,0]), R_global2inflow) + self.f[:3, iw] = np.matmul(R_global2inflow, np.array([f2[iw],0,0])) + # Above is only forces for now. Moments can be added in future. + + # Add hydrodynamic inertial excitation for underwater rotors + if current: + self.f[0,:] += self.I_hydro[0,0] * 1j*self.w*self.V_w # <<< this should have a rotation applied + breakpoint() - return F_aero0, f_aero, a_aero, b_aero # B_aero, C_aero, F_aero0, F_aero + return self.f0, self.f, self.a, self.b # B_aero, C_aero, F_aero0, F_aero - def plot(self, ax, r_ptfm=[0,0,0], R_ptfm=np.eye(3), azimuth=0, color='k', airfoils=False): + def plot(self, ax, r_ptfm=[0,0,0], R_ptfm=np.eye(3), azimuth=0, color='k', + airfoils=False, zorder=2): '''Draws the rotor on the passed axes, considering optional platform offset and rotation matrix, and rotor azimuth angle''' # ----- blade geometry ---------- @@ -538,16 +1030,17 @@ def plot(self, ax, r_ptfm=[0,0,0], R_ptfm=np.eye(3), azimuth=0, color='k', airfo # ----- rotation matricse ----- # (blade pitch would be a -rotation about local z) R_precone = rotationMatrix(0, -self.ccblade.precone, 0) - R_azimuth = [rotationMatrix(azimuth + azi, 0, 0) for azi in 2*np.pi/3.*np.arange(3)] - R_tilt = rotationMatrix(0, np.deg2rad(self.shaft_tilt), 0) # # define x as along shaft downwind, y is same as ptfm y + #R_azimuth = [rotationMatrix(azimuth + azi, 0, 0) for azi in 2*np.pi/3.*np.arange(3)] + R_azimuth = [rotationMatrix(azimuth + azi, 0, 0) for azi in (2*np.pi/self.nBlades)*np.arange(self.nBlades)] + R_tilt = rotationMatrix(0, self.shaft_tilt, 0) # # define x as along shaft downwind, y is same as ptfm y # ----- transform coordinates ----- - for ib in range(3): + for ib in range(self.nBlades): P2 = np.matmul(R_precone, P) P2 = np.matmul(R_azimuth[ib], P2) P2 = np.matmul(R_tilt, P2) - P2 = P2 + np.array([-self.overhang, 0, self.Zhub])[:,None] # PRP to tower-shaft intersection point + P2 = P2 + np.array([-self.overhang, 0, self.Zhub])[:,None] # PRP to tower-shaft intersection point # assumes overhang value is always positive P2 = np.matmul(R_ptfm, P2) + np.array(r_ptfm)[:,None] # drawing airfoils @@ -555,50 +1048,57 @@ def plot(self, ax, r_ptfm=[0,0,0], R_ptfm=np.eye(3), azimuth=0, color='k', airfo for ii in range(m-1): ax.plot(P2[0, npts*ii:npts*(ii+1)], P2[1, npts*ii:npts*(ii+1)], P2[2, npts*ii:npts*(ii+1)], color=color, lw=0.4) # draw outline - ax.plot(P2[0, 0:-1:npts], P2[1, 0:-1:npts], P2[2, 0:-1:npts], color=color, lw=0.4, zorder=2) # leading edge - ax.plot(P2[0, 2:-1:npts], P2[1, 2:-1:npts], P2[2, 2:-1:npts], color=color, lw=0.4, zorder=2) # trailing edge + ax.plot(P2[0, 0:-1:npts], P2[1, 0:-1:npts], P2[2, 0:-1:npts], color=color, lw=0.4, zorder=zorder) # leading edge + ax.plot(P2[0, 2:-1:npts], P2[1, 2:-1:npts], P2[2, 2:-1:npts], color=color, lw=0.4, zorder=zorder) # trailing edge #for j in range(m): # linebit.append(ax.plot(Xs[j::m], Ys[j::m], Zs[j::m] , color='k')) # station rings # #return linebit + - - def IECKaimal(self, case): # + def IECKaimal(self, case, current=False): # '''Calculates rotor-averaged turbulent wind spectrum based on inputted turbulence intensity or class.''' #TODO: expand commenting, confirm that Rot is power spectrum, skip V,W calcs if not used - + + if current: + speed = getFromDict(case, 'current_speed', shape=0, default=1.0) + turbulence = getFromDict(case, 'current_turbulence', shape=0, default=0.0,dtype=str) + else: + speed = getFromDict(case, 'wind_speed', shape=0, default=10.0) + turbulence = getFromDict(case, 'turbulence', shape=0, default=0.0,dtype=str) + # Set inputs (f, V_ref, HH, Class, Categ, TurbMod, R) f = self.w / 2 / np.pi # frequency in Hz HH = abs(self.Zhub) # <<< Temporary absolute value to avoid NaNs with underwater turbines. Eventually need a new function <<< R = self.R_rot - V_ref = case['wind_speed'] + V_ref = speed ###### Initialize IEC Wind parameters ####### iec_wind = pyIECWind_extreme() iec_wind.z_hub = HH - if isinstance(case['turbulence'],str): + if isinstance(turbulence,str): # If a string, the options are I, II, III, IV Class = '' - for char in case['turbulence']: + for char in turbulence: if char == 'I' or char == 'V': Class += char else: break if not Class: - raise Exception(f"Turbulence class must start with I, II, III, or IV: case['turbulence'] = {case['turbulence']}") + raise Exception(f"Turbulence class must start with I, II, III, or IV: case['turbulence'] = {turbulence}") else: Categ = char iec_wind.Turbulence_Class = Categ try: - TurbMod = case['turbulence'].split('_')[1] + TurbMod = turbulence.split('_')[1] except: - raise Exception(f"Error reading the turbulence model: {case['turbulence']}") + raise Exception(f"Error reading the turbulence model: {turbulence}") iec_wind.Turbine_Class = Class @@ -606,10 +1106,10 @@ def IECKaimal(self, case): # iec_wind.setup() # Can set iec_wind.I_ref here if wanted, NTM used then - if isinstance(case['turbulence'],int): - case['turbulence'] = float(case['turbulence']) - if isinstance(case['turbulence'],float): - iec_wind.I_ref = case['turbulence'] # this overwrites the value set in setup method + if isinstance(turbulence,int): + turbulence = float(turbulence) + if isinstance(turbulence,float): + iec_wind.I_ref = turbulence # this overwrites the value set in setup method TurbMod = 'NTM' # Compute wind turbulence standard deviation (invariant with height) @@ -659,6 +1159,7 @@ def IECKaimal(self, case): # return U, V, W, Rot + if __name__=='__main__': fname_design = os.path.join(raft_dir,'designs/VolturnUS-S.yaml') @@ -709,7 +1210,7 @@ def IECKaimal(self, case): # print(f" Running case {i_case}") - F_aero0, f_aero, a_aero, b_aero = rotor.calcAeroServoContributions(case) + f_aero0, f_aero, a_aero, b_aero = rotor.calcAero(case) rgba = cmapper((i_case+1)/8) diff --git a/RAFT/setup.py b/RAFT/setup.py index d5a35675e..b908cbe55 100644 --- a/RAFT/setup.py +++ b/RAFT/setup.py @@ -1,22 +1,3 @@ import setuptools -with open("README.md", "r", encoding="utf-8") as fh: - long_description = fh.read() - -setuptools.setup( - name="RAFT", - version="0.1", - author="National Renewable Energy Laboratory", - author_email="matthew.hall@nrel.gov", - description="RAFT: Response Amplitudes of Floating Turbines", - long_description=long_description, - long_description_content_type="text/markdown", - url="https://github.com/WISDEM/RAFT", - packages=['raft'], - classifiers=[ - "Programming Language :: Python :: 3", - "License :: OSI Approved :: Apache Software License", - "Operating System :: OS Independent", - ], - python_requires='>=3.6', -) +setuptools.setup() diff --git a/RAFT/tests/inactivetest_capytaine_integration.py b/RAFT/tests/inactivetest_capytaine_integration.py new file mode 100644 index 000000000..6753d268e --- /dev/null +++ b/RAFT/tests/inactivetest_capytaine_integration.py @@ -0,0 +1,143 @@ + +import unittest +import pytest +import sys +import numpy as np + +# test local code; consider src layout in future to test installed code +sys.path.append('..') +import FrequencyDomain as fdo + +capyTestFile = f'./test_data/mesh_converge_0.750_1.250.nc' + +@unittest.skip('Not ready yet') +class TestCapytaine(unittest.TestCase): + + def test_read_capy_nc_wCapyShape(): + wCapy, addedMass, damping, fEx = fdo.read_capy_nc(capyTestFile) + assert len(wCapy) == 28 + + def test_read_capy_nc_addedMassShape(): + wCapy, addedMass, damping, fEx = fdo.read_capy_nc(capyTestFile) + assert addedMass.shape == (6, 6, 28) + + def test_read_capy_nc_dampingShape(): + wCapy, addedMass, damping, fEx = fdo.read_capy_nc(capyTestFile) + assert damping.shape == (6, 6, 28) + + def test_read_capy_nc_fExShape(): + wCapy, addedMass, damping, fEx = fdo.read_capy_nc(capyTestFile) + assert fEx.shape == (6, 28) + + def test_read_capy_nc_fExComplex(): + wCapy, addedMass, damping, fEx = fdo.read_capy_nc(capyTestFile) + assert fEx.dtype == 'complex128' + + def test_read_capy_nc_wRangeCheck(): + with pytest.raises(ValueError): + wDes = np.arange(0.01, 3, 0.01) + wCapy, addedMass, damping, fEx = fdo.read_capy_nc(capyTestFile, wDes=wDes) + + def test_read_capy_nc_addedMassVals(): + wCapy, addedMass, damping, fEx = fdo.read_capy_nc(capyTestFile) + refAddedMass = np.loadtxt(f'./ref_data/capytaine_integration/wCapy-addedMass-surge.txt') + assert max(abs(refAddedMass[:,1] - addedMass[0,0,:])) < 1e-12 + + def test_read_capy_nc_dampingVals(): + wCapy, addedMass, damping, fEx = fdo.read_capy_nc(capyTestFile) + refDamping = np.loadtxt(f'./ref_data/capytaine_integration/wCapy-damping-surge.txt') + assert max(abs(refDamping[:,1] - damping[0,0,:])) < 1e-12 + + def test_read_capy_nc_fExRealVals(): + wCapy, addedMass, damping, fEx = fdo.read_capy_nc(capyTestFile) + refFExReal = np.loadtxt(f'./ref_data/capytaine_integration/wCapy-fExcitationReal-surge.txt') + assert max(abs(refFExReal[:,1] - fEx[0,:].real)) < 1e-12 + + def test_read_capy_nc_fExImagVals(): + wCapy, addedMass, damping, fEx = fdo.read_capy_nc(capyTestFile) + refFExImag = np.loadtxt(f'./ref_data/capytaine_integration/wCapy-fExcitationImag-surge.txt') + assert max(abs(refFExImag[:,1] - fEx[0,:].imag)) < 1e-12 + + def test_read_capy_nc_addedMassInterpVals(): + wDes = np.arange(0.1, 2.8, 0.01) + wDes, addedMassInterp, dampingInterp, fExInterp = fdo.read_capy_nc(capyTestFile, wDes=wDes) + refAddedMassInterp = np.loadtxt(f'./ref_data/capytaine_integration/wDes-addedMassInterp-surge.txt') + assert max(abs(refAddedMassInterp[:,1] - addedMassInterp[0,0,:])) < 1e-12 + + def test_read_capy_nc_dampingInterpVals(): + wDes = np.arange(0.1, 2.8, 0.01) + wDes, addedMassInterp, dampingInterp, fExInterp = fdo.read_capy_nc(capyTestFile, wDes=wDes) + refDampingInterp = np.loadtxt(f'./ref_data/capytaine_integration/wDes-dampingInterp-surge.txt') + assert max(abs(refDampingInterp[:,1] - dampingInterp[0,0,:])) < 1e-12 + + def test_read_capy_nc_fExInterpRealVals(): + wDes = np.arange(0.1, 2.8, 0.01) + wDes, addedMassInterp, dampingInterp, fExInterp = fdo.read_capy_nc(capyTestFile, wDes=wDes) + refFExInterpReal = np.loadtxt(f'./ref_data/capytaine_integration/wDes-fExcitationInterpReal-surge.txt') + assert max(abs(refFExInterpReal[:,1] - fExInterp[0,:].real)) < 1e-12 + + def test_read_capy_nc_fExInterpImagVals(): + wDes = np.arange(0.1, 2.8, 0.01) + wDes, addedMassInterp, dampingInterp, fExInterp = fdo.read_capy_nc(capyTestFile, wDes=wDes) + refFExInterpImag = np.loadtxt(f'./ref_data/capytaine_integration/wDes-fExcitationInterpImag-surge.txt') + assert max(abs(refFExInterpImag[:,1] - fExInterp[0,:].imag)) < 1e-12 + + def test_call_capy_addedMassShape(): + wRange = np.arange(0.1, 2.9, 0.1) + meshFName = f'./test_data/float.gdf' + wCapy, addedMass, damping, fEx = fdo.call_capy(meshFName, wRange) + assert addedMass.shape == (6, 6, 28) + + def test_call_capy_dampingShape(): + wRange = np.arange(0.1, 2.9, 0.1) + meshFName = f'./test_data/float.gdf' + wCapy, addedMass, damping, fEx = fdo.call_capy(meshFName, wRange) + assert damping.shape == (6, 6, 28) + + def test_call_capy_fExShape(): + wRange = np.arange(0.1, 2.9, 0.1) + meshFName = f'./test_data/float.gdf' + wCapy, addedMass, damping, fEx = fdo.call_capy(meshFName, wRange) + assert fEx.shape == (6, 28) + + def test_call_capy_fExComplex(): + wRange = np.arange(0.1, 2.9, 0.1) + meshFName = f'./test_data/float.gdf' + wCapy, addedMass, damping, fEx = fdo.call_capy(meshFName, wRange) + assert fEx.dtype == 'complex128' + + def test_call_capy_addedMassVals(): + wRange = np.arange(0.1, 2.9, 0.1) + meshFName = f'./test_data/float.gdf' + refNc = f'./ref_data/capytaine_integration/floatData.nc' + wCapy, addedMass, damping, fEx = fdo.call_capy(meshFName, wRange) + refwCapy, refAddedMass, refDamping, refFEx = fdo.read_capy_nc(refNc) + assert max(abs(refAddedMass[0,0,:] - addedMass[0,0,:])) < 1e-12 + + def test_call_capy_dampingVals(): + wRange = np.arange(0.1, 2.9, 0.1) + meshFName = f'./test_data/float.gdf' + refNc = f'./ref_data/capytaine_integration/floatData.nc' + wCapy, addedMass, damping, fEx = fdo.call_capy(meshFName, wRange) + refwCapy, refAddedMass, refDamping, refFEx = fdo.read_capy_nc(refNc) + assert max(abs(refDamping[0,0,:] - damping[0,0,:])) < 1e-12 + + def test_call_capy_fExRealVals(): + wRange = np.arange(0.1, 2.9, 0.1) + meshFName = f'./test_data/float.gdf' + refNc = f'./ref_data/capytaine_integration/floatData.nc' + wCapy, addedMass, damping, fEx = fdo.call_capy(meshFName, wRange) + refwCapy, refAddedMass, refDamping, refFEx = fdo.read_capy_nc(refNc) + assert max(abs(refFEx[0,:].real - fEx[0,:].real)) < 1e-12 + + def test_call_capy_fExImagVals(): + wRange = np.arange(0.1, 2.9, 0.1) + meshFName = f'./test_data/float.gdf' + refNc = f'./ref_data/capytaine_integration/floatData.nc' + wCapy, addedMass, damping, fEx = fdo.call_capy(meshFName, wRange) + refwCapy, refAddedMass, refDamping, refFEx = fdo.read_capy_nc(refNc) + assert max(abs(refFEx[0,:].imag - fEx[0,:].imag)) < 1e-12 + + +if __name__ == "__main__": + unittest.main() diff --git a/RAFT/tests/test_omdao_OC3spar.py b/RAFT/tests/inactivetest_omdao_OC3spar.py similarity index 95% rename from RAFT/tests/test_omdao_OC3spar.py rename to RAFT/tests/inactivetest_omdao_OC3spar.py index b1f9c2be3..b13e3abf4 100644 --- a/RAFT/tests/test_omdao_OC3spar.py +++ b/RAFT/tests/inactivetest_omdao_OC3spar.py @@ -1,12 +1,11 @@ import numpy as np import openmdao.api as om -import numpy as np import os import yaml import raft -from raft.omdao_raft import RAFT_OMDAO -from common import check, test +from raft.omdao_raft import RAFT_Group +from common import test # ----------------------------------- # OMDAO @@ -24,6 +23,7 @@ opt['modeling']['XiStart'] = 0 opt['modeling']['nIter'] = 0 opt['modeling']['dlsMax'] = 5.0 +opt['modeling']['n_cases'] = 1 opt['turbine'] = {} opt['turbine']['npts'] = 11 @@ -50,8 +50,13 @@ opt['mooring']['nline_types'] = 1 opt['mooring']['nconnections'] = 6 +opt['analysis'] = {} +opt['analysis']['general'] = {} +opt['analysis']['general']['folder_output'] = 'output' + prob = om.Problem() -prob.model = RAFT_OMDAO(modeling_options=opt['modeling'], +prob.model = RAFT_Group(modeling_options=opt['modeling'], + analysis_options=opt['analysis'], turbine_options=opt['turbine'], mooring_options=opt['mooring'], member_options=opt['members']) diff --git a/RAFT/tests/test_omdao_OC4semi.py b/RAFT/tests/inactivetest_omdao_OC4semi.py similarity index 96% rename from RAFT/tests/test_omdao_OC4semi.py rename to RAFT/tests/inactivetest_omdao_OC4semi.py index b20a9bcc1..d099e2853 100644 --- a/RAFT/tests/test_omdao_OC4semi.py +++ b/RAFT/tests/inactivetest_omdao_OC4semi.py @@ -1,12 +1,11 @@ import numpy as np import openmdao.api as om -import numpy as np import os import yaml import raft -from raft.omdao_raft import RAFT_OMDAO -from common import check, test +from raft.omdao_raft import RAFT_Group +from common import test # ----------------------------------- # OMDAO @@ -24,6 +23,7 @@ opt['modeling']['XiStart'] = 0.1 # default opt['modeling']['nIter'] = 15 # default opt['modeling']['dlsMax'] = 5.0 # default +opt['modeling']['n_cases'] = 1 opt['turbine'] = {} opt['turbine']['npts'] = 11 @@ -50,8 +50,13 @@ opt['mooring']['nline_types'] = 1 opt['mooring']['nconnections'] = 6 +opt['analysis'] = {} +opt['analysis']['general'] = {} +opt['analysis']['general']['folder_output'] = 'output' + prob = om.Problem() -prob.model = RAFT_OMDAO(modeling_options=opt['modeling'], +prob.model = RAFT_Group(modeling_options=opt['modeling'], + analysis_options=opt['analysis'], turbine_options=opt['turbine'], mooring_options=opt['mooring'], member_options=opt['members']) diff --git a/RAFT/tests/test_omdao_VolturnUS-S.py b/RAFT/tests/inactivetest_omdao_VolturnUS-S.py similarity index 96% rename from RAFT/tests/test_omdao_VolturnUS-S.py rename to RAFT/tests/inactivetest_omdao_VolturnUS-S.py index fc8f33dd1..c9a2d7400 100644 --- a/RAFT/tests/test_omdao_VolturnUS-S.py +++ b/RAFT/tests/inactivetest_omdao_VolturnUS-S.py @@ -1,12 +1,11 @@ import numpy as np import openmdao.api as om -import numpy as np import os import yaml import raft -from raft.omdao_raft import RAFT_OMDAO -from common import check, test +from raft.omdao_raft import RAFT_Group +from common import test # ----------------------------------- # OMDAO @@ -24,6 +23,7 @@ opt['modeling']['XiStart'] = 0.1 # default opt['modeling']['nIter'] = 15 # default opt['modeling']['dlsMax'] = 5.0 # default +opt['modeling']['n_cases'] = 1 opt['turbine'] = {} opt['turbine']['npts'] = 20 @@ -53,8 +53,13 @@ opt['mooring']['nline_types'] = 1 opt['mooring']['nconnections'] = 6 +opt['analysis'] = {} +opt['analysis']['general'] = {} +opt['analysis']['general']['folder_output'] = 'output' + prob = om.Problem() -prob.model = RAFT_OMDAO(modeling_options=opt['modeling'], +prob.model = RAFT_Group(modeling_options=opt['modeling'], + analysis_options=opt['analysis'], turbine_options=opt['turbine'], mooring_options=opt['mooring'], member_options=opt['members']) diff --git a/RAFT/tests/test.py b/RAFT/tests/inactivetest_raft_oc3spar.py similarity index 99% rename from RAFT/tests/test.py rename to RAFT/tests/inactivetest_raft_oc3spar.py index f6cdcb9a4..16866cebb 100644 --- a/RAFT/tests/test.py +++ b/RAFT/tests/inactivetest_raft_oc3spar.py @@ -154,8 +154,8 @@ def test_C_moor0(self): #npt.assert_array_equal #assertAlmostEqual - -unittest.main() +if __name__ == "__main__": + unittest.main() diff --git a/RAFT/tests/test_capytaine_integration.py b/RAFT/tests/test_capytaine_integration.py deleted file mode 100644 index 4fe6e141c..000000000 --- a/RAFT/tests/test_capytaine_integration.py +++ /dev/null @@ -1,134 +0,0 @@ -import pytest -import sys -import numpy as np - -# test local code; consider src layout in future to test installed code -sys.path.append('..') -import FrequencyDomain as fdo - -capyTestFile = f'./test_data/mesh_converge_0.750_1.250.nc' - -def test_read_capy_nc_wCapyShape(): - wCapy, addedMass, damping, fEx = fdo.read_capy_nc(capyTestFile) - assert len(wCapy) == 28 - -def test_read_capy_nc_addedMassShape(): - wCapy, addedMass, damping, fEx = fdo.read_capy_nc(capyTestFile) - assert addedMass.shape == (6, 6, 28) - -def test_read_capy_nc_dampingShape(): - wCapy, addedMass, damping, fEx = fdo.read_capy_nc(capyTestFile) - assert damping.shape == (6, 6, 28) - -def test_read_capy_nc_fExShape(): - wCapy, addedMass, damping, fEx = fdo.read_capy_nc(capyTestFile) - assert fEx.shape == (6, 28) - -def test_read_capy_nc_fExComplex(): - wCapy, addedMass, damping, fEx = fdo.read_capy_nc(capyTestFile) - assert fEx.dtype == 'complex128' - -def test_read_capy_nc_wRangeCheck(): - with pytest.raises(ValueError): - wDes = np.arange(0.01, 3, 0.01) - wCapy, addedMass, damping, fEx = fdo.read_capy_nc(capyTestFile, wDes=wDes) - -def test_read_capy_nc_addedMassVals(): - wCapy, addedMass, damping, fEx = fdo.read_capy_nc(capyTestFile) - refAddedMass = np.loadtxt(f'./ref_data/capytaine_integration/wCapy-addedMass-surge.txt') - assert max(abs(refAddedMass[:,1] - addedMass[0,0,:])) < 1e-12 - -def test_read_capy_nc_dampingVals(): - wCapy, addedMass, damping, fEx = fdo.read_capy_nc(capyTestFile) - refDamping = np.loadtxt(f'./ref_data/capytaine_integration/wCapy-damping-surge.txt') - assert max(abs(refDamping[:,1] - damping[0,0,:])) < 1e-12 - -def test_read_capy_nc_fExRealVals(): - wCapy, addedMass, damping, fEx = fdo.read_capy_nc(capyTestFile) - refFExReal = np.loadtxt(f'./ref_data/capytaine_integration/wCapy-fExcitationReal-surge.txt') - assert max(abs(refFExReal[:,1] - fEx[0,:].real)) < 1e-12 - -def test_read_capy_nc_fExImagVals(): - wCapy, addedMass, damping, fEx = fdo.read_capy_nc(capyTestFile) - refFExImag = np.loadtxt(f'./ref_data/capytaine_integration/wCapy-fExcitationImag-surge.txt') - assert max(abs(refFExImag[:,1] - fEx[0,:].imag)) < 1e-12 - -def test_read_capy_nc_addedMassInterpVals(): - wDes = np.arange(0.1, 2.8, 0.01) - wDes, addedMassInterp, dampingInterp, fExInterp = fdo.read_capy_nc(capyTestFile, wDes=wDes) - refAddedMassInterp = np.loadtxt(f'./ref_data/capytaine_integration/wDes-addedMassInterp-surge.txt') - assert max(abs(refAddedMassInterp[:,1] - addedMassInterp[0,0,:])) < 1e-12 - -def test_read_capy_nc_dampingInterpVals(): - wDes = np.arange(0.1, 2.8, 0.01) - wDes, addedMassInterp, dampingInterp, fExInterp = fdo.read_capy_nc(capyTestFile, wDes=wDes) - refDampingInterp = np.loadtxt(f'./ref_data/capytaine_integration/wDes-dampingInterp-surge.txt') - assert max(abs(refDampingInterp[:,1] - dampingInterp[0,0,:])) < 1e-12 - -def test_read_capy_nc_fExInterpRealVals(): - wDes = np.arange(0.1, 2.8, 0.01) - wDes, addedMassInterp, dampingInterp, fExInterp = fdo.read_capy_nc(capyTestFile, wDes=wDes) - refFExInterpReal = np.loadtxt(f'./ref_data/capytaine_integration/wDes-fExcitationInterpReal-surge.txt') - assert max(abs(refFExInterpReal[:,1] - fExInterp[0,:].real)) < 1e-12 - -def test_read_capy_nc_fExInterpImagVals(): - wDes = np.arange(0.1, 2.8, 0.01) - wDes, addedMassInterp, dampingInterp, fExInterp = fdo.read_capy_nc(capyTestFile, wDes=wDes) - refFExInterpImag = np.loadtxt(f'./ref_data/capytaine_integration/wDes-fExcitationInterpImag-surge.txt') - assert max(abs(refFExInterpImag[:,1] - fExInterp[0,:].imag)) < 1e-12 - -def test_call_capy_addedMassShape(): - wRange = np.arange(0.1, 2.9, 0.1) - meshFName = f'./test_data/float.gdf' - wCapy, addedMass, damping, fEx = fdo.call_capy(meshFName, wRange) - assert addedMass.shape == (6, 6, 28) - -def test_call_capy_dampingShape(): - wRange = np.arange(0.1, 2.9, 0.1) - meshFName = f'./test_data/float.gdf' - wCapy, addedMass, damping, fEx = fdo.call_capy(meshFName, wRange) - assert damping.shape == (6, 6, 28) - -def test_call_capy_fExShape(): - wRange = np.arange(0.1, 2.9, 0.1) - meshFName = f'./test_data/float.gdf' - wCapy, addedMass, damping, fEx = fdo.call_capy(meshFName, wRange) - assert fEx.shape == (6, 28) - -def test_call_capy_fExComplex(): - wRange = np.arange(0.1, 2.9, 0.1) - meshFName = f'./test_data/float.gdf' - wCapy, addedMass, damping, fEx = fdo.call_capy(meshFName, wRange) - assert fEx.dtype == 'complex128' - -def test_call_capy_addedMassVals(): - wRange = np.arange(0.1, 2.9, 0.1) - meshFName = f'./test_data/float.gdf' - refNc = f'./ref_data/capytaine_integration/floatData.nc' - wCapy, addedMass, damping, fEx = fdo.call_capy(meshFName, wRange) - refwCapy, refAddedMass, refDamping, refFEx = fdo.read_capy_nc(refNc) - assert max(abs(refAddedMass[0,0,:] - addedMass[0,0,:])) < 1e-12 - -def test_call_capy_dampingVals(): - wRange = np.arange(0.1, 2.9, 0.1) - meshFName = f'./test_data/float.gdf' - refNc = f'./ref_data/capytaine_integration/floatData.nc' - wCapy, addedMass, damping, fEx = fdo.call_capy(meshFName, wRange) - refwCapy, refAddedMass, refDamping, refFEx = fdo.read_capy_nc(refNc) - assert max(abs(refDamping[0,0,:] - damping[0,0,:])) < 1e-12 - -def test_call_capy_fExRealVals(): - wRange = np.arange(0.1, 2.9, 0.1) - meshFName = f'./test_data/float.gdf' - refNc = f'./ref_data/capytaine_integration/floatData.nc' - wCapy, addedMass, damping, fEx = fdo.call_capy(meshFName, wRange) - refwCapy, refAddedMass, refDamping, refFEx = fdo.read_capy_nc(refNc) - assert max(abs(refFEx[0,:].real - fEx[0,:].real)) < 1e-12 - -def test_call_capy_fExImagVals(): - wRange = np.arange(0.1, 2.9, 0.1) - meshFName = f'./test_data/float.gdf' - refNc = f'./ref_data/capytaine_integration/floatData.nc' - wCapy, addedMass, damping, fEx = fdo.call_capy(meshFName, wRange) - refwCapy, refAddedMass, refDamping, refFEx = fdo.read_capy_nc(refNc) - assert max(abs(refFEx[0,:].imag - fEx[0,:].imag)) < 1e-12 diff --git a/ROSCO/.github/workflows/CI_rosco-compile.yml b/ROSCO/.github/workflows/CI_rosco-compile.yml index c04abb8f6..3e4e70c38 100644 --- a/ROSCO/.github/workflows/CI_rosco-compile.yml +++ b/ROSCO/.github/workflows/CI_rosco-compile.yml @@ -3,9 +3,9 @@ name: CI_rosco-compile # We run CI on push commits on all branches on: [push, pull_request] -# Specify FORTRAN compiler +# Specify FORTRAN compiler, used to be "gfortran-10" env: - FORTRAN_COMPILER: gfortran-10 + FORTRAN_COMPILER: gfortran # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: @@ -16,11 +16,11 @@ jobs: fail-fast: true matrix: os: ["ubuntu-latest", "macOS-latest", "windows-latest"] - python-version: ["3.8"] + python-version: ["3.9"] steps: - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Setup environment uses: conda-incubator/setup-miniconda@v2 @@ -28,7 +28,7 @@ jobs: miniconda-version: "latest" channels: conda-forge, general auto-update-conda: true - python-version: 3.8 + python-version: 3.9 environment-file: environment.yml # Install ROSCO toolbox @@ -42,19 +42,25 @@ jobs: shell: bash -l {0} run: python ROSCO/rosco_registry/write_registry.py - - name: Add dependencies windows if: true == contains( matrix.os, 'windows') - shell: bash -l {0} run: | conda install -y m2w64-toolchain + - name: Add dependencies windows + if: true == contains( matrix.os, 'mac') + shell: bash -l {0} + run: | + conda install -y gfortran + - name: Setup Workspace - run: cmake -E make_directory ${{runner.workspace}}/ROSCO/ROSCO/build + run: | + cmake -E make_directory ${{runner.workspace}}/ROSCO/ROSCO/build - name: Configure and Build - unix if: false == contains( matrix.os, 'windows') - working-directory: ${{runner.workspace}}/ROSCO/ROSCO/build + shell: bash -l {0} + working-directory: "${{runner.workspace}}/ROSCO/ROSCO/build" run: | cmake \ -DCMAKE_INSTALL_PREFIX:PATH=${{runner.workspace}}/ROSCO/ROSCO/install \ @@ -64,11 +70,8 @@ jobs: - name: Configure and Build - windows if: true == contains( matrix.os, 'windows') - working-directory: ${{runner.workspace}}/ROSCO/ROSCO/build - shell: bash -l {0} + #shell: bash #-l {0} + working-directory: "${{runner.workspace}}/ROSCO/ROSCO/build" run: | - cmake \ - -DCMAKE_INSTALL_PREFIX:PATH=${{runner.workspace}}/ROSCO/ROSCO/install \ - -G "MinGW Makefiles" \ - .. + cmake -G "MinGW Makefiles" -DCMAKE_INSTALL_PREFIX="${{runner.workspace}}/ROSCO/ROSCO/build" .. cmake --build . --target install diff --git a/ROSCO/.github/workflows/CI_rosco-pytools.yml b/ROSCO/.github/workflows/CI_rosco-pytools.yml index 141c16ee9..dbfe77ab4 100644 --- a/ROSCO/.github/workflows/CI_rosco-pytools.yml +++ b/ROSCO/.github/workflows/CI_rosco-pytools.yml @@ -3,9 +3,9 @@ name: CI_rosco-pytools # We run CI on push commits on all branches on: [push, pull_request] -# Specify FORTRAN compiler +# Specify FORTRAN compiler, used to be "gfortran-10" env: - FC: gfortran-10 + FC: gfortran # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: @@ -16,14 +16,14 @@ jobs: fail-fast: true matrix: os: ["ubuntu-latest", "macOS-latest", "windows-latest"] - python-version: ["3.8"] + python-version: ["3.9"] defaults: run: shell: bash -l {0} steps: - name: Checkout repository and submodules - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: submodules: recursive @@ -33,7 +33,7 @@ jobs: miniconda-version: "latest" channels: conda-forge, general auto-update-conda: true - python-version: 3.8 + python-version: 3.9 environment-file: environment.yml @@ -46,10 +46,10 @@ jobs: FC: gfortran - # - name: Add dependencies macOS specific - # if: true == contains( matrix.os, 'macOS') - # run: | - # conda install compilers + - name: Add dependencies macOS specific + if: true == contains( matrix.os, 'macOS') + run: | + conda install compilers # Install ROSCO toolbox - name: Install ROSCO toolbox on Windows @@ -72,14 +72,14 @@ jobs: fail-fast: true matrix: os: ["ubuntu-latest"] #, "macOS-latest"] - python-version: ["3.8"] + python-version: ["3.9"] defaults: run: shell: bash -l {0} steps: - name: Checkout repository and submodules - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: submodules: recursive @@ -89,7 +89,7 @@ jobs: miniconda-version: "latest" channels: conda-forge, general auto-update-conda: true - python-version: 3.8 + python-version: 3.9 environment-file: environment.yml # setup cmake @@ -129,13 +129,13 @@ jobs: # Install OpenFAST - name: Install OpenFAST run: | - conda install openfast==3.2.0 + conda install openfast==3.4 # Run examples - name: Run examples run: | cd Examples - python run_examples.py + python test_examples.py # Test walkthrough notebook - name: Test walkthrough notebook @@ -159,14 +159,14 @@ jobs: fail-fast: true matrix: os: ["ubuntu-latest"] #, "macOS-latest"] - python-version: ["3.8"] + python-version: ["3.9"] defaults: run: shell: bash -l {0} steps: - name: Checkout repository and submodules - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: submodules: recursive @@ -176,7 +176,7 @@ jobs: miniconda-version: "latest" channels: conda-forge, general auto-update-conda: true - python-version: 3.8 + python-version: 3.9 environment-file: environment.yml @@ -194,7 +194,7 @@ jobs: # Install OpenFAST - name: Install OpenFAST run: | - conda install openfast==3.2.0 + conda install openfast==3.4 # Run ROSCO Testing - name: Run ROSCO testing diff --git a/ROSCO/.gitignore b/ROSCO/.gitignore index e633e4cdd..ba1e27c18 100644 --- a/ROSCO/.gitignore +++ b/ROSCO/.gitignore @@ -81,6 +81,7 @@ Examples/*.p # Exclude testing results ROSCO_testing/results/ +ROSCO_testing/testing # Simulink/Matlab temp files *.slxc diff --git a/ROSCO/Examples/example_01.py b/ROSCO/Examples/01_turbine_model.py similarity index 77% rename from ROSCO/Examples/example_01.py rename to ROSCO/Examples/01_turbine_model.py index 14cf3bbd4..95a69baca 100644 --- a/ROSCO/Examples/example_01.py +++ b/ROSCO/Examples/01_turbine_model.py @@ -1,5 +1,5 @@ ''' ------------ Example_01 -------------- +----------- 01_turbine_model -------------- Load and save a turbine model ------------------------------------- In this example: @@ -17,6 +17,7 @@ # ROSCO Modules from ROSCO_toolbox import turbine as ROSCO_turbine from ROSCO_toolbox.inputs.validation import load_rosco_yaml +import matplotlib.pyplot as plt # Load yaml file @@ -33,7 +34,6 @@ turbine.load_from_fast( path_params['FAST_InputFile'], os.path.join(tune_dir,path_params['FAST_directory']), - dev_branch=True, rot_source='txt',txt_filename=os.path.join(tune_dir,path_params['FAST_directory'],path_params['rotor_performance_filename']) ) @@ -45,4 +45,18 @@ if not os.path.isdir(example_out_dir): os.makedirs(example_out_dir) -turbine.save(os.path.join(example_out_dir,'01_NREL5MW_saved.p')) \ No newline at end of file +turbine.save(os.path.join(example_out_dir,'01_NREL5MW_saved.p')) + +# Now load the turbine and plot the Cp surface + +# Load quick from python pickle +turbine = turbine.load(os.path.join(example_out_dir,'01_NREL5MW_saved.p')) + +# plot rotor performance +print('Plotting Cp data') +turbine.Cp.plot_performance() + +if False: + plt.show() +else: + plt.savefig(os.path.join(example_out_dir,'01_NREL5MW_Cp.png')) \ No newline at end of file diff --git a/ROSCO/Examples/example_03.py b/ROSCO/Examples/02_ccblade.py similarity index 91% rename from ROSCO/Examples/example_03.py rename to ROSCO/Examples/02_ccblade.py index a5ea447ab..11afd6a24 100644 --- a/ROSCO/Examples/example_03.py +++ b/ROSCO/Examples/02_ccblade.py @@ -1,5 +1,5 @@ ''' ------------ Example_03 -------------- +----------- 02_ccblade -------------- Run CCblade, save a rotor performance text file ------------------------------------- @@ -10,7 +10,7 @@ - Write a text file with rotor performance properties ''' # Python modules -import yaml, os +import os # ROSCO toolbox modules from ROSCO_toolbox import turbine as ROSCO_turbine from ROSCO_toolbox.utilities import write_rotor_performance @@ -38,10 +38,9 @@ turbine.load_from_fast( path_params['FAST_InputFile'], os.path.join(this_dir,path_params['FAST_directory']), - dev_branch=True, rot_source='cc-blade', txt_filename=None) # Write rotor performance text file -txt_filename = os.path.join(example_out_dir,'03_Cp_Ct_Cq.Ex03.txt') +txt_filename = os.path.join(example_out_dir,'02_Cp_Ct_Cq.Ex03.txt') write_rotor_performance(turbine,txt_filename=txt_filename) diff --git a/ROSCO/Examples/example_04.py b/ROSCO/Examples/03_tune_controller.py similarity index 95% rename from ROSCO/Examples/example_04.py rename to ROSCO/Examples/03_tune_controller.py index 69da8392a..4aa193697 100644 --- a/ROSCO/Examples/example_04.py +++ b/ROSCO/Examples/03_tune_controller.py @@ -1,5 +1,5 @@ ''' ------------ Example_04 -------------- +----------- 03_tune_controller -------------- Load a turbine model and tune the controller ------------------------------------- @@ -38,7 +38,6 @@ turbine.load_from_fast( path_params['FAST_InputFile'], os.path.join(tune_dir,path_params['FAST_directory']), - dev_branch=True, rot_source='txt',txt_filename= cp_filename ) @@ -78,4 +77,4 @@ if False: plt.show() else: - plt.savefig(os.path.join(example_out_dir,'04_GainSched.png')) \ No newline at end of file + plt.savefig(os.path.join(example_out_dir,'03_GainSched.png')) \ No newline at end of file diff --git a/ROSCO/Examples/example_05.py b/ROSCO/Examples/04_simple_sim.py similarity index 96% rename from ROSCO/Examples/example_05.py rename to ROSCO/Examples/04_simple_sim.py index 9555aeb30..aba7e4684 100644 --- a/ROSCO/Examples/example_05.py +++ b/ROSCO/Examples/04_simple_sim.py @@ -1,5 +1,5 @@ ''' ------------ Example_05 -------------- +----------- 04_simple_sim -------------- Run and plot a simple simple step wind simulation ------------------------------------- @@ -59,7 +59,6 @@ turbine.load_from_fast( path_params['FAST_InputFile'], os.path.join(tune_dir,path_params['FAST_directory']), - dev_branch=True, rot_source='txt',txt_filename=cp_filename ) @@ -108,5 +107,5 @@ if False: plt.show() else: - plt.savefig(os.path.join(example_out_dir,'05_NREL5MW_SimpSim.png')) + plt.savefig(os.path.join(example_out_dir,'04_NREL5MW_SimpSim.png')) diff --git a/ROSCO/Examples/example_06.py b/ROSCO/Examples/05_openfast_sim.py similarity index 88% rename from ROSCO/Examples/example_06.py rename to ROSCO/Examples/05_openfast_sim.py index 6eab38347..7dd33085c 100644 --- a/ROSCO/Examples/example_06.py +++ b/ROSCO/Examples/05_openfast_sim.py @@ -1,5 +1,5 @@ ''' ------------ Example_06 -------------- +----------- 05_openfast_sim -------------- Load a turbine, tune a controller, run OpenFAST simulation ------------------------------------- @@ -37,10 +37,12 @@ controller = ROSCO_controller.Controller(controller_params) # Load turbine data from OpenFAST and rotor performance text file -turbine.load_from_fast(path_params['FAST_InputFile'], \ - os.path.join(this_dir,path_params['FAST_directory']), \ - dev_branch=True,rot_source='txt',\ - txt_filename=os.path.join(this_dir,path_params['FAST_directory'],path_params['rotor_performance_filename'])) +turbine.load_from_fast( + path_params['FAST_InputFile'], + os.path.join(this_dir,path_params['FAST_directory']), + rot_source='txt', + txt_filename=os.path.join(this_dir,path_params['FAST_directory'],path_params['rotor_performance_filename']) + ) # Tune controller controller.tune_controller(turbine) @@ -79,7 +81,7 @@ if False: plt.show() else: - plt.savefig(os.path.join(example_out_dir,'06_GainSched.png')) + plt.savefig(os.path.join(example_out_dir,'05_GainSched.png')) # Run OpenFAST # --- May need to change fastcall if you use a non-standard command to call openfast diff --git a/ROSCO/Examples/example_07.py b/ROSCO/Examples/06_peak_shaving.py similarity index 94% rename from ROSCO/Examples/example_07.py rename to ROSCO/Examples/06_peak_shaving.py index 3fc16f859..525e4fc08 100644 --- a/ROSCO/Examples/example_07.py +++ b/ROSCO/Examples/06_peak_shaving.py @@ -1,5 +1,5 @@ ''' ------------ Example_07 -------------- +----------- 06_peak_shavings -------------- Load saved turbine, tune controller, plot minimum pitch schedule ------------------------------------- @@ -44,7 +44,6 @@ turbine.load_from_fast( path_params['FAST_InputFile'], os.path.join(tune_dir,path_params['FAST_directory']), - dev_branch=True, rot_source='txt',txt_filename=os.path.join(tune_dir,path_params['FAST_directory'],path_params['rotor_performance_filename']) ) # Tune controller @@ -61,4 +60,4 @@ if False: plt.show() else: - plt.savefig(os.path.join(example_out_dir,'07_MinPitch.png')) + plt.savefig(os.path.join(example_out_dir,'06_MinPitch.png')) diff --git a/ROSCO/Examples/example_08.py b/ROSCO/Examples/07_openfast_outputs.py similarity index 91% rename from ROSCO/Examples/example_08.py rename to ROSCO/Examples/07_openfast_outputs.py index f4732a279..d50eab991 100644 --- a/ROSCO/Examples/example_08.py +++ b/ROSCO/Examples/07_openfast_outputs.py @@ -1,5 +1,5 @@ ''' ------------ Example_08 -------------- +----------- 07_openfast_outputss -------------- Plot some OpenFAST output data ------------------------------------- @@ -46,9 +46,9 @@ # fast_out.plot_fast_out() # Load and plot -fastout = fast_out.load_fast_out(filenames, tmin=10) +fastout = fast_out.load_fast_out(filenames) fast_out.plot_fast_out(cases=cases,showplot=False) -plt.savefig(os.path.join(example_out_dir,'08_IEA-15MW_Semi_Out.png')) +plt.savefig(os.path.join(example_out_dir,'07_IEA-15MW_Semi_Out.png')) diff --git a/ROSCO/Examples/example_09.py b/ROSCO/Examples/08_run_turbsim.py similarity index 93% rename from ROSCO/Examples/example_09.py rename to ROSCO/Examples/08_run_turbsim.py index bdabca8a2..488b07eaf 100644 --- a/ROSCO/Examples/example_09.py +++ b/ROSCO/Examples/08_run_turbsim.py @@ -1,5 +1,5 @@ ''' ------------ Example_09 -------------- +----------- 08_run_turbsim -------------- Run TurbSim to create wind field binary ------------------------------------- diff --git a/ROSCO/Examples/example_10.py b/ROSCO/Examples/09_distributed_aero.py similarity index 89% rename from ROSCO/Examples/example_10.py rename to ROSCO/Examples/09_distributed_aero.py index 7a7b06937..234fd6de8 100644 --- a/ROSCO/Examples/example_10.py +++ b/ROSCO/Examples/09_distributed_aero.py @@ -1,5 +1,5 @@ ''' ------------ Example_10 -------------- +----------- 09_distributed_aero -------------- Tune a controller for distributed aerodynamic control ------------------------------------- @@ -34,8 +34,10 @@ # Load turbine data from openfast model turbine = ROSCO_turbine.Turbine(turbine_params) -turbine.load_from_fast(path_params['FAST_InputFile'], \ - os.path.join(this_dir,path_params['FAST_directory']),dev_branch=True) +turbine.load_from_fast( + path_params['FAST_InputFile'], + os.path.join(this_dir,path_params['FAST_directory']) + ) # Tune controller controller = ROSCO_controller.Controller(controller_params) diff --git a/ROSCO/Examples/example_11.py b/ROSCO/Examples/10_linear_params.py similarity index 96% rename from ROSCO/Examples/example_11.py rename to ROSCO/Examples/10_linear_params.py index 6b1e96801..69aa30943 100644 --- a/ROSCO/Examples/example_11.py +++ b/ROSCO/Examples/10_linear_params.py @@ -1,5 +1,5 @@ ''' ------------ Example_11 -------------- +----------- 10_linear_params -------------- Load a turbine, tune a controller, export linear model ------------------------------------- @@ -33,7 +33,7 @@ if not os.path.isdir(example_out_dir): os.makedirs(example_out_dir) -linmod_filename = os.path.join(example_out_dir,'11_IEA15MW_LinMod.dat') +linmod_filename = os.path.join(example_out_dir,'10_IEA15MW_LinMod.dat') # Instantiate turbine, controller, and file processing classes turbine = ROSCO_turbine.Turbine(turbine_params) @@ -44,7 +44,6 @@ turbine.load_from_fast( path_params['FAST_InputFile'], os.path.join(this_dir,path_params['FAST_directory']), - dev_branch=True, rot_source='txt', txt_filename=os.path.join(tune_dir,path_params['FAST_directory'],path_params['rotor_performance_filename']) ) diff --git a/ROSCO/Examples/example_12.py b/ROSCO/Examples/11_robust_tuning.py similarity index 96% rename from ROSCO/Examples/example_12.py rename to ROSCO/Examples/11_robust_tuning.py index 9d8c593d9..aa4d7df66 100644 --- a/ROSCO/Examples/example_12.py +++ b/ROSCO/Examples/11_robust_tuning.py @@ -1,5 +1,5 @@ ''' ------------ Example_12 -------------- +----------- 11_robust_tuning -------------- Controller tuning to satisfy a robustness criteria ------------------------------------- NOTE: This example necessitates the mbc3 through either pyFAST or WEIS @@ -43,7 +43,7 @@ def run_example(): # Path options example_out_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'examples_out') - output_name = '12_robust_scheduling' + output_name = '11_robust_scheduling' path_options = {'output_dir': example_out_dir, 'output_name': output_name } @@ -54,7 +54,6 @@ def run_example(): turbine.load_from_fast( path_params['FAST_InputFile'], os.path.join(this_dir, path_params['FAST_directory']), - dev_branch=True, rot_source='txt', txt_filename=os.path.join(this_dir,path_params['FAST_directory'],path_params['rotor_performance_filename']) ) @@ -124,7 +123,7 @@ def run_example(): if False: plt.show() else: - fig.savefig(os.path.join(example_out_dir, '12_RobustSched.png')) + fig.savefig(os.path.join(example_out_dir, '11_RobustSched.png')) # ---- Plot nyquist ---- # Re-load and trimlinturb for plotting diff --git a/ROSCO/Examples/12_tune_ipc.py b/ROSCO/Examples/12_tune_ipc.py new file mode 100644 index 000000000..e435becff --- /dev/null +++ b/ROSCO/Examples/12_tune_ipc.py @@ -0,0 +1,71 @@ +''' +----------- 12_tune_ipc -------------- +Load a turbine, tune a controller with IPC +------------------------------------- + +In this example: + - Load a turbine from OpenFAST + - Tune a controller with IPC + - Run simple simulation with open loop control + +''' +# Python Modules +import os, platform +import matplotlib.pyplot as plt + +# ROSCO toolbox modules +from ROSCO_toolbox.ofTools.fast_io import output_processing +from ROSCO_toolbox.ofTools.case_gen.run_FAST import run_FAST_ROSCO +from ROSCO_toolbox.ofTools.case_gen import CaseLibrary as cl + +def main(): + this_dir = os.path.dirname(os.path.abspath(__file__)) + rosco_dir = os.path.dirname(this_dir) + example_out_dir = os.path.join(this_dir,'examples_out') + example_name = '12_ipc_sim' + run_dir = os.path.join(example_out_dir, example_name) + + # Load yaml file (Open Loop Case) + parameter_filename = os.path.join(rosco_dir,'Tune_Cases/NREL2p8.yaml') + + case_inputs = {} + case_inputs[('ServoDyn','Ptch_Cntrl')] = {'vals': [1], 'group': 0} + case_inputs[('DISCON_in','IPC_SatMode')] = {'vals': [0,1,2,3], 'group': 1} + + + + # simulation set up + r = run_FAST_ROSCO() + r.tuning_yaml = parameter_filename + r.wind_case_fcn = cl.ramp # single step wind input + r.wind_case_opts = { + 'U_start': 11, # from 10 to 15 m/s + 'U_end': 9, + 't_start': 100, + 't_end': 400, + 'both_dir': True, + 'vert_shear': 0.2 + } + r.case_inputs = case_inputs + r.save_dir = run_dir + r.rosco_dir = rosco_dir + r.n_cores = 4 + r.run_FAST() + + + # # Define Plot cases + cases = {} + cases['Baseline'] = ['Wind1VelX', 'BldPitch1', 'RootMyc1', 'RotSpeed'] + + out_files = [os.path.join(example_out_dir,example_name,f'NREL2p8/ramp/base/NREL2p8_{i_case}.outb') for i_case in range(4)] + op = output_processing.output_processing() + fastout = op.load_fast_out(out_files, tmin=0) + fig, ax = op.plot_fast_out(cases=cases,showplot=False) + if False: + plt.show() + else: + fig[0].savefig(os.path.join(example_out_dir,'12_ipc_FAST_Out.png')) + +if __name__=="__main__": + main() + diff --git a/ROSCO/Examples/example_14.py b/ROSCO/Examples/14_open_loop_control.py similarity index 98% rename from ROSCO/Examples/example_14.py rename to ROSCO/Examples/14_open_loop_control.py index 2b14f2495..7ca794629 100644 --- a/ROSCO/Examples/example_14.py +++ b/ROSCO/Examples/14_open_loop_control.py @@ -1,5 +1,5 @@ ''' ------------ Example_14 -------------- +----------- 14_open_loop_control -------------- Load a turbine, tune a controller with open loop control commands ------------------------------------- @@ -76,7 +76,7 @@ # Load turbine data from OpenFAST and rotor performance text file turbine.load_from_fast(path_params['FAST_InputFile'], \ os.path.join(this_dir,path_params['FAST_directory']), \ - dev_branch=True,rot_source='txt',\ + rot_source='txt',\ txt_filename=os.path.join(this_dir,path_params['FAST_directory'],path_params['rotor_performance_filename'])) # Tune controller diff --git a/ROSCO/Examples/example_15.py b/ROSCO/Examples/15_pass_through.py similarity index 93% rename from ROSCO/Examples/example_15.py rename to ROSCO/Examples/15_pass_through.py index baa29c8af..f33fd3f75 100644 --- a/ROSCO/Examples/example_15.py +++ b/ROSCO/Examples/15_pass_through.py @@ -1,5 +1,5 @@ ''' ------------ Example_15 -------------- +----------- 15_pass_through -------------- Use the runFAST scripts to set up an example, use pass through in yaml ------------------------------------- @@ -37,6 +37,7 @@ def main(): 'wind_dir': run_dir } r.save_dir = run_dir + r.rosco_dir = rosco_dir r.run_FAST() diff --git a/ROSCO/Examples/example_16.py b/ROSCO/Examples/16_external_dll.py similarity index 95% rename from ROSCO/Examples/example_16.py rename to ROSCO/Examples/16_external_dll.py index 96268013a..afb629ecd 100644 --- a/ROSCO/Examples/example_16.py +++ b/ROSCO/Examples/16_external_dll.py @@ -1,5 +1,5 @@ ''' ------------ Example_16 -------------- +----------- 16_external_dll -------------- Run openfast with ROSCO and external control interface ------------------------------------- @@ -48,7 +48,7 @@ def main(): controller_params['DISCON']['DLL_InFile'] = os.path.join(rosco_dir,'Test_Cases/NREL-5MW/DISCON.IN') controller_params['DISCON']['DLL_ProcName'] = 'DISCON' - # RAAW FAD set up + # simulation set up r = run_FAST_ROSCO() r.tuning_yaml = parameter_filename r.wind_case_fcn = cl.simp_step @@ -58,6 +58,7 @@ def main(): 'wind_dir': run_dir } r.controller_params = controller_params + r.rosco_dir = rosco_dir r.save_dir = run_dir r.run_FAST() diff --git a/ROSCO/Examples/example_17.py b/ROSCO/Examples/17_zeromq_interface.py similarity index 98% rename from ROSCO/Examples/example_17.py rename to ROSCO/Examples/17_zeromq_interface.py index c77e8cc64..ae8a34aea 100644 --- a/ROSCO/Examples/example_17.py +++ b/ROSCO/Examples/17_zeromq_interface.py @@ -1,5 +1,5 @@ ''' ------------ Example_17 -------------- +----------- 17_zeromq_interface -------------- Run ROSCO using the ROSCO toolbox control interface and execute communication with ZeroMQ ------------------------------------- @@ -80,7 +80,6 @@ def sim_rosco(): turbine.load_from_fast( path_params['FAST_InputFile'], os.path.join(tune_dir, path_params['FAST_directory']), - dev_branch=True, rot_source='txt', txt_filename=cp_filename ) diff --git a/ROSCO/Examples/18_pitch_offsets.py b/ROSCO/Examples/18_pitch_offsets.py new file mode 100644 index 000000000..ace996c52 --- /dev/null +++ b/ROSCO/Examples/18_pitch_offsets.py @@ -0,0 +1,85 @@ +''' +----------- 18_pitch_offsets ------------------------ +Run openfast with ROSCO and pitch offset faults +----------------------------------------------- + +Set up and run simulation with pitch offsets, check outputs + +''' + +import os, platform +from ROSCO_toolbox.ofTools.case_gen.run_FAST import run_FAST_ROSCO +from ROSCO_toolbox.ofTools.case_gen import CaseLibrary as cl +from ROSCO_toolbox.ofTools.fast_io import output_processing +import numpy as np + + +#directories +this_dir = os.path.dirname(os.path.abspath(__file__)) +rosco_dir = os.path.dirname(this_dir) +example_out_dir = os.path.join(this_dir,'examples_out') +os.makedirs(example_out_dir,exist_ok=True) + +if platform.system() == 'Windows': + lib_name = os.path.realpath(os.path.join(this_dir, '../ROSCO/build/libdiscon.dll')) +elif platform.system() == 'Darwin': + lib_name = os.path.realpath(os.path.join(this_dir, '../ROSCO/build/libdiscon.dylib')) +else: + lib_name = os.path.realpath(os.path.join(this_dir, '../ROSCO/build/libdiscon.so')) + + +def main(): + + # Input yaml and output directory + parameter_filename = os.path.join(rosco_dir,'Tune_Cases/IEA15MW.yaml') + run_dir = os.path.join(example_out_dir,'18_PitchFaults') + os.makedirs(run_dir,exist_ok=True) + + # Set DISCON input dynamically through yaml/dict + controller_params = {} + controller_params['PF_Mode'] = 1 # Set pitch fault mode to pitch offsets + controller_params['DISCON'] = {} + + pitch2_offset = 1 # deg + pitch3_offset = -2 # deg + controller_params['DISCON']['PF_Offsets'] = [0.,float(np.radians(pitch2_offset)),float(np.radians(pitch3_offset))] + + # simulation set up + r = run_FAST_ROSCO() + r.tuning_yaml = parameter_filename + r.wind_case_fcn = cl.simp_step # single step wind input + r.wind_case_opts = { + 'U_start': [10], # from 10 to 15 m/s + 'U_end': [15], + 'wind_dir': run_dir, + 'T_step': 50, # step at 50 sec + 'T_Max': 100 # simulation is 100 sec + } + r.case_inputs = {} + r.case_inputs[("ServoDyn","Ptch_Cntrl")] = {'vals':[1], 'group':0} # Individual pitch control must be enabled in ServoDyn + r.controller_params = controller_params + r.save_dir = run_dir + r.rosco_dir = rosco_dir + + r.run_FAST() + + + # Check pitch offsets + filenames = [os.path.join(run_dir,'IEA15MW/simp_step/base/IEA15MW_0.outb')] + fast_out = output_processing.output_processing() + + # Load and plot + fastout = fast_out.load_fast_out(filenames) + offset_2 = fastout[0]['BldPitch2'] - fastout[0]['BldPitch1'] + offset_3 = fastout[0]['BldPitch3'] - fastout[0]['BldPitch1'] + + # check that offset (min,max) is very close to prescribed values + np.testing.assert_almost_equal(offset_2.max(),pitch2_offset,decimal=3) + np.testing.assert_almost_equal(offset_2.min(),pitch2_offset,decimal=3) + np.testing.assert_almost_equal(offset_3.max(),pitch3_offset,decimal=3) + np.testing.assert_almost_equal(offset_3.max(),pitch3_offset,decimal=3) + + + +if __name__=="__main__": + main() \ No newline at end of file diff --git a/ROSCO/Examples/19_update_discon_version.py b/ROSCO/Examples/19_update_discon_version.py new file mode 100644 index 000000000..342cd4d2a --- /dev/null +++ b/ROSCO/Examples/19_update_discon_version.py @@ -0,0 +1,29 @@ +''' +----------- 19_update_discon_version ----------------- +Test and demonstrate update_discon_version() function for converting an old ROSCO input +to the current version +''' + +import os +from ROSCO_toolbox.tune import update_discon_version + +this_dir = os.path.dirname(os.path.abspath(__file__)) +rosco_dir = os.path.dirname(this_dir) + + +def main(): + + old_discon_filename = os.path.join(this_dir,'example_inputs','DISCON_v2.2.0.IN') # An IEA-15MW input + + # Tuning yaml can be anything, does not have to correspond to old discon + tuning_yaml = os.path.join(rosco_dir,'Tune_Cases','NREL5MW.yaml') # dummy for now + update_discon_version( + old_discon_filename, + tuning_yaml, + os.path.join(this_dir,'examples_out','18_UPDATED_DISCON.IN') + ) + + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/ROSCO/Examples/20_active_wake_control.py b/ROSCO/Examples/20_active_wake_control.py new file mode 100644 index 000000000..c67555d84 --- /dev/null +++ b/ROSCO/Examples/20_active_wake_control.py @@ -0,0 +1,244 @@ +''' +----------- 20_active_wake_control ------------ +Run openfast with ROSCO and active wake control +----------------------------------------------- +Set up and run simulation with AWC, check outputs +Active wake control (AWC) with blade pitching is implemented in this example with two approaches as detailed below: + +----------------------------------------------- +AWC_Mode = 1: Normal mode method: +----------------------------------------------- +The normal mode method is an adaptation into the rotating frame of the mathematical framework from the classical theory for stability of axisymmetric jets [1], which offers flexibility in specifying the forcing strategy. + +The inputs to the controller are: + Name Unit Type Range Description + AWC_NumModes - Integer [0,inf] number of forcing modes + AWC_n - Integer [-inf,inf] azimuthal mode number(s) (i.e., the azimuthal mode number relates to the number and direction of the lobes of the wake structure according to the classical spatio-temporal Fourier decomposition of an arbitrary quantity q, sigma{sigma{q*exp(i*n*theta)*exp(i*omega*time)}}. For the case of a non-time-varying flow (i.e., where omega = 0), the azimuthal mode number specifies the number of cycles of blade pitch oscillation per one rotation around the rotor azimuth.) + AWC_clockangle deg Float [0,360] clocking angle(s) of forcing mode(s) + AWC_freq Hz Float [0,inf] frequency(s) of forcing mode(s) + AWC_amp deg Float [0,inf] pitch amplitude(s) of forcing mode(s) (note that AWC_amp specifies the amplitude of each individual mode so that the total amplitude of pitching will be the sum of AWC_amp) + +The latter two inputs may be specified based on the expected inflow while the former three inputs determine the type of active wake control to be used. + +Readers may be familiar with several forcing strategies from literature on active wake control that can be represented as follows: + -collective dynamic induction control: AWC_NumModes = 1, AWC_n = 0, AWC_clockangle = 0 + -helix clockwise [2]: AWC_NumModes = 1, AWC_n = 1, AWC_clockangle = 0 + -helix counter-clockwise [2]: AWC_NumModes = 1, AWC_n = -1, AWC_clockangle = 0 + -up-and-down: AWC_NumModes = 2, AWC_n = -1 1, AWC_clockangle = 0 0 + -side-to-side: AWC_NumModes = 2, AWC_n = -1 1, AWC_clockangle = 90 90 + -other: Higher-order modes or different combinations of the above can also be specified + + These strategies are implemented using the following calculation methodology: + For each blade, we compute the total phase angle of blade pitch excursion according to: + AWC_angle(t) = 2*Pi*AWC_freq * t - AWC_n * (psi(t) + phi + AWC_clockangle*PI/180) (eq 1) + where t is time + phi(t) is the angular offset of the given blade in the rotor plane relative to blade 1 + psi is the angle of blade 1 in the rotor plane from top-dead center + + Next, the phase angle is converted into the complex pitch amplitude: + AWC_complexangle(t) = AWC_amp*PI/180 * EXP(i * AWC_angle(t)) (eq 2) + where i is the square root of -1 + + Note that if AWC_NumModes>1, then eq 1 and 2 are computed for each additional mode, and AWC_complexangle becomes a summation over all modes for each blade. + + Finally, the real pitch amplitude, theta(t), to be passed to the next step of the controller is calculated: + theta(t) = theta_0(t) + REAL(AWC_complexangle(t)) (eq 3) + where theta_0(t) is the controller's nominal pitch command + + Rearranging for ease of viewing: + Inserting eq 1 into eq 2, and then putting that result into eq 3 gives: + theta(t) = theta_0(t) + REAL(AWC_amp*PI/180 * EXP(i * (2*Pi*AWC_freq * t - AWC_n * (psi(t) + phi + AWC_clockangle*PI/180)))) (eq 4) + + Applying Euler's formula and carrying out the REAL operator: + theta(t) = theta_0(t) + AWC_amp*PI/180 * cos(2*Pi*AWC_freq * t - AWC_n * (psi(t) + phi + AWC_clockangle*PI/180)) (eq 5) + + As an example, we can set parameters to produce the counter-clockwise helix pattern from [2] using AWC_NumModes = 1, AWC_n = -1, and AWC_clockangle = 0: + For blade 1, eq 5 becomes: + theta(t) = theta_0(t) + AWC_amp*PI/180 * cos(2*Pi*AWC_freq * t + psi(t)) (eq 6) + +Note that the inverse multi-blade coordinate (MBC) transformation can also be used to obtain the same result as eq 6. + Beginning with Eq. 3 from [2], we have + + / \ / \ + | theta_1(t) | | theta_0(t) | + | theta_2(t) | = T^-1(psi(t)) * | theta_tilt(t) | (eq 7) + | theta_3(t) | | theta_yaw(t) | + \ / \ / + + where + + / \ + | 1 cos(psi_1(t)) sin(psi_1(t)) | + T^-1(psi(t)) = | 1 cos(psi_2(t)) sin(psi_2(t)) | + | 1 cos(psi_3(t)) sin(psi_3(t)) | + \ / + + Multiplying the first row of the top matrix (and dropping the subscript of blade 1) yields: + theta(t) = theta_0(t) + theta_tilt(t)*cos(psi(t)) + theta_yaw(t)*sin(psi(t)) (eq 8) + + Setting theta_tilt(t) = AWC_amp*PI/180 * cos(2*Pi*AWC_freq * t) and theta_yaw(t) = -AWC_amp*PI/180 * sin(2*Pi*AWC_freq * t) gives: + theta(t) = theta_0(t) + (AWC_amp*PI/180 * cos(2*Pi*AWC_freq * t))*cos(psi(t)) - (AWC_amp*PI/180 * sin(2*Pi*AWC_freq * t))*sin(psi(t)) (eq 9) + + Applying a Ptolemy identity gives: + theta(t) = theta_0(t) + AWC_amp*PI/180 * cos(2*Pi*AWC_freq * t + psi(t)) (eq 10) + which is equivlanet to eq 6 above. + +----------------------------------------------- +AWC_Mode = 2: Coleman transform method: +----------------------------------------------- +A second method is the Coleman transform method. + +The inputs to the controller are: + Name Unit Type Range Description + AWC_NumModes - Integer [1,2] number of modes for tilt and yaw (1: identical settings for tilt and yaw pitch angles, 2: seperate settings for tilt and yaw moments) + AWC_harmonic - Integer [0,inf] harmonic(s) to apply in the inverse Coleman transform (size = AWC_NumModes. 0: collective pitch AWC, 1: 1P IPC-AWC, 2: 2P IPC-AWC, etc.) + AWC_clockangle deg Array of Floats [-360,360] clocking angle(s) of tilt and yaw pitch angles (size = AWC_NumModes. If size = 1, yaw clockangle = 2*clockangle) + AWC_freq Hz Array of Floats [0,inf] frequency(s) of the tilt and yaw ptich angles, respectively (size = AWC_NumModes. If size = 1, both frequencies are assumed identical) + AWC_amp deg Array of Floats [0,inf] pitch amplitude(s) of tilt and yaw pitch angles (size = AWC_NumModes. If size = 1, both amplitudes are assumed identical) + +Using the inputs mentioned above, the user is able to specify any desired combination of sinusoidal tilt and yaw modes to be tracked by the turbine. +When a single mode is defined in the inputs, the prescribed tilt and yaw angles are assumed to be identical, except for the phase. The phase difference +between the tilt and yaw angles is taken from the input AWC_clockangle. + +Readers may be familiar with several forcing strategies from literature on active wake control that can be represented as follows: + -collective dynamic induction control: AWC_NumModes = 1, AWC_harmonic = 0 + -helix clockwise [2]: AWC_NumModes = 1, AWC_harmonic = 1, AWC_clockangle = -90 OR AWC_NumModes = 2, AWC_n = [1 1], AWC_clockangle = [0 -90] + -helix counter-clockwise [2]: AWC_NumModes = 1, AWC_harmonic = 1, AWC_clockangle = 90 OR AWC_NumModes = 2, AWC_n = [1 1], AWC_clockangle = [0 90] + -up-and-down: AWC_NumModes = 2, AWC_harmonic = [1 1], AWC_amp = [# 0] (where "#" represents the desired amplitude) + -side-to-side: AWC_NumModes = 2, AWC_harmonic = [1 1], AWC_amp = [0 #] (where "#" represents the desired amplitude) + -other: different combinations of the above can also be specified + + These strategies are implemented using the following calculation methodology: + The inputs described above enable the user to specify a desired sinusoidal signal for either the collective pitch (AWC_n = 0) or tilt and yaw pitch + angles (AWC_n = 1). These AWC pitch angles are defined as: + AWC_angle(t) = AWC_amp * sin(2*pi*AWC_freq*t + AWC_clockangle) (eq 1) + + In case of collective pitch AWC, this signal is directly superimposed on the regular pitch control signal. + + In case of IPC-based AWC, the reference tilt and yaw pitch angles theta are transformed to the rotating frame (i.e., pitch angles theta_k(t) for all + individual blades) using the inverse MBC transformation: + + / \ / \ + | theta_1(t) | | theta_0(t) | + | theta_2(t) | = T^-1(psi(t)) * | theta_tilt(t) | (eq 2) + | theta_3(t) | | theta_yaw(t) | + \ / \ / + + where + + theta_tilt(t) = AWC_amp(1) * sin(2*pi*AWC_freq(1)*t + AWC_clockangle(1)) (eq 3) + theta_yaw(t) = AWC_amp(2) * sin(2*pi*AWC_freq(2)*t + AWC_clockangle(2)) (eq 4) + + and + / \ + | 1 cos(psi_1(t)) sin(psi_1(t)) | + T^-1(psi(t)) = | 1 cos(psi_2(t)) sin(psi_2(t)) | (eq 5) + | 1 cos(psi_3(t)) sin(psi_3(t)) | + \ / + + with psi_k(t) the azimuthal position of blade k at time instant t. Note that if AWC_NumModes = 1, it is assumed that: + AWC_amp(2) = AWC_amp(1) + AWC_freq(2) = AWC_freq(1) + AWC_clockangle(2) = 2*AWC_clockangle(1) + + For more information on this control strategy, the user is referred to [2]. + +----------------------------------------------- + +General Implementation note: AWC strategies will be compromised if the AWC pitch command attempts to lower the blade pitch below value PC_MinPit as specified +in the DISCON file, so PC_MinPit may need to be reduced by the user. + +References: +[1] - Batchelor, G. K., and A. E. Gill. "Analysis of the stability of axisymmetric jets." Journal of fluid mechanics 14.4 (1962): 529-551. +[2] - Frederik, Joeri A., et al. "The helix approach: Using dynamic individual pitch control to enhance wake mixing in wind farms." Wind Energy 23.8 (2020): 1739-1751. +''' + +import os, platform +from ROSCO_toolbox.ofTools.case_gen.run_FAST import run_FAST_ROSCO +from ROSCO_toolbox.ofTools.case_gen import CaseLibrary as cl +from ROSCO_toolbox.ofTools.fast_io import output_processing +from ROSCO_toolbox.utilities import read_DISCON, DISCON_dict +import numpy as np + +# Choose your implementation method +AWC_Mode = 1 # 1 for SNL implementation, 2 for Coleman Transformation implementation + +#directories +this_dir = os.path.dirname(os.path.abspath(__file__)) +rosco_dir = os.path.dirname(this_dir) +example_out_dir = os.path.join(this_dir,'examples_out') +os.makedirs(example_out_dir,exist_ok=True) + +if platform.system() == 'Windows': + lib_name = os.path.realpath(os.path.join(this_dir, '../ROSCO/build/libdiscon.dll')) +elif platform.system() == 'Darwin': + lib_name = os.path.realpath(os.path.join(this_dir, '../ROSCO/build/libdiscon.dylib')) +else: + lib_name = os.path.realpath(os.path.join(this_dir, '../ROSCO/build/libdiscon.so')) + + +def main(): + + # Input yaml and output directory + parameter_filename = os.path.join(rosco_dir,'Tune_Cases/NREL2p8.yaml') # will be dummy and overwritten with SNL DISCON params + run_dir = os.path.join(example_out_dir,'20_active_wake_control/all_cases') + os.makedirs(run_dir,exist_ok=True) + + # Read all DISCON inputs + rosco_vt = read_DISCON(os.path.join(rosco_dir,'Test_Cases','NREL_2p8_127/NREL-2p8-127_DISCON.IN')) + + # Apply all discon variables as case inputs + control_base_case = {} + for discon_input in rosco_vt: + control_base_case[('DISCON_in',discon_input)] = {'vals': [rosco_vt[discon_input]], 'group': 0} + + # Set up AWC cases defined above + if AWC_Mode == 1: + control_base_case[('DISCON_in','AWC_Mode')] = {'vals': [0,1,1,1,1,1], 'group': 2} + control_base_case[('DISCON_in','AWC_NumModes')] = {'vals': [1,1,1,1,2,2], 'group': 2} + control_base_case[('DISCON_in','AWC_n')] = {'vals': [[0],[0],[1],[-1],[-1,1], [-1,1]], 'group': 2} + control_base_case[('DISCON_in','AWC_freq')] = {'vals': [[0],[0.05],[0.05],[0.05],[0.05,0.05], [0.05,0.05]], 'group': 2} + control_base_case[('DISCON_in','AWC_amp')] = {'vals': [[0],[2.5],[2.5],[2.5],[1.25,1.25], [1.25,1.25]], 'group': 2} + control_base_case[('DISCON_in','AWC_clockangle')] = {'vals': [[0],[0],[0],[0],[0,0], [90,90]], 'group': 2} + elif AWC_Mode == 2: + control_base_case[('DISCON_in','AWC_Mode')] = {'vals': [0,2,2,2,2,2], 'group': 2} + control_base_case[('DISCON_in','AWC_NumModes')] = {'vals': [1,1,2,2,2,2], 'group': 2} + control_base_case[('DISCON_in','AWC_harmonic')] = {'vals': [[0],[0],[1,1],[1,1],[1,1], [1,1]], 'group': 2} + control_base_case[('DISCON_in','AWC_freq')] = {'vals': [[0],[0.05],[0.05,0.05],[0.05,0.05],[0.05,0.05], [0.05,0.05]], 'group': 2} + control_base_case[('DISCON_in','AWC_amp')] = {'vals': [[0],[2.5],[2.5,2.5],[2.5,2.5],[2.5,0.0], [0.0,2.5]], 'group': 2} + control_base_case[('DISCON_in','AWC_clockangle')] = {'vals': [[0],[0],[0,-90],[0,90],[0,0], [180,180]], 'group': 2} + + # simulation set up + r = run_FAST_ROSCO() + r.tuning_yaml = parameter_filename + r.wind_case_fcn = cl.power_curve # single step wind input + r.wind_case_opts = { + 'U': [14], # from 10 to 15 m/s + 'TMax': 100, + } + r.case_inputs = control_base_case + r.case_inputs[("ServoDyn","Ptch_Cntrl")] = {'vals':[1], 'group':0} # Individual pitch control must be enabled in ServoDyn + r.save_dir = run_dir + r.rosco_dir = rosco_dir + r.n_cores = 5 + r.run_FAST() + + # # Check AWC here + # filenames = [os.path.join(run_dir,'IEA15MW/simp_step/base/IEA15MW_0.outb')] + # fast_out = output_processing.output_processing() + + # # Load and plot + # fastout = fast_out.load_fast_out(filenames) + # offset_2 = fastout[0]['BldPitch2'] - fastout[0]['BldPitch1'] + # offset_3 = fastout[0]['BldPitch3'] - fastout[0]['BldPitch1'] + + # # check that offset (min,max) is very close to prescribed values + # np.testing.assert_almost_equal(offset_2.max(),pitch2_offset,decimal=3) + # np.testing.assert_almost_equal(offset_2.min(),pitch2_offset,decimal=3) + # np.testing.assert_almost_equal(offset_3.max(),pitch3_offset,decimal=3) + # np.testing.assert_almost_equal(offset_3.max(),pitch3_offset,decimal=3) + + + +if __name__=="__main__": + main() diff --git a/ROSCO/Examples/21_optional_inputs.py b/ROSCO/Examples/21_optional_inputs.py new file mode 100644 index 000000000..8a69b0acd --- /dev/null +++ b/ROSCO/Examples/21_optional_inputs.py @@ -0,0 +1,51 @@ +''' +----------- 21_optional_inputse_discon_version ----------------- +Test and demonstrate update_discon_version() function for converting an old ROSCO input +to the current version +''' + +import os, platform +from ROSCO_toolbox import control_interface as ROSCO_ci +from ROSCO_toolbox import sim as ROSCO_sim +from ROSCO_toolbox import turbine as ROSCO_turbine +import numpy as np + + +this_dir = os.path.dirname(os.path.abspath(__file__)) +rosco_dir = os.path.dirname(this_dir) + +example_out_dir = os.path.join(this_dir,'examples_out') +example_in_dir = os.path.join(this_dir,'example_inputs') + + +def main(): + + # Set up rosco_dll + if platform.system() == 'Windows': + rosco_dll = os.path.join(rosco_dir, 'ROSCO/build/libdiscon.dll') + elif platform.system() == 'Darwin': + rosco_dll = os.path.join(rosco_dir, 'ROSCO/build/libdiscon.dylib') + else: + rosco_dll = os.path.join(rosco_dir, 'ROSCO/build/libdiscon.so') + + # Load turbine model from saved pickle + turbine = ROSCO_turbine.Turbine + turbine = turbine.load(os.path.join(example_out_dir,'01_NREL5MW_saved.p')) + + # Not an extensive list, but can add if issues arise + param_filenames = [ + os.path.join(example_in_dir, 'minimal_DISCON.IN'), # pass + os.path.join(example_in_dir, 'minimal_DISCON_err.IN'), # fail + ] + + avi_fail = [] + for param_filename in param_filenames: + controller_int = ROSCO_ci.ControllerInterface(rosco_dll,param_filename=param_filename,sim_name='sim1') + controller_int.kill_discon() + avi_fail.append(controller_int.aviFAIL.value) + + # Check whether controller call failed + assert avi_fail == [0,-1], "Unexpected pass/fail" + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/ROSCO/Examples/22_cable_control.py b/ROSCO/Examples/22_cable_control.py new file mode 100644 index 000000000..467ed629b --- /dev/null +++ b/ROSCO/Examples/22_cable_control.py @@ -0,0 +1,153 @@ +''' +----------- 22_cable_control ------------------------ +Run openfast with ROSCO and cable control +----------------------------------------------- + +Set up and run simulation with pitch offsets, check outputs + +''' + +import os, platform +from ROSCO_toolbox.ofTools.case_gen.run_FAST import run_FAST_ROSCO +from ROSCO_toolbox.ofTools.case_gen import CaseLibrary as cl +from ROSCO_toolbox.ofTools.fast_io import output_processing +import numpy as np +from ROSCO_toolbox.ofTools.fast_io.FAST_reader import InputReader_OpenFAST +from ROSCO_toolbox.inputs.validation import load_rosco_yaml +import matplotlib.pyplot as plt +from ROSCO_toolbox.controller import OpenLoopControl + +''' +ROSCO currently supports user-defined hooks for cable control actuation, if CC_Mode = 1. +The control logic can be determined in Controllers.f90 with the CableControl subroutine. +The CableControl subroutine takes an array of CC_DesiredL (length) equal to the ChannelIDs set in MoorDyn and +determines the length and change in length needed for MoorDyn using a 2nd order actuator model (CC_ActTau). +In the DISCON input, users must specify CC_GroupIndex relating to the deltaL of each control ChannelID. +These indices can be found in the ServoDyn summary file (*SrvD.sum) + +In the example below (and hard-coded in ROSCO) a step change of -10 m on line 1 is applied at 50 sec. +''' + + +#directories +this_dir = os.path.dirname(os.path.abspath(__file__)) +rosco_dir = os.path.dirname(this_dir) +example_out_dir = os.path.join(this_dir,'examples_out') +os.makedirs(example_out_dir,exist_ok=True) + +def main(): + + # Input yaml and output directory + parameter_filename = os.path.join(rosco_dir,'Tune_Cases/IEA15MW_cable.yaml') + run_dir = os.path.join(example_out_dir,'22_cable_control') + os.makedirs(run_dir,exist_ok=True) + + # Read initial input file + inps = load_rosco_yaml(parameter_filename) + path_params = inps['path_params'] + + # Change inputs programatically, read first + reader = InputReader_OpenFAST() + reader.FAST_InputFile = path_params['FAST_InputFile'] + reader.FAST_directory = os.path.join(rosco_dir,'Tune_Cases',path_params['FAST_directory']) + reader.execute() + + # Set control line mapping (ChannelID -> Line(s)) + reader.fst_vt['MoorDyn']['ChannelID'] = [1, 2, 3] + reader.fst_vt['MoorDyn']['Lines_Control'] = [['1'], ['2'], ['3']] + + # Make segments longer + reader.fst_vt['MoorDyn']['NumSegs'] = [20,20,20] + + # Outputs + reader.fst_vt['MoorDyn']['Outputs'] = ['l', 'l', 'l'] + + # Set up ServoDyn for cable control + reader.fst_vt['ServoDyn']['CCmode'] = 5 + + # Set heading + heading = 40 # deg + reader.fst_vt['ServoDyn']['YawNeut'] = heading + reader.fst_vt['ElastoDyn']['NacYaw'] = heading + reader.fst_vt['InflowWind']['PropagationDir'] = -heading + + t_trans = 100 + t_sigma = 20 + t_max = 200 + + line_ends = [-14.51, 1.58, 10.33] + + olc = OpenLoopControl(t_max=t_max) + olc.interp_timeseries( + 'cable_control_1', + [0,t_trans,t_trans+t_sigma], + [0,0,line_ends[0]] , + 'sigma' + ) + + olc.interp_timeseries( + 'cable_control_2', + [0,t_trans,t_trans+t_sigma], + [0,0,line_ends[1]] , + 'sigma' + ) + + olc.interp_timeseries( + 'cable_control_3', + [0,t_trans,t_trans+t_sigma], + [0,0,line_ends[2]] , + 'sigma' + ) + + + ol_params = olc.write_input(os.path.join(run_dir,'open_loop_cable.dat')) + + controller_params = {} + controller_params['open_loop'] = ol_params + controller_params['CC_Mode'] = 2 + + # simulation set up + r = run_FAST_ROSCO() + r.tuning_yaml = parameter_filename + r.wind_case_fcn = cl.simp_step # single step wind input + r.wind_case_fcn = cl.power_curve + r.wind_case_opts = { + 'U': [8], + 'TMax': t_max, + } + r.case_inputs = {} + r.fst_vt = reader.fst_vt + r.controller_params = controller_params + r.save_dir = run_dir + r.rosco_dir = rosco_dir + + r.run_FAST() + + + op = output_processing.output_processing() + op2 = output_processing.output_processing() + + md_out = op.load_fast_out([os.path.join(run_dir,'IEA15MW_cable/power_curve/base/IEA15MW_cable_0.MD.Line1.out')], tmin=0) + local_vars = op2.load_fast_out([os.path.join(run_dir,'IEA15MW_cable/power_curve/base/IEA15MW_cable_0.RO.dbg2')], tmin=0) + + fig, axs = plt.subplots(4,1) + axs[0].plot(local_vars[0]['Time'],local_vars[0]['CC_DesiredL'],label='CC_DesiredL') + axs[1].plot(local_vars[0]['Time'],local_vars[0]['CC_ActuatedL'],label='CC_ActuatedL') + axs[2].plot(local_vars[0]['Time'],local_vars[0]['CC_ActuatedDL'],label='CC_ActuatedDL') + axs[3].plot(md_out[0]['Time'],md_out[0]['Seg20Lst'],label='Seg20Lst') + + [a.legend() for a in axs] + [a.grid() for a in axs] + + if False: + plt.show() + else: + plt.savefig(os.path.join(example_out_dir,'22_cable_control.png')) + + # Check that the last segment of line 1 shrinks by 10 m + np.testing.assert_almost_equal(md_out[0]['Seg20Lst'][-1] - md_out[0]['Seg20Lst'][0], line_ends[0], 2) + + + +if __name__=="__main__": + main() \ No newline at end of file diff --git a/ROSCO/Examples/23_structural_control.py b/ROSCO/Examples/23_structural_control.py new file mode 100644 index 000000000..2a49b0f5f --- /dev/null +++ b/ROSCO/Examples/23_structural_control.py @@ -0,0 +1,88 @@ +''' +----------- 23_structural_control ------------------------ +Run openfast with ROSCO and structural control +----------------------------------------------- + +Set up and run simulation with pitch offsets, check outputs + +''' + +import os, platform +from ROSCO_toolbox.ofTools.case_gen.run_FAST import run_FAST_ROSCO +from ROSCO_toolbox.ofTools.case_gen import CaseLibrary as cl +import numpy as np +from ROSCO_toolbox.ofTools.fast_io.FAST_reader import InputReader_OpenFAST +from ROSCO_toolbox.inputs.validation import load_rosco_yaml + +''' +ROSCO currently supports user-defined hooks for structural control control actuation, if StC_Mode = 1. +The control logic can be determined in Controllers.f90 with the StructrualControl subroutine. +In the DISCON input, users must specify StC_GroupIndex relating to the control ChannelID. +These indices can be found in the ServoDyn summary file (*SrvD.sum) + +In the example below (and hard-coded in ROSCO) a step change of -4e5 N on the first structural controller +is applied at 50 sec. + +The develop branch (as of Mar 3, 2023) of OpenFAST (v3.5.0, upcoming) is required to run this example +''' + + +#directories +this_dir = os.path.dirname(os.path.abspath(__file__)) +rosco_dir = os.path.dirname(this_dir) +example_out_dir = os.path.join(this_dir,'examples_out') +os.makedirs(example_out_dir,exist_ok=True) + +if platform.system() == 'Windows': + lib_name = os.path.realpath(os.path.join(this_dir, '../ROSCO/build/libdiscon.dll')) +elif platform.system() == 'Darwin': + lib_name = os.path.realpath(os.path.join(this_dir, '../ROSCO/build/libdiscon.dylib')) +else: + lib_name = os.path.realpath(os.path.join(this_dir, '../ROSCO/build/libdiscon.so')) + + +def main(): + + # Input yaml and output directory + parameter_filename = os.path.join(rosco_dir,'Tune_Cases/IEA15MW_ballast.yaml') + run_dir = os.path.join(example_out_dir,'23_structural_control') + os.makedirs(run_dir,exist_ok=True) + + # Read initial input file + inps = load_rosco_yaml(parameter_filename) + path_params = inps['path_params'] + + # Change inputs programatically, read first + reader = InputReader_OpenFAST() + reader.FAST_InputFile = path_params['FAST_InputFile'] + reader.FAST_directory = os.path.join(rosco_dir,'Tune_Cases',path_params['FAST_directory']) + # reader.FAST_directory = '/Users/dzalkind/Tools/ROSCO1/Test_Cases/ptfm_control_archive/IEA-15-240-RWT-UMaineSemi_ballast' + reader.execute() + + reader.fst_vt['ServoDyn']['NumSStC'] = 3 + reader.fst_vt['ServoDyn']['SStCfiles'] = ['StC-Force-Col1.dat', 'StC-Force-Col2.dat', 'StC-Force-Col3.dat'] + # Add SStC file inputs + for StC_file in reader.fst_vt['ServoDyn']['SStCfiles']: + reader.fst_vt['SStC'].append(reader.read_StC(StC_file)) + + + # simulation set up + r = run_FAST_ROSCO() + r.tuning_yaml = parameter_filename + r.wind_case_fcn = cl.simp_step # single step wind input + r.wind_case_fcn = cl.power_curve + r.wind_case_opts = { + 'U': [9], + 'T_max': 100, + } + r.case_inputs = {} + r.fst_vt = reader.fst_vt + r.save_dir = run_dir + r.rosco_dir = rosco_dir + + r.run_FAST() + + + +if __name__=="__main__": + main() \ No newline at end of file diff --git a/ROSCO/Examples/ROSCO_walkthrough.ipynb b/ROSCO/Examples/ROSCO_walkthrough.ipynb index 8f078be6d..d3f912b7c 100644 --- a/ROSCO/Examples/ROSCO_walkthrough.ipynb +++ b/ROSCO/Examples/ROSCO_walkthrough.ipynb @@ -33,23 +33,9 @@ "name": "stdout", "output_type": "stream", "text": [ + "WARNING: Be sure to pip install simpy and marmot-agents for offshore BOS runs\n", "Using ofTools in ROSCO_toolbox...\n" ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/dzalkind/opt/anaconda3/envs/rosco-env/lib/python3.8/site-packages/openmdao/utils/general_utils.py:130: OMDeprecationWarning:simple_warning is deprecated. Use openmdao.utils.om_warnings.issue_warning instead.\n", - "/Users/dzalkind/opt/anaconda3/envs/rosco-env/lib/python3.8/site-packages/openmdao/utils/notebook_utils.py:171: UserWarning:Tabulate is not installed. Run `pip install openmdao[notebooks]` to install required dependencies. Using ASCII for outputs.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WARNING: Be sure to pip install simpy and marmot-agents for offshore BOS runs\n" - ] } ], "source": [ @@ -193,15 +179,19 @@ "Loading wind turbine data for NREL's ROSCO tuning and simulation processeses\n", "-----------------------------------------------------------------------------\n", "Loading FAST model: NREL-5MW.fst \n", - "Loading rotor performace data from text file: /Users/dzalkind/Tools/ROSCO/Test_Cases/NREL-5MW/Cp_Ct_Cq.NREL5MW.txt\n", - "Loading rotor performace data from text file: Cp_Ct_Cq.NREL5MW.txt\n" + "Loading rotor performace data from text file: /Users/dzalkind/Tools/ROSCO3/Test_Cases/NREL-5MW/Cp_Ct_Cq.NREL5MW.txt\n", + "Loading rotor performace data from text file: ../Tune_Cases/../Test_Cases/NREL-5MW/Cp_Ct_Cq.NREL5MW.txt\n" ] } ], "source": [ "# Load turbine data from openfast model\n", "turbine = ROSCO_turbine.Turbine(turbine_params)\n", - "turbine.load_from_fast(path_params['FAST_InputFile'],path_params['FAST_directory'],dev_branch=True,rot_source='txt',txt_filename=path_params['rotor_performance_filename'])\n" + "turbine.load_from_fast(\n", + " path_params['FAST_InputFile'],\n", + " os.path.join('../Tune_Cases/',path_params['FAST_directory']),\n", + " rot_source='txt',txt_filename=os.path.join('../Tune_Cases/',path_params['FAST_directory'],path_params['rotor_performance_filename'])\n", + " )\n" ] }, { @@ -241,14 +231,12 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ - "
" + "
" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -320,14 +308,12 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZ0AAAEGCAYAAAC+fkgiAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAAA3bElEQVR4nO3deXxU9bn48c+TQMK+Qwj7FnYRBQHXYnFB1GpttVpEaq1UW1u9vbdXrPan3em9rb2tWitiLVqVWldUFBWNgAs7sgVI2EMCIWHJRvbn98c50SFMJpNkZs7M5Hm/XvOaOcv3nOebnMmTc873fL+iqhhjjDGRkOB1AMYYY1oOSzrGGGMixpKOMcaYiLGkY4wxJmIs6RhjjImYVl4HEO169OihgwYN8jqMepWUlNC+fXuvwwiZeKsPBK7TunXr8lW1Z4RDsuPaAy2pToGOa0s6DRg0aBBr1671Oox6paenM3XqVK/DCJl4qw8ErpOI7ItsNA47riOvJdUp0HFtl9eMMcZEjCUdY4wxEWNJxxhjTMRY0jHGGBMxlnSMMcZEjCUdY4wxEWNJxxhjTMTYczrGGGMaVFpRRc7xMnKOnyT3xEkOHi+jd3lNo7djSccYYwzF5VUcOFrKgaOlZB87Sfaxkxw8XsrB487n46WVp6wvAneOS270fizpGGNMC1BTo+QVlbO3oIT9BaXsO1rCvoJS9ruJ5lidpNK2dSJ9u7alb5e2jOvXhb5dnM99urSlT5c2pHRqw8crljc6Dks6xoRBSXkVH2zPY8nmXKqKyomz3k9MFDteWsGuIyXsOlLMnvwS9uaXOO8FJZRVfnk5LDFB6Ne1LQO6tWPsGan079qO/t3a0r9rO/p1bUu39kmISMjj8yTpiEg34F/AIGAvcIOqHvOz3nTgz0AisEBV5wUqLyKXAvOAJKAC+KmqfuCWSQdSgZPu5i9T1bywVNC0SCXlVbyfcZglm3NJ33GE8qoaenRI5tyU0H9xTcumqhwuLCczr4jMw8Vk5hWzK6+YXUeKKSip+GK9VgnCgG7tGNyjPecP68GgHu0Z2K0dg7q3p0+XNrRKjHxbMq/OdOYCy1R1nojMdafv9V1BRBKBx4BLgWxgjYgsVtVtAcrnA1erao6IjAWWAn19NjtTVaO3l0MTc8qrqvloxxFe/zyHZRmHKausoVfHZG48pz8zzkhl4qBurFj+kddhmhh2orSS7YcK2XG4iO2HithxqIidh4ooKq/6Yp0u7VozrGcHLh2dwpCe7RnaswNDenagf9e2niSWQLxKOtcAU93PC4F06iQdYBKQpaq7AURkkVtuW33lVXWDT/mtQBsRSVbV8pDXwLRYNTXKqj1HeW3DQd7ekkthWRXd2idx/YT+XH1mHyYO7EpCgp3dmMZRVbKPnWRbbiFbcwrZllNIRm4hB4+f/GKdTm1aMbJ3J645qw/DUzqS1qsjaSkd6B6mS2HhIKoa+Z2KHFfVLj7Tx1S1a511vglMV9XvudOzgMmqelcjyt+hqpe40+lAd6AaeBn4tdZTeRGZA8wBSElJmbBo0aJm1jh8iouL6dChg9dhhEw01+dwSQ0f51TxSU4V+SeVNolwdkorpqQmMrp7Iq3qSTSB6nTxxRevU9WJ4Yy7lh3X3qpbp6NlNew54bz2nqhhT2E1Je69fAFS2wsDOiXQv6Pz6tcxga7JElXJpb7fU6DjOmxnOiLyPtDbz6L7g92En3lBZUgRGQP8HrjMZ/ZMVT0oIh1xks4s4Bl/5VV1PjAfYOLEiRrNY2DE2xgd0Vaf0ooq3tyUy4trDrB23zFE4IJhPfjG2f24fExv2iYlNriNaKmTHdfeOVlRzTNvpoP0Z8P+42w4cIzDhc4FmFYJwvCUjlw9vjNj+3ZmTJ9OjOzdKahjy2tN+T2FLenUnmH4IyKHRSRVVXNFJBXwd0M/G+jvM90PyHE/11teRPoBrwK3qOoun3gOuu9FIvI8zuU7v0nHtGyqyuaDJ1i05gCLN+ZQXF7FkJ7tuXf6SL5+Vl96d27jdYgmyuUXl7N27zHW7j3Kmn3H2HrwBFU1CmxnUPd2nDukO2cN6Mq4fp0ZldqJNq2jP8GEilf3dBYDs3Fams0GXvezzhogTUQGAweBG4FvByovIl2At4D7VPXj2g2JSCugi6rmi0hr4Crg/dBXy8Sy0ooqFm/M4dnP9rE1p5A2rRO48ow+3DipPxMHdo2qyxomuhwtqeCz3QV8uquAT3cXkJVXDEBSqwTG9+vCnIuGkFSYzS1XXkS39kkeR+str5LOPOBFEbkN2A9cDyAifXCaRs9Q1SoRuQunBVoi8HdV3RqoPHAXMAz4uYj83J13GVACLHUTTiJOwnky3JU0sWH3kWKe/WwfL63LpqisipG9O/Kra8dyzfg+dGrT2uvwTBQqq6xm9Z6jrMg8worMfLYfKgKgXVIi5wzqxnVn92Xy4G6M7duZ5FbOWUx6+qEWn3DAo6SjqgXAND/zc4AZPtNLgCWNKP9r4Nf17HZCU+M18UdVWZ6Zz1Mr97B85xFaJwpXjE1l1rkD7azG+LXrSDEfZOSxPPMIq/YcpaKqhqTEBCYO6spPLx/BlCHdGdevM62jrIlytLEeCUyLUlZZzWsbDvLUyj1k5hXTs2MyP7l0ODdO6k+vjnavxnypsrqGtXuPsSzjMMu257EnvwSAtF4dmDVlIBem9WDy4O4xccM/mljSMS3C8dIKFn6yj4Wf7uVoSQWjUzvxx+vP5KozU7+4/GFMeVU1n2QVsGRzLu9lHOZ4aSVJiQmcO7Q7t54/iK+O7EW/ru28DjOmWdIxce3QiTIWrNjN86v3U1pRzbSRvfjehUOYMqSbXUIzgHNGsyLzCG98nsv7GYcpKquiY5tWXDoqhcvG9ObCtB60T7Y/laFiP0kTl/YXlPLYh1m8siGbGoWvndmH739lCCN7d/I6NBMFVJUNB47z2oaDvLkpl6MlFXRu25orxvbmirGpnDesu50Bh4klHRNXDhwt5ZEPMnl5/UESE4QbzxnAnIuG0L+bXRIxkFdYxr/XZfPi2gPsKygluVUCl45O4drxfbloeE+SWlkjgHCzpGPiwoGjzpnNS+uySUgQZk0ZyJ1Th5LSyRoHtHTVNcpHO/N4YfUBPtieR3WNMmVIN+66eBjTx/amozWLjyhLOiamFRSX8+iHWfzzs30IwszJA7hz6jDrNcBwvLSCRWsO8Mwne8k5UUaPDkl878LB3HjOAAb3aO91eC2WJR0Tk0rKq3hq5R7mL99NaUUV3zqnPz+elkZq57Zeh2Y8lpVXzD8+2cPL6w5ysrKac4d05+dXjWbaqBS7fBYFLOmYmFJdoyxas58/vZdJfnE508f05r8uH8GwXvHVI7FpvPX7j/HYB1ks255HUqsErh3fh1vPH8yoVGs8Ek0s6ZiY8cmufH75xja2Hypi0qBuzL9lAmcP6NpwQRPXPttdwKMfZLEyK5+u7VrzH5cMZ+aUAfTokOx1aMYPSzom6h04Wspvl2Tw9pZD9O3Slsdnns30sb3tOZsW7tNdBfzpvZ2s3nuUHh2S+dmMkcycPNCeqYly9tsxUaussprH03fx+Ee7SBThvy4bzvcuHNKiuoE3p9txqIjfv7OdD7bnkdIpmQevHs1NkwbYcREjLOmYqLQyM5+fv76FPfklfO3MPvxsxihrkdbCHTpRxp/e28m/1x2gfXIr5l4xku+cN8iSTYyxpGOiyoly5Z5FG3htYw6Durfj2dsmcWFaT6/DMh4qr6rmyeW7efTDLGpq4NbzB3PXxcPoasMExCRLOiYqqCovrz/I/1tRSpWW8eNpafxg6lD7L7aF+2RXPg+8toXdR0qYcUZv7rtilPUuEeMs6RjPHS4s475XNvPB9jyGd03gr7deaE2gW7jCcuUn/9rIKxsO0r9bW56+9RwuHtHL67BMCFjSMZ5RVV5Zf5BfvLGViuoafn7VaAZX7rWE08K98XkO960spaLmJD/66jB+ePEwO+ONI5Z0jCcKisu59+XNvJ9xmIkDu/K/15/J4B7tSU/f53VoxiMnTlby4OtbeG1jDkM6JzD/tgsY1quj12GZEPMk6YhIN+BfwCBgL3CDqh7zs9504M9AIrBAVecFKi8ig4AMYIe7ic9U9Q63zATgH0BbnCGw71ZVDUf9TGArMo/wkxc/58TJSh64chS3nj+YxAR75qYl+3RXAf/54kYOF5XzH5cMZ2xCtiWcOOVVR0RzgWWqmgYsc6dPISKJwGPAFcBo4CYRGR1E+V2qOt593eEz/3FgDpDmvqaHuE6mARVVNfxuSQaznlpNl7atef2H5/O9C4dYwmnBqqprmPf2dr694DOSWyfy8p3ncfclaXZMxDGvLq9dA0x1Py8E0oF766wzCchS1d0AIrLILbctyPJfEJFUoJOqfupOPwNcC7zdzHqYIO3NL+HHizawKfsEMycP4IErR9vY8i3csZIK7nphPR9nFXDTpAH8/KpRtEuyK/7xzqvfcIqq5gKoaq6I+GuW0hc44DOdDUwOovxgEdkAFAIPqOoKd1vZdbbVt77gRGQOzlkRKSkppKenN6ZuEVVcXBzV8QGsP1zFk5vLSRD40VnJTOhawKpPVvhdNxbq01jRUqdoOq73F1bzlw3lHC9XbhubxIXdClj9ycovlkfLzyyUrE6OsCUdEXkf6O1n0f3BbsLPvIbuweQCA1S1wL2H85qIjGnstlR1PjAfYOLEiTp16tTgIvZAeno60RpfdY3yx3d38NcNuzizX2f+evME+nYJPPRANNenqaKlTtFyXL/xeQ6/XfY5Xdom89J3JzC+f5fT1omWn1koWZ0cYUs6qnpJfctE5LCIpLpnKalAnp/VsoH+PtP9gBz3s9/yqloOlLuf14nILmC4u61+9WzLhMHRkgruXrSBFZn53DSpPw9ePcaavbZwqsrD7+3kkQ+ymDiwK3+9+Wx6dbSujVoarxoSLAZmu59nA6/7WWcNkCYig0UkCbjRLVdveRHp6TZAQESG4DQY2O1eiisSkSnidE18Sz37NCGw5eAJrn5kJav2HOX33ziD3103zhJOC1ddozzw2hYe+SCLb03sz/O3T7GE00J5dU9nHvCiiNwG7AeuBxCRPjhNo2eoapWI3AUsxWky/XdV3RqoPHAR8EsRqQKqgTtU9ai77E6+bDL9NtaIICze3XqIuxdtpGu71rx0x7mM69fF65CMxyqqavjPf3/OG5/ncMdXhnLv9BE2LEUL5knSUdUCYJqf+TnADJ/pJTjP1ARb/mXg5Xr2uRYY2/SoTSCqylMr9/CbJRmM69uZJ2dPtP9kDScrqrnzuXWk7zjCvdNHcufUoV6HZDxm7RNNs1VV1/Dg4q08t2o/V4ztzcM3jLfm0IbCskpu+8ca1u47xu+uO4ObJg3wOiQTBSzpmGYpKqvkh89vYPnOI9zxlaH89+UjSLAH+1q8sspqbvvHGjbsP84jN53FVeP6eB2SiRKWdEyTHS2pYPbfV5ORW8i8687gRvtP1uCc+d71/HrW7jtmCcecxpKOaZLcEye5ecEqso+dZP4tE/jqyBSvQzJRQFXdjlzz+NW1Yy3hmNNY0jGNtie/hJsXrOLEyUqe+e4kJg/p7nVIJkr87u3tvLw+m3suSWPWlIFeh2OikCUd0yjbcgq55e+rqVHlhduncEa/zl6HZKLEEx/tYv7y3cw+dyB3T0vzOhwTpSzpmKBtyj7OzQtW0T65Fc/eNsUGWzNfeGdLLr97eztXn9mHB68eY8/hmHpZ0jFB2ZpzgllPraZT29YsmjOFfl1tnHrj2H2kmP/69ybG9+/CH64fZ60XTUBedYNjYsiOQ0XcvGAV7ZISeeF2SzjmS6UVVdz5z/W0ThQem3k2ya3s+SwTmJ3pmICy8oqYueAzklol8MLtU+jfzRKOcagqD7y6hZ15RSy8dVKDPYgbA3amYwLYk1/Ct59cBQjP3z6FQT3aex2SiSLPr97PKxsOcs+04Vw0vKfX4ZgYYUnH+HXoRBkzn/yM6hrlhdsnM7SnNRowX9qUfZxfLN7GV4b35EdfHeZ1OCaG2OU1c5rCskq+8/RqCsuqWDRnCmkpHb0OyUSRkvIqfvDcenp2TOb/vjXeGg6YRrGkY05RUVXDHc+uIyuvmKdvPYexfe05HHOqP7y7g4PHT/Lv759L1/ZJXodjYowlHfOFmhrlv1/6nE92FfDwDWdyYZpdpzen2rD/GP/4ZC83Tx7IxEHdvA7HxCC7p2O+8D9Ld/Daxhx+evkIrju7X8MFTItSWV3Dfa9sJqVjG/57+givwzExys50DADPfraPv320i5mTB/ADG2jL+DF/+W62HyriyVsm0rFNa6/DMTHKkzMdEekmIu+JSKb73rWe9aaLyA4RyRKRuQ2VF5GZIrLR51UjIuPdZenutmqX9YpIZWPAZ7sLeGjxVqaN7MUvrxlrXZiY0+w+Usyfl2Uy44zeXDraehQ3TefV5bW5wDJVTQOWudOnEJFE4DHgCmA0cJOIjA5UXlWfU9XxqjoemAXsVdWNPpudWbtcVfPCU7XYknP8JD98bj0Du7fj/24cT6K1RDJ11NQo972ymTatEnjoa2O8DsfEuAYvr4lIT+B2YJDv+qr63Wbs9xpgqvt5IZAO3FtnnUlAlqruduNY5JbbFmT5m4AXmhFj3CurrOaOf66jvKqG+bPskonx78W1B1i15yjzrjuDXh3beB2OiXHB3NN5HVgBvA9Uh2i/KaqaC6CqufVc6uoLHPCZzgYmN6L8t3CSk6+nRaQaeBn4taqqv+BEZA4wByAlJYX09PTgauWB4uLiJsWnqizYXMGmnCruPjuZ7G1ryd4W+vgaq6n1iWbRUqemHNdlVcpvlpcyvGsCKSW7SE/fHeYoHdHyMwslq5NLVQO+gI0NrVNPufeBLX5e1wDH66x7zE/564EFPtOzgEfczwHL4ySnzXXm9XXfOwLvArcEU48JEyZoNPvwww+bVO7plbt14L1v6sPv7ghtQM3U1PpEs0B1AtZqE75fzX0Fe1w/+kGmDrz3TV2372jwFQ6BlnYcxKr66hTouA7mTOdNEZmhqksamcwuqW+ZiBwWkVR1zlJSAX/3V7KB/j7T/YAc93ND5W+kzqU1VT3ovheJyPM4l++eaUyd4sWavUf51VsZXDIqxQbbMvU6cbKSJz7axbSRvTh7gN+2PsY0WjANCe7GSTwnRaRQRIpEpLCZ+10MzHY/z8a5hFfXGiBNRAaLSBJOIlncUHkRScA5S1rkM6+ViPRwP7cGrsI562pxTpRWcvcLG+jftS0Pf+tM68LE1OupFbspLKviJ5cN9zoUE0caPNNR1XB0vDUPeFFEbgP24yQJRKQPziW1GapaJSJ3AUuBRODvqro1UHnXRUC2ug0QXMnAUjfhJOJc+nsyDPWKaqrKfa9uIq+onFd+cB6drOGAqUdBcTlPrdzDlWekMqaPdYVkQqfepCMiI1V1u4ic7W+5qq5v6k5VtQCY5md+DjDDZ3oJcNplvfrKu8vSgSl15pUAE5oab7z499pslmw+xL3TRzKuXxevwzFR7InluzlZWc1/XGqXX01oBTrT+QlOS5c/+lmmwFfDEpEJi11Hinlw8VbOG9qd7180xOtwTBTLKyxj4Sd7ufasvgzrZT2Mm9CqN+mo6hz3/eLIhWPCoaKqhrsXbSC5dQIP32Bd0ZvAHv0wi+oatUYmJiyC6ntNRMbi9ArwxZNhqtoiW37Foj++u4MtBwt5YtYEene2h/tM/bKPlfLC6v1cP7E/A7vbSLEm9ILpkeBBnKf/R+PcX7kCWEkLbW4ca1btLuCJ5buZOXkAl4/p7XU4JoTcrqJSOLWnkP3N2eaCFXsQEX48zUYDNeERzJnON4EzgQ2qequIpAALwhuWCYWyymrmvrKZ/t3acv+Vo7wOx4SQiPwIeBA4DNS4sxUY15zt/vTyEUwb1YvUzm2bGaEx/gWTdE6qao2IVIlIJ5wHMe1OdAx45INM9uSX8M/bJtMuyUaxiDN3AyPclpwh0z65lQ3eZ8IqmL9Ea0WkC85zLeuAYmB1OIMyzbctp5AnPtrNNyf044K0Hl6HY0LvAHDC6yCMaaxgHg79gfvxbyLyDtBJVTeFNyzTHNU1ytxXNtGlXWvun2GX1eLUbiBdRN4CymtnqurD3oVkTMMCPRyaCLRV1WJ3egqQ5H7uqKpFkQnRNNbTH+9hU/YJHrnpLLq2T/I6HBMe+91XkvsyJiYEOtP5Pc79m/9xp1/A6a+sDbCe08evMVFgf0Epf3h3B9NG9uKqcaleh2PCRFV/4XUMxjRFoKQzDTjHZ/q4ql4tzljGK8IblmkKVeX+1zaTKMKvrrVhp+ORiPyfqt4jIm/gtFY7hap+zYOwjAlaoKSToKpVPtP3AqiqikiH8IZlmuLdbYdZkZnPg1ePpk8Xa/Iap5513//gaRTGNFGgpJPke+9GVd8FEJHO+PRMYKJDeVU1v12SQVqvDsyaMtDrcEyYqOo69/0jr2MxpikCjafzJPAvERlQO0NEBuLc22lxwwJEu2c+2ce+glLuv3IUrRKDGSbJxDIRSRORl0Rkm4jsrn15HZcxDQnU4efDIlIKrBSR9jjXj0uAear6eKQCNA0rKC7nLx9kMnVET6aO6OV1OCYynsbpkeBPwMXArYDdxDNRL+C/xKr6N1UdAAwEBqvqQEs40edP7++ktKKaB6yrm5akraouA0RV96nqQ9hwIyYGBNU3Su2zOib6ZBfV8Pyq/cyaMtDGPmlZytyh2TPdEXYPAnaaa6KeJxf/RaSbiLwnIpnue9d61psuIjtEJEtE5vrMv15EtopIjYhMrFPmPnf9HSJyuc/8CSKy2V32F4mD9sSqyqLtFXRIbsU9l9g49i3MPUA74Mc4o+LOAmZ7GZAxwfDqjvNcYJmqpgHL3OlTuD0iPIYzlMJo4CYRGe0u3gJcByyvU2Y0cCMwBpgO/NXdDsDjOCOhprmv6SGuU8Sl7zjCloJq7r5kuPU80MKo6hpVLVbVbFW9VVWvU9XPvI7LmIYE6gbnukAFVfWVZuz3GpwxegAWAumc3sPBJCBLVXe78Sxyy21T1Qx3nr/tLlLVcmCPiGQBk0RkL06fcZ+65Z4BrgXebkYdPFVTo/zu7QxS2ok1kW5BROQCYEjtIIoi8hLQzV38a1X9wLPgjAlCoHs6VwdYpkBzkk6KquYCqGquiPi7Ft0XpyfdWtnA5Aa22xfw/W8v251X6X6uOz9mvb3lEDsPF3PHmckktbIm0i3IL4Af+UyPAL4DtAd+BljSMVEtUJPpW5uzYRF5H/A3VOX9wW7Cz7zTuv0IskyjtiUic3AuxZGSkkJ6enoDu42sGlV++/FJ+rQXRncoi7r4mqO4uDiu6gMhr1MnVd3mM51Z+8CoiPwuUMFoP6592XEQG5pSp6Bar4nIlTj3Sb7oiUBVfxmojKpeEmB7h0Uk1T3LScXpWLSubKC/z3Q/IKeBUOsrk+1+DmpbqjofmA8wceJEnTp1agO7jay3NuVysHg9f7npLDod20m0xdcc6enpcVUfCHmduvhOqKrvZfCUQAWj/bj2ZcdBbGhKnRq8LiMifwO+hXNKL8D1OM/tNMdivmxpMxt43c86a4A0ERksIkk4DQQWB7HdG0UkWUQG4zQYWO1eyisSkSluq7Vb6tln1KupUf68bCfDenXgyjOsF+kWaLv7T+ApROQqYIcH8RjTKMGc6ZynquNEZJOq/kJE/kjz7ucAzANeFJHbcMYEuR5ARPoAC1R1hqpWuc8fLAUSgb+r6lZ3va8DjwA9gbdEZKOqXq6qW0XkRWAbUAX8UFWr3X3eCfwDaIvTgCAmGxHU3sv5843jSUyI+VbfpvH+A+eY/ybOECPgNJk+D7jKs6iMCVIwSeek+17qJoUCYHBzduqO6z7Nz/wcYIbP9BJgiZ/1XgVerWfbvwF+42f+WmBs06P2Xu1ZztCe7blqXB+vwzEeUNUsERkHzMS55A3OowN3qGqZd5EZE5xgks6bItIF+F+c/6wUWBDOoIx/dpZjANxHAv7udRzGNEWDSUdVf+V+fFlE3gTaqOqJ8IZl6rKzHGNMPAi29dp5wKDa9UWE2ofTTGS8s9XOcowxsa/BpCMizwJDgY1A7U15BSzpRND85bsZ1L2dneUYY2JaMGc6E4HRqtrQg5kmTNbvP8bGA8f5xdfG2FlOCycim/H/YLPgjCY/LsIhGdMowSSdLTg9C+SGORZTj6c/3kvHNq345oR+Da9s4p01izYxLZik0wPYJiKrgfLamar6tbBFZb6Qe+IkSzbncut5g2ifHNQtOBPHVHWf1zEY0xzB/BV7KNxBmPo9++k+VJXZ5w3yOhQTRURkCs4D0qOAJJwHqEtUtZOngRnTgGCaTH8kIinAOe6s1arqr680E2InK6p5fvV+Lhvdm/7d2nkdjokuj+J0DfVvnPuutwDDPI3ImCAE0/faDcBqnK5qbgBWuV1wmDB7dcNBjpdWcuv5g7wOxUQhVc0CElW1WlWfBi72OiZjGhLM5bX7gXNqz25EpCfwPvBSOANr6VSVpz/ew5g+nZg0uFvDBUxLU+p2hLtRRP4Hp6FPe49jMqZBwYz+lVDnclpBkOVMM6zMyiczr5jvnj/Y3wipxszC+R7eBZTgDOnxDU8jMiYIwZzpvCMiS4EX3Olv4acTThNaT3+8lx4dkrnqTBu+wJxKRBKB36jqzUAZzmiixsSEYBoS/FREvgGcj/MA2ny3l2cTJnvyS/hgex73XJJGcqtEr8MxUUZVq0Wkp4gkqWqF1/EY0xhBPfihqi8DL4c5FuN6ce0BEhOEb08a4HUoJnrtBT4WkcU4l9cAUNWHPYvImCDUm3REZKWqXiAiRZza7UZtdxv2PEAYVNcor6zPZurwnvTq1KbhAqalynFfCUBHj2MxJmj1Jh1VvcB9twM6glZkHuFwYTkPXW1d3pj6qardxzExKaheplV1VkPzTGi8tC6bru1aM21UitehmCgmIm9wesefJ4C1wBM2iqiJVsE0fR7jOyEirXDGZG8yEekmIu+JSKb73rWe9aaLyA4RyRKRuT7zrxeRrSJSIyITfeZfKiLrRGSz+/5Vn2Xp7rY2uq9ezalDOJworeTdbYe5ZnxfklpZq3QT0G6gGHjSfRUCh4Hh7rQxUSnQPZ37gJ8BbUWksHY2UAHMb+Z+5wLLVHWem0zmAvfW2X8i8BhwKZANrBGRxaq6Dafn6+uAJ+psNx+4WlVzRGQssBTo67N8pqqubWbsYfPGphwqqmqsN2kTjLNU9SKf6TdEZLmqXiQiWz2LypgG1PvvtKr+DugMPKOqndxXR1Xtrqr3NXO/1wAL3c8LgWv9rDMJyFLV3W6z0EVuOVQ1Q1V3+Il5g6rmuJNbgTYiktzMWCPm3+uyGdm7I2P6WBsN06CeIvJF80b3cw930ppRm6gV8J6OqtaIyJlh2G+Kqua6+8it51JXX+CAz3Q2MLkR+/gGsEFVy33mPS0i1TjNv39d38B0IjIHmAOQkpJCenp6I3bbNAeLa/j8wEluHJHERx99FHS54uLiiMQXKfFWHwhbnf4TWCkiu3CuQAwGfiAi7fnyH7pTeHFcN5UdB7GhSXVS1YAvnEtc5zS0np9y7+NcBqv7ugY4XmfdY37KXw8s8JmeBTxSZ510YKKfsmOAXcBQn3l93feOwLvALcHUY8KECRoJv12yTYfc95bmFZY1qtyHH34YnoA8Em/1UQ1cJ2CtNvK7pV8e08nAmcB4oE1jykbquG6qlnYcxKr66hTouA7m4dCLge+LyD6ch9CCGhZXVS+pb5mIHBaRVHXOclIBf0MlZOP0J1WrH85zCQGJSD/gVZyksssnnoPue5GIPI9z+e6ZhrYXCVXVNby6/iAXj+hFz44xczXQeEhE2gE/AQaq6u0ikiYiI1T1Ta9jMyaQYJLOFWHY72JgNjDPfX/dzzprgDQRGQwcxBk75NuBNioiXYC3gPtU9WOf+a2ALqqaLyKtcYb8fT8E9QiJFZn55BWVWwMC0xhPA+uAc93pbJyxdSzpmKjWYLtcdYbH7QJc7b66aPOHzJ0HXCoimTit0+YBiEgfEVni7rcKpwfdpUAG8KKqbnXX+7qIZON84d5yOyTFXX8Y8PM6TaOTgaUisgnYiJPEoqZZae2zOV8dGXWtuE30Gqqq/wNUAqjqSZyrEMZEtWAeDr0buB14xZ31TxGZr6qPNHWnqloATPMzPweY4TO9BD89WqvT4ehpnY6q6q+BX9ez22Y9WxQuJ05W8t62w3x78gB7Nsc0RoWItMV9QFREhgLlgYsY471gLq/dBkxW1RIAEfk98CnO+OymmT7cnkdFdQ1Xn9nH61BMbHkIeAfoLyLP4fQCf6unERkThGCSjgDVPtPV2Gl8yLyz5RApnZI5q38Xr0MxMURV3xWRdcAUnO/j3aqa73FYxjQomKTzNLBKRF7FObivAZ4Ka1QtxMmKatJ35nHDxP4kJFgeN8ETkWWqOg2n4UzdecZErWAGcXtYRNKBC9xZt6rqhrBG1UJ8tPMIZZU1TB/T2+tQTIwQkTZAO6CH22dh7X8rnQC7RmuiXlCDuLkEqMEurYXM0q2H6NKuNZMGd/M6FBM7vg/cg5Ng1vHl97EQ50FuY6Jag82lROT/4XSr0RWnb6enReSBcAcW7yqqang/4zCXjkqhVaK1WjPBUdU/q+pg4L9UdYiqDnZfZ6rqo17HZ0xDgjnTuQmnR9syABGZB6yn/qbJJgif7MqnqKyK6WPt0pppPFV9RETOAwbh8z1W1ajoZcOY+gSTdPYCbYDaQaGScfo1M82wdOsh2iclcv6wHg2vbEwdIvIsMBTnYefa1qVKlHTtZEx9gkk65cBWEXkP56C+FKd3278AqOqPwxhfXKquUd7depivjkqhTetEr8MxsWkiMNrtXNGYmBFM0qn79H96eEJpOdbuPUpBSYW1WjPNsQXoDeR6HYgxjRFMk+mFIpKEMwwuwA5VrQxvWPHtna2HSGqVwNQRPb0OxcSuHsA2EVmNT/c3qvo170IypmHB9L02Faf12l6c5pn9RWS2qi4Pa2RxSlVZuuUQF6X1pH1yY1qsG3OKh7wOwJimCOav3h+By9QdHlpEhgMvEKUdaEa7zQdPkHOijJ9cNsLrUEwMU9Xgh5c1JooEk3Ra1yYcAFXd6Y5JY5rgnS2HaJUgXDLKhjEwjSciRbg9S9ddhDO4YqcIh2RMowSTdNaJyFPAs+70TJwnoU0TvLvtMFOGdKdLuySvQzExSFU7eh2DMc0RzKPwdwBbgR8DdwPb3HmmkXJPnCQrr9gaEBhjWqyAZzoikgCsU9WxwMORCSl+rch0ep6/IM0eCDXGtEwBz3RUtQb4XEQGhHKnItJNRN4TkUz3vWs9600XkR0ikiUic33mXy8iW0WkRkQm+swfJCInfYaq/pvPsgkistnd1l9EJOIdl67MzKdnx2RGpNgVEmNMyxTM5bVUnB4JlonI4tpXM/c7F1imqmnAMnf6FCKSiNNr7hXAaOAmERntLt4CXAf4a7a9S1XHuy/fy4CPA3OANPc1vZl1aJSaGuXjrHwuGNYDD/KdMcZEhWAaEvwiDPu9Bpjqfl6I08vBvXXWmQRkqepuABFZ5JbbpqoZ7rygdiYiqUAnVf3UnX4GuBZ4uxl1aJSMQ4UUlFRwgfW1ZoxpwepNOu5gUXcAw4DNwFOqWhWi/aaoai6AquaKiL/2w32BAz7T2cDkILY9WEQ24Iwv8oCqrnC3lV1nW33r24CIzME5KyIlJYX09PQgdhvYkj0VACQc2Ul6elazt1eruLg4JPFFi3irD0RPncJxXIdLtPzMQsnq5Ah0prMQqARW8OUlrruD3bCIvI/TN1Rd9we7CT/zGurcMBcYoKoFIjIBeE1ExjR2W6o6H5gPMHHiRJ06dWpwEQfw1K5VDE8p4+vTv9LsbflKT08nFPFFi3irD0RPncJxXIdLtPzMQsnq5AiUdEar6hkA7nM6qxuzYVW9pL5lInJYRFLds5xUIM/PatlAf5/pfkBOA/ssx+2HSlXXicgunD7jst3yQW8rlMoqq1m95ygzJw+M1C6NMSYqBWpI8EWnniG8rFZrMTDb/TwbeN3POmuANBEZ7HY4eqNbrl4i0tNtgICIDMFpMLDbvZRXJCJT3FZrt9Szz7BYs/co5VU1XGhNpY0xLVygpHOmiBS6ryJgXO1nESls5n7nAZeKSCbO+DzzAESkj4gsgS8S3V3AUiADeFFVt7rrfV1EsoFzgbdEZKm73YuATSLyOfAScIeqHnWX3QksALJwBqGLWCOClZn5tE4UJg/pFqldGmNMVKr38pqqhm10MVUtAKb5mZ8DzPCZXgIs8bNe3TF+aue/DLxczz7XAmObHnXTrcjM5+wBXWmXZL1KG2NatmCe0zHNkF9czrbcQru0ZowxWNIJu4+zaru+sf7WjDHGkk6YrczMp3Pb1pzRt7PXoRhjjOcs6YSRqrIyK5/zh3UnMcG6vjHGGEs6YbTrSAm5J8q4YJhdWjPGGLCkE1YrM48AWCMCY4xxWdIJo892H6V/t7b079bO61CMMSYqWNIJE1Vl/f5jTBjgd6ggY4xpkSzphMnB4yfJKyrn7IGWdIwxppYlnTBZt+8YAGfbmY4xxnzBkk6YbNh/nLatExnZ24amNsaYWpZ0wmT9/mOM69eZVon2IzbGmFr2FzEMyiqr2ZZTyAS7n2OMMaewpBMGm7JPUFWjdj/HGGPqsKQTBuv3O40IzhrQxdtAjDEmyljSCYN1+44xqHs7undI9joUY4yJKpZ0QkxV2bD/mF1aM8YYPzxJOiLSTUTeE5FM993vX2gRmS4iO0QkS0Tm+sy/XkS2ikiNiEz0mT9TRDb6vGpEZLy7LN3dVu2yXuGo24GjJ8kvruAsa0RgjDGn8epMZy6wTFXTgGXu9ClEJBF4DLgCGA3cJCKj3cVbgOuA5b5lVPU5VR2vquOBWcBeVd3os8rM2uWqmhfiOgFf3s852+7nGGPMabxKOtcAC93PC4Fr/awzCchS1d2qWgEscsuhqhmquqOBfdwEvBCacIO3fv8x2iclMiLFHgo1xpi6vEo6KaqaC+C++7vU1Rc44DOd7c4L1rc4Pek87V5a+7mIhGVUtfX7j3Fm/y72UKgxxvjRKlwbFpH3gd5+Ft0f7Cb8zNMg9z0ZKFXVLT6zZ6rqQRHpCLyMc/ntmXrKzwHmAKSkpJCenh5UwOVVyracUq4c3DroMs1VXFwcsX1FQrzVB6KnTk09rr0QLT+zULI6uVQ14i9gB5Dqfk4FdvhZ51xgqc/0fcB9ddZJByb6Kfsn4GcB9v8d4NFgYp0wYYIG65OsfB1475u6LONQ0GWa68MPP4zYviIh3uqjGrhOwFr14DvYmOPaCy3tOIhV9dUp0HHt1TWgxcBs9/Ns4HU/66wB0kRksIgkATe65QISkQTgepx7QLXzWolID/dza+AqnMYIIfXFQ6H9reWaMcb441XSmQdcKiKZwKXuNCLSR0SWAKhqFXAXsBTIAF5U1a3uel8XkWycs6G3RGSpz7YvArJVdbfPvGRgqYhsAjYCB4EnQ12pDfuPMaRHe7q2Twr1po0xJi6E7Z5OIKpaAEzzMz8HmOEzvQRY4me9V4FX69l2OjClzrwSYEKzgm6AqrJ+/3EuHhGWx3+MMSYuWBOrENlXUMrRkgrrWdoYYwKwpBMiGw5YJ5/GGNMQSzohkpFbRFJiAmm9OngdijHGRC1LOiGSkVtIWkoHeyjUGGMCsL+QIZKRW8So1E5eh2GMMVHNkk4IHCkqJ7+4nJG9rb81Y4wJxJJOCOw4VARgZzrGGNMASzohkJFbCGBnOsYY0wBLOiGQcaiQXh2TbXhqY4xpgCWdELBGBMYYExxLOs1UWV1DVl4RI1Pt0poxxjTEkk4z7T5SQmW1Mqq3nekYY0xDLOk0U20jAru8ZowxDbOk00wZhwppnSgM6dne61CMMSbqWdJppu25RQzr1ZHW1v2NMcY0yP5SNlNGbiGjrBGBMcYExZJOMxQUl5NXVG6NCIwxJkiWdJphu3V/Y4wxjeJJ0hGRbiLynohkuu9+h9sUkekiskNEskRkrs/8/xWR7SKySUReFZEuPsvuc9ffISKX+8yfICKb3WV/ERFpbj2+6P7GLq8ZY0xQvDrTmQssU9U0YJk7fQoRSQQeA64ARgM3ichod/F7wFhVHQfsBO5zy4wGbgTGANOBv7rbAXgcmAOkua/pza3E9kNF9OiQTA/r/sYYY4LiVdK5Bljofl4IXOtnnUlAlqruVtUKYJFbDlV9V1Wr3PU+A/r5bHeRqpar6h4gC5gkIqlAJ1X9VFUVeKaefTaKNSIwxpjGaeXRflNUNRdAVXNFpJefdfoCB3yms4HJftb7LvAvnzKf1SnTF6h0P9ed75eIzME5KyIlJYX09PTT1qmuUXbklnLJwNZ+l0dKcXGxp/sPtXirD0RPnYI5rqNFtPzMQsnq5Ahb0hGR94HefhbdH+wm/MzTOvu4H6gCnmugTIPbOmWB6nxgPsDEiRN16tSpp62z83ARVe8u5/LJo5l6Vr/TlkdKeno6/uKLVfFWH4ieOgVzXEeLaPmZhZLVyRG2pKOql9S3TEQOi0iqe5aTCuT5WS0b6O8z3Q/I8dnGbOAqYJp7ySxQmWy+vAR32raa4ssxdKzlmjHGBMurezqLgdnu59nA637WWQOkichgEUnCaSCwGJxWbcC9wNdUtbTOdm8UkWQRGYzTYGC1eymvSESmuK3Wbqlnn0HbfqiI1onC0J4dmrMZY4xpUbxKOvOAS0UkE7jUnUZE+ojIEgC3ocBdwFIgA3hRVbe65R8FOgLvichGEfmbW2Yr8CKwDXgH+KGqVrtl7gQW4DQu2AW83ZwKZOQWMrRnB5Ja2aNOxhgTLE8aEqhqATDNz/wcYIbP9BJgiZ/1hgXY9m+A3/iZvxYY28SQT7M9t4hzh3YP1eaMMaZFsH/Tm+BYSQWHCsusubQxxjSSJZ0mOFlZzVXjUpkw0G9HCsYYY+rh1XM6Ma1Pl7Y8+u2zvQ7DGGNijp3pGGOMiRhLOsYYYyLGko4xxpiIsaRjjDEmYizpGGOMiRhLOsYYYyLGko4xxpiIsaRjjDEmYuTLUQGMPyJyBNjndRwB9ADyvQ4ihOKtPhC4TgNVtWckgwE7rj3SkupU73FtSSfGichaVZ3odRyhEm/1gfisU7jF48/M6uSwy2vGGGMixpKOMcaYiLGkE/vmex1AiMVbfSA+6xRu8fgzszph93SMMcZEkJ3pGGOMiRhLOsYYYyLGkk6MEJG/i0ieiGzxmfeQiBwUkY3ua4aXMTaWiPQXkQ9FJENEtorI3e78biLynohkuu8xMURrgPrE9O8p3OLt2I634xpCe2zbPZ0YISIXAcXAM6o61p33EFCsqn/wMramEpFUIFVV14tIR2AdcC3wHeCoqs4TkblAV1W917tIgxOgPjcQw7+ncIu3YzvejmsI7bFtZzoxQlWXA0e9jiOUVDVXVde7n4uADKAvcA2w0F1tIc7BHfUC1McEEG/Hdrwd1xDaY9uSTuy7S0Q2uZcoYuZ0vS4RGQScBawCUlQ1F5yDHejlYWhNUqc+ECe/pwiL+Z9ZvB3X0Pxj25JObHscGAqMB3KBP3oaTROJSAfgZeAeVS30Op7m8lOfuPg9RVjM/8zi7biG0BzblnRimKoeVtVqVa0BngQmeR1TY4lIa5yD+DlVfcWdfdi9hlx7LTnPq/gay1994uH3FGmx/jOLt+MaQndsW9KJYbUHsOvrwJb61o1GIiLAU0CGqj7ss2gxMNv9PBt4PdKxNUV99Yn135MXYvlnFm/HNYT22LbWazFCRF4ApuJ0JX4YeNCdHg8osBf4fu0141ggIhcAK4DNQI07+2c414pfBAYA+4HrVTXqbzQHqM9NxPDvKdzi7diOt+MaQntsW9IxxhgTMXZ5zRhjTMRY0jHGGBMxlnSMMcZEjCUdY4wxEWNJxxhjTMRY0olTIvInEbnHZ3qpiCzwmf6jiPxERL7mdj7YmG3/Q0S+6Wf+FBFZ5fY2m+F22hg2IvIdEXk0nPsw0ceO7djWyusATNh8AlwP/J+IJOA8A9HJZ/l5OF1ZrMJ5aC0UFgI3qOrnIpIIjAjRdo3xZcd2DLMznfj1Mc6XD2AMzpPCRSLSVUSSgVHABt//qNz/8v4iIp+IyO7a//jE8aiIbBORt6i/o8JeOP0v4XaNsc0t/5CIPCsiH4gzlsjttQVE5KcissbtMPAXPvNvFpHV7n+WT7hfdETkVhHZKSIfAeeH7sdlYogd2zHMznTilKrmiEiViAzA+YJ+itMV+bnACWCTqlY4vVucIhW4ABiJ81/iSzjdW4wAzgBSgG3A3/3s9k/ADhFJB94BFqpqmbtsHDAFaI/zB+EtYCyQhtNfkwCLxRlb5QjwLeB8Va0Ukb8CM0XkPeAXwAS3Dh8CG5r8QzIxyY7t2GZJJ77V/kd4HvAwzhfzPJyD+pN6yrzmdt63TURS3HkXAS+oajWQIyIf+Cuoqr8UkeeAy4Bv43SRMdVd/LqqngROisiHOF/GC9x1a79cHXC+qONwvnxr3D8cbXE6R5wMpKvqEQAR+RcwvDE/EBM37NiOUZZ04tsnOF/EM3AuQRwA/hMoxP9/cwDlPp99/1UMqr8kVd0FPC4iTwJHRKR7PeXV3f7vVPUJ3wUi8iOc/yTvqzP/2mDjMHHPju0YZfd04tvHwFU4Q+RWu50LdsG5DPFpI7azHLhRRBLF6VX2Yn8riciV8uU1jTSgGjjuTl8jIm3cL+pUYA2wFPiuOGN0ICJ9RaQXsAz4pvu5dmz5gTgdJk4Vke7idLN+fSPqYOKLHdsxys504ttmnJY9z9eZ10FV8xuxnVeBr7pldwIf1bPeLOBPIlIKVAEzVbXa/a6uBt7C6WH3V6qag3M5YxTwqbtOMXCzqm4TkQeAd8VpnVQJ/FBVPxOnqeqnODd11wOJjaiHiR92bMco62XahJ37ZSpW1T94HYsxoWTHduPZ5TVjjDERY2c6xhhjIsbOdIwxxkSMJR1jjDERY0nHGGNMxFjSMcYYEzGWdIwxxkTM/wdJ2AHQ1Mdu6QAAAABJRU5ErkJggg==\n", + "image/png": "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\n", "text/plain": [ - "
" + "
" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -366,7 +352,11 @@ "source": [ "# Write parameter input file\n", "param_file = 'DISCON.IN' # This must be named DISCON.IN to be seen by the compiled controller binary. \n", - "ROSCO_utilities.write_DISCON(turbine,controller,param_file=param_file, txt_filename=path_params['rotor_performance_filename'])" + "ROSCO_utilities.write_DISCON(\n", + " turbine,controller,\n", + " param_file=param_file, \n", + " txt_filename=os.path.join('../Tune_Cases/',path_params['FAST_directory'],path_params['rotor_performance_filename'])\n", + ")" ] }, { @@ -404,14 +394,12 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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NzdSUlKue2zTpk1A2is9AL/88gtdunShXbt2bNu2jT///JPw8PA0+2bkdfPz88PPz48ffviBpKSkG25js9lo06YNa9eu5auvvmL37t288847uLr+N0poQkICEyZMYPbs2fz1118cPXqU559/3vH4tGnTGDVqFG+//TZ79uxh3LhxvPbaa8yaNQuA+Ph42rdvT/ny5dmyZQtjxoxJs/+dut15RSTr2WwGHy/bT/dp6zkdm0Tpwr788NS9dK9bwmlvQ10rd91jMENKAowras65XzkJHr4Z2qVHjx6MHDnScaVlzZo1zJs3L11D/7dt25YhQ4YA8NJLL/HBBx+wYsUKKlSocNN93nrrLe69914A+vXrx8iRIzl48CD33HMPAA8//DDLly/npZdeytDz6NOnD127dnXU0qBBA1577TVatWoFwDPPPEOfPn3SfbykpCT+7//+j9jYWO6///7rHi9cuDDw35WeK95++20effRRxo4d61hXvXr1NPtm5HVzc3Nj5syZDBgwgClTplCrVi2aNGnCo48+SrVq1QD4448/2LhxI3v27KFcuXIAjtfzipSUFKZMmULp0qUBe9B74403HI+/+eabTJw40XGVqVSpUuzevZvPPvuMXr168fXXX2O1Wpk+fTo+Pj5UrlyZ48eP8+STT6bzFb2x251XRLLWmbgkRnyz3TGTd5daxXjzwSr4euatr/u89WzzgEKFCtGuXTtmzZqFYRi0a9eOQoUKpWvfK1+uYL81FBISQlRUVLr3CQ4OxsfHJ80XcXBwMBs3bszgs7j+uABVq1ZNsy4xMZHY2FgCAgJuepzu3bvj6urKpUuXCAwMZMKECbRp0ybddWzfvp0BAwaku9b0vG4PPfQQ7dq1Y9WqVaxbt44lS5bw3nvv8fnnn9O7d2+2b99O8eLFHcHmRnx8fBzBBqBIkSKOc545c4Zjx47Rr1+/NLWnpqYSGBgIwJ49e6hevXqaNkcNGjS45fO8nfScV0SyztoDZ3lm/nbOxCXh7e7KGw9W5pHwULPLMoXCze24+9ivoJh17jvQt29fxy2bTz75JP2nc097H9ZisWCz2dK9j8Viue0xXFxcMK653Xaj20TXHvdm625X3wcffMADDzxAQEAAQUFBt9z2Rry9vW+7zZ28bl5eXrRo0YIWLVrw+uuv079/f0aPHk3v3r3v+JxXXtcr5542bRr16tVLs92VW1vXvgc3kt736or0nFdEMp/VZjDpz/1MWrYfw4BywX588lgtygbnrpm8M5PCze1YLBm+NWS21q1bk5ycDOC4jZNTFC5cOE3D19jYWCIiIrLsfCEhIZQpUyZd27q7u2O1WtOsq1atGn/++WeGboHdiUqVKjm6oVerVo3jx4+zb9++W169uZng4GCKFSvGoUOHePzxx296vtmzZ3Pp0iVHmFq/fn2abQoXLkxcXBzx8fH4+to/A7caAyc95xWRzHU6NpFn5m1j/SF7b8tH64QyukNlvD3y9h8UCjdOyNXVlT179jh+z0maN2/OzJkz6dChA/nz5+e1117LMTWWLFmSP//8k3vvvRdPT0/y58/P6NGjuf/++yldujSPPvooqamp/Prrr7z44ot3dI7o6GgeeeQR+vbtS7Vq1fD392fz5s289957PPjggwA0adKExo0b89BDD/H+++9TpkwZ9u7di8VioXXr1uk6z5gxYxg2bBgBAQG0adOGpKQkNm/ezPnz5xkxYgSPPfYYo0aNol+/frz66qscPnyYCRMmpDlGvXr18PHx4ZVXXuHpp59m48aNzJw5867OKyKZZ/X+szwzbxvR8cn4ergyrktVHqxRzOyycgT1lnJSAQEBt2yLYpaRI0fSuHFj2rdvT9u2benUqVOatiNmmjhxIkuXLk3Tdb5p06Z8++23LFq0iBo1atC8eXM2bNhwx+fw8/OjXr16fPDBBzRu3JgqVarw2muvMWDAAD7++GPHdt9//z116tShe/fuVKpUiRdffPG6q0q30r9/fz7//HNmzpxJ1apVadKkCTNnzqRUqVKOOn766Sd2795NzZo1GTVqFO+++26aYxQoUICvvvqKxYsXU7VqVebOnZumy/6dnFdE7p7VZvDhH/voMX0D0fHJVCwSwE9P36dgcxWLkZ6b704kNjaWwMBAYmJirvvyT0xMJCIiglKlSuHllbunexfJDfSZE8mY6ItJDJ//X2+o7nXtt6G83HPGFfCsdKvv72vptpSIiEgusPnwOYbO2cap2ES83V15u3MVutQqbnZZOZLCjYiISA5mGAZfrI7gnctTKJQu7MunT9SmXB7uDXU7CjciIiI5VMylFF74dge/7z4NQMfqRRnfpWqeG5Qvo/TqiIiI5EB/n4hhyNdbOXouAQ9XF17rUIkn6uWdKRTuhsLN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VKpUKc05rj3njXh4eFCpUiV279592+d3O/v37+fw4cPXjZdTrlw5nn32WX7//Xe6dOnCjBkzHI8lJiZy8OBBatasedfnF3E2CjcieUSzZs1YvXo127dvd1y5AXu4mTZtGomJiXcVbgCeeeYZ3nnnHRYuXMjevXsZMmTIbQcBHD58OL/99hsRERFs3bqVZcuWUbFixTTbvPHGG/z555/8/fff9O7dm0KFCjkGBnzppZdYt24dTz31FNu3b2f//v0sWrSIp59+GrAHhMcff5yePXuyYMECIiIi2LRpE++++66jV9awYcNYsmQJ7733Hvv27ePjjz++5S2pK1q1asXq1asz/kJd48cff+SBBx7Ax8cHsN/yGjp0KCtWrODIkSOsWbOGTZs2pXld1q9fj6enZ5pbdiJip3Ajkkc0a9aMS5cuUaZMGYKDgx3rmzRpQlxcHKVLlyY0NPSuzvHcc8/Rs2dPevfuTYMGDfD397+uLcu1rFYrTz31FBUrVqR169aUL1+eyZMnp9nmnXfe4ZlnnqF27dpERkayaNEiPDw8AKhWrRorV65k//79NGrUiJo1a/Laa69RpEgRx/4zZsygZ8+ePPfcc5QvX56OHTuyYcMGx/OtX78+n3/+OR999BE1atTg999/59VXX73t8x0wYACLFy8mJiYmoy9VGj/++GOaW1Kurq5ER0fTs2dPypUrR9euXWnTpg1jx451bDN37lwef/xxRyASkf9YjLu9YS4ikkWujLtz/vz5dE2FYIauXbtSs2ZNRo4ceUf7nz17liJFinDs2DHHbbLbOXPmDBUqVGDz5s2UKlXqjs4r4sx05UZE5C783//933Xj8mTEuXPneP/999MdbAAiIiKYPHmygo3ITejKjYjkWLnhyo2I5DwKNyIiIuJUdFtKREREnIrCjYiIiDgVhRsRERFxKgo3IiIi4lQUbkRERMSpKNyIiIiIU1G4EREREaeicCMiIiJO5f8Bz8SFbE872TMAAAAASUVORK5CYII=\n", "text/plain": [ - "
" + "
" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -459,13 +447,13 @@ "text": [ " \n", "------------------------------------------------------------------------------\n", - "Running ROSCO-v2.5.0\n", + "Running ROSCO-v2.6.0\n", "A wind turbine controller framework for public use in the scientific field \n", "Developed in collaboration: National Renewable Energy Laboratory \n", " Delft University of Technology, The Netherlands \n", "------------------------------------------------------------------------------\n", "Generator speed: 9.5 RPM, Pitch angle: 0.0 deg, Power: 0.0 kW, Est. wind Speed: 10.0 m/s\n", - "Generator speed: 673.4 RPM, Pitch angle: 0.1 deg, Power: 340.7 kW, Est. wind Speed: 4.6 m/s\n", + "Generator speed: 673.4 RPM, Pitch angle: 0.1 deg, Power: 340.8 kW, Est. wind Speed: 4.6 m/s\n", "Generator speed: 751.3 RPM, Pitch angle: 0.1 deg, Power: 853.4 kW, Est. wind Speed: 7.1 m/s\n", "Generator speed: 800.7 RPM, Pitch angle: 0.1 deg, Power: 1072.2 kW, Est. wind Speed: 6.8 m/s\n", "Generator speed: 781.4 RPM, Pitch angle: 0.1 deg, Power: 1190.5 kW, Est. wind Speed: 6.8 m/s\n", @@ -569,14 +557,12 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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+YuKisLFixerHT83N/emc8yCRUUMBgN69OiBpKQkt/akpCT07dtXoajUSwiBqVOnYt26dfjpp58QFxfn9npcXByioqLc8mmxWLBt2zZXPnv06AG9Xu/WJysrC0eOHPHKnN977704fPgwDh065PrTs2dPPPLIIzh06BBat27NnN6Afv36VVtqf+LECbRs2RIAP6M3o6SkBBqN+68urVbrWtbMnN4aufLXp08fFBQUYN++fa4+e/fuRUFBwc3n+Kam6pLHOJc1r1y5UqSmpopp06YJf39/kZ6ernRoqvPXv/5VBAcHi61bt4qsrCzXn5KSElefV199VQQHB4t169aJw4cPi3HjxtW4PC8mJkZs2rRJHDhwQNxzzz1es7yxLqquEhKCOb0R+/btEzqdTixcuFCcPHlSfPbZZ8LPz098+umnrj7M542ZMGGCaN68uWtZ87p160R4eLh44YUXXH2Y02srLCwUBw8eFAcPHhQAxJIlS8TBgwdd22fIlb/7779fdOnSRezevVvs3r1bJCQkcFlzY/Pvf/9btGzZUhgMBnH77be7lumSOwA1/lm1apWrj91uFy+99JKIiooSRqNR3H333eLw4cNuxyktLRVTp04VoaGhwtfXVwwfPlycO3eunr8a9bq6YGFOb8x3330nOnfuLIxGo+jQoYNYvny52+vM540xmUzi2WefFS1atBA+Pj6idevWYs6cOcJsNrv6MKfXtmXLlhp/dk6YMEEIIV/+Ll++LB555BERGBgoAgMDxSOPPCLy8/NvOm5JCCFubmyGiIiIqH5wDgsRERGpHgsWIiIiUj0WLERERKR6LFiIiIhI9ViwEBERkeqxYCEiIiLVY8FCREREqseChYiIiFSPBQsRqdK8efPQrVs3xc7/4osv4sknn6xT3+eeew7PPPOMhyMi8m7c6ZaI6t31bi8/YcIELF26FGazGWFhYfUUVaWLFy8iPj4eKSkpaNWq1XX75+TkoE2bNkhJSal2E04ikgcLFiKqd1VvXf/5559j7ty5bnc19vX1RXBwsBKhAQAWLVqEbdu24ccff6zzex588EG0bdsW/+///T8PRkbkvXhJiIjqXVRUlOtPcHAwJEmq1nb1JaGJEydi9OjRWLRoESIjI9GkSRPMnz8f5eXleP755xEaGoqYmBh8+OGHbufKzMzE2LFjERISgrCwMIwaNQrp6enXjG/NmjUYOXKkW9uXX36JhIQE+Pr6IiwsDIMHD0ZxcbHr9ZEjR+K///3vLeeGiGrGgoWIGoyffvoJFy5cwPbt27FkyRLMmzcPw4cPR0hICPbu3YvJkydj8uTJyMjIAACUlJRg0KBBCAgIwPbt27Fz504EBATg/vvvh8ViqfEc+fn5OHLkCHr27Olqy8rKwrhx4zBp0iT89ttv2Lp1K8aMGYOqA9S9evVCRkYGzp4969kkEHkpFixE1GCEhobi7bffRvv27TFp0iS0b98eJSUlmD17NuLj4zFr1iwYDAb8/PPPABwjJRqNBh988AESEhLQsWNHrFq1CufOncPWrVtrPMfZs2chhEB0dLSrLSsrC+Xl5RgzZgxatWqFhIQETJkyBQEBAa4+zZs3B4Drjt4Q0c3RKR0AEVFdderUCRpN5b+zIiMj0blzZ9dzrVaLsLAw5OTkAACSk5Nx6tQpBAYGuh2nrKwMp0+frvEcpaWlAAAfHx9XW9euXXHvvfciISEB9913HxITE/H73/8eISEhrj6+vr4AHKM6RCQ/FixE1GDo9Xq355Ik1dhmt9sBAHa7HT169MBnn31W7VhNmzat8Rzh4eEAHJeGnH20Wi2SkpKwa9cubNy4Ee+88w7mzJmDvXv3ulYF5eXlXfO4RHRreEmIiBqt22+/HSdPnkRERATatm3r9qe2VUht2rRBUFAQUlNT3dolSUK/fv0wf/58HDx4EAaDAV9//bXr9SNHjkCv16NTp04e/ZqIvBULFiJqtB555BGEh4dj1KhR2LFjB9LS0rBt2zY8++yzOH/+fI3v0Wg0GDx4MHbu3Olq27t3LxYtWoRffvkF586dw7p165Cbm4uOHTu6+uzYsQP9+/d3XRoiInmxYCGiRsvPzw/bt29HixYtMGbMGHTs2BGTJk1CaWkpgoKCan3fk08+iTVr1rguLQUFBWH79u0YNmwY2rVrh3/84x944403MHToUNd7/vvf/+KJJ57w+NdE5K24cRwR0VWEEOjduzemTZuGcePGXbf///73Pzz//PNISUmBTsepgUSewBEWIqKrSJKE5cuXo7y8vE79i4uLsWrVKhYrRB7EERYiIiJSPY6wEBERkeqxYCEiIiLVY8FCREREqseChYiIiFSPBQsRERGpHgsWIiIiUj0WLERERKR6LFiIiIhI9ViwEBERker9fwzKRGBKDpp1AAAAAElFTkSuQmCC\n", "text/plain": [ - "
" + "
" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" } ], @@ -593,7 +579,7 @@ "lib_name = (f'../ROSCO/build/libdiscon.{ext}')\n", "\n", "# Load the simulator and controller interface\n", - "controller_int = ROSCO_ci.ControllerInterface(lib_name)\n", + "controller_int = ROSCO_ci.ControllerInterface(lib_name,param_filename=param_file)\n", "sim = ROSCO_sim.Sim(turbine,controller_int)\n", "\n", "# Define a wind speed history\n", @@ -650,39 +636,35 @@ "outputs": [ { "data": { - "image/png": "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csklo6Kd//DDD+dPmzZtysSJE6dOmzZtyqOPPprXtczJJ588fsKECdPat5ubm+XMM88cO2rUqOmHHXbY5DVr1gSiXfvqq68eNnjw4MMmT548ddy4cdP+9Kc/FQNcfvnlI3/60592rBRw/PHHT7joootGt29fccUVI771rW8NbY+9oKDg8OHDh8+YPHny1OOOO25i13v8+Mc/Luu8b/jw4TO2b9/uAxCRWeeee+6Y9mNtbW0UFRXNnD9//vjuvqcAL7/8cvbnP//5kbHKxHLTTTeVTJw4cerEiROnTpgwYdq9995b2NNrdXbSSSeN37NnT0quh3aoszY4Y7oYOXJk6+rVq1dGO/bXv/615Mgjj2y47777is8///yoqy8cfvjhzQ899NC6K664ovxgrt1u8ODBbY8//vi68vLytnfeeSfzzDPPnLhr167324/ffffdhTk5OeHO5/zud78rLSgoCG3evHn5woULi66++uoRjz/++Ppo1//yl7+886c//enOZcuWZRx77LFTP//5z1fPnTu34cEHHywCdoXDYaqrq30NDQ0dv7Tfeeed3BtvvHHLDTfcsB3g/PPPLz/rrLNqL7vssupYnyWarKysyJo1a7IaGhokNzdXH3744fyysrK2A5134oknNp144olNByoXzYcffui/4YYbhi5ZsmRVSUlJuLa21tOecHvrpZdeWtcX1zF9z2pwxsQpEonw2GOPFd1zzz0bX3nllfympqZoy4Zw5JFHtsycObO1p/eZO3duc3l5eRvArFmzWoLBoKe5uVkAamtrPb///e/Lrr/++u2dz3nssccKv/CFL+wFuOyyy6pff/31vEgksv/FO5kxY0ZrZmZmZM+ePd6TTz65YfHixbkAixcvzpo0aVJzTk5OePfu3d7m5mb58MMPM4877rgeJZdoTjnllNp//vOfhQD3339/8fnnn9+x2OaLL76YfcQRR0yeMmXK1COOOGLy0qVLM9zPmNdey7v66quHXXjhheVz5syZNGLEiBk///nPO2qff/jDH4pnzJgxxa0ljw6FQmzfvt2fk5MTKSgoCAMUFBREJk+eHARYsWJFxgknnDBh2rRpU2bNmjXpvffeywQnif/Xf/3XqKOPPnriiBEjZjz++OO5F154YfnYsWOnnX/++eXt9+tcOzWpxf5RTEr5zoNLR36woz77wCXjN3FIXtP/u2DmlgOXdGzZsiVj8uTJU9u3b7rpps0LFixoePbZZ3NHjhzZOm3atNajjz66/p///GfBpZdeWnMwsVRWVgamTJkyNTc3N/yzn/1s64IFCxpilb/77ruLpk6d2pSVlaUAV1999fCrrrpqZ25u7j7Za+fOnYExY8YEAfx+P7m5ueGdO3f6hg4dGop2XYBXX301e/To0S3Dhw8PAfh8Pl27dm3gpZdeyjnmmGMat27d6n/hhRdyi4qKQpMmTWrOzMzss3bSz372s1XXXXfd0Isuuqhm1apV2Zdffvne119/PRdg5syZLW+//fZqv9/Pv//977zvfve7I55++ukPu15j3bp1ma+//vqampoa75QpU6Z/5zvf2b1ixYqMBx98sHjRokWrMzIy9DOf+cyo2267reTLX/7y3tLS0raRI0fOmDt3bv0nP/nJ6ksuuaQW4Itf/OLohQsXbpoxY0brCy+8kPOVr3xl1JtvvvkBQG1tre+NN9744L777iu86KKLJrzwwgurZ82a1XzYYYdNef3117OOO+645r76npi+ZwnOmC66e4x47733Fl9wwQVVABdffHHVvffeW3IwCW7UqFFtGzZseH/IkCHhV155JfvCCy8cv3LlyuXFxcVRq1qLFi3K/PGPfzz8qaeeWgvw+uuvZ23YsCHjjjvu2NK1jS3apOkiEjUh3XbbbWX33HPPoMrKysBDDz20tn3/rFmzGl588cWcN954I/c73/nOzs2bNwdee+21nIKCgvCcOXNiJuJ47tt5/9FHH91cWVmZ8ec//7n41FNPre1crqqqynvRRReN2bhxY6aIaFtbW9Sa8umnn16TlZWlWVlZoeLi4rbKykrfU089lbd8+fLsmTNnTgFoaWnxDB48OOTz+Xj55ZfXvvTSS9nPPPNM/rXXXjty0aJFOdddd92O9957L/fCCy8c137dYDDYcb8zzzyzxuPxcOSRRzaVlJS0zZkzpxlg4sSJzR9++GGGJbjUZgnOpJSDqWn1p1AoxJNPPln07LPPFt54441DVZWamhpfdXW154orrhi1fPny7LKysmCs9hj3l3EY4IQTTmgaNWpU6/LlyzM3btwY+N///d9hAAsXLtx44oknNn344Yf+Cy64YPwdd9yxYdq0aa0Ar7zySu7y5cuzhw8fPiMUCklVVZVvzpw5k95+++01Q4YMCW7YsCEwbty4tra2NhoaGryDBw8Of/3rXx/+7LPPFgC0J+32Nri777678Iorrhhz2mmnLcvOztZjjz224fXXX89dvXp11lFHHdU8duzY4E033VSWm5sbvuyyy/Z097l++ctfDrr77rsHATz11FNrS0pKQtu3b98nATc2NnpLS0v3aTdcsGBBzXXXXTfymWeeWbNr166O30XXXHPN8JNOOqn+2Wef/XDNmjWBk08+eRJRZGRkdCRMr9dLKBQSVZULL7xw76233rq1a3mPx8P8+fOb5s+f3/Txj3+87otf/GL5D3/4wx15eXmh7tpF22utXq+XQCCgna8VCoWiJl6TOqwNzpg4PPLII/mTJ09u2rFjx/tbt25dtm3btmULFiyovu+++woffPDBjatXr155oM4G27Zt84VCzhPDlStXBjZu3JgxadKk1s997nM1q1evXrl69eqVJ554YtOePXu8Z5xxxoTrr7++8vTTT29sP/+aa67ZvWvXrve3bt267OWXX15dXl7e+vbbb68Bp6Zx5513lgDcddddRccee2y9x+Ph5ptv3tp+7a7xXHrppTUzZsxovPXWW0sATjrppIbnnnuusLCwMOzz+SgrKwvX1dV533vvvdz58+c3dj2/3fe+973d7fcoLy9vO+WUUxqefvrpgurqag84nWImT57c5PPt+/f0V77ylT3f+ta3trXXitrV1dV5R4wYEQT405/+VBrre9rVggUL6h577LGirVu3+gB27tzp/eCDDwIbN270v/rqqx2PvhctWpQ9fPjwYHFxcWTEiBHBO++8swicdtY33ngj62DuaVKXJThjumhvg2t//fznPx983333FX/iE5+o6Vzu/PPPr/773/9e0vX8e+65p7CsrOywJUuW5Jx33nkTjj/++AkAzzzzTO7kyZOnTZo0aeoFF1ww7qabbtpUVlYW7nr+b37zm8GbN2/O+NWvfjWsPYb2X9jdueqqq/ZUV1f7Ro0aNf3mm28e8tvf/rYyns96/fXXb7/11luHhMNh5syZ01xTU+ObPXt2x+PIyZMnN+fm5oZjteV1dfTRRzdfccUVu4455pjJkydPnrpw4cJBd95558au5caNG9f2ox/9aL+prK655pod119//Ygjjzxycji837cnplmzZrX88Ic/3HrKKadMnDhx4tSTTz554pYtW/zBYFC+/e1vjxgzZsy0yZMnT33wwQeLbrnlli0A999///q77rqrdNKkSVMnTJgw7aGHHio8qJualGULnpqkW7p06caZM2d2+wjMmHS0dOnS0pkzZ5YnO45DmdXgjDHGDEiW4IwxxgxIluCMMcYMSJbgTCqIRCIR63JtBgz35zn2VDIm4SzBmVSwfPfu3QWW5MxA4K4HVwAsT3Yshzob6G2SLhQKfXHHjh2379ixw1b0NgNBx4reyQ7kUGfDBIwxxgxI9teyMcaYAckSnDHGmAHJEpwxxpgByRKcMcaYAckSnDHGmAHp/wMk2t7+Z9XjYwAAAABJRU5ErkJggg==\n", + "image/png": "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359NmzbVmocoKSmp1mznBQUFTJs2jYyMDDQaDT179mTHjh3069ev+T6YEEIIIUQja5PF4rBhw1AUpcH9KpWKF198kRdffLHBY7Zt21br9eLFi1m8eHEjRSiEEEIIYR6MHrN44sSJyx6zatWqqwpGCCGEEEKYF6OLxd69e/PWW2/V2yOXmZnJxIkTeeyxxxo1OCGEEEII0bKMLhZXrVrFwoULGTp0KPHx8bW2d+nShcLCQg4dOtQUMQohhBBCiBZidLE4efJkjh07hoeHB5GRkbz11ltMmjSJRx55hBdeeIFt27YRGhralLEKIYQQQohmZtINLl5eXqxbt467776bOXPm4ODgwJ49e4iIiGiq+IQQQgghRAsyaVLu/Px8pkyZwo8//sjTTz+Nl5cXd9xxB/v27Wuq+IQQQgghRAsyulj8+eef6dKlC/Hx8Rw4cIAFCxZw5MgRoqKiuO6663juueeoqqpqyliFEEIIIUQzM7pYvPXWW5kxYwa7d++mU6dOADg4OPDhhx/y888/8+WXX9KnT58mC1QIIYQQQjQ/o8cs/vnnn3Tv3r3efaNHj+bo0aM8+eSTjRaYEEIIIYRoeUb3LDZUKF7g7OzMZ599dtUBCSGEEEII82FUz+L69euNakylUjFhwoSrCkgIIYQQQpgPo4rFm266yajGVCoV1dXVVxOPEEIIIYQwI0YVi3q9vqnjEEIIIYQQZsikeRb/qby8vLHiEEIIIYQQZsjkYrG6upqXX34Zf39/HB0dSUhIAOD555+XG1yEEEIIIa4xJheLr776KsuXL2fhwoXY2NgYtkdERPDpp58a3U5ycjI7d+5k48aNHDx4kIqKClNDEUIIIYQQTczkYnHlypV8/PHH3H333VhaWhq2d+/enZMnT17y3MTERObOnUtISAghISFERUUxbtw4+vTpg0ajYfTo0Xz33XcyRlIIIYQQwkyYXCympqbSoUOHOtv1ej06na7B85544gkiIiI4ffo0L730EsePH6ewsJDKykoyMjLYsGED1113Hc8//zzdu3eX9aaFEEIIIcyA0Su4XNC1a1d27txJcHBwre3fffcdPXv2bPA8Gxsb4uPj8fT0rLPPy8uLESNGMGLECObNm8eGDRtITEykb9++poYnhBBCCCEakcnF4rx587jnnntITU1Fr9fzww8/EBcXx8qVK/n5558bPO/NN980+j3Gjx9valhCCCGEEKIJGH0ZOjs7G4AJEybwzTffsGHDBlQqFS+88AKxsbH89NNPjB492qi2ysrKKC0tNbxOTExkyZIlbNy40cTwhRBCCCFEUzK6Z9Hf35+JEyfy4IMPcv311zN27NgrftNJkyZxyy238Oijj1JQUED//v2xtrYmJyeHRYsW8dhjj11x20IIIYQQovEY3bO4YsUKtFotEyZMIDAwkOeff94wx6KpDh48yJAhQwD4/vvv8fb2JjExkZUrV/Luu+9eUZtCCCGEEKLxGV0s3nXXXWzatImzZ8/y8MMP89VXXxEWFsbw4cP56quvTFrNpbS0FCcnJwA2bdrELbfcgoWFBQMGDCAxMdH0TyGEEEIIIZqEyVPnBAYGMm/ePBISEti0aRP+/v5MmzYNX19fpk+fblQbHTp04McffyQ5OZmNGzcyZswYALKysnB2djY1JCGEEEII0USuam3okSNHsmrVKlauXImFhQUfffSRUee98MILzJ49m5CQEPr378/AgQOBml7GS02/I4QQQgghmpfJU+dccO7cOb744gtWrFhBSkoKw4cP58EHHzTq3FtvvZXrrruO9PR0IiMjDdtHjhzJzTfffKUhCSGEEEKIRmZSsVheXs53333HF198wY4dO/D39+e+++7j/vvvJyQk5LLn+/n5MWnSJCZOnMjIkSPx8fGptb9fv34mBS+EEEIIIZqW0Zehp02bho+PDw8//DCenp788ssvnDt3jvnz5xtVKAKsXr0ae3t7Hn/8cTw8PLjtttv48ssvycvLu9L4hRBCCCFEEzK6WNyzZw/z588nLS2Nb775hrFjx6JSqUx6s2HDhvH2229z+vRpdu/eTa9evVi6dCm+vr4MGzaMxYsXEx8fb/KHMNWOHTuYMGECfn5+qFQqfvzxx1r7FUXhxRdfxM/PDzs7O4YNG8bx48cv2+7atWvp0qULarWaLl26sG7duib6BEIIIYQQzcPoYvHIkSM88cQTuLm5Ncobd+3alblz57Jnzx4SExO5++672bJlCxEREXTr1o1ffvmlUd6nPiUlJURGRvL+++/Xu3/hwoUsWrSI999/n3379uHj48Po0aMpKipqsM3du3dzxx13cM8993D48GHuuecebr/9dvbu3dtUH0MIIYQQosld8Q0u/5ScnMy8efP4/PPPTT73wuXthx9+mNLSUjZu3IharW6s0OoYN24c48aNq3efoigsWbKEZ599lltuuQWomZDc29ub1atX88gjj9R73pIlSxg9ejRz584FYO7cuWzfvp0lS5awZs2apvkgJlAUhdLKKiqqobSyCmvFtF5h0bh0OsmFuZBcmAfJg/mQXJiHC3lQFKWlQ0GlNFIUhw8fplevXlRXVxt9TlZWFllZWej1+lrbu3fv3hghGUWlUrFu3TpuuukmABISEggNDeXgwYO1pvGZNGkSLi4urFixot52goKCePLJJ3nyyScN2xYvXsySJUsanGi8oqKCiooKw2utVktgYCA5OTmNPt9kaWUVkS9vadQ2hRBCCNG09j89FI2DbZO0rdVq8fDwoLCw8JJ1h9E9i+vXr7/kflOW/jtw4ABTp04lNja2TsWsUqlMKjgbW0ZGBgDe3t61tl9YkvBS59V3zoX26vPaa68xf/78Ots3bdqEvb29KWFfVkU1NGJHshBCCCGawZYtW1BbNk3bpaWlRh1ndPVw0003oVKpLtkdauwNL/fffz/h4eF89tlneHt7m3yjTHP4Z0yKolw2TlPPmTt3LrNmzTK8vtCzOGbMmEbvWVQUhREjKtiyZQsjRozA2loKx5ak01VJLsyE5MI8SB7Mh+TCPFzIww1jR2FjY9Mk76HVao06zuj/C3x9fVm6dKnhcu0/HTp0iN69exvV1tmzZ/nhhx/o0KGDsW/fbC7M/ZiRkYGvr69he1ZWVp2ew3+e989exMudo1ar6x2baW1tjbW1tamhX5ZGpUJtCRoH2yZpXxhPp9NJLsyE5MI8SB7Mh+TCPFzIg42NTZPlwdh2jb4bunfv3hw8eLDB/ZfrdbzYyJEjOXz4sLFv3azatWuHj48P0dHRhm2VlZVs376dQYMGNXjewIEDa50DNZeTL3WOEEIIIYS5M7pn8T//+Q8lJSUN7u/QoQNbt241qq1PP/2UqVOncuzYMbp161ansp04caKxYV2R4uJizpw5Y3h99uxZDh06hJubG0FBQcycOZMFCxYQFhZGWFgYCxYswN7enilTphjOuffee/H39+e1114D4IknnmDo0KG88cYbTJo0if/9739s3ryZXbt2NelnEUIIIYRoSkYXi0OGDLnkfgcHB6KiooxqKyYmhl27dvHrr7/W2dccN7js37+f4cOHG15fGDc4depUli9fzpw5cygrK2P6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gx49ehgoqoZJq9Xy6quvsnHjRnbu3Im7u7uhQ2qQnnjiCU6ePMmxY8d0ry5dujBixAiOHTsmiWItCgoKKjN91G+//UarVq0MFFHDlJubi4mJfkpgamoqU+cYmLu7OyqVSu/6XVhYSEJCQq1ev6VnsYGIiopi1KhRdOnShcDAQGJiYrh06RLjx483dGgNysSJE1m7di3ff/89NjY2ut7eJk2aYGlpaeDoGg4bG5syz4laW1vj4OAgz4/WssjISHr06MGcOXN47rnnOHDgADExMcTExBg6tAZl4MCBzJ49Gzc3N3x9fTl69CgLFy5kzJgxhg6t3rt37x6///677v358+c5duwY9vb2uLm5MXnyZObMmYOnpyeenp7MmTMHKysrXnjhhdoLUisajE8//VTbqlUrbaNGjbQBAQHahIQEQ4fU4ADlvlauXGno0Bq84OBg7aRJkwwdRoP0ww8/aP38/LRKpVLr5eWljYmJMXRIDU5WVpZ20qRJWjc3N62FhYXWw8NDO23aNG1BQYGhQ6v34uLiyr0uhIeHa7VarVaj0WhnzpypValUWqVSqe3du7f25MmTtRqjzLMohBBCCCEqJM8sCiGEEEKICkmyKIQQQgghKiTJohBCCCGEqJAki0IIIYQQokKSLAohhBBCiArJPItC1ENqtZqioiJDhyGEqCHm5uYyebyoNZIsClGPaLVa0tLSuHv3rqFDEULUMDs7O1QqVa2uESwaJkkWhahHShNFJycnrKys5CIiRD2k1WrJzc0lPT0dQG/NYCFqgiSLQtQTarValyg6ODgYOhwhRA0qXR40PT0dJycnuSUtapQMcBGinih9RtHKysrAkQghakPpz7o8nyxqmiSLQtQzcutZiIZBftZFbZFkUQghhBBCVEiSRSGEEPXC6NGjGTx4sKHDqDYhISFMnjzZ0GEIIcmiEMLw/nyRHz16NAqFosxrwIABZfabM2cOpqamzJs3r1Ln2bhxI/3798fR0RGFQsGxY8fK1AkJCSlz7mHDht33uMePH2f48OG0bNkSS0tLvL29+fe//11h/d9//x0bGxvs7OzKbEtISKBz585YWFjg4eHBsmXLHvi5/vydmZmZ4ebmxj//+U8yMjIAOH36NAqFgv379+vt161bN5RKJbm5ubqywsJCrKysiImJKbcd/vwaPXp0mViio6Px9/cvU3737l0U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\n", "text/plain": [ - "
" + "
" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" }, { "data": { - "image/png": "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6/TnzjvvTJ82bdrMadOmzZw6deqsRx55JGWwdXV1+umnT6muro7Za6Cpw/QYnPrEGz9+fPv27du3RVv28MMPpy9YsMD36KOPpl100UVRr8Ywf/781ieffHL3tddeW3g0dXfIysoKPPfcc7sLCwsDH3zwQdx55503rbKyclPH8gcffDDF4/GEum7zm9/8JiM5OTl44MCBLffcc0/qDTfckP/cc8/tjVb/ddddV/HTn/60YvPmze5TTjll5lVXXVW3ZMkS3xNPPJEKVIZCIerq6hw+n69zp/3BBx9477jjjoO33357GcBFF11UeP755zd85StfqevvtUQTHx8f3rFjR7zP5xOv12ueeuqppOzs7MCRtlu6dGnL0qVLW460XjR79uxx3n777bkbNmz4OD09PdTQ0GDrSLhD9cYbb+w+FvWo4actOKX6EA6HWbVqVepDDz1U/NZbbyW1tLREu1QICxYsaJs3b177YJ9nyZIlrYWFhQGAhQsXtvn9fltra6sANDQ02H77299m33bbbWVdt1m1alXKV7/61RqAr3zlK3Vr165NDIfDvSvvYs6cOe1xcXHh6upq+4oVK3zr16/3Aqxfvz5++vTprR6PJ1RVVWVvbW2VPXv2xJ166qmDSi7RnHHGGQ3/+Mc/UgAee+yxtIsuuqjzApuvv/56wgknnFA0Y8aMmSeccELRxo0b3ZHXmNjRyrvhhhvGXXLJJYWLFy+enp+fP+dnP/tZZ+vz7rvvTpszZ86MSCt5QjAYpKyszOnxeMLJyckhgOTk5HBRUZEfYOvWre5PfepTU2fNmjVj4cKF0z/66KM4sJL4F77whYKTTjppWn5+/pznnnvOe8kllxROmjRp1kUXXVTY8XxdW6cqtuk/SY2qG5/YOH5neVPCkdccuGk5iS2/unjewSOvaTl48KC7qKhoZsfjO++888DKlSt9r7zyinf8+PHts2bNaj/ppJOa/vGPfyRfeeWV9UcTS0lJiWvGjBkzvV5v6L/+678OrVy50tff+g8++GDqzJkzW+Lj4w3ADTfckHf99ddXeL3ebtmroqLCNXHiRD+A0+nE6/WGKioqHLm5ucFo9QKsWbMmYcKECW15eXlBAIfDYXbt2uV64403PCeffHLzoUOHnK+99po3NTU1OH369Na4uLhjdpz0S1/6Uu2tt96ae9lll9V//PHHCVdffXXN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\n", + "image/png": "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69exdetWtZi7d+/+WMetUCiQmJiIlJQUeHp6YsmSJVi1apXW432UqKgorF+/HleuXFG17+TkhJKSErVZsHbt2sHR0RH3799/6iehjYyMcPjwYTg7O2P06NFwd3fHrFmzMGHCBLUHburbz8bGRu3WggdNmjQJ//jHPzBq1Cj07NkTN2/eVJtlfBISiQSJiYno168fwsPD0bFjR4SEhODy5cuqS/wDBw7EgQMHMHToUHTs2BFhYWFwdXXF4cOHVbEuWbIE8+fPR0xMDNzc3FT7PE0iS6QvJEJTr31BRI3q/v37yMvLg0KhgImJidjhEFET4+88iY0zi0RERESkFZNFIiIiItKKySIRERERacVkkYiIiIi0YrJIpKf4bBpRy8DfdRIbk0UiPVO3vIu2pWOI6NlSXl4OQPNNNUTNhYtyE+kZIyMjmJmZ4fr165BKpTAw4N98RM8iQRBQXl6OoqIiWFlZPXQdUKKmxHUWifRQZWUl8vLy+I5ZohbAysoKcrkcEolE7FCohWKySKSnlEolL0UTPeOkUilnFEl0TBaJiIiISCve7EREREREWjFZJCIiIiKtmCwSERERkVZMFomIiIhIKyaLRERERKQVk0UiIiIi0orJIhERERFp9f8Buc1bnbTL7OMAAAAASUVORK5CYII=\n", "text/plain": [ - "
" + "
" ] }, - "metadata": { - "needs_background": "light" - }, + "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ - "([
,
],\n", - " [array([,\n", - " ,\n", - " ,\n", - " ], dtype=object),\n", - " array([,\n", - " ,\n", - " ], dtype=object)])" + "([
,
],\n", + " [array([,\n", + " ,\n", + " ,\n", + " ], dtype=object),\n", + " array([,\n", + " ,\n", + " ], dtype=object)])" ] }, "execution_count": 11, @@ -702,7 +684,7 @@ "# Define Plot cases \n", "cases = {}\n", "cases['Baseline'] = ['Wind1VelX', 'BldPitch1', 'GenTq', 'RotSpeed']\n", - "cases['Rotor Performance'] = ['RtVAvgxh', 'RtTSR', 'RtAeroCp']\n", + "cases['Rotor Performance'] = ['RtVAvgxh', 'RtTSR', 'RtFldCp']\n", "\n", "# Plot, woohoo!\n", "op.plot_fast_out(fast_out, cases)" @@ -762,6 +744,13 @@ "I would finally like to note that there has been a lot of work from a lot of very smart (and really great) people that has gone into all of this, some of which are acknowledged on the [ROSCO toolbox](www.github.com/nrel/ROSCO_toolbox) and [ROSCO](www.github.com/nrel/ROSCO_toolbox) github pages. " ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": null, @@ -773,9 +762,9 @@ "metadata": { "celltoolbar": "Slideshow", "kernelspec": { - "display_name": "rosco-env", + "display_name": "rosco-env3", "language": "python", - "name": "rosco-env" + "name": "rosco-env3" }, "language_info": { "codemirror_mode": { @@ -787,7 +776,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.13" + "version": "3.10.8" } }, "nbformat": 4, diff --git a/ROSCO/Examples/example_02.py b/ROSCO/Examples/example_02.py deleted file mode 100644 index a513ddd95..000000000 --- a/ROSCO/Examples/example_02.py +++ /dev/null @@ -1,37 +0,0 @@ -''' ------------ Example_02 -------------- -Load a turbine model from saved pickle, make a quick cp plot -------------------------------------- - -In this example: - - Load a turbine from a saved pickle - - Plot Cp Surface -''' - -# Python modules -import os -import matplotlib.pyplot as plt -# ROSCO toolbox modules -from ROSCO_toolbox import turbine as ROSCO_turbine - -this_dir = os.path.dirname(os.path.abspath(__file__)) -example_out_dir = os.path.join(this_dir,'examples_out') -if not os.path.isdir(example_out_dir): - os.makedirs(example_out_dir) - -# Initialize a turbine class -- Don't need to instantiate! -turbine = ROSCO_turbine.Turbine - -# Load quick from python pickle -turbine = turbine.load(os.path.join(example_out_dir,'01_NREL5MW_saved.p')) - -# plot rotor performance -print('Plotting Cp data') -turbine.Cp.plot_performance() - - - -if False: - plt.show() -else: - plt.savefig(os.path.join(example_out_dir,'02_NREL5MW_Cp.png')) \ No newline at end of file diff --git a/ROSCO/Examples/example_13.py b/ROSCO/Examples/example_13.py deleted file mode 100644 index b326491d3..000000000 --- a/ROSCO/Examples/example_13.py +++ /dev/null @@ -1,115 +0,0 @@ -''' ------------ Example_13 -------------- -Load a turbine, tune a controller with IPC -------------------------------------- - -In this example: - - Load a turbine from OpenFAST - - Tune a controller with IPC - - Run simple simulation with open loop control - -''' -# Python Modules -import os, platform -import matplotlib.pyplot as plt - -# ROSCO toolbox modules -from ROSCO_toolbox import controller as ROSCO_controller -from ROSCO_toolbox import turbine as ROSCO_turbine -from ROSCO_toolbox.utilities import DISCON_dict -from ROSCO_toolbox.ofTools.fast_io import output_processing -from ROSCO_toolbox.inputs.validation import load_rosco_yaml -from ROSCO_toolbox.ofTools.case_gen.CaseLibrary import set_channels -from ROSCO_toolbox.ofTools.case_gen.runFAST_pywrapper import runFAST_pywrapper_batch -from ROSCO_toolbox.ofTools.case_gen.CaseGen_General import CaseGen_General - - - -this_dir = os.path.dirname(os.path.abspath(__file__)) -rosco_dir = os.path.dirname(this_dir) -example_out_dir = os.path.join(this_dir,'examples_out') -run_dir = os.path.join(example_out_dir, '13_ipc_sim') - -# Load yaml file (Open Loop Case) -parameter_filename = os.path.join(rosco_dir,'Tune_Cases/BAR.yaml') - -inps = load_rosco_yaml(parameter_filename) -path_params = inps['path_params'] -turbine_params = inps['turbine_params'] -controller_params = inps['controller_params'] - -# Turn flaps off and IPC on -controller_params['Flp_Mode'] = 0 -controller_params['IPC_ControlMode'] = 1 - -# Instantiate turbine, and controller -turbine = ROSCO_turbine.Turbine(turbine_params) -controller = ROSCO_controller.Controller(controller_params) - -# Load turbine data from OpenFAST and rotor performance text file -turbine.load_from_fast(path_params['FAST_InputFile'], - os.path.join(this_dir, path_params['FAST_directory']), dev_branch=True) -# Tune controller -controller.tune_controller(turbine) - -# Set rosco_dll -if platform.system() == 'Windows': - rosco_dll = os.path.join(rosco_dir, 'ROSCO/build/libdiscon.dll') -elif platform.system() == 'Darwin': - rosco_dll = os.path.join(rosco_dir, 'ROSCO/build/libdiscon.dylib') -else: - rosco_dll = os.path.join(rosco_dir, 'ROSCO/build/libdiscon.so') - -case_inputs = {} -case_inputs[('ServoDyn','DLL_FileName')] = {'vals': [rosco_dll], 'group': 0} -case_inputs[('ServoDyn','Ptch_Cntrl')] = {'vals': [1], 'group': 0} - -# Apply all discon variables as case inputs -discon_vt = DISCON_dict( - turbine, - controller, - txt_filename=os.path.join(this_dir,path_params['FAST_directory'],path_params['rotor_performance_filename']) - ) - -for discon_input in discon_vt: - case_inputs[('DISCON_in',discon_input)] = {'vals': [discon_vt[discon_input]], 'group': 0} - -# Generate cases -if not os.path.exists(run_dir): - os.makedirs(run_dir) - -case_list, case_name_list = CaseGen_General(case_inputs, dir_matrix=run_dir, namebase='ipc_example') -channels = set_channels() -channels['BldPitch2'] = True -channels['BldPitch3'] = True - -# Run FAST cases -fastBatch = runFAST_pywrapper_batch() - -fastBatch.FAST_directory = os.path.realpath(os.path.join(rosco_dir,'Tune_Cases',path_params['FAST_directory'])) -fastBatch.FAST_InputFile = path_params['FAST_InputFile'] -fastBatch.channels = channels -fastBatch.FAST_runDirectory = run_dir -fastBatch.case_list = case_list -fastBatch.case_name_list = case_name_list -fastBatch.debug_level = 2 -fastBatch.FAST_exe = 'openfast' - -fastBatch.run_serial() - - -# # Define Plot cases -cases = {} -cases['Baseline'] = ['Wind1VelX', ('BldPitch1', 'BldPitch2', 'BldPitch3'), 'RootMyc1', 'RotSpeed'] - -out_file = os.path.join(example_out_dir,'13_ipc_sim/ipc_example_0.outb') -op = output_processing.output_processing() -fastout = op.load_fast_out(out_file, tmin=0) -fig, ax = op.plot_fast_out(cases=cases,showplot=False) -if False: - plt.show() -else: - fig[0].savefig(os.path.join(example_out_dir,'13_ipc_FAST_Out.png')) - - - diff --git a/ROSCO/Examples/example_19.py b/ROSCO/Examples/example_19.py new file mode 100644 index 000000000..fbbe67d1c --- /dev/null +++ b/ROSCO/Examples/example_19.py @@ -0,0 +1,29 @@ +''' +----------- XX_update_discon_version ----------------- +Test and demonstrate update_discon_version() function for converting an old ROSCO input +to the current version +''' + +import os +from ROSCO_toolbox.tune import update_discon_version + +this_dir = os.path.dirname(os.path.abspath(__file__)) +rosco_dir = os.path.dirname(this_dir) + + +def main(): + + old_discon_filename = os.path.join(this_dir,'example_inputs','DISCON_v2.2.0.IN') # An IEA-15MW input + + # Tuning yaml can be anything, does not have to correspond to old discon + tuning_yaml = os.path.join(rosco_dir,'Tune_Cases','NREL5MW.yaml') # dummy for now + update_discon_version( + old_discon_filename, + tuning_yaml, + os.path.join(this_dir,'examples_out','18_UPDATED_DISCON.IN') + ) + + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/ROSCO/Examples/Cp_Ct_Cq.NREL5MW.txt b/ROSCO/Examples/example_inputs/Cp_Ct_Cq.NREL5MW.txt similarity index 100% rename from ROSCO/Examples/Cp_Ct_Cq.NREL5MW.txt rename to ROSCO/Examples/example_inputs/Cp_Ct_Cq.NREL5MW.txt diff --git a/ROSCO/Examples/example_inputs/DISCON_v2.2.0.IN b/ROSCO/Examples/example_inputs/DISCON_v2.2.0.IN new file mode 100644 index 000000000..81cbc1480 --- /dev/null +++ b/ROSCO/Examples/example_inputs/DISCON_v2.2.0.IN @@ -0,0 +1,119 @@ +! Controller parameter input file for the IEA-15-240-RWT wind turbine +! - File written using ROSCO Controller tuning logic on 02/25/20 + +!------- DEBUG ------------------------------------------------------------ +1 ! LoggingLevel - {0: write no debug files, 1: write standard output .dbg-file, 2: write standard output .dbg-file and complete avrSWAP-array .dbg2-file} + +!------- CONTROLLER FLAGS ------------------------------------------------- +2 ! F_LPFType - {1: first-order low-pass filter, 2: second-order low-pass filter}, [rad/s] (currently filters generator speed and pitch control signals +2 ! F_NotchType - Notch on the measured generator speed and/or tower fore-aft motion (for floating) {0: disable, 1: generator speed, 2: tower-top fore-aft motion, 3: generator speed and tower-top fore-aft motion} +0 ! IPC_ControlMode - Turn Individual Pitch Control (IPC) for fatigue load reductions (pitch contribution) {0: off, 1: 1P reductions, 2: 1P+2P reductions} +1 ! VS_ControlMode - Generator torque control mode in above rated conditions {0: constant torque, 1: constant power, 2: TSR tracking PI control} +1 ! PC_ControlMode - Blade pitch control mode {0: No pitch, fix to fine pitch, 1: active PI blade pitch control} +0 ! Y_ControlMode - Yaw control mode {0: no yaw control, 1: yaw rate control, 2: yaw-by-IPC} +1 ! SS_Mode - Setpoint Smoother mode {0: no setpoint smoothing, 1: introduce setpoint smoothing} +2 ! WE_Mode - Wind speed estimator mode {0: One-second low pass filtered hub height wind speed, 1: Immersion and Invariance Estimator, 2: Extended Kalman Filter} +1 ! PS_Mode - Pitch saturation mode {0: no pitch saturation, 1: implement pitch saturation} +0 ! SD_Mode - Shutdown mode {0: no shutdown procedure, 1: pitch to max pitch at shutdown} +0 ! Fl_Mode - Floating specific feedback mode {0: no nacelle velocity feedback, 1: nacelle velocity feedback} +0 ! Flp_Mode - Flap control mode {0: no flap control, 1: steady state flap angle, 2: Proportional flap control} + +!------- FILTERS ---------------------------------------------------------- +1.00810 ! F_LPFCornerFreq - Corner frequency (-3dB point) in the low-pass filters, [rad/s] +0.70000 ! F_LPFDamping - Damping coefficient [used only when F_FilterType = 2] +3.35500 ! F_NotchCornerFreq - Natural frequency of the notch filter, [rad/s] +0.00000 0.25000 ! F_NotchBetaNumDen - Two notch damping values (numerator and denominator, resp) - determines the width and depth of the notch, [-] +0.628320000000 ! F_SSCornerFreq - Corner frequency (-3dB point) in the first order low pass filter for the setpoint smoother, [rad/s]. +0.21300 1.00000 ! F_FlCornerFreq - Natural frequency and damping in the second order low pass filter of the tower-top fore-aft motion for floating feedback control [rad/s, -]. +1.16240 1.00000 ! F_FlpCornerFreq - Corner frequency and damping in the second order low pass filter of the blade root bending moment for flap control [rad/s, -]. + +!------- BLADE PITCH CONTROL ---------------------------------------------- +28 ! PC_GS_n - Amount of gain-scheduling table entries +0.063278 0.090539 0.112201 0.130892 0.147682 0.163130 0.177562 0.191194 0.204189 0.216578 0.228470 0.240017 0.251275 0.262033 0.272673 0.282965 0.293075 0.302964 0.312677 0.322161 0.331649 0.340690 0.349958 0.358737 0.367513 0.376528 0.384789 0.393240 ! PC_GS_angles - Gain-schedule table: pitch angles +-1.222765 -1.056462 -0.919886 -0.805720 -0.708866 -0.625663 -0.553417 -0.490096 -0.434142 -0.384341 -0.339730 -0.299539 -0.263141 -0.230024 -0.199764 -0.172005 -0.146450 -0.122847 -0.100980 -0.080665 -0.061742 -0.044072 -0.027535 -0.012026 0.002549 0.016271 0.029213 0.041440 ! PC_GS_KP - Gain-schedule table: pitch controller kp gains +-0.127742 -0.115205 -0.104909 -0.096302 -0.089000 -0.082728 -0.077281 -0.072508 -0.068289 -0.064535 -0.061172 -0.058142 -0.055398 -0.052901 -0.050620 -0.048527 -0.046601 -0.044821 -0.043173 -0.041641 -0.040215 -0.038883 -0.037636 -0.036467 -0.035368 -0.034333 -0.033358 -0.032436 ! PC_GS_KI - Gain-schedule table: pitch controller ki gains +0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ! PC_GS_KD - Gain-schedule table: pitch controller kd gains +0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ! PC_GS_TF - Gain-schedule table: pitch controller tf gains (derivative filter) +1.570800000000 ! PC_MaxPit - Maximum physical pitch limit, [rad]. +0.000000000000 ! PC_MinPit - Minimum physical pitch limit, [rad]. +0.034900000000 ! PC_MaxRat - Maximum pitch rate (in absolute value) in pitch controller, [rad/s]. +-0.03490000000 ! PC_MinRat - Minimum pitch rate (in absolute value) in pitch controller, [rad/s]. +0.791680000000 ! PC_RefSpd - Desired (reference) HSS speed for pitch controller, [rad/s]. +0.000000000000 ! PC_FinePit - Record 5: Below-rated pitch angle set-point, [rad] +0.017450000000 ! PC_Switch - Angle above lowest minimum pitch angle for switch, [rad] + +!------- INDIVIDUAL PITCH CONTROL ----------------------------------------- +0.0 ! IPC_IntSat - Integrator saturation (maximum signal amplitude contribution to pitch from IPC), [rad] +0.0 0.0 ! IPC_KI - Integral gain for the individual pitch controller: first parameter for 1P reductions, second for 2P reductions, [-] +0.0 0.0 ! IPC_aziOffset - Phase offset added to the azimuth angle for the individual pitch controller, [rad]. +0.0 ! IPC_CornerFreqAct - Corner frequency of the first-order actuators model, to induce a phase lag in the IPC signal {0: Disable}, [rad/s] + +!------- VS TORQUE CONTROL ------------------------------------------------ +96.55000000000 ! VS_GenEff - Generator efficiency mechanical power -> electrical power, [should match the efficiency defined in the generator properties!], [%] +19624046.66639 ! VS_ArSatTq - Above rated generator torque PI control saturation, [Nm] +4500000.000000 ! VS_MaxRat - Maximum torque rate (in absolute value) in torque controller, [Nm/s]. +21586451.33303 ! VS_MaxTq - Maximum generator torque in Region 3 (HSS side), [Nm]. +0.000000000000 ! VS_MinTq - Minimum generator (HSS side), [Nm]. +0.523600000000 ! VS_MinOMSpd - Optimal mode minimum speed, cut-in speed towards optimal mode gain path, [rad/s] +34505815.52476 ! VS_Rgn2K - Generator torque constant in Region 2 (HSS side), [N-m/(rad/s)^2] +15000000.00000 ! VS_RtPwr - Wind turbine rated power [W] +19624046.66639 ! VS_RtTq - Rated torque, [Nm]. +0.791680000000 ! VS_RefSpd - Rated generator speed [rad/s] +1 ! VS_n - Number of generator PI torque controller gains +-50437958.66505 ! VS_KP - Proportional gain for generator PI torque controller [1/(rad/s) Nm]. (Only used in the transitional 2.5 region if VS_ControlMode =/ 2) +-4588245.18720 ! VS_KI - Integral gain for generator PI torque controller [1/rad Nm]. (Only used in the transitional 2.5 region if VS_ControlMode =/ 2) +9.00 ! VS_TSRopt - Power-maximizing region 2 tip-speed-ratio [rad]. + +!------- SETPOINT SMOOTHER --------------------------------------------- +1.00000 ! SS_VSGain - Variable speed torque controller setpoint smoother gain, [-]. +0.00100 ! SS_PCGain - Collective pitch controller setpoint smoother gain, [-]. + +!------- WIND SPEED ESTIMATOR --------------------------------------------- +120.000 ! WE_BladeRadius - Blade length (distance from hub center to blade tip), [m] +1 ! WE_CP_n - Amount of parameters in the Cp array +0.0 0.0 0.0 0.0 ! WE_CP - Parameters that define the parameterized CP(lambda) function +0.0 ! WE_Gamma - Adaption gain of the wind speed estimator algorithm [m/rad] +1.0 ! WE_GearboxRatio - Gearbox ratio [>=1], [-] +318628138.00000 ! WE_Jtot - Total drivetrain inertia, including blades, hub and casted generator inertia to LSS, [kg m^2] +1.225 ! WE_RhoAir - Air density, [kg m^-3] +"Cp_Ct_Cq.IEA15MW.txt" ! PerfFileName - File containing rotor performance tables (Cp,Ct,Cq) +104 48 ! PerfTableSize - Size of rotor performance tables, first number refers to number of blade pitch angles, second number referse to number of tip-speed ratios +44 ! WE_FOPoles_N - Number of first-order system poles used in EKF +3.00 3.50 4.00 4.50 5.00 5.50 6.00 6.50 7.00 7.50 8.00 8.50 9.00 9.50 10.00 10.50 11.24 11.74 12.24 12.74 13.24 13.74 14.24 14.74 15.24 15.74 16.24 16.74 17.24 17.74 18.24 18.74 19.24 19.74 20.24 20.74 21.24 21.74 22.24 22.74 23.24 23.74 24.24 24.74 ! WE_FOPoles_v - Wind speeds corresponding to first-order system poles [m/s] +-0.02334364 -0.02723425 -0.03112486 -0.03501546 -0.03890607 -0.04279668 -0.04668728 -0.05057789 -0.05446850 -0.05835911 -0.06224971 -0.06614032 -0.07003093 -0.07392153 -0.07781214 -0.08170275 -0.05441825 -0.05758074 -0.06474714 -0.07383682 -0.08430904 -0.09581400 -0.10815415 -0.12121919 -0.13495759 -0.14915715 -0.16379718 -0.17904114 -0.19494603 -0.21082316 -0.22752972 -0.24440216 -0.26178793 -0.27954029 -0.29769427 -0.31606508 -0.33525667 -0.35396333 -0.37406865 -0.39341852 -0.41345400 -0.43495515 -0.45460302 -0.47551894 ! WE_FOPoles - First order system poles + +!------- YAW CONTROL ------------------------------------------------------ +0.0 ! Y_ErrThresh - Yaw error threshold. Turbine begins to yaw when it passes this. [rad^2 s] +0.0 ! Y_IPC_IntSat - Integrator saturation (maximum signal amplitude contribution to pitch from yaw-by-IPC), [rad] +1 ! Y_IPC_n - Number of controller gains (yaw-by-IPC) +0.0 ! Y_IPC_KP - Yaw-by-IPC proportional controller gain Kp +0.0 ! Y_IPC_KI - Yaw-by-IPC integral controller gain Ki +0.0 ! Y_IPC_omegaLP - Low-pass filter corner frequency for the Yaw-by-IPC controller to filtering the yaw alignment error, [rad/s]. +0.0 ! Y_IPC_zetaLP - Low-pass filter damping factor for the Yaw-by-IPC controller to filtering the yaw alignment error, [-]. +0.0 ! Y_MErrSet - Yaw alignment error, set point [rad] +0.0 ! Y_omegaLPFast - Corner frequency fast low pass filter, 1.0 [Hz] +0.0 ! Y_omegaLPSlow - Corner frequency slow low pass filter, 1/60 [Hz] +0.0 ! Y_Rate - Yaw rate [rad/s] + +!------- TOWER FORE-AFT DAMPING ------------------------------------------- +-1 ! FA_KI - Integral gain for the fore-aft tower damper controller, -1 = off / >0 = on [rad s/m] - !NJA - Make this a flag +0.0 ! FA_HPF_CornerFreq - Corner frequency (-3dB point) in the high-pass filter on the fore-aft acceleration signal [rad/s] +0.0 ! FA_IntSat - Integrator saturation (maximum signal amplitude contribution to pitch from FA damper), [rad] + +!------- MINIMUM PITCH SATURATION ------------------------------------------- +44 ! PS_BldPitchMin_N - Number of values in minimum blade pitch lookup table (should equal number of values in PS_WindSpeeds and PS_BldPitchMin) +3.00 3.50 4.00 4.50 5.00 5.50 6.00 6.50 7.00 7.50 8.00 8.50 9.00 9.50 10.00 10.50 11.24 11.74 12.24 12.74 13.24 13.74 14.24 14.74 15.24 15.74 16.24 16.74 17.24 17.74 18.24 18.74 19.24 19.74 20.24 20.74 21.24 21.74 22.24 22.74 23.24 23.74 24.24 24.74 ! PS_WindSpeeds - Wind speeds corresponding to minimum blade pitch angles [m/s] +0.06108652 0.06108652 0.06108652 0.05672320 0.04799655 0.03926991 0.02617994 0.01308997 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 ! PS_BldPitchMin - Minimum blade pitch angles [rad] + +!------- SHUTDOWN ----------------------------------------------------------- +0.393240000000 ! SD_MaxPit - Maximum blade pitch angle to initiate shutdown, [rad] +0.418880000000 ! SD_CornerFreq - Cutoff Frequency for first order low-pass filter for blade pitch angle, [rad/s] + +!------- Floating ----------------------------------------------------------- +-9.32196000000 ! Fl_Kp - Nacelle velocity proportional feedback gain [s] + +!------- FLAP ACTUATION ----------------------------------------------------- +0.000000000000 ! Flp_Angle - Initial or steady state flap angle [rad] +0.00000000e+00 ! Flp_Kp - Blade root bending moment proportional gain for flap control [s] +0.00000000e+00 ! Flp_Ki - Flap displacement integral gain for flap control [s] +0.000000000000 ! Flp_MaxPit - Maximum (and minimum) flap pitch angle [rad] \ No newline at end of file diff --git a/ROSCO/Examples/Example_OL_Input.dat b/ROSCO/Examples/example_inputs/Example_OL_Input.dat similarity index 100% rename from ROSCO/Examples/Example_OL_Input.dat rename to ROSCO/Examples/example_inputs/Example_OL_Input.dat diff --git a/ROSCO/Examples/example_inputs/minimal_DISCON.IN b/ROSCO/Examples/example_inputs/minimal_DISCON.IN new file mode 100644 index 000000000..21716d03f --- /dev/null +++ b/ROSCO/Examples/example_inputs/minimal_DISCON.IN @@ -0,0 +1,99 @@ +! Controller parameter input file for the NREL-5MW wind turbine +! - File written using ROSCO version 2.7.0 controller tuning logic on 02/27/23 + +!------- DEBUG ------------------------------------------------------------ +0 ! LoggingLevel - (0: write no debug files, 1: write standard output .dbg-file, 2: LoggingLevel 1 + ROSCO LocalVars (.dbg2) 3: LoggingLevel 2 + complete avrSWAP-array (.dbg3)) +0 ! Echo - (0 - no Echo, 1 - Echo input data to .echo) + +!------- CONTROLLER FLAGS ------------------------------------------------- +1 ! F_LPFType - (1: first-order low-pass filter, 2: second-order low-pass filter), [rad/s] (currently filters generator speed and pitch control signals +3 ! VS_ControlMode - Generator torque control mode in above rated conditions {0: constant torque, 1: constant power, 2: TSR tracking PI control with constant torque, 3: TSR tracking PI control with constant power} +1 ! PC_ControlMode - Blade pitch control mode {0: No pitch, fix to fine pitch, 1: active PI blade pitch control} +1 ! SS_Mode - Setpoint Smoother mode {0: no setpoint smoothing, 1: introduce setpoint smoothing} +2 ! WE_Mode - Wind speed estimator mode {0: One-second low pass filtered hub height wind speed, 1: Immersion and Invariance Estimator, 2: Extended Kalman Filter} +1 ! PS_Mode - Pitch saturation mode {0: no pitch saturation, 1: implement pitch saturation} + +Extra lines that ROSCO doesn't care about anymore + +!------- FILTERS ---------------------------------------------------------- +1.57080 ! F_LPFCornerFreq - Corner frequency (-3dB point) in the low-pass filters, [rad/s] +0.62830 ! F_SSCornerFreq - Corner frequency (-3dB point) in the first order low pass filter for the setpoint smoother, [rad/s]. +0.20944 ! F_WECornerFreq - Corner frequency (-3dB point) in the first order low pass filter for the wind speed estimate [rad/s]. +0.17952 ! F_YawErr - Low pass filter corner frequency for yaw controller [rad/s]. +0.000000 1.000000 ! F_FlCornerFreq - Natural frequency and damping in the second order low pass filter of the tower-top fore-aft motion for floating feedback control [rad/s, -]. +0.01042 ! F_FlHighPassFreq - Natural frequency of first-order high-pass filter for nacelle fore-aft motion [rad/s]. +0.000000 1.000000 ! F_FlpCornerFreq - Corner frequency and damping in the second order low pass filter of the blade root bending moment for flap control [rad/s, -]. + +!------- BLADE PITCH CONTROL ---------------------------------------------- +30 ! PC_GS_n - Amount of gain-scheduling table entries +0.056789 0.084492 0.106018 0.124332 0.140807 0.155903 0.169931 0.183270 0.196062 0.208354 0.220050 0.231503 0.242646 0.253377 0.263967 0.274233 0.284343 0.294292 0.303997 0.313626 0.322957 0.332260 0.341319 0.350368 0.359221 0.368059 0.376700 0.385301 0.393691 0.402050 ! PC_GS_angles - Gain-schedule table: pitch angles [rad]. +-0.020655 -0.018159 -0.016134 -0.014459 -0.013049 -0.011846 -0.010809 -0.009904 -0.009108 -0.008403 -0.007774 -0.007209 -0.006698 -0.006235 -0.005813 -0.005427 -0.005072 -0.004745 -0.004442 -0.004162 -0.003901 -0.003657 -0.003430 -0.003217 -0.003017 -0.002829 -0.002652 -0.002484 -0.002326 -0.002176 ! PC_GS_KP - Gain-schedule table: pitch controller kp gains [s]. +-0.008388 -0.007514 -0.006805 -0.006218 -0.005725 -0.005304 -0.004940 -0.004624 -0.004345 -0.004098 -0.003878 -0.003680 -0.003501 -0.003339 -0.003192 -0.003056 -0.002932 -0.002817 -0.002712 -0.002613 -0.002522 -0.002437 -0.002357 -0.002283 -0.002212 -0.002147 -0.002085 -0.002026 -0.001971 -0.001918 ! PC_GS_KI - Gain-schedule table: pitch controller ki gains [-]. +0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 ! PC_GS_KD - Gain-schedule table: pitch controller kd gains +0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 ! PC_GS_TF - Gain-schedule table: pitch controller tf gains (derivative filter) +1.570000000000 ! PC_MaxPit - Maximum physical pitch limit, [rad]. +0.000880000000 ! PC_MinPit - Minimum physical pitch limit, [rad]. +0.174500000000 ! PC_MaxRat - Maximum pitch rate (in absolute value) in pitch controller, [rad/s]. +-0.17450000000 ! PC_MinRat - Minimum pitch rate (in absolute value) in pitch controller, [rad/s]. +122.9096700000 ! PC_RefSpd - Desired (reference) HSS speed for pitch controller, [rad/s]. +0.000880000000 ! PC_FinePit - Record 5: Below-rated pitch angle set-point, [rad] +0.017450000000 ! PC_Switch - Angle above lowest minimum pitch angle for switch, [rad] + +!------- INDIVIDUAL PITCH CONTROL ----------------------------------------- +9.120000 11.400000 ! IPC_Vramp - Start and end wind speeds for cut-in ramp function. First entry: IPC inactive, second entry: IPC fully active. [m/s] +2 ! IPC_SatMode - IPC Saturation method (0 - no saturation (except by PC_MinPit), 1 - saturate by PS_BldPitchMin, 2 - saturate sotfly (full IPC cycle) by PC_MinPit, 3 - saturate softly by PS_BldPitchMin) +0.3 ! IPC_IntSat - Integrator saturation (maximum signal amplitude contribution to pitch from IPC), [rad] +0.000e+00 0.000e+00 ! IPC_KP - Proportional gain for the individual pitch controller: first parameter for 1P reductions, second for 2P reductions, [-] +0.000e+00 0.000e+00 ! IPC_KI - Integral gain for the individual pitch controller: first parameter for 1P reductions, second for 2P reductions, [-] +0.000000 0.000000 ! IPC_aziOffset - Phase offset added to the azimuth angle for the individual pitch controller, [rad]. +0.0 ! IPC_CornerFreqAct - Corner frequency of the first-order actuators model, to induce a phase lag in the IPC signal {0: Disable}, [rad/s] + +!------- VS TORQUE CONTROL ------------------------------------------------ +94.40000000000 ! VS_GenEff - Generator efficiency mechanical power -> electrical power, [should match the efficiency defined in the generator properties!], [%] +43093.51876000 ! VS_ArSatTq - Above rated generator torque PI control saturation, [Nm] +1500000.000000 ! VS_MaxRat - Maximum torque rate (in absolute value) in torque controller, [Nm/s]. +47402.87063000 ! VS_MaxTq - Maximum generator torque in Region 3 (HSS side), [Nm]. +0.000000000000 ! VS_MinTq - Minimum generator torque (HSS side), [Nm]. +35.29006000000 ! VS_MinOMSpd - Minimum generator speed [rad/s] +2.185750000000 ! VS_Rgn2K - Generator torque constant in Region 2 (HSS side), [Nm/(rad/s)^2] +5000000.000000 ! VS_RtPwr - Wind turbine rated power [W] +43093.51876000 ! VS_RtTq - Rated torque, [Nm]. +122.9096700000 ! VS_RefSpd - Rated generator speed [rad/s] +1 ! VS_n - Number of generator PI torque controller gains +-657.442080000 ! VS_KP - Proportional gain for generator PI torque controller [-]. (Only used in the transitional 2.5 region if VS_ControlMode =/ 2) +-104.507080000 ! VS_KI - Integral gain for generator PI torque controller [s]. (Only used in the transitional 2.5 region if VS_ControlMode =/ 2) +7.64 ! VS_TSRopt - Power-maximizing region 2 tip-speed-ratio [rad]. + +!------- SETPOINT SMOOTHER --------------------------------------------- +1.00000 ! SS_VSGain - Variable speed torque controller setpoint smoother gain, [-]. +0.00100 ! SS_PCGain - Collective pitch controller setpoint smoother gain, [-]. + +Extra lines that ROSCO doesn't care about anymore + +!------- WIND SPEED ESTIMATOR --------------------------------------------- +63.000 ! WE_BladeRadius - Blade length (distance from hub center to blade tip), [m] +1 ! WE_CP_n - Amount of parameters in the Cp array +0.0 ! WE_CP - Parameters that define the parameterized CP(lambda) function +0.0 ! WE_Gamma - Adaption gain of the wind speed estimator algorithm [m/rad] +97.0 ! WE_GearboxRatio - Gearbox ratio [>=1], [-] +43702538.05700 ! WE_Jtot - Total drivetrain inertia, including blades, hub and casted generator inertia to LSS, [kg m^2] +1.225 ! WE_RhoAir - Air density, [kg m^-3] +"Cp_Ct_Cq.NREL5MW.txt" ! PerfFileName - File containing rotor performance tables (Cp,Ct,Cq) (absolute path or relative to this file) +36 26 ! PerfTableSize - Size of rotor performance tables, first number refers to number of blade pitch angles, second number referse to number of tip-speed ratios +60 ! WE_FOPoles_N - Number of first-order system poles used in EKF +3.0000 3.2897 3.5793 3.8690 4.1586 4.4483 4.7379 5.0276 5.3172 5.6069 5.8966 6.1862 6.4759 6.7655 7.0552 7.3448 7.6345 7.9241 8.2138 8.5034 8.7931 9.0828 9.3724 9.6621 9.9517 10.2414 10.5310 10.8207 11.1103 11.4000 11.8533 12.3067 12.7600 13.2133 13.6667 14.1200 14.5733 15.0267 15.4800 15.9333 16.3867 16.8400 17.2933 17.7467 18.2000 18.6533 19.1067 19.5600 20.0133 20.4667 20.9200 21.3733 21.8267 22.2800 22.7333 23.1867 23.6400 24.0933 24.5467 25.0000 ! WE_FOPoles_v - Wind speeds corresponding to first-order system poles [m/s] +-0.01638154 -0.01796321 -0.01954487 -0.02112654 -0.02270820 -0.02428987 -0.02587154 -0.02745320 -0.02903487 -0.03061653 -0.03219820 -0.03377987 -0.03536153 -0.03694320 -0.03852486 -0.04010653 -0.04168820 -0.04326986 -0.04485153 -0.04643319 -0.04801486 -0.04959652 -0.05117819 -0.05275986 -0.05434152 -0.05592319 -0.05758373 -0.05882656 -0.06845507 -0.05992890 0.02094683 0.01327182 0.00285485 -0.00935731 -0.02210773 -0.03573037 -0.04990222 -0.06404904 -0.07899629 -0.09463190 -0.10954192 -0.12525205 -0.14168652 -0.15843395 -0.17415061 -0.19052486 -0.20780146 -0.22581018 -0.24373777 -0.26010871 -0.27706767 -0.29551708 -0.31430599 -0.33428552 -0.35420853 -0.37183729 -0.38936451 -0.40828911 -0.42758878 -0.44818175 ! WE_FOPoles - First order system poles [1/s] + +!------- MINIMUM PITCH SATURATION ------------------------------------------- +60 ! PS_BldPitchMin_N - Number of values in minimum blade pitch lookup table (should equal number of values in PS_WindSpeeds and PS_BldPitchMin) +3.0000 3.2897 3.5793 3.8690 4.1586 4.4483 4.7379 5.0276 5.3172 5.6069 5.8966 6.1862 6.4759 6.7655 7.0552 7.3448 7.6345 7.9241 8.2138 8.5034 8.7931 9.0828 9.3724 9.6621 9.9517 10.2414 10.5310 10.8207 11.1103 11.4000 11.8533 12.3067 12.7600 13.2133 13.6667 14.1200 14.5733 15.0267 15.4800 15.9333 16.3867 16.8400 17.2933 17.7467 18.2000 18.6533 19.1067 19.5600 20.0133 20.4667 20.9200 21.3733 21.8267 22.2800 22.7333 23.1867 23.6400 24.0933 24.5467 25.0000 ! PS_WindSpeeds - Wind speeds corresponding to minimum blade pitch angles [m/s] +0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.01116187 0.02310060 0.03164156 0.03968639 0.04741131 0.05899071 0.07019329 0.08090119 0.09141661 0.10169361 0.11174124 0.12170066 0.13137494 0.14103377 0.15048120 0.15989580 0.16913227 0.17831010 0.18739638 0.19643591 0.20537011 0.21419674 0.22293719 0.23161365 0.24025975 0.24885012 0.25735704 0.26578040 0.27407178 0.28233051 0.29047594 0.29867838 0.30674517 0.31490089 0.32284411 ! PS_BldPitchMin - Minimum blade pitch angles [rad] + +!------- SHUTDOWN ----------------------------------------------------------- +0.436300000000 ! SD_MaxPit - Maximum blade pitch angle to initiate shutdown, [rad] +0.418880000000 ! SD_CornerFreq - Cutoff Frequency for first order low-pass filter for blade pitch angle, [rad/s] + +!------- Floating ----------------------------------------------------------- +0.000000000000 ! Fl_Kp - Nacelle velocity proportional feedback gain [s] + +Extra lines that ROSCO doesn't care about anymore \ No newline at end of file diff --git a/ROSCO/Examples/example_inputs/minimal_DISCON_err.IN b/ROSCO/Examples/example_inputs/minimal_DISCON_err.IN new file mode 100644 index 000000000..327af71c4 --- /dev/null +++ b/ROSCO/Examples/example_inputs/minimal_DISCON_err.IN @@ -0,0 +1,106 @@ +! Controller parameter input file for the NREL-5MW wind turbine +! - File written using ROSCO version 2.7.0 controller tuning logic on 02/27/23 + +!------- DEBUG ------------------------------------------------------------ +0 ! LoggingLevel - (0: write no debug files, 1: write standard output .dbg-file, 2: LoggingLevel 1 + ROSCO LocalVars (.dbg2) 3: LoggingLevel 2 + complete avrSWAP-array (.dbg3)) +1 ! Echo - (0 - no Echo, 1 - Echo input data to .echo) + +!------- CONTROLLER FLAGS ------------------------------------------------- +1 ! F_LPFType - (1: first-order low-pass filter, 2: second-order low-pass filter), [rad/s] (currently filters generator speed and pitch control signals +0 ! F_NotchType - Notch on the measured generator speed and/or tower fore-aft motion (for floating) {0: disable, 1: generator speed, 2: tower-top fore-aft motion, 3: generator speed and tower-top fore-aft motion} +1 ! IPC_ControlMode - Turn Individual Pitch Control (IPC) for fatigue load reductions (pitch contribution) {0: off, 1: 1P reductions, 2: 1P+2P reductions} +3 ! VS_ControlMode - Generator torque control mode in above rated conditions {0: constant torque, 1: constant power, 2: TSR tracking PI control with constant torque, 3: TSR tracking PI control with constant power} +1 ! PC_ControlMode - Blade pitch control mode {0: No pitch, fix to fine pitch, 1: active PI blade pitch control} +0 ! Y_ControlMode - Yaw control mode {0: no yaw control, 1: yaw rate control, 2: yaw-by-IPC} +1 ! SS_Mode - Setpoint Smoother mode {0: no setpoint smoothing, 1: introduce setpoint smoothing} +0 ! WE_Mode - Wind speed estimator mode {0: One-second low pass filtered hub height wind speed, 1: Immersion and Invariance Estimator, 2: Extended Kalman Filter} +0 ! SD_Mode - Shutdown mode {0: no shutdown procedure, 1: pitch to max pitch at shutdown} +0 ! Fl_Mode - Floating specific feedback mode {0: no nacelle velocity feedback, 1: feed back translational velocity, 2: feed back rotational veloicty} +0 ! TD_Mode - Tower damper mode {0: no tower damper, 1: feed back translational nacelle accelleration to pitch angle} +0 ! Flp_Mode - Flap control mode {0: no flap control, 1: steady state flap angle, 2: Proportional flap control, 2: Cyclic (1P) flap control} +0 ! OL_Mode - Open loop control mode {0: no open loop control, 1: open loop control vs. time} +0 ! PA_Mode - Pitch actuator mode {0 - not used, 1 - first order filter, 2 - second order filter} +0 ! PF_Mode - Pitch fault mode {0 - not used, 1 - constant offset on one or more blades} +0 ! ZMQ_Mode - Fuse ZeroMQ interface {0: unused, 1: Yaw Control} +0 ! CC_Mode - Cable control mode [0- unused, 1- User defined, 2- Position control (not yet implemented)] +1 ! StC_Mode - Structural control mode [0- unused, 1- User defined] + +Extra lines that ROSCO doesn't care about anymore + + + + +!------- FILTERS ---------------------------------------------------------- +1.57080 ! F_LPFCornerFreq - Corner frequency (-3dB point) in the low-pass filters, [rad/s] +0.00000 ! F_LPFDamping - Damping coefficient {used only when F_FilterType = 2} [-] +0.00000 ! F_NotchCornerFreq - Natural frequency of the notch filter, [rad/s] +0.000000 0.250000 ! F_NotchBetaNumDen - Two notch damping values (numerator and denominator, resp) - determines the width and depth of the notch, [-] +0.62830 ! F_SSCornerFreq - Corner frequency (-3dB point) in the first order low pass filter for the setpoint smoother, [rad/s]. +0.20944 ! F_WECornerFreq - Corner frequency (-3dB point) in the first order low pass filter for the wind speed estimate [rad/s]. +0.17952 ! F_YawErr - Low pass filter corner frequency for yaw controller [rad/s]. +0.000000 1.000000 ! F_FlCornerFreq - Natural frequency and damping in the second order low pass filter of the tower-top fore-aft motion for floating feedback control [rad/s, -]. +0.01042 ! F_FlHighPassFreq - Natural frequency of first-order high-pass filter for nacelle fore-aft motion [rad/s]. +0.000000 1.000000 ! F_FlpCornerFreq - Corner frequency and damping in the second order low pass filter of the blade root bending moment for flap control [rad/s, -]. + +!------- BLADE PITCH CONTROL ---------------------------------------------- +30 ! PC_GS_n - Amount of gain-scheduling table entries +0.056789 0.084492 0.106018 0.124332 0.140807 0.155903 0.169931 0.183270 0.196062 0.208354 0.220050 0.231503 0.242646 0.253377 0.263967 0.274233 0.284343 0.294292 0.303997 0.313626 0.322957 0.332260 0.341319 0.350368 0.359221 0.368059 0.376700 0.385301 0.393691 0.402050 ! PC_GS_angles - Gain-schedule table: pitch angles [rad]. +-0.020655 -0.018159 -0.016134 -0.014459 -0.013049 -0.011846 -0.010809 -0.009904 -0.009108 -0.008403 -0.007774 -0.007209 -0.006698 -0.006235 -0.005813 -0.005427 -0.005072 -0.004745 -0.004442 -0.004162 -0.003901 -0.003657 -0.003430 -0.003217 -0.003017 -0.002829 -0.002652 -0.002484 -0.002326 -0.002176 ! PC_GS_KP - Gain-schedule table: pitch controller kp gains [s]. +-0.008388 -0.007514 -0.006805 -0.006218 -0.005725 -0.005304 -0.004940 -0.004624 -0.004345 -0.004098 -0.003878 -0.003680 -0.003501 -0.003339 -0.003192 -0.003056 -0.002932 -0.002817 -0.002712 -0.002613 -0.002522 -0.002437 -0.002357 -0.002283 -0.002212 -0.002147 -0.002085 -0.002026 -0.001971 -0.001918 ! PC_GS_KI - Gain-schedule table: pitch controller ki gains [-]. +0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 ! PC_GS_KD - Gain-schedule table: pitch controller kd gains +0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 ! PC_GS_TF - Gain-schedule table: pitch controller tf gains (derivative filter) +1.570000000000 ! PC_MaxPit - Maximum physical pitch limit, [rad]. +0.000880000000 ! PC_MinPit - Minimum physical pitch limit, [rad]. +0.174500000000 ! PC_MaxRat - Maximum pitch rate (in absolute value) in pitch controller, [rad/s]. +-0.17450000000 ! PC_MinRat - Minimum pitch rate (in absolute value) in pitch controller, [rad/s]. +122.9096700000 ! PC_RefSpd - Desired (reference) HSS speed for pitch controller, [rad/s]. +0.000880000000 ! PC_FinePit - Record 5: Below-rated pitch angle set-point, [rad] +0.017450000000 ! PC_Switch - Angle above lowest minimum pitch angle for switch, [rad] + +!------- INDIVIDUAL PITCH CONTROL ----------------------------------------- +9.120000 11.400000 ! IPC_Vramp - Start and end wind speeds for cut-in ramp function. First entry: IPC inactive, second entry: IPC fully active. [m/s] +2 ! IPC_SatMode - IPC Saturation method (0 - no saturation (except by PC_MinPit), 1 - saturate by PS_BldPitchMin, 2 - saturate sotfly (full IPC cycle) by PC_MinPit, 3 - saturate softly by PS_BldPitchMin) +0.3 ! IPC_IntSat - Integrator saturation (maximum signal amplitude contribution to pitch from IPC), [rad] +0.000e+00 0.000e+00 ! IPC_KP - Proportional gain for the individual pitch controller: first parameter for 1P reductions, second for 2P reductions, [-] +0.000e+00 0.000e+00 ! IPC_KI - Integral gain for the individual pitch controller: first parameter for 1P reductions, second for 2P reductions, [-] +0.000000 0.000000 ! IPC_aziOffset - Phase offset added to the azimuth angle for the individual pitch controller, [rad]. +0.0 ! IPC_CornerFreqAct - Corner frequency of the first-order actuators model, to induce a phase lag in the IPC signal {0: Disable}, [rad/s] + +!------- VS TORQUE CONTROL ------------------------------------------------ +94.40000000000 ! VS_GenEff - Generator efficiency mechanical power -> electrical power, [should match the efficiency defined in the generator properties!], [%] +43093.51876000 ! VS_ArSatTq - Above rated generator torque PI control saturation, [Nm] +1500000.000000 ! VS_MaxRat - Maximum torque rate (in absolute value) in torque controller, [Nm/s]. +47402.87063000 ! VS_MaxTq - Maximum generator torque in Region 3 (HSS side), [Nm]. +0.000000000000 ! VS_MinTq - Minimum generator torque (HSS side), [Nm]. +35.29006000000 ! VS_MinOMSpd - Minimum generator speed [rad/s] +2.185750000000 ! VS_Rgn2K - Generator torque constant in Region 2 (HSS side), [Nm/(rad/s)^2] +5000000.000000 ! VS_RtPwr - Wind turbine rated power [W] +43093.51876000 ! VS_RtTq - Rated torque, [Nm]. +122.9096700000 ! VS_RefSpd - Rated generator speed [rad/s] +1 ! VS_n - Number of generator PI torque controller gains +-657.442080000 ! VS_KP - Proportional gain for generator PI torque controller [-]. (Only used in the transitional 2.5 region if VS_ControlMode =/ 2) +-104.507080000 ! VS_KI - Integral gain for generator PI torque controller [s]. (Only used in the transitional 2.5 region if VS_ControlMode =/ 2) +7.64 ! VS_TSRopt - Power-maximizing region 2 tip-speed-ratio [rad]. + +!------- SETPOINT SMOOTHER --------------------------------------------- +1.00000 ! SS_VSGain - Variable speed torque controller setpoint smoother gain, [-]. +0.00100 ! SS_PCGain - Collective pitch controller setpoint smoother gain, [-]. + +Extra lines that ROSCO doesn't care about anymore + +!------- WIND SPEED ESTIMATOR --------------------------------------------- +63.000 ! WE_BladeRadius - Blade length (distance from hub center to blade tip), [m] +97.0 ! WE_GearboxRatio - Gearbox ratio [>=1], [-] + +!------- MINIMUM PITCH SATURATION ------------------------------------------- +60 ! PS_BldPitchMin_N - Number of values in minimum blade pitch lookup table (should equal number of values in PS_WindSpeeds and PS_BldPitchMin) +0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.00088027 0.01116187 0.02310060 0.03164156 0.03968639 0.04741131 0.05899071 0.07019329 0.08090119 0.09141661 0.10169361 0.11174124 0.12170066 0.13137494 0.14103377 0.15048120 0.15989580 0.16913227 0.17831010 0.18739638 0.19643591 0.20537011 0.21419674 0.22293719 0.23161365 0.24025975 0.24885012 0.25735704 0.26578040 0.27407178 0.28233051 0.29047594 0.29867838 0.30674517 0.31490089 0.32284411 ! PS_BldPitchMin - Minimum blade pitch angles [rad] + +!------- SHUTDOWN ----------------------------------------------------------- +0.436300000000 ! SD_MaxPit - Maximum blade pitch angle to initiate shutdown, [rad] +0.418880000000 ! SD_CornerFreq - Cutoff Frequency for first order low-pass filter for blade pitch angle, [rad/s] + +!------- Floating ----------------------------------------------------------- +0.000000000000 ! Fl_Kp - Nacelle velocity proportional feedback gain [s] + +Extra lines that ROSCO doesn't care about anymore \ No newline at end of file diff --git a/ROSCO/Examples/run_examples.py b/ROSCO/Examples/test_examples.py similarity index 55% rename from ROSCO/Examples/run_examples.py rename to ROSCO/Examples/test_examples.py index 56b47208a..0bd6840e7 100644 --- a/ROSCO/Examples/run_examples.py +++ b/ROSCO/Examples/test_examples.py @@ -4,33 +4,45 @@ import runpy all_scripts = [ - 'example_01', - 'example_02', - 'example_03', - 'example_04', - 'example_05', - 'example_06', - 'example_07', - 'example_08', - 'example_09', - 'example_10', - 'example_11', - 'example_12', - 'example_13', - 'example_14', - 'example_15', - 'example_16', - 'example_17', # NJA: only runs on unix in CI + '01_turbine_model', + '02_ccblade', + '03_tune_controller', + '04_simple_sim', + '05_openfast_sim', + '06_peak_shaving', + '07_openfast_outputs', + '08_run_turbsim', + '09_distributed_aero', + '10_linear_params', + '11_robust_tuning', + '12_tune_ipc', + '14_open_loop_control', + '15_pass_through', + '16_external_dll', + '17_zeromq_interface', # NJA: only runs on unix in CI + '18_pitch_offsets', + '19_update_discon_version', + '20_active_wake_control', + '21_optional_inputs', + '22_cable_control', + 'update_rosco_discons', ] def execute_script(fscript): examples_dir = os.path.dirname(os.path.realpath(__file__)) + test_case_dir = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)),'../Test_Cases')) # Go to location due to relative path use for airfoil files print("\n\n") print("NOW RUNNING:", fscript) print() - fullpath = os.path.join(examples_dir, fscript + ".py") + + if fscript in ['update_rosco_discons']: + run_dir = test_case_dir + else: + run_dir = examples_dir + + fullpath = os.path.join(run_dir, fscript + ".py") basepath = os.path.dirname(os.path.realpath(fullpath)) os.chdir(basepath) diff --git a/ROSCO/ROSCO/CMakeLists.txt b/ROSCO/ROSCO/CMakeLists.txt index 3a97a2160..b450a30fe 100644 --- a/ROSCO/ROSCO/CMakeLists.txt +++ b/ROSCO/ROSCO/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.6) -project(ROSCO VERSION 2.6.0 LANGUAGES Fortran C) +project(ROSCO VERSION 2.8.0 LANGUAGES Fortran C) set(CMAKE_Fortran_MODULE_DIRECTORY "${CMAKE_BINARY_DIR}/ftnmods") @@ -109,6 +109,10 @@ install(TARGETS discon LIBRARY DESTINATION lib ARCHIVE DESTINATION lib ) -if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + +set(linuxDefault ${CMAKE_INSTALL_PREFIX} STREQUAL "/usr/local") +set(windowsDefault ${CMAKE_INSTALL_PREFIX} STREQUAL "C:\\Program Files (x86)") +if(${linuxDefault} OR ${windowsDefault}) + message("TRUE") set(CMAKE_INSTALL_PREFIX "${CMAKE_SOURCE_DIR}/install") -endif() +endif() \ No newline at end of file diff --git a/ROSCO/ROSCO/rosco_registry/rosco_types.yaml b/ROSCO/ROSCO/rosco_registry/rosco_types.yaml index cd090bdc6..b0dc2cd69 100644 --- a/ROSCO/ROSCO/rosco_registry/rosco_types.yaml +++ b/ROSCO/ROSCO/rosco_registry/rosco_types.yaml @@ -12,6 +12,20 @@ default_types: size: 0 # Use this if the type IS an array (size:3 --> REAL(8), BldPitch(3)) allocatable: False equals: + complex: &complex + type: complex + description: + dimension: # Use this if a higher-dimensional allocatable array (dimension:(:,:) --> REAL(8), DIMESION(:,:), ALLOCATABLE) + size: 0 # Use this if the type IS an array (size:3 --> REAL(8), BldPitch(3)) + allocatable: False + equals: + float: &float + type: float + description: + dimension: # Use this if a higher-dimensional allocatable array (dimension:(:,:) --> REAL(8), DIMESION(:,:), ALLOCATABLE) + size: 0 # Use this if the type IS an array (size:3 --> REAL(8), BldPitch(3)) + allocatable: False + equals: character: &character type: character description: @@ -62,7 +76,9 @@ ControlParameters: LoggingLevel: <<: *integer description: 0 - write no debug files, 1 - write standard output .dbg-file, 2 - write standard output .dbg-file and complete avrSWAP-array .dbg2-file - + Echo: + <<: *integer + description: 0 - no Echo, 1 - Echo input data to .echo # Filters F_LPFType: <<: *integer @@ -129,6 +145,9 @@ ControlParameters: IPC_IntSat: <<: *real description: Integrator saturation (maximum signal amplitude contrbution to pitch from IPC) + IPC_SatMode: + <<: *integer + description: IPC Saturation method IPC Saturation method (0 - no saturation (except by PC_MinPit), 1 - saturate by PS_BldPitchMin, 2 - saturate sotfly (full IPC cycle) by PC_MinPit, 3 - saturate softly by PS_BldPitchMin) IPC_KP: <<: *real description: Integral gain for the individual pitch controller, [-]. @@ -398,6 +417,14 @@ ControlParameters: Ind_YawRate: <<: *integer description: The column in OL_Filename that contains the generator torque in Nm + Ind_CableControl: + <<: *integer + allocatable: True + description: The column in OL_Filename that contains the cable control inputs in m + Ind_StructControl: + <<: *integer + allocatable: True + description: The column in OL_Filename that contains the structural control inputs in various units OL_Breakpoints: <<: *real allocatable: True @@ -406,6 +433,14 @@ ControlParameters: <<: *real allocatable: True description: Open blade pitch timeseries + OL_CableControl: + <<: *real + allocatable: True + dimension: (:,:) + OL_StructControl: + <<: *real + allocatable: True + dimension: (:,:) OL_GenTq: <<: *real allocatable: True @@ -431,6 +466,67 @@ ControlParameters: <<: *real description: Pitch actuator damping ratio [-, unused if PA_Mode = 1] + # Active wake control + AWC_Mode: + <<: *integer + description: Active wake control mode [0 - unused, 1 - complex number method, 2 - Coleman transform method] + AWC_NumModes: + <<: *integer + description: AWC- Number of modes to include [-] + AWC_n: + <<: *integer + allocatable: True + description: AWC azimuthal mode [-] + AWC_harmonic: + <<: *integer + allocatable: True + description: AWC AWC Coleman transform harmonic [-] + AWC_freq: + <<: *real + allocatable: True + description: AWC frequency [Hz] + AWC_amp: + <<: *real + allocatable: True + description: AWC amplitude [deg] + AWC_clockangle: + <<: *real + allocatable: True + description: AWC clocking angle [deg] + + # Active wake control + AWC_Mode: + <<: *integer + description: Active wake control mode [0 - unused, 1 - SNL method, 2 - NREL method] + AWC_NumModes: + <<: *integer + description: AWC- Number of modes to include [-] + AWC_n: + <<: *integer + allocatable: True + description: AWC azimuthal mode [-] + AWC_freq: + <<: *real + allocatable: True + description: AWC frequency [Hz] + AWC_amp: + <<: *real + allocatable: True + description: AWC amplitude [deg] + AWC_clockangle: + <<: *real + allocatable: True + description: AWC clocking angle [deg] + + # Pitch actuator error + PF_Mode: + <<: *integer + description: Pitch actuator fault mode {0 - not used, 1 - offsets on one or more blades} + PF_Offsets: + <<: *real + description: Pitch actuator fault offsets for blade 1-3 [rad/s] + allocatable: True + # External Control Ext_Mode: <<: *integer @@ -460,6 +556,38 @@ ControlParameters: <<: *real description: Integer for zeromq update frequency + # Cable control + CC_Mode: + <<: *integer + description: Flag for ZeroMQ (0-off, 1-yaw} + + CC_Group_N: + <<: *integer + description: Number of cable control groups + + CC_ActTau: + <<: *real + description: Time constant for line actuator [s] + + CC_GroupIndex: + <<: *integer + description: Cable control group indices + allocatable: True + + # StC Control + StC_Mode: + <<: *integer + description: Flag for StC Control + + StC_Group_N: + <<: *integer + description: Number of cable control groups + + StC_GroupIndex: + <<: *integer + description: Cable control group indices + allocatable: True + # Calculated PC_RtTq99: <<: *real @@ -562,6 +690,46 @@ FilterParameters: <<: *real dimension: (99) description: Second order filter - Previous output 1 + lpfV_a2: + <<: *real + dimension: (99) + description: Second order filter - Denominator coefficient 1 + lpfV_a1: + <<: *real + dimension: (99) + description: Second order filter - Denominator coefficient 1 + lpfV_a0: + <<: *real + dimension: (99) + description: Second order filter - Denominator coefficient 0 + lpfV_b2: + <<: *real + dimension: (99) + description: Second order filter - Numerator coefficient 2 + lpfV_b1: + <<: *real + dimension: (99) + description: Second order filter - Numerator coefficient 1 + lpfV_b0: + <<: *real + dimension: (99) + description: Second order filter - Numerator coefficient 0 + lpfV_InputSignalLast2: + <<: *real + dimension: (99) + description: Second order filter - Previous input 2 + lpfV_OutputSignalLast2: + <<: *real + dimension: (99) + description: Second order filter - Previous output 2 + lpfV_InputSignalLast1: + <<: *real + dimension: (99) + description: Second order filter - Previous input 1 + lpfV_OutputSignalLast1: + <<: *real + dimension: (99) + description: Second order filter - Previous output 1 hpf_InputSignalLast: <<: *real dimension: (99) @@ -643,6 +811,12 @@ FilterParameters: dimension: (99) description: Notch filter denominator coefficient 0 +rlParams: + LastSignal: + <<: *real + dimension: (99) + description: Last input signal + piParams: ITerm: <<: *real @@ -701,6 +875,9 @@ LocalVariables: <<: *real description: Blade pitch [rad] size: 3 + BlPitchCMeas: + <<: *real + description: Mean (collective) blade pitch [rad] Azimuth: <<: *real description: Rotor aziumuth angle [rad] @@ -794,6 +971,24 @@ LocalVariables: IPC_AxisYaw_2P: <<: *real description: Integral of quadrature, 2P + axisTilt_1P: + <<: *real + description: Tilt moment, 1P + axisYaw_1P: + <<: *real + description: Yaw moment, 1P + axisYawF_1P: + <<: *real + description: Filtered yaw moment, 1P + axisTilt_2P: + <<: *real + description: Tilt moment, 2P + axisYaw_2P: + <<: *real + description: Yaw moment, 2P + axisYawF_2P: + <<: *real + description: Filtered yaw moment, 2P IPC_KI: <<: *real description: Integral gain for IPC, after ramp [-] @@ -802,6 +997,9 @@ LocalVariables: <<: *real description: Proportional gain for IPC, after ramp [-] size: 2 + IPC_IntSat: + <<: *real + description: Integrator saturation (maximum signal amplitude contrbution to pitch from IPC) PC_State: <<: *integer description: State of the pitch control system @@ -811,7 +1009,7 @@ LocalVariables: size: 3 PitComAct: <<: *real - description: Actuated pitch of each blade the last time the controller was called [rad]. + description: Actuated pitch command of each blade [rad]. size: 3 SS_DelOmegaF: <<: *real @@ -871,6 +1069,72 @@ LocalVariables: <<: *real FA_AccF: <<: *real + PtfmTDX: + <<: *real + description: Platform motion -- Displacement TDX (m)') + PtfmTDY: + <<: *real + description: Platform motion -- Displacement TDY (m)') + PtfmTDZ: + <<: *real + description: Platform motion -- Displacement TDZ (m)') + PtfmRDX: + <<: *real + description: Platform motion -- Displacement RDX (rad)') + PtfmRDY: + <<: *real + description: Platform motion -- Displacement RDY (rad)') + PtfmRDZ: + <<: *real + description: Platform motion -- Displacement RDZ (rad)') + PtfmTVX: + <<: *real + description: Platform motion -- Velocity TVX (m/s)') + PtfmTVY: + <<: *real + description: Platform motion -- Velocity TVY (m/s)') + PtfmTVZ: + <<: *real + description: Platform motion -- Velocity TVZ (m/s)') + PtfmRVX: + <<: *real + description: Platform motion -- Velocity RVX (rad/s)') + PtfmRVY: + <<: *real + description: Platform motion -- Velocity RVY (rad/s)') + PtfmRVZ: + <<: *real + description: Platform motion -- Velocity RVZ (rad/s)') + PtfmTAX: + <<: *real + description: Platform motion -- Acceleration TAX (m/s^2)') + PtfmTAY: + <<: *real + description: Platform motion -- Acceleration TAY (m/s^2)') + PtfmTAZ: + <<: *real + description: Platform motion -- Acceleration TAZ (m/s^2)') + PtfmRAX: + <<: *real + description: Platform motion -- Acceleration RAX (rad/s^2)') + PtfmRAY: + <<: *real + description: Platform motion -- Acceleration RAY (rad/s^2)') + PtfmRAZ: + <<: *real + description: Platform motion -- Acceleration RAZ (rad/s^2)') + CC_DesiredL: + <<: *real + size: 12 + CC_ActuatedL: + <<: *real + size: 12 + CC_ActuatedDL: + <<: *real + size: 12 + StC_Input: + <<: *real + size: 12 Flp_Angle: <<: *real description: Flap Angle (rad) @@ -890,6 +1154,10 @@ LocalVariables: restart: <<: *logical description: Restart flag + AWC_complexangle: + <<: *complex + description: Complex angle for each blade, sum of modes? + size: 3 WE: <<: *derived_type id: WE @@ -902,6 +1170,10 @@ LocalVariables: <<: *derived_type id: piParams description: PI parameters derived type + rlP: + <<: *derived_type + id: rlParams + description: Rate limiter parameters derived type ObjectInstances: instLPF: @@ -910,6 +1182,9 @@ ObjectInstances: instSecLPF: <<: *integer description: Second order low-pass filter instance + instSecLPFV: + <<: *integer + description: Second order low-pass filter instance instHPF: <<: *integer description: High-pass filter instance @@ -922,6 +1197,9 @@ ObjectInstances: instPI: <<: *integer description: PI controller instance + instRL: + <<: *integer + description: Rate limiter instance PerformanceData: TSR_vec: @@ -1027,13 +1305,13 @@ DebugVariables: description: Commanded yaw rate [rad/s]. NacHeadingTarget: <<: *real - description: Target nacelle heading [rad]. + description: Target nacelle heading [deg]. NacVaneOffset: <<: *real - description: Nacelle vane angle with offset [rad]. - Yaw_err: + description: Nacelle vane angle with offset [deg]. + Yaw_Err: <<: *real - description: Yaw error [rad]. + description: Yaw error [deg]. YawState: <<: *real description: State of yaw controller @@ -1086,7 +1364,7 @@ ZMQ_Variables: ExtControlType: avrSWAP: - <<: *c_float + <<: *float description: The swap array- used to pass data to and from the DLL controller [see Bladed DLL documentation] allocatable: True dimension: (:) diff --git a/ROSCO/ROSCO/rosco_registry/write_registry.py b/ROSCO/ROSCO/rosco_registry/write_registry.py index 05baaa8dd..2f31b4003 100644 --- a/ROSCO/ROSCO/rosco_registry/write_registry.py +++ b/ROSCO/ROSCO/rosco_registry/write_registry.py @@ -125,7 +125,7 @@ def write_roscoio(yfile): file.write(" TYPE(PerformanceData), INTENT(INOUT) :: PerfData\n") file.write(" TYPE(ErrorVariables), INTENT(INOUT) :: ErrVar\n") file.write(" TYPE(ZMQ_Variables), INTENT(INOUT) :: zmqVar\n") - file.write(" REAL(C_FLOAT), INTENT(IN) :: avrSWAP(*)\n") + file.write(" REAL(ReKi), INTENT(IN) :: avrSWAP(*)\n") file.write(" INTEGER(IntKi), INTENT(IN) :: size_avcOUTNAME\n") file.write(" CHARACTER(size_avcOUTNAME-1), INTENT(IN) :: RootName \n") file.write(" \n") @@ -163,7 +163,7 @@ def write_roscoio(yfile): file.write(' Close ( Un )\n') file.write(' ENDIF\n') file.write(' ! Read Parameter files\n') - file.write(' CALL ReadControlParameterFileSub(CntrPar, zmqVar, LocalVar%ACC_INFILE, LocalVar%ACC_INFILE_SIZE, ErrVar)\n') + file.write(' CALL ReadControlParameterFileSub(CntrPar, zmqVar, LocalVar%ACC_INFILE, LocalVar%ACC_INFILE_SIZE, RootName, ErrVar)\n') file.write(' IF (CntrPar%WE_Mode > 0) THEN\n') file.write(' CALL READCpFile(CntrPar, PerfData, ErrVar)\n') file.write(' ENDIF\n') @@ -183,7 +183,7 @@ def write_roscoio(yfile): file.write(' INTEGER(IntKi), INTENT(IN) :: size_avcOUTNAME\n') file.write(' INTEGER(IntKi) :: I , nDebugOuts, nLocalVars ! Generic index.\n') file.write(' CHARACTER(1), PARAMETER :: Tab = CHAR(9) ! The tab character.\n') - file.write(' CHARACTER(29), PARAMETER :: FmtDat = "(F20.5,TR5,99(ES20.5E2,TR5:))" ! The format of the debugging data\n') + file.write(' CHARACTER(100) :: FmtDat ! The format of the debugging data\n') file.write(' INTEGER(IntKi), SAVE :: UnDb ! I/O unit for the debugging information\n') file.write(' INTEGER(IntKi), SAVE :: UnDb2 ! I/O unit for the debugging information, avrSWAP\n') file.write(' INTEGER(IntKi), SAVE :: UnDb3 ! I/O unit for the debugging information, avrSWAP\n') @@ -191,6 +191,13 @@ def write_roscoio(yfile): file.write(' CHARACTER(size_avcOUTNAME-1), INTENT(IN) :: RootName ! a Fortran version of the input C string (not considered an array here) [subtract 1 for the C null-character]\n') file.write(' CHARACTER(200) :: Version ! git version of ROSCO\n') file.write(' CHARACTER(15), ALLOCATABLE :: DebugOutStrings(:), DebugOutUnits(:)\n') + file.write('\n') + file.write(' ! Avr output writing\n') + file.write(' INTEGER(IntKi), SAVE, DIMENSION(:), ALLOCATABLE :: avrIndices\n') + file.write(' INTEGER(IntKi) :: avrBaseLength = 85\n') + file.write(' INTEGER(IntKi) :: Ind\n') + file.write(' CHARACTER(100) :: avrFmt\n') + file.write('\n') file.write(' REAL(DbKi), ALLOCATABLE :: DebugOutData(:)\n \n') file.write(' CHARACTER(15), ALLOCATABLE :: LocalVarOutStrings(:)\n') file.write(' REAL(DbKi), ALLOCATABLE :: LocalVarOutData(:)\n \n') @@ -221,12 +228,15 @@ def write_roscoio(yfile): file.write(' DebugOutUnits = [CHARACTER(15) :: ') counter = 0 for unit in dbg_units: + # Give dummy unit if not defined + if not unit: + unit = '[N/A]' counter += 1 if counter == len(dbg_units): - file.write(" '{}'".format(unit)) + file.write(" '{}'".format(unit)) # last line else: file.write(" '{}',".format(unit)) - if (counter % 5 == 0): + if (counter % 5 == 0): # group in groups of 5 file.write(' & \n ') file.write(']\n') @@ -234,13 +244,18 @@ def write_roscoio(yfile): # -- Always prints blade(1) for multi-bladed inputss (e.g. BldPitch(1)) lv_strings = [] for lv_idx, localvar in enumerate(reg['LocalVariables']): - if reg['LocalVariables'][localvar]['type'] in ['integer', 'real']: + if reg['LocalVariables'][localvar]['type'] in ['integer', 'real', 'complex']: lv_strings.append(localvar) - file.write(' nLocalVars = {}\n'.format(len(lv_strings))) + + n_lv_outputs = len(lv_strings) + file.write(' nLocalVars = {}\n'.format(n_lv_outputs)) file.write(' Allocate(LocalVarOutData(nLocalVars))\n') file.write(' Allocate(LocalVarOutStrings(nLocalVars))\n') + + # Loop through LocalVariables for lv_idx, localvar in enumerate(lv_strings): - if reg['LocalVariables'][localvar]['size'] > 0: + # If an array, only show first + if reg['LocalVariables'][localvar]['size'] > 0 or reg['LocalVariables'][localvar]['allocatable']: file.write(' LocalVarOutData({}) = LocalVar%{}(1)\n'.format(lv_idx+1, localvar)) else: file.write(' LocalVarOutData({}) = LocalVar%{}\n'.format(lv_idx+1, localvar)) @@ -274,36 +289,77 @@ def write_roscoio(yfile): file.write(" CALL GetNewUnit(UnDb2, ErrVar)\n") file.write(" OPEN(unit=UnDb2, FILE=TRIM(RootName)//'.RO.dbg2')\n") file.write(" WRITE(UnDb2, *) 'Generated on '//CurDate()//' at '//CurTime()//' using ROSCO-'//TRIM(rosco_version)\n") - file.write(" WRITE(UnDb2, '(99(a20,TR5:))') 'Time', LocalVarOutStrings\n") - file.write(" WRITE(UnDb2, '(99(a20,TR5:))')\n") + file.write(f" WRITE(UnDb2, '({n_lv_outputs+1}(a20,TR5:))') 'Time', LocalVarOutStrings\n") + file.write(f" WRITE(UnDb2, '({n_lv_outputs+1}(a20,TR5:))')\n") file.write(" END IF\n") file.write("\n") # avrSWAP debug file.write(" IF (CntrPar%LoggingLevel > 2) THEN\n") + file.write(" ! Set avrIndices, start with basic indices\n") + file.write(" Allocate(avrIndices(avrBaseLength))\n") + file.write(" DO Ind = 1, avrBaseLength\n") + file.write(" avrIndices(Ind) = Ind\n") + file.write(" END DO\n") + file.write("\n") + file.write(" ! Cable control indices\n") + file.write(" IF (CntrPar%CC_Mode > 0) THEN\n") + file.write(" DO Ind = 1, SIZE(CntrPar%CC_GroupIndex)\n") + file.write(" Call AddToList(avrIndices,CntrPar%CC_GroupIndex(Ind))\n") + file.write(" Call AddToList(avrIndices,CntrPar%CC_GroupIndex(Ind)+1)\n") + file.write(" END DO\n") + file.write(" END IF\n") + file.write("\n") + file.write(" ! Structural control indices\n") + file.write(" IF (CntrPar%StC_Mode > 0) THEN\n") + file.write(" DO Ind = 1, SIZE(CntrPar%StC_GroupIndex)\n") + file.write(" Call AddToList(avrIndices,CntrPar%StC_GroupIndex(Ind))\n") + file.write(" END DO\n") + file.write(" END IF\n") + file.write("\n") + file.write(" ! Format string\n") + file.write(" avrFmt = '(A21,'//TRIM(Int2LStr(SIZE(avrIndices)))//'(TR12," + '"' + "'//'" + "AvrSWAP(" + '",I4,"' + ')"' + "))'\n") + # file.write(" WRITE(UnDb3,'"+'(A,85("'+"'//Tab//'"+'AvrSWAP("'+',I2,")"'+"))') 'LocalVar%Time ', (i,i=1, 85)\n") + file.write("\n") file.write(" CALL GetNewUnit(UnDb3, ErrVar)\n") file.write(" OPEN(unit=UnDb3, FILE=TRIM(RootName)//'.RO.dbg3')\n") file.write(" WRITE(UnDb3,'(/////)')\n") - file.write(" WRITE(UnDb3,'"+'(A,85("'+"'//Tab//'"+'AvrSWAP("'+',I2,")"'+"))') 'LocalVar%Time ', (i,i=1, 85)\n") - file.write(" WRITE(UnDb3,'"+'(A,85("'+"'//Tab//'"+'(-)"'+"))') '(s)'"+'\n') + file.write(" WRITE(UnDb3,avrFmt) 'LocalVar%Time ', (avrIndices)\n") + file.write(" WRITE(UnDb3,'(A21,'//TRIM(Int2LStr(SIZE(avrIndices)))//'(TR22," + '"(-)"' + "))') '(s)'\n") file.write(" END IF\n") file.write(" END IF\n") + file.write("\n") file.write(" ! Print simulation status, every 10 seconds\n") file.write(" IF (MODULO(LocalVar%Time, 10.0_DbKi) == 0) THEN\n") file.write(" WRITE(*, 100) LocalVar%GenSpeedF*RPS2RPM, LocalVar%BlPitch(1)*R2D, avrSWAP(15)/1000.0, LocalVar%WE_Vw\n") file.write(" 100 FORMAT('Generator speed: ', f6.1, ' RPM, Pitch angle: ', f5.1, ' deg, Power: ', f7.1, ' kW, Est. wind Speed: ', f5.1, ' m/s')\n") file.write(" END IF\n") file.write("\n") + file.write(" ! Process DebugOutData, LocalVarOutData\n") + file.write(" ! Remove very small numbers that cause ******** outputs\n") + file.write(" DO I = 1,SIZE(DebugOutData)\n") + file.write(" IF (ABS(DebugOutData(I)) < 1E-10) THEN\n") + file.write(" DebugOutData(I) = 0\n") + file.write(" END IF\n") + file.write(" END DO\n") + file.write(" \n") + file.write(" DO I = 1,SIZE(LocalVarOutData)\n") + file.write(" IF (ABS(LocalVarOutData(I)) < 1E-10) THEN\n") + file.write(" LocalVarOutData(I) = 0\n") + file.write(" END IF\n") + file.write(" END DO\n") + file.write(" \n") file.write(" ! Write debug files\n") + file.write(f' FmtDat = "(F20.5,TR5,{n_lv_outputs}(ES20.5E2,TR5:))" ! The format of the debugging data\n') file.write(" IF(CntrPar%LoggingLevel > 0) THEN\n") - file.write(" WRITE (UnDb, FmtDat) LocalVar%Time, DebugOutData\n") + file.write(" WRITE (UnDb, TRIM(FmtDat)) LocalVar%Time, DebugOutData\n") file.write(" END IF\n") file.write("\n") file.write(" IF(CntrPar%LoggingLevel > 1) THEN\n") - file.write(" WRITE (UnDb2, FmtDat) LocalVar%Time, LocalVarOutData\n") + file.write(" WRITE (UnDb2, TRIM(FmtDat)) LocalVar%Time, LocalVarOutData\n") file.write(" END IF\n") file.write("\n") file.write(" IF(CntrPar%LoggingLevel > 2) THEN\n") - file.write(" WRITE (UnDb3, FmtDat) LocalVar%Time, avrSWAP(1: 85)\n") + file.write(" WRITE (UnDb3, TRIM(FmtDat)) LocalVar%Time, avrSWAP(avrIndices)\n") file.write(" END IF\n") file.write("\n") file.write("END SUBROUTINE Debug\n") @@ -336,6 +392,24 @@ def read_type(param): f90type += ', DIMENSION(:), ALLOCATABLE' elif param['dimension']: f90type += ', DIMENSION{}'.format(param['dimension']) + elif param['type'] == 'complex': + f90type = 'COMPLEX(DbKi)' + if param['allocatable']: + if param['dimension']: + f90type += ', DIMENSION{}, ALLOCATABLE'.format(param['dimension']) + else: + f90type += ', DIMENSION(:), ALLOCATABLE' + elif param['dimension']: + f90type += ', DIMENSION{}'.format(param['dimension']) + elif param['type'] == 'float': + f90type = 'REAL(ReKi)' + if param['allocatable']: + if param['dimension']: + f90type += ', DIMENSION{}, ALLOCATABLE'.format(param['dimension']) + else: + f90type += ', DIMENSION(:), ALLOCATABLE' + elif param['dimension']: + f90type += ', DIMENSION{}'.format(param['dimension']) elif param['type'] == 'character': f90type = 'CHARACTER' if param['length']: diff --git a/ROSCO/ROSCO/src/Constants.f90 b/ROSCO/ROSCO/src/Constants.f90 index d04745aed..b85eefaa7 100644 --- a/ROSCO/ROSCO/src/Constants.f90 +++ b/ROSCO/ROSCO/src/Constants.f90 @@ -14,7 +14,7 @@ MODULE Constants USE, INTRINSIC :: ISO_C_Binding - Character(*), PARAMETER :: rosco_version = 'v2.6.0' ! ROSCO version + Character(*), PARAMETER :: rosco_version = 'v2.8.0' ! ROSCO version INTEGER, PARAMETER :: DbKi = C_DOUBLE !< Default kind for double floating-point numbers INTEGER, PARAMETER :: ReKi = C_FLOAT !< Default kind for single floating-point numbers INTEGER, PARAMETER :: IntKi = C_INT !< Default kind for integer numbers @@ -35,4 +35,6 @@ MODULE Constants INTEGER(IntKi), PARAMETER :: ErrID_Fatal = 4 !< ErrStat parameter indicating "fatal error"; simulation should end INTEGER, PARAMETER :: BITS_IN_ADDR = C_INTPTR_T*8 !< The number of bits in an address (32-bit or 64-bit). + CHARACTER(1), PARAMETER :: Tab = CHAR( 9 ) + END MODULE Constants diff --git a/ROSCO/ROSCO/src/ControllerBlocks.f90 b/ROSCO/ROSCO/src/ControllerBlocks.f90 index a62c53661..390be8d01 100644 --- a/ROSCO/ROSCO/src/ControllerBlocks.f90 +++ b/ROSCO/ROSCO/src/ControllerBlocks.f90 @@ -201,15 +201,15 @@ SUBROUTINE WindSpeedEstimator(LocalVar, CntrPar, objInst, PerfData, DebugVar, Er ! Saturate inputs to WSE IF (LocalVar%RotSpeedF < 0.25 * CntrPar%VS_MinOMSpd / CntrPar%WE_GearboxRatio) THEN - WE_Inp_Speed = 0.25 * CntrPar%VS_MinOMSpd / CntrPar%WE_GearboxRatio + WE_Inp_Speed = 0.25 * CntrPar%VS_MinOMSpd / CntrPar%WE_GearboxRatio + EPSILON(1.0_DbKi) ! If this is 0, could cause problems... ELSE WE_Inp_Speed = LocalVar%RotSpeedF END IF - IF (LocalVar%BlPitch(1) < CntrPar%PC_MinPit) THEN + IF (LocalVar%BlPitchCMeas < CntrPar%PC_MinPit) THEN WE_Inp_Pitch = CntrPar%PC_MinPit ELSE - WE_Inp_Pitch = LocalVar%BlPitch(1) + WE_Inp_Pitch = LocalVar%BlPitchCMeas END IF IF (LocalVar%VS_LastGenTrqF < 0.0001 * CntrPar%VS_RtTq) THEN @@ -228,7 +228,7 @@ SUBROUTINE WindSpeedEstimator(LocalVar, CntrPar, objInst, PerfData, DebugVar, Er ! Inversion and Invariance Filter implementation IF (CntrPar%WE_Mode == 1) THEN ! Compute AeroDynTorque - Tau_r = AeroDynTorque(LocalVar%RotSpeedF, LocalVar%BlPitch(1), LocalVar, CntrPar, PerfData, ErrVar) + Tau_r = AeroDynTorque(LocalVar%RotSpeedF, LocalVar%BlPitchCMeas, LocalVar, CntrPar, PerfData, ErrVar) LocalVar%WE_VwIdot = CntrPar%WE_Gamma/CntrPar%WE_Jtot*(LocalVar%VS_LastGenTrq*CntrPar%WE_GearboxRatio - Tau_r) LocalVar%WE_VwI = LocalVar%WE_VwI + LocalVar%WE_VwIdot*LocalVar%DT @@ -413,7 +413,7 @@ REAL(DbKi) FUNCTION Shutdown(LocalVar, CntrPar, objInst) ! Pitch Blades to 90 degrees at max pitch rate if in shutdown mode IF (LocalVar%SD) THEN - Shutdown = LocalVar%BlPitch(1) + CntrPar%PC_MaxRat*LocalVar%DT + Shutdown = LocalVar%BlPitchCMeas + CntrPar%PC_MaxRat*LocalVar%DT IF (MODULO(LocalVar%Time, 10.0_DbKi) == 0) THEN print *, ' ** SHUTDOWN MODE **' ENDIF diff --git a/ROSCO/ROSCO/src/Controllers.f90 b/ROSCO/ROSCO/src/Controllers.f90 index 7568d4df0..221dd16b0 100644 --- a/ROSCO/ROSCO/src/Controllers.f90 +++ b/ROSCO/ROSCO/src/Controllers.f90 @@ -96,17 +96,23 @@ SUBROUTINE PitchControl(avrSWAP, CntrPar, LocalVar, objInst, DebugVar, ErrVar) ! Saturate collective pitch commands: LocalVar%PC_PitComT = saturate(LocalVar%PC_PitComT, LocalVar%PC_MinPit, CntrPar%PC_MaxPit) ! Saturate the overall command using the pitch angle limits - LocalVar%PC_PitComT = ratelimit(LocalVar%PC_PitComT, LocalVar%PC_PitComT_Last, CntrPar%PC_MinRat, CntrPar%PC_MaxRat, LocalVar%DT) ! Saturate the overall command of blade K using the pitch rate limit + LocalVar%PC_PitComT = ratelimit(LocalVar%PC_PitComT, CntrPar%PC_MinRat, CntrPar%PC_MaxRat, LocalVar%DT, LocalVar%restart, LocalVar%rlP,objInst%instRL,LocalVar%BlPitchCMeas) ! Saturate the overall command of blade K using the pitch rate limit LocalVar%PC_PitComT_Last = LocalVar%PC_PitComT ! Combine and saturate all individual pitch commands in software DO K = 1,LocalVar%NumBl ! Loop through all blades, add IPC contribution and limit pitch rate LocalVar%PitCom(K) = LocalVar%PC_PitComT + LocalVar%FA_PitCom(K) - LocalVar%PitCom(K) = saturate(LocalVar%PitCom(K), LocalVar%PC_MinPit, CntrPar%PC_MaxPit) ! Saturate the command using the pitch satauration limits + LocalVar%PitCom(K) = saturate(LocalVar%PitCom(K), LocalVar%PC_MinPit, CntrPar%PC_MaxPit) ! Saturate the command using the pitch saturation limits LocalVar%PitCom(K) = LocalVar%PitCom(K) + LocalVar%IPC_PitComF(K) ! Add IPC - LocalVar%PitCom(K) = saturate(LocalVar%PitCom(K), LocalVar%PC_MinPit, CntrPar%PC_MaxPit) ! Saturate the command using the absolute pitch angle limits - LocalVar%PitCom(K) = ratelimit(LocalVar%PitCom(K), LocalVar%BlPitch(K), CntrPar%PC_MinRat, CntrPar%PC_MaxRat, LocalVar%DT) ! Saturate the overall command of blade K using the pitch rate limit - END DO + + ! Hard IPC saturation by peak shaving limit + IF (CntrPar%IPC_SatMode == 1) THEN + LocalVar%PitCom(K) = saturate(LocalVar%PitCom(K), LocalVar%PC_MinPit, CntrPar%PC_MaxPit) + END IF + + ! Rate limit + LocalVar%PitCom(K) = ratelimit(LocalVar%PitCom(K), CntrPar%PC_MinRat, CntrPar%PC_MaxRat, LocalVar%DT, LocalVar%restart, LocalVar%rlP,objInst%instRL,LocalVar%BlPitch(K)) ! Saturate the overall command of blade K using the pitch rate limit + END DO ! Open Loop control, use if ! Open loop mode active Using OL blade pitch control @@ -118,6 +124,11 @@ SUBROUTINE PitchControl(avrSWAP, CntrPar, LocalVar, objInst, DebugVar, ErrVar) ENDIF ENDIF + ! Active wake control + IF (CntrPar%AWC_Mode > 0) THEN + CALL ActiveWakeControl(CntrPar, LocalVar, DebugVar) + ENDIF + ! Place pitch actuator here, so it can be used with or without open-loop DO K = 1,LocalVar%NumBl ! Loop through all blades, add IPC contribution and limit pitch rate IF (CntrPar%PA_Mode > 0) THEN @@ -134,17 +145,25 @@ SUBROUTINE PitchControl(avrSWAP, CntrPar, LocalVar, objInst, DebugVar, ErrVar) ! Hardware saturation: using CntrPar%PC_MinPit DO K = 1,LocalVar%NumBl ! Loop through all blades, add IPC contribution and limit pitch rate ! Saturate the pitch command using the overall (hardware) limit - LocalVar%PitComAct(K) = saturate(LocalVar%PitComAct(K), LocalVar%PC_MinPit, CntrPar%PC_MaxPit) + LocalVar%PitComAct(K) = saturate(LocalVar%PitComAct(K), CntrPar%PC_MinPit, CntrPar%PC_MaxPit) ! Saturate the overall command of blade K using the pitch rate limit - LocalVar%PitComAct(K) = ratelimit(LocalVar%PitComAct(K), LocalVar%BlPitch(K), CntrPar%PC_MinRat, CntrPar%PC_MaxRat, LocalVar%DT) ! Saturate the overall command of blade K using the pitch rate limit + LocalVar%PitComAct(K) = ratelimit(LocalVar%PitComAct(K), CntrPar%PC_MinRat, CntrPar%PC_MaxRat, LocalVar%DT, LocalVar%restart, LocalVar%rlP,objInst%instRL,LocalVar%BlPitch(K)) ! Saturate the overall command of blade K using the pitch rate limit END DO + ! Add pitch actuator fault for blade K + IF (CntrPar%PF_Mode == 1) THEN + DO K = 1, LocalVar%NumBl + ! This assumes that the pitch actuator fault overides the Hardware saturation + LocalVar%PitComAct(K) = LocalVar%PitComAct(K) + CntrPar%PF_Offsets(K) + END DO + END IF + ! Command the pitch demanded from the last ! call to the controller (See Appendix A of Bladed User's Guide): - avrSWAP(42) = LocalVar%PitComAct(1) ! Use the command angles of all blades if using individual pitch - avrSWAP(43) = LocalVar%PitComAct(2) ! " - avrSWAP(44) = LocalVar%PitComAct(3) ! " - avrSWAP(45) = LocalVar%PitComAct(1) ! Use the command angle of blade 1 if using collective pitch + avrSWAP(42) = LocalVar%PitComAct(1) ! Use the command angles of all blades if using individual pitch + avrSWAP(43) = LocalVar%PitComAct(2) ! " + avrSWAP(44) = LocalVar%PitComAct(3) ! " + avrSWAP(45) = LocalVar%PitComAct(1) ! Use the command angle of blade 1 if using collective pitch ! Add RoutineName to error message IF (ErrVar%aviFAIL < 0) THEN @@ -222,7 +241,7 @@ SUBROUTINE VariableSpeedControl(avrSWAP, CntrPar, LocalVar, objInst, ErrVar) LocalVar%GenTq = MIN(LocalVar%GenTq, CntrPar%VS_MaxTq) ! Saturate the command using the maximum torque limit ! Saturate the commanded torque using the torque rate limit: - LocalVar%GenTq = ratelimit(LocalVar%GenTq, LocalVar%VS_LastGenTrq, -CntrPar%VS_MaxRat, CntrPar%VS_MaxRat, LocalVar%DT) ! Saturate the command using the torque rate limit + LocalVar%GenTq = ratelimit(LocalVar%GenTq, -CntrPar%VS_MaxRat, CntrPar%VS_MaxRat, LocalVar%DT, LocalVar%restart, LocalVar%rlP,objInst%instRL) ! Saturate the command using the torque rate limit ! Open loop torque control IF ((CntrPar%OL_Mode == 1) .AND. (CntrPar%Ind_GenTq > 0)) THEN @@ -254,7 +273,7 @@ SUBROUTINE YawRateControl(avrSWAP, CntrPar, LocalVar, objInst, zmqVar, DebugVar, ! TODO: The constant offset implementation is sort of circular here as a setpoint is already being defined in SetVariablesSetpoints. This could also use cleanup USE ROSCO_Types, ONLY : ControlParameters, LocalVariables, ObjectInstances, DebugVariables, ErrorVariables, ZMQ_Variables - REAL(C_FLOAT), INTENT(INOUT) :: avrSWAP(*) ! The swap array, used to pass data to, and receive data from, the DLL controller. + REAL(ReKi), INTENT(INOUT) :: avrSWAP(*) ! The swap array, used to pass data to, and receive data from, the DLL controller. TYPE(ControlParameters), INTENT(INOUT) :: CntrPar TYPE(LocalVariables), INTENT(INOUT) :: LocalVar @@ -357,6 +376,7 @@ SUBROUTINE YawRateControl(avrSWAP, CntrPar, LocalVar, objInst, zmqVar, DebugVar, DebugVar%NacHeadingTarget = NacHeadingTarget DebugVar%NacVaneOffset = NacVaneOffset DebugVar%YawState = YawState + DebugVar%Yaw_Err = NacHeadingError END IF END SUBROUTINE YawRateControl !------------------------------------------------------------------------------------------------------------------------------- @@ -376,8 +396,6 @@ SUBROUTINE IPC(CntrPar, LocalVar, objInst, DebugVar, ErrVar) ! Local variables REAL(DbKi) :: PitComIPC(3), PitComIPCF(3), PitComIPC_1P(3), PitComIPC_2P(3) INTEGER(IntKi) :: i, K ! Integer used to loop through gains and turbine blades - REAL(DbKi) :: axisTilt_1P, axisYaw_1P, axisYawF_1P ! Direct axis and quadrature axis outputted by Coleman transform, 1P - REAL(DbKi) :: axisTilt_2P, axisYaw_2P, axisYawF_2P ! Direct axis and quadrature axis outputted by Coleman transform, 1P REAL(DbKi) :: axisYawIPC_1P ! IPC contribution with yaw-by-IPC component REAL(DbKi) :: Y_MErr, Y_MErrF, Y_MErrF_IPC ! Unfiltered and filtered yaw alignment error [rad] @@ -385,8 +403,8 @@ SUBROUTINE IPC(CntrPar, LocalVar, objInst, DebugVar, ErrVar) ! Body ! Pass rootMOOPs through the Coleman transform to get the tilt and yaw moment axis - CALL ColemanTransform(LocalVar%rootMOOPF, LocalVar%Azimuth, NP_1, axisTilt_1P, axisYaw_1P) - CALL ColemanTransform(LocalVar%rootMOOPF, LocalVar%Azimuth, NP_2, axisTilt_2P, axisYaw_2P) + CALL ColemanTransform(LocalVar%rootMOOPF, LocalVar%Azimuth, NP_1, LocalVar%axisTilt_1P, LocalVar%axisYaw_1P) + CALL ColemanTransform(LocalVar%rootMOOPF, LocalVar%Azimuth, NP_2, LocalVar%axisTilt_2P, LocalVar%axisYaw_2P) ! High-pass filter the MBC yaw component and filter yaw alignment error, and compute the yaw-by-IPC contribution IF (CntrPar%Y_ControlMode == 2) THEN @@ -394,7 +412,7 @@ SUBROUTINE IPC(CntrPar, LocalVar, objInst, DebugVar, ErrVar) Y_MErrF = LPFilter(Y_MErr, LocalVar%DT, CntrPar%F_YawErr, LocalVar%FP, LocalVar%iStatus, LocalVar%restart, objInst%instSecLPF) Y_MErrF_IPC = PIController(Y_MErrF, CntrPar%Y_IPC_KP, CntrPar%Y_IPC_KI, -CntrPar%Y_IPC_IntSat, CntrPar%Y_IPC_IntSat, LocalVar%DT, 0.0_DbKi, LocalVar%piP, LocalVar%restart, objInst%instPI) ELSE - axisYawF_1P = axisYaw_1P + LocalVar%axisYawF_1P = LocalVar%axisYaw_1P Y_MErrF = 0.0 Y_MErrF_IPC = 0.0 END IF @@ -404,22 +422,33 @@ SUBROUTINE IPC(CntrPar, LocalVar, objInst, DebugVar, ErrVar) LocalVar%IPC_KP(i) = sigma(LocalVar%WE_Vw, CntrPar%IPC_Vramp(1), CntrPar%IPC_Vramp(2), 0.0_DbKi, CntrPar%IPC_KP(i), ErrVar) LocalVar%IPC_KI(i) = sigma(LocalVar%WE_Vw, CntrPar%IPC_Vramp(1), CntrPar%IPC_Vramp(2), 0.0_DbKi, CntrPar%IPC_KI(i), ErrVar) END DO + + ! Handle saturation limit, depends on IPC_SatMode + IF (CntrPar%IPC_SatMode == 2) THEN + ! Saturate to min allowed pitch angle, softly using IPC_IntSat + LocalVar%IPC_IntSat = min(CntrPar%IPC_IntSat,LocalVar%BlPitchCMeas - CntrPar%PC_MinPit) + ELSEIF (CntrPar%IPC_SatMode == 3) THEN + ! Saturate to peak shaving, softly using IPC_IntSat + LocalVar%IPC_IntSat = min(CntrPar%IPC_IntSat,LocalVar%BlPitchCMeas - LocalVar%PC_MinPit) + ELSE + LocalVar%IPC_IntSat = CntrPar%IPC_IntSat + ENDIF ! Integrate the signal and multiply with the IPC gain - IF ((CntrPar%IPC_ControlMode >= 1) .AND. (CntrPar%Y_ControlMode /= 2)) THEN - LocalVar%IPC_axisTilt_1P = PIController(axisTilt_1P, LocalVar%IPC_KP(1), LocalVar%IPC_KI(1), -CntrPar%IPC_IntSat, CntrPar%IPC_IntSat, LocalVar%DT, 0.0_DbKi, LocalVar%piP, LocalVar%restart, objInst%instPI) - LocalVar%IPC_axisYaw_1P = PIController(axisYawF_1P, LocalVar%IPC_KP(1), LocalVar%IPC_KI(1), -CntrPar%IPC_IntSat, CntrPar%IPC_IntSat, LocalVar%DT, 0.0_DbKi, LocalVar%piP, LocalVar%restart, objInst%instPI) + IF (CntrPar%IPC_ControlMode >= 1 .AND. CntrPar%Y_ControlMode /= 2) THEN + LocalVar%IPC_axisTilt_1P = PIController(LocalVar%axisTilt_1P, LocalVar%IPC_KP(1), LocalVar%IPC_KI(1), -LocalVar%IPC_IntSat, LocalVar%IPC_IntSat, LocalVar%DT, 0.0_DbKi, LocalVar%piP, LocalVar%restart, objInst%instPI) + LocalVar%IPC_axisYaw_1P = PIController(LocalVar%axisYawF_1P, LocalVar%IPC_KP(1), LocalVar%IPC_KI(1), -LocalVar%IPC_IntSat, LocalVar%IPC_IntSat, LocalVar%DT, 0.0_DbKi, LocalVar%piP, LocalVar%restart, objInst%instPI) IF (CntrPar%IPC_ControlMode >= 2) THEN - LocalVar%IPC_axisTilt_2P = PIController(axisTilt_2P, LocalVar%IPC_KP(2), LocalVar%IPC_KI(2), -CntrPar%IPC_IntSat, CntrPar%IPC_IntSat, LocalVar%DT, 0.0_DbKi, LocalVar%piP, LocalVar%restart, objInst%instPI) - LocalVar%IPC_axisYaw_2P = PIController(axisYawF_2P, LocalVar%IPC_KP(2), LocalVar%IPC_KI(2), -CntrPar%IPC_IntSat, CntrPar%IPC_IntSat, LocalVar%DT, 0.0_DbKi, LocalVar%piP, LocalVar%restart, objInst%instPI) + LocalVar%IPC_axisTilt_2P = PIController(LocalVar%axisTilt_2P, LocalVar%IPC_KP(2), LocalVar%IPC_KI(2), -LocalVar%IPC_IntSat, LocalVar%IPC_IntSat, LocalVar%DT, 0.0_DbKi, LocalVar%piP, LocalVar%restart, objInst%instPI) + LocalVar%IPC_axisYaw_2P = PIController(LocalVar%axisYawF_2P, LocalVar%IPC_KP(2), LocalVar%IPC_KI(2), -LocalVar%IPC_IntSat, LocalVar%IPC_IntSat, LocalVar%DT, 0.0_DbKi, LocalVar%piP, LocalVar%restart, objInst%instPI) END IF ELSE LocalVar%IPC_axisTilt_1P = 0.0 LocalVar%IPC_axisYaw_1P = 0.0 LocalVar%IPC_axisTilt_2P = 0.0 LocalVar%IPC_axisYaw_2P = 0.0 - END IF + ENDIF ! Add the yaw-by-IPC contribution axisYawIPC_1P = LocalVar%IPC_axisYaw_1P + Y_MErrF_IPC @@ -442,13 +471,6 @@ SUBROUTINE IPC(CntrPar, LocalVar, objInst, DebugVar, ErrVar) LocalVar%IPC_PitComF(K) = PitComIPCF(K) END DO - ! debugging - DebugVar%axisTilt_1P = axisTilt_1P - DebugVar%axisYaw_1P = axisYaw_1P - DebugVar%axisTilt_2P = axisTilt_2P - DebugVar%axisYaw_2P = axisYaw_2P - - ! Add RoutineName to error message IF (ErrVar%aviFAIL < 0) THEN @@ -575,4 +597,196 @@ SUBROUTINE FlapControl(avrSWAP, CntrPar, LocalVar, objInst) RETURN ENDIF END SUBROUTINE FlapControl + + +!------------------------------------------------------------------------------------------------------------------------------- + SUBROUTINE ActiveWakeControl(CntrPar, LocalVar, DebugVar) + ! Active wake controller + ! AWC_Mode = 0, No active wake control + ! AWC_Mode = 1, SNL active wake control + ! AWC_Mode = 2, Coleman Transform-based active wake control + USE ROSCO_Types, ONLY : ControlParameters, LocalVariables, DebugVariables, ObjectInstances + + TYPE(ControlParameters), INTENT(INOUT) :: CntrPar + TYPE(DebugVariables), INTENT(INOUT) :: DebugVar + TYPE(LocalVariables), INTENT(INOUT) :: LocalVar + + ! Local vars + REAL(DbKi), PARAMETER :: phi1 = 0.0 ! Phase difference from first to first blade + REAL(DbKi), PARAMETER :: phi2 = 2.0/3.0*PI ! Phase difference from first to second blade + REAL(DbKi), PARAMETER :: phi3 = 4.0/3.0*PI ! Phase difference from first to third blade + REAL(DbKi), DIMENSION(3) :: AWC_angle + COMPLEX(DbKi), DIMENSION(3) :: AWC_complexangle + COMPLEX(DbKi) :: complexI = (0.0, 1.0) + INTEGER(IntKi) :: Imode, K ! Index used for looping through AWC modes, blades + REAL(DbKi) :: clockang ! Clock angle for AWC pitching + REAL(DbKi) :: omega ! angular frequency for AWC pitching in Hz + REAL(DbKi) :: amp ! amplitude for AWC pitching in degrees + REAL(DbKi), DIMENSION(2) :: AWC_TiltYaw = [0.0, 0.0] ! AWC Tilt and yaw pitch signal + + + ! Compute the AWC pitch settings + IF (CntrPar%AWC_Mode == 1) THEN + + LocalVar%AWC_complexangle = 0.0D0 + + DO Imode = 1,CntrPar%AWC_NumModes + clockang = CntrPar%AWC_clockangle(Imode)*PI/180.0_DbKi + omega = CntrPar%AWC_freq(Imode)*PI*2.0_DbKi + AWC_angle(1) = omega * LocalVar%Time - CntrPar%AWC_n(Imode) * (LocalVar%Azimuth + phi1 + clockang) + AWC_angle(2) = omega * LocalVar%Time - CntrPar%AWC_n(Imode) * (LocalVar%Azimuth + phi2 + clockang) + AWC_angle(3) = omega * LocalVar%Time - CntrPar%AWC_n(Imode) * (LocalVar%Azimuth + phi3 + clockang) + ! Add the forcing contribution to LocalVar%AWC_complexangle + amp = CntrPar%AWC_amp(Imode)*PI/180.0_DbKi + DO K = 1,LocalVar%NumBl ! Loop through all blades + LocalVar%AWC_complexangle(K) = LocalVar%AWC_complexangle(K) + amp * EXP(complexI * (AWC_angle(K))) + END DO + END DO + + DO K = 1,LocalVar%NumBl ! Loop through all blades, apply AWC_angle + LocalVar%PitCom(K) = LocalVar%PitCom(K) + REAL(LocalVar%AWC_complexangle(K)) + END DO + + ELSEIF (CntrPar%AWC_Mode == 2) THEN + + DO Imode = 1,CntrPar%AWC_NumModes + DebugVar%axisTilt_1P = AWC_TiltYaw(1) + AWC_TiltYaw = [0.0, 0.0] + AWC_TiltYaw(Imode) = PI/180*CntrPar%AWC_amp(Imode)*cos(LocalVar%Time*2*PI*CntrPar%AWC_freq(Imode) + CntrPar%AWC_clockangle(Imode)*PI/180) + IF (CntrPar%AWC_NumModes == 1) THEN + AWC_TiltYaw(2) = PI/180*CntrPar%AWC_amp(1)*cos(LocalVar%Time*2*PI*CntrPar%AWC_freq(1) + 2*CntrPar%AWC_clockangle(1)*PI/180) + ENDIF + CALL ColemanTransformInverse(AWC_TiltYaw(1), AWC_TiltYaw(2), LocalVar%Azimuth, CntrPar%AWC_harmonic(Imode), 0.0, AWC_angle) + + DO K = 1,LocalVar%NumBl ! Loop through all blades, apply AWC_angle + LocalVar%PitCom(K) = LocalVar%PitCom(K) + AWC_angle(K) + END DO + END DO + DebugVar%axisYaw_1P = AWC_TiltYaw(2) + DebugVar%axisTilt_2P = AWC_angle(1) + + ENDIF + + END SUBROUTINE ActiveWakeControl + +!------------------------------------------------------------------------------------------------------------------------------- + SUBROUTINE CableControl(avrSWAP, CntrPar, LocalVar, objInst, ErrVar) + ! Cable controller + ! CC_Mode = 0, No cable control, this code not executed + ! CC_Mode = 1, User-defined cable control + ! CC_Mode = 2, Position control, not yet implemented + ! + ! Note that LocalVar%CC_Actuated*(), and CC_Desired() has a fixed max size of 12, which can be increased in rosco_types.yaml + ! + USE ROSCO_Types, ONLY : ControlParameters, LocalVariables, ObjectInstances, ErrorVariables + + REAL(ReKi), INTENT(INOUT) :: avrSWAP(*) ! The swap array, used to pass data to, and receive data from, the DLL controller. + + TYPE(ControlParameters), INTENT(INOUT) :: CntrPar + TYPE(LocalVariables), INTENT(INOUT) :: LocalVar + TYPE(ObjectInstances), INTENT(INOUT) :: objInst + TYPE(ErrorVariables), INTENT(INOUT) :: ErrVar + + ! Internal Variables + Integer(IntKi) :: I_GROUP + + + IF (CntrPar%CC_Mode == 1) THEN + ! User defined control + + IF (LocalVar%Time > 500) THEN + ! Shorten first group by 4 m + LocalVar%CC_DesiredL(1) = -14.51 + LocalVar%CC_DesiredL(2) = 1.58 + LocalVar%CC_DesiredL(3) = -10.332 + + + END IF + + ELSEIF (CntrPar%CC_Mode == 2) THEN + ! Open loop control + ! DO I_GROUP = 1, CntrPar%CC_Group_N + ! LocalVar%CC_DesiredL(I_GROUP) = interp1d(x,y,eq,ErrVar) + + DO I_GROUP = 1,CntrPar%CC_Group_N + IF (CntrPar%Ind_CableControl(I_GROUP) > 0) THEN + LocalVar%CC_DesiredL(I_GROUP) = interp1d(CntrPar%OL_Breakpoints, & + CntrPar%OL_CableControl(I_GROUP,:), & + LocalVar%Time,ErrVar) + ENDIF + ENDDO + + + + END IF + + ! Convert desired to actuated line length and delta length for all groups + + DO I_GROUP = 1, CntrPar%CC_Group_N + + ! Get Actuated deltaL + LocalVar%CC_ActuatedDL(I_GROUP) = SecLPFilter_Vel(LocalVar%CC_DesiredL(I_GROUP),LocalVar%DT,2*PI/CntrPar%CC_ActTau,1.0, & + LocalVar%FP,LocalVar%iStatus,LocalVar%restart,objInst%instSecLPFV) + + ! Integrate + LocalVar%CC_ActuatedL(I_GROUP) = PIController(LocalVar%CC_ActuatedDL(I_GROUP),0.0_DbKi,1.0_DbKi, & + -1000.0_DbKi,1000.0_DbKi,LocalVar%DT,LocalVar%CC_ActuatedDL(1), & + LocalVar%piP, LocalVar%restart, objInst%instPI) + + END DO + + ! Assign to avrSWAP + DO I_GROUP = 1, CntrPar%CC_Group_N + + avrSWAP(CntrPar%CC_GroupIndex(I_GROUP)) = LocalVar%CC_ActuatedL(I_GROUP) + avrSWAP(CntrPar%CC_GroupIndex(I_GROUP)+1) = LocalVar%CC_ActuatedDL(I_GROUP) + + END DO + + END SUBROUTINE CableControl + +!------------------------------------------------------------------------------------------------------------------------------- +SUBROUTINE StructuralControl(avrSWAP, CntrPar, LocalVar, objInst) + ! Cable controller + ! StC_Mode = 0, No cable control, this code not executed + ! StC_Mode = 1, User-defined cable control + ! StC_Mode = 2, Ballast-like control, not yet implemented + ! + ! Note that LocalVar%StC_Input() has a fixed max size of 12, which can be increased in rosco_types.yaml + ! + USE ROSCO_Types, ONLY : ControlParameters, LocalVariables, ObjectInstances + + REAL(ReKi), INTENT(INOUT) :: avrSWAP(*) ! The swap array, used to pass data to, and receive data from, the DLL controller. + + TYPE(ControlParameters), INTENT(INOUT) :: CntrPar + TYPE(LocalVariables), INTENT(INOUT) :: LocalVar + TYPE(ObjectInstances), INTENT(INOUT) :: objInst + + ! Internal Variables + Integer(IntKi) :: I_GROUP + + + IF (CntrPar%StC_Mode == 1) THEN + ! User defined control + + IF (LocalVar%Time > 500) THEN + ! Step change in input of -4500 N + LocalVar%StC_Input(1) = -1.234e+06 + LocalVar%StC_Input(2) = 2.053e+06 + LocalVar%StC_Input(3) = -7.795e+05 + + END IF + + + + END IF + + + ! Assign to avrSWAP + DO I_GROUP = 1, CntrPar%StC_Group_N + avrSWAP(CntrPar%StC_GroupIndex(I_GROUP)) = LocalVar%StC_Input(I_GROUP) + END DO + + END SUBROUTINE StructuralControl +!------------------------------------------------------------------------------------------------------------------------------- END MODULE Controllers diff --git a/ROSCO/ROSCO/src/DISCON.F90 b/ROSCO/ROSCO/src/DISCON.F90 index 2b2ec286f..3b0f72911 100644 --- a/ROSCO/ROSCO/src/DISCON.F90 +++ b/ROSCO/ROSCO/src/DISCON.F90 @@ -44,7 +44,7 @@ SUBROUTINE DISCON(avrSWAP, aviFAIL, accINFILE, avcOUTNAME, avcMSG) BIND (C, NAME !REAL(ReKi), INTENT(IN) :: from_SC(*) ! DATA from the super controller !REAL(ReKi), INTENT(INOUT) :: to_SC(*) ! DATA to the super controller -REAL(C_FLOAT), INTENT(INOUT) :: avrSWAP(*) ! The swap array, used to pass data to, and receive data from, the DLL controller. +REAL(ReKi), INTENT(INOUT) :: avrSWAP(*) ! The swap array, used to pass data to, and receive data from, the DLL controller. INTEGER(C_INT), INTENT(INOUT) :: aviFAIL ! A flag used to indicate the success of this DLL call set as follows: 0 if the DLL call was successful, >0 if the DLL call was successful but cMessage should be issued as a warning messsage, <0 if the DLL call was unsuccessful or for any other reason the simulation is to be stopped at this point with cMessage as the error message. CHARACTER(KIND=C_CHAR), INTENT(IN ) :: accINFILE(NINT(avrSWAP(50))) ! The name of the parameter input file CHARACTER(KIND=C_CHAR), INTENT(IN ) :: avcOUTNAME(NINT(avrSWAP(51))) ! OUTNAME (Simulation RootName) @@ -79,13 +79,13 @@ SUBROUTINE DISCON(avrSWAP, aviFAIL, accINFILE, avcOUTNAME, avcMSG) BIND (C, NAME END IF ! Read avrSWAP array into derived types/variables -CALL ReadAvrSWAP(avrSWAP, LocalVar) +CALL ReadAvrSWAP(avrSWAP, LocalVar, CntrPar) ! Set Control Parameters -CALL SetParameters(avrSWAP, accINFILE, SIZE(avcMSG), CntrPar, LocalVar, objInst, PerfData, zmqVar, ErrVar) +CALL SetParameters(avrSWAP, accINFILE, SIZE(avcMSG), CntrPar, LocalVar, objInst, PerfData, zmqVar, RootName, ErrVar) ! Call external controller, if desired -IF (CntrPar%Ext_Mode > 0) THEN +IF (CntrPar%Ext_Mode > 0 .AND. ErrVar%aviFAIL >= 0) THEN CALL ExtController(avrSWAP, CntrPar, LocalVar, ExtDLL, ErrVar) ! Data from external dll is in ExtDLL%avrSWAP, it's unused in the following code END IF @@ -116,6 +116,16 @@ SUBROUTINE DISCON(avrSWAP, aviFAIL, accINFILE, avcOUTNAME, avcMSG) BIND (C, NAME IF (CntrPar%Flp_Mode > 0) THEN CALL FlapControl(avrSWAP, CntrPar, LocalVar, objInst) END IF + + ! Cable control + IF (CntrPar%CC_Mode > 0) THEN + CALL CableControl(avrSWAP,CntrPar,LocalVar, objInst, ErrVar) + END IF + + ! Structural control + IF (CntrPar%StC_Mode > 0) THEN + CALL StructuralControl(avrSWAP,CntrPar,LocalVar, objInst) + END IF IF ( CntrPar%LoggingLevel > 0 ) THEN CALL Debug(LocalVar, CntrPar, DebugVar, ErrVar, avrSWAP, RootName, SIZE(avcOUTNAME)) diff --git a/ROSCO/ROSCO/src/ExtControl.f90 b/ROSCO/ROSCO/src/ExtControl.f90 index 2a398cda2..17d821e49 100644 --- a/ROSCO/ROSCO/src/ExtControl.f90 +++ b/ROSCO/ROSCO/src/ExtControl.f90 @@ -26,6 +26,7 @@ MODULE ExtControl USE Functions USE ROSCO_Types USE SysSubs + USE Constants IMPLICIT NONE @@ -35,7 +36,9 @@ MODULE ExtControl SUBROUTINE BladedDLL_Legacy_Procedure ( avrSWAP, aviFAIL, accINFILE, avcOUTNAME, avcMSG ) BIND(C) USE, INTRINSIC :: ISO_C_Binding - REAL(C_FLOAT), INTENT(INOUT) :: avrSWAP (*) !< DATA + USE Constants + + REAL(ReKi), INTENT(INOUT) :: avrSWAP (*) !< DATA INTEGER(C_INT), INTENT(INOUT) :: aviFAIL !< FLAG (Status set in DLL and returned to simulation code) CHARACTER(KIND=C_CHAR), INTENT(IN) :: accINFILE (*) !< INFILE CHARACTER(KIND=C_CHAR), INTENT(INOUT) :: avcOUTNAME(*) !< OUTNAME (in:Simulation RootName; out:Name:Units; of logging channels) @@ -54,7 +57,7 @@ SUBROUTINE ExtController(avrSWAP, CntrPar, LocalVar, ExtDLL, ErrVar) TYPE(ExtControlType), INTENT(INOUT) :: ExtDLL - REAL(C_FLOAT), INTENT(INOUT) :: avrSWAP(*) ! The swap array, used to pass data to, and receive data from the DLL controller. + REAL(ReKi), INTENT(INOUT) :: avrSWAP(*) ! The swap array, used to pass data to, and receive data from the DLL controller. ! Temporary variables ! CHARACTER(1024), PARAMETER :: ExtDLL_InFile = '/Users/dzalkind/Tools/ROSCO/Test_Cases/IEA-15-240-RWT-UMaineSemi/ServoData/DISCON-UMaineSemi.IN' diff --git a/ROSCO/ROSCO/src/Filters.f90 b/ROSCO/ROSCO/src/Filters.f90 index 5123b74c0..2a5ee24b2 100644 --- a/ROSCO/ROSCO/src/Filters.f90 +++ b/ROSCO/ROSCO/src/Filters.f90 @@ -26,7 +26,7 @@ MODULE Filters CONTAINS !------------------------------------------------------------------------------------------------------------------------------- - REAL(DbKi) FUNCTION LPFilter(InputSignal, DT, CornerFreq, FP, iStatus, reset, inst) + REAL(DbKi) FUNCTION LPFilter(InputSignal, DT, CornerFreq, FP, iStatus, reset, inst, InitialValue) ! Discrete time Low-Pass Filter of the form: ! Continuous Time Form: H(s) = CornerFreq/(1 + CornerFreq) ! Discrete Time Form: H(z) = (b1z + b0) / (a1*z + a0) @@ -40,11 +40,18 @@ REAL(DbKi) FUNCTION LPFilter(InputSignal, DT, CornerFreq, FP, iStatus, reset, in INTEGER(IntKi), INTENT(IN) :: iStatus ! A status flag set by the simulation as follows: 0 if this is the first call, 1 for all subsequent time steps, -1 if this is the final call at the end of the simulation. INTEGER(IntKi), INTENT(INOUT) :: inst ! Instance number. Every instance of this function needs to have an unique instance number to ensure instances don't influence each other. LOGICAL(4), INTENT(IN) :: reset ! Reset the filter to the input signal + REAL(DbKi), OPTIONAL, INTENT(IN) :: InitialValue ! Value to set when reset + + REAL(DbKi) :: InitialValue_ ! Value to set when reset + + ! Defaults + InitialValue_ = InputSignal + IF (PRESENT(InitialValue)) InitialValue_ = InitialValue - ! Initialization + ! Initialization IF ((iStatus == 0) .OR. reset) THEN - FP%lpf1_OutputSignalLast(inst) = InputSignal - FP%lpf1_InputSignalLast(inst) = InputSignal + FP%lpf1_OutputSignalLast(inst) = InitialValue_ + FP%lpf1_InputSignalLast(inst) = InitialValue_ FP%lpf1_a1(inst) = 2 + CornerFreq*DT FP%lpf1_a0(inst) = CornerFreq*DT - 2 FP%lpf1_b1(inst) = CornerFreq*DT @@ -63,7 +70,7 @@ REAL(DbKi) FUNCTION LPFilter(InputSignal, DT, CornerFreq, FP, iStatus, reset, in END FUNCTION LPFilter !------------------------------------------------------------------------------------------------------------------------------- - REAL(DbKi) FUNCTION SecLPFilter(InputSignal, DT, CornerFreq, Damp, FP, iStatus, reset, inst) + REAL(DbKi) FUNCTION SecLPFilter(InputSignal, DT, CornerFreq, Damp, FP, iStatus, reset, inst, InitialValue) ! Discrete time Low-Pass Filter of the form: ! Continuous Time Form: H(s) = CornerFreq^2/(s^2 + 2*CornerFreq*Damp*s + CornerFreq^2) ! Discrete Time From: H(z) = (b2*z^2 + b1*z + b0) / (a2*z^2 + a1*z + a0) @@ -75,14 +82,21 @@ REAL(DbKi) FUNCTION SecLPFilter(InputSignal, DT, CornerFreq, Damp, FP, iStatus, REAL(DbKi), INTENT(IN) :: Damp ! Dampening constant INTEGER(IntKi), INTENT(IN) :: iStatus ! A status flag set by the simulation as follows: 0 if this is the first call, 1 for all subsequent time steps, -1 if this is the final call at the end of the simulation. INTEGER(IntKi), INTENT(INOUT) :: inst ! Instance number. Every instance of this function needs to have an unique instance number to ensure instances don't influence each other. - LOGICAL(4), INTENT(IN) :: reset ! Reset the filter to the input signal + LOGICAL(4), INTENT(IN) :: reset ! Reset the filter to the input signal + REAL(DbKi), OPTIONAL, INTENT(IN) :: InitialValue ! Value to set when reset + + REAL(DbKi) :: InitialValue_ ! Value to set when reset + + ! Defaults + InitialValue_ = InputSignal + IF (PRESENT(InitialValue)) InitialValue_ = InitialValue ! Initialization IF ((iStatus == 0) .OR. reset ) THEN - FP%lpf2_OutputSignalLast1(inst) = InputSignal - FP%lpf2_OutputSignalLast2(inst) = InputSignal - FP%lpf2_InputSignalLast1(inst) = InputSignal - FP%lpf2_InputSignalLast2(inst) = InputSignal + FP%lpf2_OutputSignalLast1(inst) = InitialValue_ + FP%lpf2_OutputSignalLast2(inst) = InitialValue_ + FP%lpf2_InputSignalLast1(inst) = InitialValue_ + FP%lpf2_InputSignalLast2(inst) = InitialValue_ ! Coefficients FP%lpf2_a2(inst) = DT**2.0*CornerFreq**2.0 + 4.0 + 4.0*Damp*CornerFreq*DT @@ -105,8 +119,60 @@ REAL(DbKi) FUNCTION SecLPFilter(InputSignal, DT, CornerFreq, Damp, FP, iStatus, inst = inst + 1 END FUNCTION SecLPFilter + !------------------------------------------------------------------------------------------------------------------------------- - REAL(DbKi) FUNCTION HPFilter( InputSignal, DT, CornerFreq, FP, iStatus, reset, inst) + REAL(DbKi) FUNCTION SecLPFilter_Vel(InputSignal, DT, CornerFreq, Damp, FP, iStatus, reset, inst, InitialValue) + ! Discrete time Low-Pass Filter (output is velocity) of the form: + ! Continuous Time Form: H(s) = s CornerFreq^2/(s^2 + 2*CornerFreq*Damp*s + CornerFreq^2) + ! Discrete Time From: H(z) = (b2*z^2 + b1*z + b0) / (a2*z^2 + a1*z + a0) + USE ROSCO_Types, ONLY : FilterParameters + TYPE(FilterParameters), INTENT(INOUT) :: FP + REAL(DbKi), INTENT(IN) :: InputSignal + REAL(DbKi), INTENT(IN) :: DT ! time step [s] + REAL(DbKi), INTENT(IN) :: CornerFreq ! corner frequency [rad/s] + REAL(DbKi), INTENT(IN) :: Damp ! Dampening constant + INTEGER(IntKi), INTENT(IN) :: iStatus ! A status flag set by the simulation as follows: 0 if this is the first call, 1 for all subsequent time steps, -1 if this is the final call at the end of the simulation. + INTEGER(IntKi), INTENT(INOUT) :: inst ! Instance number. Every instance of this function needs to have an unique instance number to ensure instances don't influence each other. + LOGICAL(4), INTENT(IN) :: reset ! Reset the filter to the input signal + REAL(DbKi), OPTIONAL, INTENT(IN) :: InitialValue ! Value to set when reset + + REAL(DbKi) :: InitialValue_ ! Value to set when reset + + ! Defaults + InitialValue_ = InputSignal + IF (PRESENT(InitialValue)) InitialValue_ = InitialValue + + ! Initialization + IF ((iStatus == 0) .OR. reset ) THEN + FP%lpfV_OutputSignalLast1(inst) = InitialValue_ + FP%lpfV_OutputSignalLast2(inst) = InitialValue_ + FP%lpfV_InputSignalLast1(inst) = InitialValue_ + FP%lpfV_InputSignalLast2(inst) = InitialValue_ + + ! Coefficients + FP%lpfV_a2(inst) = DT**2.0*CornerFreq**2.0 + 4.0 + 4.0*Damp*CornerFreq*DT + FP%lpfV_a1(inst) = 2.0*DT**2.0*CornerFreq**2.0 - 8.0 + FP%lpfV_a0(inst) = DT**2.0*CornerFreq**2.0 + 4.0 - 4.0*Damp*CornerFreq*DT + FP%lpfV_b2(inst) = 2.0*DT*CornerFreq**2.0 + FP%lpfV_b1(inst) = 0.0 + FP%lpfV_b0(inst) = -2.0*DT*CornerFreq**2.0 + ENDIF + + ! Filter + SecLPFilter_Vel = 1.0/FP%lpfV_a2(inst) * (FP%lpfV_b2(inst)*InputSignal + FP%lpfV_b1(inst)*FP%lpfV_InputSignalLast1(inst) + FP%lpfV_b0(inst)*FP%lpfV_InputSignalLast2(inst) - FP%lpfV_a1(inst)*FP%lpfV_OutputSignalLast1(inst) - FP%lpfV_a0(inst)*FP%lpfV_OutputSignalLast2(inst)) + + ! Save signals for next time step + FP%lpfV_InputSignalLast2(inst) = FP%lpfV_InputSignalLast1(inst) + FP%lpfV_InputSignalLast1(inst) = InputSignal + FP%lpfV_OutputSignalLast2(inst) = FP%lpfV_OutputSignalLast1(inst) + FP%lpfV_OutputSignalLast1(inst) = SecLPFilter_Vel + + inst = inst + 1 + + END FUNCTION SecLPFilter_Vel + +!------------------------------------------------------------------------------------------------------------------------------- + REAL(DbKi) FUNCTION HPFilter( InputSignal, DT, CornerFreq, FP, iStatus, reset, inst, InitialValue) ! Discrete time High-Pass Filter USE ROSCO_Types, ONLY : FilterParameters TYPE(FilterParameters), INTENT(INOUT) :: FP @@ -119,11 +185,18 @@ REAL(DbKi) FUNCTION HPFilter( InputSignal, DT, CornerFreq, FP, iStatus, reset, i LOGICAL(4), INTENT(IN) :: reset ! Reset the filter to the input signal ! Local REAL(DbKi) :: K ! Constant gain + REAL(DbKi), OPTIONAL, INTENT(IN) :: InitialValue ! Value to set when reset + + REAL(DbKi) :: InitialValue_ ! Value to set when reset + + ! Defaults + InitialValue_ = InputSignal + IF (PRESENT(InitialValue)) InitialValue_ = InitialValue ! Initialization IF ((iStatus == 0) .OR. reset) THEN - FP%hpf_OutputSignalLast(inst) = InputSignal - FP%hpf_InputSignalLast(inst) = InputSignal + FP%hpf_OutputSignalLast(inst) = InitialValue_ + FP%hpf_InputSignalLast(inst) = InitialValue_ ENDIF K = 2.0 / DT @@ -137,7 +210,7 @@ REAL(DbKi) FUNCTION HPFilter( InputSignal, DT, CornerFreq, FP, iStatus, reset, i END FUNCTION HPFilter !------------------------------------------------------------------------------------------------------------------------------- - REAL(DbKi) FUNCTION NotchFilterSlopes(InputSignal, DT, CornerFreq, Damp, FP, iStatus, reset, inst, Moving) + REAL(DbKi) FUNCTION NotchFilterSlopes(InputSignal, DT, CornerFreq, Damp, FP, iStatus, reset, inst, Moving, InitialValue) ! Discrete time inverted Notch Filter with descending slopes, G = CornerFreq*s/(Damp*s^2+CornerFreq*s+Damp*CornerFreq^2) USE ROSCO_Types, ONLY : FilterParameters TYPE(FilterParameters), INTENT(INOUT) :: FP @@ -150,9 +223,15 @@ REAL(DbKi) FUNCTION NotchFilterSlopes(InputSignal, DT, CornerFreq, Damp, FP, iSt INTEGER(IntKi), INTENT(INOUT) :: inst ! Instance number. Every instance of this function needs to have an unique instance number to ensure instances don't influence each other. LOGICAL(4), INTENT(IN) :: reset ! Reset the filter to the input signal LOGICAL, OPTIONAL, INTENT(IN) :: Moving ! Moving CornerFreq flag + REAL(DbKi), OPTIONAL, INTENT(IN) :: InitialValue ! Value to set when reset LOGICAL :: Moving_ ! Local version REAL(DbKi) :: CornerFreq_ ! Local version + REAL(DbKi) :: InitialValue_ ! Value to set when reset + + ! Defaults + InitialValue_ = InputSignal + IF (PRESENT(InitialValue)) InitialValue_ = InitialValue Moving_ = .FALSE. IF (PRESENT(Moving)) Moving_ = Moving @@ -166,10 +245,10 @@ REAL(DbKi) FUNCTION NotchFilterSlopes(InputSignal, DT, CornerFreq, Damp, FP, iSt ! Initialization IF ((iStatus == 0) .OR. reset) THEN - FP%nfs_OutputSignalLast1(inst) = InputSignal - FP%nfs_OutputSignalLast2(inst) = InputSignal - FP%nfs_InputSignalLast1(inst) = InputSignal - FP%nfs_InputSignalLast2(inst) = InputSignal + FP%nfs_OutputSignalLast1(inst) = InitialValue_ + FP%nfs_OutputSignalLast2(inst) = InitialValue_ + FP%nfs_InputSignalLast1(inst) = InitialValue_ + FP%nfs_InputSignalLast2(inst) = InitialValue_ ENDIF IF ((iStatus == 0) .OR. reset .OR. Moving_) THEN @@ -192,7 +271,7 @@ REAL(DbKi) FUNCTION NotchFilterSlopes(InputSignal, DT, CornerFreq, Damp, FP, iSt END FUNCTION NotchFilterSlopes !------------------------------------------------------------------------------------------------------------------------------- - REAL(DbKi) FUNCTION NotchFilter(InputSignal, DT, omega, betaNum, betaDen, FP, iStatus, reset, inst) + REAL(DbKi) FUNCTION NotchFilter(InputSignal, DT, omega, betaNum, betaDen, FP, iStatus, reset, inst, InitialValue) ! Discrete time Notch Filter ! Continuous Time Form: G(s) = (s^2 + 2*omega*betaNum*s + omega^2)/(s^2 + 2*omega*betaDen*s + omega^2) ! Discrete Time Form: H(z) = (b2*z^2 +b1*z^2 + b0*z)/((z^2 +a1*z^2 + a0*z)) @@ -207,16 +286,22 @@ REAL(DbKi) FUNCTION NotchFilter(InputSignal, DT, omega, betaNum, betaDen, FP, iS INTEGER(IntKi), INTENT(IN) :: iStatus ! A status flag set by the simulation as follows: 0 if this is the first call, 1 for all subsequent time steps, -1 if this is the final call at the end of the simulation. INTEGER(IntKi), INTENT(INOUT) :: inst ! Instance number. Every instance of this function needs to have an unique instance number to ensure instances don't influence each other. LOGICAL(4), INTENT(IN) :: reset ! Reset the filter to the input signal + REAL(DbKi), OPTIONAL, INTENT(IN) :: InitialValue ! Value to set when reset ! Local REAL(DbKi) :: K ! Constant gain + REAL(DbKi) :: InitialValue_ ! Value to set when reset + + ! Defaults + InitialValue_ = InputSignal + IF (PRESENT(InitialValue)) InitialValue_ = InitialValue ! Initialization K = 2.0/DT IF ((iStatus == 0) .OR. reset) THEN - FP%nf_OutputSignalLast1(inst) = InputSignal - FP%nf_OutputSignalLast2(inst) = InputSignal - FP%nf_InputSignalLast1(inst) = InputSignal - FP%nf_InputSignalLast2(inst) = InputSignal + FP%nf_OutputSignalLast1(inst) = InitialValue_ + FP%nf_OutputSignalLast2(inst) = InitialValue_ + FP%nf_InputSignalLast1(inst) = InitialValue_ + FP%nf_InputSignalLast2(inst) = InitialValue_ FP%nf_b2(inst) = (K**2.0 + 2.0*omega*BetaNum*K + omega**2.0)/(K**2.0 + 2.0*omega*BetaDen*K + omega**2.0) FP%nf_b1(inst) = (2.0*omega**2.0 - 2.0*K**2.0) / (K**2.0 + 2.0*omega*BetaDen*K + omega**2.0); FP%nf_b0(inst) = (K**2.0 - 2.0*omega*BetaNum*K + omega**2.0) / (K**2.0 + 2.0*omega*BetaDen*K + omega**2.0) @@ -269,6 +354,10 @@ SUBROUTINE PreFilterMeasuredSignals(CntrPar, LocalVar, DebugVar, objInst, ErrVar ! Filtering the tower fore-aft acceleration signal IF (CntrPar%Fl_Mode > 0) THEN ! Force to start at 0 + IF (LocalVar%iStatus == 0 .AND. LocalVar%Time == 0) THEN + LocalVar%NacIMU_FA_Acc = 0 + LocalVar%FA_Acc = 0 + ENDIF LocalVar%NacIMU_FA_AccF = SecLPFilter(LocalVar%NacIMU_FA_Acc, LocalVar%DT, CntrPar%F_FlCornerFreq(1), CntrPar%F_FlCornerFreq(2), LocalVar%FP, LocalVar%iStatus, LocalVar%restart, objInst%instSecLPF) ! Fixed Damping LocalVar%FA_AccF = SecLPFilter(LocalVar%FA_Acc, LocalVar%DT, CntrPar%F_FlCornerFreq(1), CntrPar%F_FlCornerFreq(2), LocalVar%FP, LocalVar%iStatus, LocalVar%restart, objInst%instSecLPF) ! Fixed Damping LocalVar%NacIMU_FA_AccF = HPFilter(LocalVar%NacIMU_FA_AccF, LocalVar%DT, CntrPar%F_FlHighPassFreq, LocalVar%FP, LocalVar%iStatus, LocalVar%restart, objInst%instHPF) @@ -279,7 +368,11 @@ SUBROUTINE PreFilterMeasuredSignals(CntrPar, LocalVar, DebugVar, objInst, ErrVar LocalVar%FA_AccF = NotchFilter(LocalVar%FA_AccF, LocalVar%DT, CntrPar%F_NotchCornerFreq, CntrPar%F_NotchBetaNumDen(1), CntrPar%F_NotchBetaNumDen(2), LocalVar%FP, LocalVar%iStatus, LocalVar%restart, objInst%instNotch) ! Fixed Damping ENDIF ENDIF - LocalVar%FA_AccHPF = HPFilter(LocalVar%FA_Acc, LocalVar%DT, CntrPar%FA_HPFCornerFreq, LocalVar%FP, LocalVar%iStatus, LocalVar%restart, objInst%instHPF) + + ! FA acc for ForeAft damping, condition matches whether it's used in Controllers.f90 + IF ((CntrPar%TD_Mode > 0) .OR. (CntrPar%Y_ControlMode == 2)) THEN + LocalVar%FA_AccHPF = HPFilter(LocalVar%FA_Acc, LocalVar%DT, CntrPar%FA_HPFCornerFreq, LocalVar%FP, LocalVar%iStatus, LocalVar%restart, objInst%instHPF) + ENDIF ! Filter Wind Speed Estimator Signal LocalVar%We_Vw_F = LPFilter(LocalVar%WE_Vw, LocalVar%DT,CntrPar%F_WECornerFreq, LocalVar%FP, LocalVar%iStatus, LocalVar%restart, objInst%instLPF) ! 30 second time constant diff --git a/ROSCO/ROSCO/src/Functions.f90 b/ROSCO/ROSCO/src/Functions.f90 index af9a0c2cd..4f4a936e7 100644 --- a/ROSCO/ROSCO/src/Functions.f90 +++ b/ROSCO/ROSCO/src/Functions.f90 @@ -48,21 +48,45 @@ REAL(DbKi) FUNCTION saturate(inputValue, minValue, maxValue) END FUNCTION saturate !------------------------------------------------------------------------------------------------------------------------------- - REAL(DbKi) FUNCTION ratelimit(inputSignal, inputSignalPrev, minRate, maxRate, DT) + REAL(DbKi) FUNCTION ratelimit(inputSignal, minRate, maxRate, DT, reset, rlP, inst, ResetValue) ! Saturates inputValue. Makes sure it is not smaller than minValue and not larger than maxValue + USE ROSCO_Types, ONLY : rlParams + + IMPLICIT NONE - REAL(DbKi), INTENT(IN) :: inputSignal - REAL(DbKi), INTENT(IN) :: inputSignalPrev - REAL(DbKi), INTENT(IN) :: minRate - REAL(DbKi), INTENT(IN) :: maxRate - REAL(DbKi), INTENT(IN) :: DT + REAL(DbKi), INTENT(IN) :: inputSignal + REAL(DbKi), INTENT(IN) :: minRate + REAL(DbKi), INTENT(IN) :: maxRate + REAL(DbKi), INTENT(IN) :: DT + LOGICAL, INTENT(IN) :: reset + TYPE(rlParams), INTENT(INOUT) :: rlP + INTEGER(IntKi), INTENT(INOUT) :: inst + REAL(DbKi), OPTIONAL, INTENT(IN) :: ResetValue ! Value to base rate limit off if restarting + ! Local variables REAL(DbKi) :: rate + REAL(DbKi) :: ResetValue_ + + ResetValue_ = inputSignal + IF (PRESENT(ResetValue)) ResetValue_ = ResetValue + + IF (reset) THEN + rlP%LastSignal(inst) = ResetValue_ + ratelimit = ResetValue_ + + ELSE + rate = (inputSignal - rlP%LastSignal(inst))/DT ! Signal rate (unsaturated) + rate = saturate(rate, minRate, maxRate) ! Saturate the signal rate - rate = (inputSignal - inputSignalPrev)/DT ! Signal rate (unsaturated) - rate = saturate(rate, minRate, maxRate) ! Saturate the signal rate - ratelimit = inputSignalPrev + rate*DT ! Saturate the overall command using the rate limit + ratelimit = rlP%LastSignal(inst) + rate*DT + + rlP%LastSignal(inst) = ratelimit + + ENDIF + + ! Increment instance + inst = inst + 1 ! Saturate the overall command using the rate limit END FUNCTION ratelimit @@ -575,69 +599,5 @@ REAL(DbKi) FUNCTION sigma(x, x0, x1, y0, y1, ErrVar) END FUNCTION sigma -!------------------------------------------------------------------------------------------------------------------------------- - ! Copied from NWTC_IO.f90 -!> This function returns a character string encoded with today's date in the form dd-mmm-ccyy. -FUNCTION CurDate( ) - - ! Function declaration. - - CHARACTER(11) :: CurDate !< 'dd-mmm-yyyy' string with the current date - - - ! Local declarations. - - CHARACTER(8) :: CDate ! String to hold the returned value from the DATE_AND_TIME subroutine call. - - - - ! Call the system date function. - - CALL DATE_AND_TIME ( CDate ) - - - ! Parse out the day. - - CurDate(1:3) = CDate(7:8)//'-' - - - ! Parse out the month. - - SELECT CASE ( CDate(5:6) ) - CASE ( '01' ) - CurDate(4:6) = 'Jan' - CASE ( '02' ) - CurDate(4:6) = 'Feb' - CASE ( '03' ) - CurDate(4:6) = 'Mar' - CASE ( '04' ) - CurDate(4:6) = 'Apr' - CASE ( '05' ) - CurDate(4:6) = 'May' - CASE ( '06' ) - CurDate(4:6) = 'Jun' - CASE ( '07' ) - CurDate(4:6) = 'Jul' - CASE ( '08' ) - CurDate(4:6) = 'Aug' - CASE ( '09' ) - CurDate(4:6) = 'Sep' - CASE ( '10' ) - CurDate(4:6) = 'Oct' - CASE ( '11' ) - CurDate(4:6) = 'Nov' - CASE ( '12' ) - CurDate(4:6) = 'Dec' - END SELECT - - - ! Parse out the year. - - CurDate(7:11) = '-'//CDate(1:4) - - - RETURN - END FUNCTION CurDate - END MODULE Functions diff --git a/ROSCO/ROSCO/src/ROSCO_Helpers.f90 b/ROSCO/ROSCO/src/ROSCO_Helpers.f90 index c030cc843..13f9d2d6d 100644 --- a/ROSCO/ROSCO/src/ROSCO_Helpers.f90 +++ b/ROSCO/ROSCO/src/ROSCO_Helpers.f90 @@ -28,14 +28,22 @@ MODULE ROSCO_Helpers MODULE PROCEDURE ParseInput_Str ! Parses a character string from a string. MODULE PROCEDURE ParseInput_Dbl ! Parses a double-precision REAL from a string. MODULE PROCEDURE ParseInput_Int ! Parses an INTEGER from a string. + MODULE PROCEDURE ParseInput_Int_Opt ! Parses an INTEGER from a string. Optional input. + MODULE PROCEDURE ParseInput_Dbl_Opt ! Parses an double-precision REAL from a string. Optional input. + MODULE PROCEDURE ParseInput_Str_Opt ! Parses an character string from a string. Optional input. ! MODULE PROCEDURE ParseInput_Log ! Parses an LOGICAL from a string. END INTERFACE - INTERFACE ParseAry ! Parse an array of numbers from a string. + INTERFACE ParseAry ! Parse an array of numbers from a string. MODULE PROCEDURE ParseDbAry ! Parse an array of double-precision REAL values. MODULE PROCEDURE ParseInAry ! Parse an array of whole numbers. + MODULE PROCEDURE ParseInAry_Opt ! Parse an array of whole numbers. Optional inputs. + MODULE PROCEDURE ParseDbAry_Opt ! Parse an array of double-precision REAL values. Optional inputs. END INTERFACE + INTEGER(IntKi), PARAMETER :: MaxLineLength = 2048 ! characters + INTEGER(IntKi), PARAMETER :: MaxParamLength = 200 ! characters, file paths can be long + CONTAINS !======================================================================= @@ -43,13 +51,13 @@ MODULE ROSCO_Helpers subroutine ParseInput_Int(Un, CurLine, VarName, FileName, Variable, ErrVar, CheckName) USE ROSCO_Types, ONLY : ErrorVariables - CHARACTER(1024) :: Line + CHARACTER(MaxLineLength) :: Line INTEGER(IntKi), INTENT(IN ) :: Un ! Input file unit - CHARACTER(*), INTENT(IN ) :: VarName ! Input file unit - CHARACTER(*), INTENT(IN ) :: FileName ! Input file unit + CHARACTER(*), INTENT(IN ) :: VarName ! Input file unit + CHARACTER(*), INTENT(IN ) :: FileName ! Input file unit INTEGER(IntKi), INTENT(INOUT) :: CurLine ! Current line of input - TYPE(ErrorVariables), INTENT(INOUT) :: ErrVar ! Current line of input - CHARACTER(20) :: Words (2) ! The two "words" parsed from the line + TYPE(ErrorVariables), INTENT(INOUT) :: ErrVar ! Current line of input + CHARACTER(MaxParamLength) :: Words (2) ! The two "words" parsed from the line INTEGER(IntKi), INTENT(INOUT) :: Variable ! Variable INTEGER(IntKi) :: ErrStatLcl ! Error status local to this routine. @@ -102,6 +110,250 @@ subroutine ParseInput_Int(Un, CurLine, VarName, FileName, Variable, ErrVar, Chec END subroutine ParseInput_Int + !======================================================================= + ! Parse integer input: read line, check that variable name is in line, handle errors + subroutine ParseInput_Int_Opt(FileLines, VarName, Variable, FileName, ErrVar, AllowDefault, UnEc) + USE ROSCO_Types, ONLY : ErrorVariables + + CHARACTER(*), INTENT(IN ), DIMENSION(:) :: FileLines ! Input file unit + CHARACTER(*), INTENT(IN ) :: VarName ! Input file unit + CHARACTER(*), INTENT(IN ) :: FileName ! Input file unit + TYPE(ErrorVariables), INTENT(INOUT) :: ErrVar ! Current line of input + INTEGER(IntKi), INTENT(INOUT) :: Variable ! Variable + Integer(IntKi), OPTIONAL, INTENT(IN ) :: UnEc ! Variable + + + ! Flag (usually control mode) specifying whether default is allowed, 0 - yes, nonzero - no + LOGICAL, OPTIONAL, INTENT(IN ) :: AllowDefault + + INTEGER(IntKi) :: CurLine ! Current line of input + CHARACTER(MaxParamLength) :: Words (2) ! The two "words" parsed from the line + CHARACTER(MaxParamLength) :: VarNameUC + CHARACTER(MaxLineLength) :: Line + INTEGER(IntKi) :: ErrStatLcl ! Error status local to this routine. + INTEGER(IntKi) :: I, VarLineIndex ! Line indexer + LOGICAL :: AllowDefault_, FoundLine + CHARACTER(*), PARAMETER :: RoutineName = 'ParseInput_Int_Opt' + + + ! Figure out if we allow default + AllowDefault_ = .TRUE. + if (PRESENT(AllowDefault)) AllowDefault_ = AllowDefault + + ! If we've already failed, don't read anything + IF (ErrVar%aviFAIL >= 0) THEN + + CALL FindLine(FileLines, VarName, FoundLine, Line, CurLine) + + ! Separate line again + CALL GetWords ( Line, Words, 2 ) + + ! PRINT *, "Line: ", Line + + ! Print warning with default + IF (.NOT. FoundLine) THEN + IF (.NOT. AllowDefault_) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = RoutineName//':Missing or default values are not allowed for '//TRIM( VarName )//'. Please check control modes.' + RETURN + ENDIF + + Variable = 0 ! Default of integer inputs is 0 for now + PRINT *, "ROSCO Warning: Did not find "//TRIM( VarName )//" in input file. Using default value of ", Variable + ENDIF + + ! Debugging: show what's being read, turn into Echo later + IF (DEBUG_PARSING) THEN + print *, 'Read: '//TRIM(Words(1))//' and '//TRIM(Words(2)),' on line ', CurLine + END IF + + ! IF We haven't failed already + IF (ErrVar%aviFAIL >= 0 .AND. FoundLine) THEN + + ! Read the variable + READ (Words(1),*,IOSTAT=ErrStatLcl) Variable + IF ( ErrStatLcl /= 0 ) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = NewLine//' >> A fatal error occurred when parsing data from "' & + //TRIM( FileName )//'".'//NewLine// & + ' >> The variable "'//TRIM( Words(2) )//'" was not assigned valid INTEGER value on line #' & + //TRIM( Int2LStr( CurLine ) )//'.'//NewLine//& + ' >> The text being parsed was :'//NewLine//' "'//TRIM( Line )//'"' + ENDIF + + ENDIF + + IF ( PRESENT(UnEc)) THEN + IF ( UnEc > 0 ) WRITE (UnEc,*) CurLine, Tab, VarName, Tab, Variable + END IF + + END IF + + END subroutine ParseInput_Int_Opt + + !======================================================================= + ! Parse integer input: read line, check that variable name is in line, handle errors + subroutine ParseInput_Dbl_Opt(FileLines, VarName, Variable, FileName, ErrVar, AllowDefault, UnEc) + USE ROSCO_Types, ONLY : ErrorVariables + + CHARACTER(*), INTENT(IN ), DIMENSION(:) :: FileLines ! Input file unit + CHARACTER(*), INTENT(IN ) :: VarName ! Input file unit + CHARACTER(*), INTENT(IN ) :: FileName ! Input file unit + TYPE(ErrorVariables), INTENT(INOUT) :: ErrVar ! Current line of input + REAL(DbKi), INTENT(INOUT) :: Variable ! Variable + Integer(IntKi), OPTIONAL, INTENT(IN ) :: UnEc ! Variable + + + ! Flag (usually control mode) specifying whether default is allowed, 0 - yes, nonzero - no + LOGICAL, OPTIONAL, INTENT(IN ) :: AllowDefault + + INTEGER(IntKi) :: CurLine ! Current line of input + CHARACTER(MaxParamLength) :: Words (2) ! The two "words" parsed from the line + CHARACTER(MaxParamLength) :: VarNameUC + CHARACTER(MaxLineLength) :: Line + INTEGER(IntKi) :: ErrStatLcl ! Error status local to this routine. + INTEGER(IntKi) :: I, VarLineIndex ! Line indexer + LOGICAL :: AllowDefault_, FoundLine + CHARACTER(*), PARAMETER :: RoutineName = 'ParseInput_Dbl_Opt' + + + ! Figure out if we allow default + AllowDefault_ = .TRUE. + if (PRESENT(AllowDefault)) AllowDefault_ = AllowDefault + + ! If we've already failed, don't read anything + IF (ErrVar%aviFAIL >= 0) THEN + + CALL FindLine(FileLines, VarName, FoundLine, Line, CurLine) + + + ! Separate line again + CALL GetWords ( Line, Words, 2 ) + + ! PRINT *, "Line: ", Line + + ! Print warning with default + IF (.NOT. FoundLine) THEN + IF (.NOT. AllowDefault_) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = RoutineName//':Missing or default values are not allowed for '//TRIM( VarName )//'. Please check control modes.' + RETURN + ENDIF + + Variable = 0 ! Default of integer inputs is 0 for now + PRINT *, "ROSCO Warning: Did not find "//TRIM( VarName )//" in input file. Using default value of ", Variable + ENDIF + + ! Debugging: show what's being read, turn into Echo later + IF (DEBUG_PARSING) THEN + print *, 'Read: '//TRIM(Words(1))//' and '//TRIM(Words(2)),' on line ', CurLine + END IF + + ! IF We haven't failed already + IF (ErrVar%aviFAIL >= 0 .AND. FoundLine) THEN + + ! Read the variable + READ (Words(1),*,IOSTAT=ErrStatLcl) Variable + IF ( ErrStatLcl /= 0 ) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = NewLine//' >> A fatal error occurred when parsing data from "' & + //TRIM( FileName )//'".'//NewLine// & + ' >> The variable "'//TRIM( Words(2) )//'" was not assigned valid INTEGER value on line #' & + //TRIM( Int2LStr( CurLine ) )//'.'//NewLine//& + ' >> The text being parsed was :'//NewLine//' "'//TRIM( Line )//'"' + ENDIF + + ENDIF + + IF ( PRESENT(UnEc)) THEN + IF ( UnEc > 0 ) WRITE (UnEc,*) CurLine, Tab, VarName, Tab, Variable + END IF + + END IF + + END subroutine ParseInput_Dbl_Opt + + !======================================================================= + ! Parse integer input: read line, check that variable name is in line, handle errors + subroutine ParseInput_Str_Opt(FileLines, VarName, Variable, FileName, ErrVar, AllowDefault, UnEc) + USE ROSCO_Types, ONLY : ErrorVariables + + CHARACTER(*), INTENT(IN ), DIMENSION(:) :: FileLines ! Input file unit + CHARACTER(*), INTENT(IN ) :: VarName ! Input file unit + CHARACTER(*), INTENT(IN ) :: FileName ! Input file unit + TYPE(ErrorVariables), INTENT(INOUT) :: ErrVar ! Current line of input + CHARACTER(*), INTENT(INOUT) :: Variable ! Variable + Integer(IntKi), OPTIONAL, INTENT(IN ) :: UnEc ! Variable + + ! Flag (usually control mode) specifying whether default is allowed, 0 - yes, nonzero - no + LOGICAL, OPTIONAL, INTENT(IN ) :: AllowDefault + + INTEGER(IntKi) :: CurLine ! Current line of input + CHARACTER(MaxParamLength) :: Words (2) ! The two "words" parsed from the line + CHARACTER(MaxParamLength) :: VarNameUC + CHARACTER(MaxLineLength) :: Line + INTEGER(IntKi) :: ErrStatLcl ! Error status local to this routine. + INTEGER(IntKi) :: I, VarLineIndex ! Line indexer + LOGICAL :: AllowDefault_, FoundLine + CHARACTER(*), PARAMETER :: RoutineName = 'ParseInput_Str_Opt' + + + ! Figure out if we allow default + AllowDefault_ = .TRUE. + if (PRESENT(AllowDefault)) AllowDefault_ = AllowDefault + + ! If we've already failed, don't read anything + IF (ErrVar%aviFAIL >= 0) THEN + + CALL FindLine(FileLines, VarName, FoundLine, Line, CurLine) + + + ! Separate line again + CALL GetWords ( Line, Words, 2 ) + + ! PRINT *, "Line: ", TRIM(Line) + + ! Print warning with default + IF (.NOT. FoundLine) THEN + IF (.NOT. AllowDefault_) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = RoutineName//':Missing or default values are not allowed for '//TRIM( VarName )//'. Please check control modes.' + RETURN + ENDIF + + Variable = 'unused' ! Default of string input is unused for now + PRINT *, "ROSCO Warning: Did not find "//TRIM( VarName )//" in input file. Using default value of ", TRIM(Variable) + ENDIF + + ! Debugging: show what's being read, turn into Echo later + IF (DEBUG_PARSING) THEN + print *, 'Read: '//TRIM(Words(1))//' and '//TRIM(Words(2)),' on line ', CurLine + END IF + + IF (ErrVar%aviFAIL >= 0 .AND. FoundLine) THEN + + ! Read the variable + READ (Words(1),'(A)',IOSTAT=ErrStatLcl) Variable + IF ( ErrStatLcl /= 0 ) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = NewLine//' >> A fatal error occurred when parsing data from "' & + //TRIM( FileName )//'".'//NewLine// & + ' >> The variable "'//TRIM( Words(2) )//'" was not assigned valid INTEGER value on line #' & + //TRIM( Int2LStr( CurLine ) )//'.'//NewLine//& + ' >> The text being parsed was :'//NewLine//' "'//TRIM( Line )//'"' + ENDIF + + ENDIF + + IF ( PRESENT(UnEc)) THEN + IF ( UnEc > 0 ) WRITE (UnEc,*) CurLine, Tab, VarName, Tab, Variable + END IF + + END IF + + END subroutine ParseInput_Str_Opt + + !======================================================================= ! Parse double input, this is a copy of ParseInput_Int and a change in the variable definitions subroutine ParseInput_Dbl(Un, CurLine, VarName, FileName, Variable, ErrVar, CheckName) @@ -234,7 +486,7 @@ END subroutine ParseInput_Str !> This subroutine parses the specified line of text for AryLen REAL values. !! Generate an error message if the value is the wrong type. !! Use ParseAry (nwtc_io::parseary) instead of directly calling a specific routine in the generic interface. - SUBROUTINE ParseDbAry ( Un, LineNum, AryName, Ary, AryLen, FileName, ErrVar, CheckName ) + SUBROUTINE ParseDbAry ( Un, LineNum, ParamName, Ary, AryLen, FileName, ErrVar, CheckName ) USE ROSCO_Types, ONLY : ErrorVariables @@ -248,7 +500,7 @@ SUBROUTINE ParseDbAry ( Un, LineNum, AryName, Ary, AryLen, FileName, ErrVar, Che CHARACTER(*), INTENT(IN) :: FileName !< The name of the file being parsed. - CHARACTER(*), INTENT(IN ) :: AryName !< The array name we are trying to fill. + CHARACTER(*), INTENT(IN ) :: ParamName !< The array name we are trying to fill. TYPE(ErrorVariables), INTENT(INOUT) :: ErrVar ! Current line of input @@ -280,10 +532,10 @@ SUBROUTINE ParseDbAry ( Un, LineNum, AryName, Ary, AryLen, FileName, ErrVar, Che IF ( ErrStatLcl /= 0 ) THEN IF ( ALLOCATED(Ary) ) THEN ErrVar%aviFAIL = -1 - ErrVar%ErrMsg = RoutineName//':Error allocating memory for the '//TRIM( AryName )//' array; array was already allocated.' + ErrVar%ErrMsg = RoutineName//':Error allocating memory for the '//TRIM( ParamName )//' array; array was already allocated.' ELSE ErrVar%aviFAIL = -1 - ErrVar%ErrMsg = RoutineName//':Error allocating memory for '//TRIM(Int2LStr( AryLen ))//' characters in the '//TRIM( AryName )//' array.' + ErrVar%ErrMsg = RoutineName//':Error allocating memory for '//TRIM(Int2LStr( AryLen ))//' characters in the '//TRIM( ParamName )//' array.' END IF END IF @@ -313,7 +565,7 @@ SUBROUTINE ParseDbAry ( Un, LineNum, AryName, Ary, AryLen, FileName, ErrVar, Che ! Check that Variable Name is at the end of Words, will also check length of array IF (CheckName_) THEN - CALL ChkParseData ( Words_Ary(AryLen:AryLen+1), AryName, FileName, LineNum, ErrVar ) + CALL ChkParseData ( Words_Ary(AryLen:AryLen+1), ParamName, FileName, LineNum, ErrVar ) END IF ! Read array @@ -322,17 +574,13 @@ SUBROUTINE ParseDbAry ( Un, LineNum, AryName, Ary, AryLen, FileName, ErrVar, Che ErrVar%aviFAIL = -1 ErrVar%ErrMsg = RoutineName//':A fatal error occurred when parsing data from "' & //TRIM( FileName )//'".'//NewLine// & - ' >> The "'//TRIM( AryName )//'" array was not assigned valid REAL values on line #' & + ' >> The "'//TRIM( ParamName )//'" array was not assigned valid REAL values on line #' & //TRIM( Int2LStr( LineNum ) )//'.'//NewLine//' >> The text being parsed was :'//NewLine & //' "'//TRIM( Line )//'"' RETURN CALL Cleanup() ENDIF - ! IF ( PRESENT(UnEc) ) THEN - ! IF ( UnEc > 0 ) WRITE (UnEc,'(A)') TRIM( FileInfo%Lines(LineNum) ) - ! END IF - LineNum = LineNum + 1 CALL Cleanup() ENDIF @@ -361,7 +609,7 @@ END SUBROUTINE ParseDbAry !> This subroutine parses the specified line of text for AryLen INTEGER values. !! Generate an error message if the value is the wrong type. !! Use ParseAry (nwtc_io::parseary) instead of directly calling a specific routine in the generic interface. - SUBROUTINE ParseInAry ( Un, LineNum, AryName, Ary, AryLen, FileName, ErrVar, CheckName ) + SUBROUTINE ParseInAry ( Un, LineNum, ParamName, Ary, AryLen, FileName, ErrVar, CheckName ) USE ROSCO_Types, ONLY : ErrorVariables @@ -375,7 +623,7 @@ SUBROUTINE ParseInAry ( Un, LineNum, AryName, Ary, AryLen, FileName, ErrVar, Che CHARACTER(*), INTENT(IN) :: FileName !< The name of the file being parsed. - CHARACTER(*), INTENT(IN ) :: AryName !< The array name we are trying to fill. + CHARACTER(*), INTENT(IN ) :: ParamName !< The array name we are trying to fill. TYPE(ErrorVariables), INTENT(INOUT) :: ErrVar ! Current line of input @@ -407,10 +655,10 @@ SUBROUTINE ParseInAry ( Un, LineNum, AryName, Ary, AryLen, FileName, ErrVar, Che IF ( ErrStatLcl /= 0 ) THEN IF ( ALLOCATED(Ary) ) THEN ErrVar%aviFAIL = -1 - ErrVar%ErrMsg = RoutineName//':Error allocating memory for the '//TRIM( AryName )//' array; array was already allocated.' + ErrVar%ErrMsg = RoutineName//':Error allocating memory for the '//TRIM( ParamName )//' array; array was already allocated.' ELSE ErrVar%aviFAIL = -1 - ErrVar%ErrMsg = RoutineName//':Error allocating memory for '//TRIM(Int2LStr( AryLen ))//' characters in the '//TRIM( AryName )//' array.' + ErrVar%ErrMsg = RoutineName//':Error allocating memory for '//TRIM(Int2LStr( AryLen ))//' characters in the '//TRIM( ParamName )//' array.' END IF END IF @@ -440,7 +688,7 @@ SUBROUTINE ParseInAry ( Un, LineNum, AryName, Ary, AryLen, FileName, ErrVar, Che ! Check that Variable Name is at the end of Words, will also check length of array IF (CheckName_) THEN - CALL ChkParseData ( Words_Ary(AryLen:AryLen+1), AryName, FileName, LineNum, ErrVar ) + CALL ChkParseData ( Words_Ary(AryLen:AryLen+1), ParamName, FileName, LineNum, ErrVar ) END IF ! Read array @@ -449,7 +697,7 @@ SUBROUTINE ParseInAry ( Un, LineNum, AryName, Ary, AryLen, FileName, ErrVar, Che ErrVar%aviFAIL = -1 ErrVar%ErrMsg = RoutineName//':A fatal error occurred when parsing data from "' & //TRIM( FileName )//'".'//NewLine// & - ' >> The "'//TRIM( AryName )//'" array was not assigned valid REAL values on line #' & + ' >> The "'//TRIM( ParamName )//'" array was not assigned valid REAL values on line #' & //TRIM( Int2LStr( LineNum ) )//'.'//NewLine//' >> The text being parsed was :'//NewLine & //' "'//TRIM( Line )//'"' RETURN @@ -485,6 +733,289 @@ END SUBROUTINE Cleanup END SUBROUTINE ParseInAry !======================================================================= + +!======================================================================= +!> This subroutine parses the specified line of text for AryLen INTEGER values. +!! Generate an error message if the value is the wrong type. +!! Use ParseAry (nwtc_io::parseary) instead of directly calling a specific routine in the generic interface. + SUBROUTINE ParseInAry_Opt( FileLines, ParamName, Ary, AryLen, FileName, ErrVar, AllowDefault, UnEc ) + + USE ROSCO_Types, ONLY : ErrorVariables + + ! Arguments declarations. + CHARACTER(*), INTENT(IN ), DIMENSION(:) :: FileLines ! Input file unit + INTEGER, INTENT(IN ) :: AryLen !< The length of the array to parse. + INTEGER(IntKi), ALLOCATABLE, INTENT(INOUT) :: Ary(:) !< The array to receive the input values. + CHARACTER(*), INTENT(IN) :: FileName !< The name of the file being parsed. + CHARACTER(*), INTENT(IN) :: ParamName !< The array name we are trying to fill. + TYPE(ErrorVariables), INTENT(INOUT) :: ErrVar ! Current line of input + Integer(IntKi), OPTIONAL, INTENT(IN ) :: UnEc ! Variable + LOGICAL, OPTIONAL, INTENT(IN ) :: AllowDefault + + ! Local declarations. + INTEGER(IntKi) :: FinalAryLen !< Final array length, non-input + INTEGER(IntKi) :: LineNum !< The number of the line to parse. + CHARACTER(MaxLineLength) :: Line + INTEGER(IntKi) :: ErrStatLcl ! Error status local to this routine. + INTEGER(IntKi) :: i + + CHARACTER(MaxParamLength), ALLOCATABLE :: Words_Ary (:) ! The array "words" parsed from the line. + CHARACTER(MaxLineLength) :: Debug_String + CHARACTER(*), PARAMETER :: RoutineName = 'ParseInAry_Opt' + CHARACTER(MaxParamLength) :: ParamNameUC + LOGICAL :: AllowDefault_, FoundLine + + ! Figure out if we allow default + AllowDefault_ = .TRUE. + if (PRESENT(AllowDefault)) AllowDefault_ = AllowDefault + + ! If we've already failed, don't read anything + IF (ErrVar%aviFAIL >= 0) THEN + + CALL FindLine(FileLines, ParamName, FoundLine, Line, LineNum, AryLen) + + ! PRINT *, "Line: ", TRIM(Line) + + ! Minimum array length + IF (AryLen < 1) THEN + FinalAryLen = 1 + ELSE + FinalAryLen = AryLen + ENDIF + + ! Allocate array and handle errors + ALLOCATE ( Ary(FinalAryLen) , STAT=ErrStatLcl ) + IF ( ErrStatLcl /= 0 ) THEN + IF ( ALLOCATED(Ary) ) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = RoutineName//':Error allocating memory for the '//TRIM( ParamName )//' array; array was already allocated.' + ELSE + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = RoutineName//':Error allocating memory for '//TRIM(Int2LStr( AryLen ))//' characters in the '//TRIM( ParamName )//' array.' + END IF + END IF + + ! Print warning with default + IF (.NOT. FoundLine) THEN + IF (.NOT. AllowDefault_) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = RoutineName//':Missing or default values are not allowed for '//TRIM( ParamName )//'. Please check control modes and array length.' + RETURN + ENDIF + + Ary = 0 ! Default of allocatable arrays is 0 for now + PRINT *, "ROSCO Warning: Did not find correct size "//TRIM( ParamName )//" in input file. Using default value of [", Ary, "]" + ENDIF + + IF (FoundLine) THEN + + ! Allocate words array + ALLOCATE ( Words_Ary( AryLen + 1 ) , STAT=ErrStatLcl ) + IF ( ErrStatLcl /= 0 ) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = RoutineName//':Fatal error allocating memory for the Words array.' + CALL Cleanup() + RETURN + ENDIF + + ! Separate line string into AryLen + 1 words, should include variable name + CALL GetWords ( Line, Words_Ary, AryLen + 1 ) + + ! Debug Output + IF (DEBUG_PARSING) THEN + Debug_String = '' + DO i = 1,AryLen+1 + Debug_String = TRIM(Debug_String)//TRIM(Words_Ary(i)) + IF (i < AryLen + 1) THEN + Debug_String = TRIM(Debug_String)//',' + END IF + END DO + print *, 'Read: '//TRIM(Debug_String)//' on line ', LineNum + END IF + + ! Read array + READ (Line,*,IOSTAT=ErrStatLcl) Ary + IF ( ErrStatLcl /= 0 ) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = RoutineName//':A fatal error occurred when parsing data from "' & + //TRIM( FileName )//'".'//NewLine// & + ' >> The "'//TRIM( ParamName )//'" array was not assigned valid REAL values on line #' & + //TRIM( Int2LStr( LineNum ) )//'.'//NewLine//' >> The text being parsed was :'//NewLine & + //' "'//TRIM( Line )//'"' + RETURN + CALL Cleanup() + ENDIF + + ENDIF + + IF ( PRESENT(UnEc)) THEN + IF ( UnEc > 0 ) WRITE (UnEc,*) LineNum, Tab, ParamName, Tab, Ary + END IF + + CALL Cleanup() + ENDIF + + RETURN + + !======================================================================= + CONTAINS + !======================================================================= + SUBROUTINE Cleanup ( ) + + ! This subroutine cleans up the parent routine before exiting. + + ! Deallocate the Words array if it had been allocated. + + IF ( ALLOCATED( Words_Ary ) ) DEALLOCATE( Words_Ary ) + + + RETURN + + END SUBROUTINE Cleanup + +END SUBROUTINE ParseInAry_Opt + +!======================================================================= +!> This subroutine parses the specified line of text for AryLen INTEGER values. +!! Generate an error message if the value is the wrong type. +!! Use ParseAry (nwtc_io::parseary) instead of directly calling a specific routine in the generic interface. + SUBROUTINE ParseDbAry_Opt ( FileLines, ParamName, Ary, AryLen, FileName, ErrVar, AllowDefault, UnEc ) + + USE ROSCO_Types, ONLY : ErrorVariables + + ! Arguments declarations. + CHARACTER(*), INTENT(IN ), DIMENSION(:) :: FileLines ! Input file unit + INTEGER, INTENT(IN) :: AryLen !< The length of the array to parse. + REAL(DbKi), ALLOCATABLE, INTENT(INOUT) :: Ary(:) !< The array to receive the input values. + CHARACTER(*), INTENT(IN) :: FileName !< The name of the file being parsed. + CHARACTER(*), INTENT(IN) :: ParamName !< The array name we are trying to fill. + TYPE(ErrorVariables), INTENT(INOUT) :: ErrVar ! Current line of input + LOGICAL, OPTIONAL, INTENT(IN ) :: AllowDefault + Integer(IntKi), OPTIONAL, INTENT(IN ) :: UnEc ! Variable + + ! Local declarations. + INTEGER(IntKi) :: LineNum !< The number of the line to parse. + INTEGER(IntKi) :: FinalAryLen !< Final array length, non-input + CHARACTER(MaxLineLength) :: Line + INTEGER(IntKi) :: ErrStatLcl ! Error status local to this routine. + INTEGER(IntKi) :: i + + CHARACTER(MaxParamLength), ALLOCATABLE :: Words_Ary (:) ! The array "words" parsed from the line. + CHARACTER(MaxLineLength) :: Debug_String + CHARACTER(*), PARAMETER :: RoutineName = 'ParseDbAry_Opt' + CHARACTER(MaxParamLength) :: ParamNameUC, FileLineUC + LOGICAL :: AllowDefault_, FoundLine + + ! Figure out if we allow default + AllowDefault_ = .TRUE. + if (PRESENT(AllowDefault)) AllowDefault_ = AllowDefault + + ! If we've already failed, don't read anything + IF (ErrVar%aviFAIL >= 0) THEN + + CALL FindLine(FileLines, ParamName, FoundLine, Line, LineNum, AryLen) + + ! Minimum array length + IF (AryLen < 1) THEN + FinalAryLen = 1 + ELSE + FinalAryLen = AryLen + ENDIF + + ! Allocate array and handle errors + ALLOCATE ( Ary(FinalAryLen) , STAT=ErrStatLcl ) + IF ( ErrStatLcl /= 0 ) THEN + IF ( ALLOCATED(Ary) ) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = RoutineName//':Error allocating memory for the '//TRIM( ParamName )//' array; array was already allocated.' + ELSE + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = RoutineName//':Error allocating memory for '//TRIM(Int2LStr( AryLen ))//' characters in the '//TRIM( ParamName )//' array.' + END IF + END IF + + ! Print warning with default + IF (.NOT. FoundLine) THEN + IF (.NOT. AllowDefault_) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = RoutineName//':Missing or default values are not allowed for '//TRIM( ParamName )//'. Please check control modes and array length.' + RETURN + ENDIF + + Ary = 0 ! Default of allocatable arrays is 0 for now + PRINT *, "ROSCO Warning: Did not find correct size"//TRIM( ParamName )//" in input file. Using default value of [", Ary, "]" + ENDIF + + IF (FoundLine) THEN + + ! Allocate words array + ALLOCATE ( Words_Ary( AryLen + 1 ) , STAT=ErrStatLcl ) + IF ( ErrStatLcl /= 0 ) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = RoutineName//':Fatal error allocating memory for the Words array.' + CALL Cleanup() + RETURN + ENDIF + + ! Separate line string into AryLen + 1 words, should include variable name + CALL GetWords ( Line, Words_Ary, AryLen + 1 ) + + ! Debug Output + IF (DEBUG_PARSING) THEN + Debug_String = '' + DO i = 1,AryLen+1 + Debug_String = TRIM(Debug_String)//TRIM(Words_Ary(i)) + IF (i < AryLen + 1) THEN + Debug_String = TRIM(Debug_String)//',' + END IF + END DO + print *, 'Read: '//TRIM(Debug_String)//' on line ', LineNum + END IF + + ! Read array + READ (Line,*,IOSTAT=ErrStatLcl) Ary + IF ( ErrStatLcl /= 0 ) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = RoutineName//':A fatal error occurred when parsing data from "' & + //TRIM( FileName )//'".'//NewLine// & + ' >> The "'//TRIM( ParamName )//'" array was not assigned valid REAL values on line #' & + //TRIM( Int2LStr( LineNum ) )//'.'//NewLine//' >> The text being parsed was :'//NewLine & + //' "'//TRIM( Line )//'"' + RETURN + CALL Cleanup() + ENDIF + + ENDIF + + IF ( PRESENT(UnEc)) THEN + IF ( UnEc > 0 ) WRITE (UnEc,*) LineNum, Tab, ParamName, Tab, Ary + END IF + + CALL Cleanup() + ENDIF + + RETURN + + !======================================================================= + CONTAINS + !======================================================================= + SUBROUTINE Cleanup ( ) + + ! This subroutine cleans up the parent routine before exiting. + + ! Deallocate the Words array if it had been allocated. + + IF ( ALLOCATED( Words_Ary ) ) DEALLOCATE( Words_Ary ) + + + RETURN + + END SUBROUTINE Cleanup + +END SUBROUTINE ParseDbAry_Opt + +!======================================================================= + !> This subroutine checks the data to be parsed to make sure it finds !! the expected variable name and an associated value. SUBROUTINE ChkParseData ( Words, ExpVarName, FileName, FileLineNum, ErrVar ) @@ -546,6 +1077,57 @@ SUBROUTINE ChkParseData ( Words, ExpVarName, FileName, FileLineNum, ErrVar ) END SUBROUTINE ChkParseData +SUBROUTINE FindLine(FileLines, ParamName, FoundLine, Line, LineNum, AryLen) + CHARACTER(*), INTENT(IN ), DIMENSION(:) :: FileLines ! Input file unit + CHARACTER(*), INTENT(IN) :: ParamName !< The array name we are trying to fill. + INTEGER(IntKi), INTENT(OUT) :: LineNum !< The number of the line to parse. + LOGICAL, INTENT(OUT) :: FoundLine + INTEGER(IntKi), OPTIONAL, INTENT(IN ) :: AryLen + CHARACTER(MaxLineLength), INTENT(OUT) :: Line + + + CHARACTER(MaxParamLength), ALLOCATABLE :: Words(:) ! The two "words" parsed from the line + + CHARACTER(MaxParamLength) :: ParamNameUC, FileLineUC + INTEGER(IntKi) :: I, WordInd + + IF (.NOT. PRESENT(AryLen)) THEN + WordInd = 2 + ELSE + WordInd = AryLen + 1 + ENDIF + + ALLOCATE(Words(WordInd)) ! TODO: check error + + ! Make name uppercase + ParamNameUC = ParamName + CALL Conv2UC(ParamNameUC) + + ! Search for line in FileLines + FoundLine = .FALSE. + LineNum = 0 + DO I = 1,SIZE(FileLines) + + ! Separate line string into 2 words + CALL GetWords ( FileLines(I), Words, WordInd ) + + ! Make FileLines uppercase + FileLineUC = Words(WordInd) + CALL Conv2UC(FileLineUC) + + ! WRITE(500,*) Words + + ! PRINT *, TRIM(ParamNameUC), '==', TRIM(FileLineUC), '=', TRIM(FileLineUC)==TRIM(ParamNameUC) + + IF (FileLineUC == ParamNameUC) THEN + Line = FileLines(I) + LineNum = I + FoundLine = .TRUE. + END IF + END DO + +END subroutine FindLine + !======================================================================= subroutine ReadEmptyLine(Un,CurLine) INTEGER(IntKi), INTENT(IN ) :: Un ! Input file unit @@ -1037,5 +1619,101 @@ FUNCTION Int2LStr ( Num ) RETURN END FUNCTION Int2LStr +!======================================================================= + + subroutine AddToList(list, element) + ! Credit to: https://stackoverflow.com/questions/28048508/how-to-add-new-element-to-dynamical-array-in-fortran-90 + ! This is set up for integers, will need to make interface for other types + IMPLICIT NONE + + integer :: i, isize + Integer(IntKi), intent(in) :: element + Integer(IntKi), dimension(:), allocatable, intent(inout) :: list + Integer(IntKi), dimension(:), allocatable :: clist + + + if(allocated(list)) then + isize = size(list) + allocate(clist(isize+1)) + do i=1,isize + clist(i) = list(i) + end do + clist(isize+1) = element + + deallocate(list) + call move_alloc(clist, list) + + else + allocate(list(1)) + list(1) = element + end if + + + end subroutine AddToList + + !------------------------------------------------------------------------------------------------------------------------------- + ! Copied from NWTC_IO.f90 + !> This function returns a character string encoded with today's date in the form dd-mmm-ccyy. + FUNCTION CurDate( ) + + ! Function declaration. + + CHARACTER(11) :: CurDate !< 'dd-mmm-yyyy' string with the current date + + + ! Local declarations. + + CHARACTER(8) :: CDate ! String to hold the returned value from the DATE_AND_TIME subroutine call. + + + + ! Call the system date function. + + CALL DATE_AND_TIME ( CDate ) + + + ! Parse out the day. + + CurDate(1:3) = CDate(7:8)//'-' + + + ! Parse out the month. + + SELECT CASE ( CDate(5:6) ) + CASE ( '01' ) + CurDate(4:6) = 'Jan' + CASE ( '02' ) + CurDate(4:6) = 'Feb' + CASE ( '03' ) + CurDate(4:6) = 'Mar' + CASE ( '04' ) + CurDate(4:6) = 'Apr' + CASE ( '05' ) + CurDate(4:6) = 'May' + CASE ( '06' ) + CurDate(4:6) = 'Jun' + CASE ( '07' ) + CurDate(4:6) = 'Jul' + CASE ( '08' ) + CurDate(4:6) = 'Aug' + CASE ( '09' ) + CurDate(4:6) = 'Sep' + CASE ( '10' ) + CurDate(4:6) = 'Oct' + CASE ( '11' ) + CurDate(4:6) = 'Nov' + CASE ( '12' ) + CurDate(4:6) = 'Dec' + END SELECT + + + ! Parse out the year. + + CurDate(7:11) = '-'//CDate(1:4) + + + RETURN + END FUNCTION CurDate + END MODULE ROSCO_Helpers \ No newline at end of file diff --git a/ROSCO/ROSCO/src/ROSCO_IO.f90 b/ROSCO/ROSCO/src/ROSCO_IO.f90 index d495263b5..fc05e7b16 100644 --- a/ROSCO/ROSCO/src/ROSCO_IO.f90 +++ b/ROSCO/ROSCO/src/ROSCO_IO.f90 @@ -1,5 +1,5 @@ ! ROSCO IO -! This file is automatically generated by write_registry.py using ROSCO v2.6.0 +! This file is automatically generated by write_registry.py using ROSCO v2.8.0 ! For any modification to the registry, please edit the rosco_types.yaml accordingly MODULE ROSCO_IO @@ -53,6 +53,7 @@ SUBROUTINE WriteRestartFile(LocalVar, CntrPar, ErrVar, objInst, RootName, size_a WRITE( Un, IOSTAT=ErrStat) LocalVar%BlPitch(1) WRITE( Un, IOSTAT=ErrStat) LocalVar%BlPitch(2) WRITE( Un, IOSTAT=ErrStat) LocalVar%BlPitch(3) + WRITE( Un, IOSTAT=ErrStat) LocalVar%BlPitchCMeas WRITE( Un, IOSTAT=ErrStat) LocalVar%Azimuth WRITE( Un, IOSTAT=ErrStat) LocalVar%NumBl WRITE( Un, IOSTAT=ErrStat) LocalVar%FA_Acc @@ -89,10 +90,17 @@ SUBROUTINE WriteRestartFile(LocalVar, CntrPar, ErrVar, objInst, RootName, size_a WRITE( Un, IOSTAT=ErrStat) LocalVar%IPC_AxisYaw_1P WRITE( Un, IOSTAT=ErrStat) LocalVar%IPC_AxisTilt_2P WRITE( Un, IOSTAT=ErrStat) LocalVar%IPC_AxisYaw_2P + WRITE( Un, IOSTAT=ErrStat) LocalVar%axisTilt_1P + WRITE( Un, IOSTAT=ErrStat) LocalVar%axisYaw_1P + WRITE( Un, IOSTAT=ErrStat) LocalVar%axisYawF_1P + WRITE( Un, IOSTAT=ErrStat) LocalVar%axisTilt_2P + WRITE( Un, IOSTAT=ErrStat) LocalVar%axisYaw_2P + WRITE( Un, IOSTAT=ErrStat) LocalVar%axisYawF_2P WRITE( Un, IOSTAT=ErrStat) LocalVar%IPC_KI(1) WRITE( Un, IOSTAT=ErrStat) LocalVar%IPC_KI(2) WRITE( Un, IOSTAT=ErrStat) LocalVar%IPC_KP(1) WRITE( Un, IOSTAT=ErrStat) LocalVar%IPC_KP(2) + WRITE( Un, IOSTAT=ErrStat) LocalVar%IPC_IntSat WRITE( Un, IOSTAT=ErrStat) LocalVar%PC_State WRITE( Un, IOSTAT=ErrStat) LocalVar%PitCom(1) WRITE( Un, IOSTAT=ErrStat) LocalVar%PitCom(2) @@ -120,6 +128,72 @@ SUBROUTINE WriteRestartFile(LocalVar, CntrPar, ErrVar, objInst, RootName, size_a WRITE( Un, IOSTAT=ErrStat) LocalVar%Fl_PitCom WRITE( Un, IOSTAT=ErrStat) LocalVar%NACIMU_FA_AccF WRITE( Un, IOSTAT=ErrStat) LocalVar%FA_AccF + WRITE( Un, IOSTAT=ErrStat) LocalVar%PtfmTDX + WRITE( Un, IOSTAT=ErrStat) LocalVar%PtfmTDY + WRITE( Un, IOSTAT=ErrStat) LocalVar%PtfmTDZ + WRITE( Un, IOSTAT=ErrStat) LocalVar%PtfmRDX + WRITE( Un, IOSTAT=ErrStat) LocalVar%PtfmRDY + WRITE( Un, IOSTAT=ErrStat) LocalVar%PtfmRDZ + WRITE( Un, IOSTAT=ErrStat) LocalVar%PtfmTVX + WRITE( Un, IOSTAT=ErrStat) LocalVar%PtfmTVY + WRITE( Un, IOSTAT=ErrStat) LocalVar%PtfmTVZ + WRITE( Un, IOSTAT=ErrStat) LocalVar%PtfmRVX + WRITE( Un, IOSTAT=ErrStat) LocalVar%PtfmRVY + WRITE( Un, IOSTAT=ErrStat) LocalVar%PtfmRVZ + WRITE( Un, IOSTAT=ErrStat) LocalVar%PtfmTAX + WRITE( Un, IOSTAT=ErrStat) LocalVar%PtfmTAY + WRITE( Un, IOSTAT=ErrStat) LocalVar%PtfmTAZ + WRITE( Un, IOSTAT=ErrStat) LocalVar%PtfmRAX + WRITE( Un, IOSTAT=ErrStat) LocalVar%PtfmRAY + WRITE( Un, IOSTAT=ErrStat) LocalVar%PtfmRAZ + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_DesiredL(1) + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_DesiredL(2) + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_DesiredL(3) + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_DesiredL(4) + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_DesiredL(5) + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_DesiredL(6) + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_DesiredL(7) + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_DesiredL(8) + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_DesiredL(9) + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_DesiredL(10) + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_DesiredL(11) + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_DesiredL(12) + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedL(1) + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedL(2) + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedL(3) + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedL(4) + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedL(5) + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedL(6) + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedL(7) + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedL(8) + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedL(9) + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedL(10) + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedL(11) + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedL(12) + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedDL(1) + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedDL(2) + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedDL(3) + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedDL(4) + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedDL(5) + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedDL(6) + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedDL(7) + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedDL(8) + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedDL(9) + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedDL(10) + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedDL(11) + WRITE( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedDL(12) + WRITE( Un, IOSTAT=ErrStat) LocalVar%StC_Input(1) + WRITE( Un, IOSTAT=ErrStat) LocalVar%StC_Input(2) + WRITE( Un, IOSTAT=ErrStat) LocalVar%StC_Input(3) + WRITE( Un, IOSTAT=ErrStat) LocalVar%StC_Input(4) + WRITE( Un, IOSTAT=ErrStat) LocalVar%StC_Input(5) + WRITE( Un, IOSTAT=ErrStat) LocalVar%StC_Input(6) + WRITE( Un, IOSTAT=ErrStat) LocalVar%StC_Input(7) + WRITE( Un, IOSTAT=ErrStat) LocalVar%StC_Input(8) + WRITE( Un, IOSTAT=ErrStat) LocalVar%StC_Input(9) + WRITE( Un, IOSTAT=ErrStat) LocalVar%StC_Input(10) + WRITE( Un, IOSTAT=ErrStat) LocalVar%StC_Input(11) + WRITE( Un, IOSTAT=ErrStat) LocalVar%StC_Input(12) WRITE( Un, IOSTAT=ErrStat) LocalVar%Flp_Angle(1) WRITE( Un, IOSTAT=ErrStat) LocalVar%Flp_Angle(2) WRITE( Un, IOSTAT=ErrStat) LocalVar%Flp_Angle(3) @@ -129,6 +203,9 @@ SUBROUTINE WriteRestartFile(LocalVar, CntrPar, ErrVar, objInst, RootName, size_a WRITE( Un, IOSTAT=ErrStat) LocalVar%ACC_INFILE_SIZE WRITE( Un, IOSTAT=ErrStat) LocalVar%ACC_INFILE WRITE( Un, IOSTAT=ErrStat) LocalVar%restart + WRITE( Un, IOSTAT=ErrStat) LocalVar%AWC_complexangle(1) + WRITE( Un, IOSTAT=ErrStat) LocalVar%AWC_complexangle(2) + WRITE( Un, IOSTAT=ErrStat) LocalVar%AWC_complexangle(3) WRITE( Un, IOSTAT=ErrStat) LocalVar%WE%om_r WRITE( Un, IOSTAT=ErrStat) LocalVar%WE%v_t WRITE( Un, IOSTAT=ErrStat) LocalVar%WE%v_m @@ -152,6 +229,16 @@ SUBROUTINE WriteRestartFile(LocalVar, CntrPar, ErrVar, objInst, RootName, size_a WRITE( Un, IOSTAT=ErrStat) LocalVar%FP%lpf2_OutputSignalLast2 WRITE( Un, IOSTAT=ErrStat) LocalVar%FP%lpf2_InputSignalLast1 WRITE( Un, IOSTAT=ErrStat) LocalVar%FP%lpf2_OutputSignalLast1 + WRITE( Un, IOSTAT=ErrStat) LocalVar%FP%lpfV_a2 + WRITE( Un, IOSTAT=ErrStat) LocalVar%FP%lpfV_a1 + WRITE( Un, IOSTAT=ErrStat) LocalVar%FP%lpfV_a0 + WRITE( Un, IOSTAT=ErrStat) LocalVar%FP%lpfV_b2 + WRITE( Un, IOSTAT=ErrStat) LocalVar%FP%lpfV_b1 + WRITE( Un, IOSTAT=ErrStat) LocalVar%FP%lpfV_b0 + WRITE( Un, IOSTAT=ErrStat) LocalVar%FP%lpfV_InputSignalLast2 + WRITE( Un, IOSTAT=ErrStat) LocalVar%FP%lpfV_OutputSignalLast2 + WRITE( Un, IOSTAT=ErrStat) LocalVar%FP%lpfV_InputSignalLast1 + WRITE( Un, IOSTAT=ErrStat) LocalVar%FP%lpfV_OutputSignalLast1 WRITE( Un, IOSTAT=ErrStat) LocalVar%FP%hpf_InputSignalLast WRITE( Un, IOSTAT=ErrStat) LocalVar%FP%hpf_OutputSignalLast WRITE( Un, IOSTAT=ErrStat) LocalVar%FP%nfs_OutputSignalLast1 @@ -176,12 +263,15 @@ SUBROUTINE WriteRestartFile(LocalVar, CntrPar, ErrVar, objInst, RootName, size_a WRITE( Un, IOSTAT=ErrStat) LocalVar%piP%ITermLast WRITE( Un, IOSTAT=ErrStat) LocalVar%piP%ITerm2 WRITE( Un, IOSTAT=ErrStat) LocalVar%piP%ITermLast2 + WRITE( Un, IOSTAT=ErrStat) LocalVar%rlP%LastSignal WRITE( Un, IOSTAT=ErrStat) objInst%instLPF WRITE( Un, IOSTAT=ErrStat) objInst%instSecLPF + WRITE( Un, IOSTAT=ErrStat) objInst%instSecLPFV WRITE( Un, IOSTAT=ErrStat) objInst%instHPF WRITE( Un, IOSTAT=ErrStat) objInst%instNotchSlopes WRITE( Un, IOSTAT=ErrStat) objInst%instNotch WRITE( Un, IOSTAT=ErrStat) objInst%instPI + WRITE( Un, IOSTAT=ErrStat) objInst%instRL Close ( Un ) ENDIF END SUBROUTINE WriteRestartFile @@ -194,7 +284,7 @@ SUBROUTINE ReadRestartFile(avrSWAP, LocalVar, CntrPar, objInst, PerfData, RootNa TYPE(PerformanceData), INTENT(INOUT) :: PerfData TYPE(ErrorVariables), INTENT(INOUT) :: ErrVar TYPE(ZMQ_Variables), INTENT(INOUT) :: zmqVar - REAL(C_FLOAT), INTENT(IN) :: avrSWAP(*) + REAL(ReKi), INTENT(IN) :: avrSWAP(*) INTEGER(IntKi), INTENT(IN) :: size_avcOUTNAME CHARACTER(size_avcOUTNAME-1), INTENT(IN) :: RootName @@ -232,6 +322,7 @@ SUBROUTINE ReadRestartFile(avrSWAP, LocalVar, CntrPar, objInst, PerfData, RootNa READ( Un, IOSTAT=ErrStat) LocalVar%BlPitch(1) READ( Un, IOSTAT=ErrStat) LocalVar%BlPitch(2) READ( Un, IOSTAT=ErrStat) LocalVar%BlPitch(3) + READ( Un, IOSTAT=ErrStat) LocalVar%BlPitchCMeas READ( Un, IOSTAT=ErrStat) LocalVar%Azimuth READ( Un, IOSTAT=ErrStat) LocalVar%NumBl READ( Un, IOSTAT=ErrStat) LocalVar%FA_Acc @@ -268,10 +359,17 @@ SUBROUTINE ReadRestartFile(avrSWAP, LocalVar, CntrPar, objInst, PerfData, RootNa READ( Un, IOSTAT=ErrStat) LocalVar%IPC_AxisYaw_1P READ( Un, IOSTAT=ErrStat) LocalVar%IPC_AxisTilt_2P READ( Un, IOSTAT=ErrStat) LocalVar%IPC_AxisYaw_2P + READ( Un, IOSTAT=ErrStat) LocalVar%axisTilt_1P + READ( Un, IOSTAT=ErrStat) LocalVar%axisYaw_1P + READ( Un, IOSTAT=ErrStat) LocalVar%axisYawF_1P + READ( Un, IOSTAT=ErrStat) LocalVar%axisTilt_2P + READ( Un, IOSTAT=ErrStat) LocalVar%axisYaw_2P + READ( Un, IOSTAT=ErrStat) LocalVar%axisYawF_2P READ( Un, IOSTAT=ErrStat) LocalVar%IPC_KI(1) READ( Un, IOSTAT=ErrStat) LocalVar%IPC_KI(2) READ( Un, IOSTAT=ErrStat) LocalVar%IPC_KP(1) READ( Un, IOSTAT=ErrStat) LocalVar%IPC_KP(2) + READ( Un, IOSTAT=ErrStat) LocalVar%IPC_IntSat READ( Un, IOSTAT=ErrStat) LocalVar%PC_State READ( Un, IOSTAT=ErrStat) LocalVar%PitCom(1) READ( Un, IOSTAT=ErrStat) LocalVar%PitCom(2) @@ -299,6 +397,72 @@ SUBROUTINE ReadRestartFile(avrSWAP, LocalVar, CntrPar, objInst, PerfData, RootNa READ( Un, IOSTAT=ErrStat) LocalVar%Fl_PitCom READ( Un, IOSTAT=ErrStat) LocalVar%NACIMU_FA_AccF READ( Un, IOSTAT=ErrStat) LocalVar%FA_AccF + READ( Un, IOSTAT=ErrStat) LocalVar%PtfmTDX + READ( Un, IOSTAT=ErrStat) LocalVar%PtfmTDY + READ( Un, IOSTAT=ErrStat) LocalVar%PtfmTDZ + READ( Un, IOSTAT=ErrStat) LocalVar%PtfmRDX + READ( Un, IOSTAT=ErrStat) LocalVar%PtfmRDY + READ( Un, IOSTAT=ErrStat) LocalVar%PtfmRDZ + READ( Un, IOSTAT=ErrStat) LocalVar%PtfmTVX + READ( Un, IOSTAT=ErrStat) LocalVar%PtfmTVY + READ( Un, IOSTAT=ErrStat) LocalVar%PtfmTVZ + READ( Un, IOSTAT=ErrStat) LocalVar%PtfmRVX + READ( Un, IOSTAT=ErrStat) LocalVar%PtfmRVY + READ( Un, IOSTAT=ErrStat) LocalVar%PtfmRVZ + READ( Un, IOSTAT=ErrStat) LocalVar%PtfmTAX + READ( Un, IOSTAT=ErrStat) LocalVar%PtfmTAY + READ( Un, IOSTAT=ErrStat) LocalVar%PtfmTAZ + READ( Un, IOSTAT=ErrStat) LocalVar%PtfmRAX + READ( Un, IOSTAT=ErrStat) LocalVar%PtfmRAY + READ( Un, IOSTAT=ErrStat) LocalVar%PtfmRAZ + READ( Un, IOSTAT=ErrStat) LocalVar%CC_DesiredL(1) + READ( Un, IOSTAT=ErrStat) LocalVar%CC_DesiredL(2) + READ( Un, IOSTAT=ErrStat) LocalVar%CC_DesiredL(3) + READ( Un, IOSTAT=ErrStat) LocalVar%CC_DesiredL(4) + READ( Un, IOSTAT=ErrStat) LocalVar%CC_DesiredL(5) + READ( Un, IOSTAT=ErrStat) LocalVar%CC_DesiredL(6) + READ( Un, IOSTAT=ErrStat) LocalVar%CC_DesiredL(7) + READ( Un, IOSTAT=ErrStat) LocalVar%CC_DesiredL(8) + READ( Un, IOSTAT=ErrStat) LocalVar%CC_DesiredL(9) + READ( Un, IOSTAT=ErrStat) LocalVar%CC_DesiredL(10) + READ( Un, IOSTAT=ErrStat) LocalVar%CC_DesiredL(11) + READ( Un, IOSTAT=ErrStat) LocalVar%CC_DesiredL(12) + READ( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedL(1) + READ( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedL(2) + READ( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedL(3) + READ( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedL(4) + READ( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedL(5) + READ( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedL(6) + READ( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedL(7) + READ( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedL(8) + READ( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedL(9) + READ( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedL(10) + READ( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedL(11) + READ( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedL(12) + READ( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedDL(1) + READ( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedDL(2) + READ( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedDL(3) + READ( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedDL(4) + READ( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedDL(5) + READ( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedDL(6) + READ( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedDL(7) + READ( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedDL(8) + READ( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedDL(9) + READ( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedDL(10) + READ( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedDL(11) + READ( Un, IOSTAT=ErrStat) LocalVar%CC_ActuatedDL(12) + READ( Un, IOSTAT=ErrStat) LocalVar%StC_Input(1) + READ( Un, IOSTAT=ErrStat) LocalVar%StC_Input(2) + READ( Un, IOSTAT=ErrStat) LocalVar%StC_Input(3) + READ( Un, IOSTAT=ErrStat) LocalVar%StC_Input(4) + READ( Un, IOSTAT=ErrStat) LocalVar%StC_Input(5) + READ( Un, IOSTAT=ErrStat) LocalVar%StC_Input(6) + READ( Un, IOSTAT=ErrStat) LocalVar%StC_Input(7) + READ( Un, IOSTAT=ErrStat) LocalVar%StC_Input(8) + READ( Un, IOSTAT=ErrStat) LocalVar%StC_Input(9) + READ( Un, IOSTAT=ErrStat) LocalVar%StC_Input(10) + READ( Un, IOSTAT=ErrStat) LocalVar%StC_Input(11) + READ( Un, IOSTAT=ErrStat) LocalVar%StC_Input(12) READ( Un, IOSTAT=ErrStat) LocalVar%Flp_Angle(1) READ( Un, IOSTAT=ErrStat) LocalVar%Flp_Angle(2) READ( Un, IOSTAT=ErrStat) LocalVar%Flp_Angle(3) @@ -309,6 +473,9 @@ SUBROUTINE ReadRestartFile(avrSWAP, LocalVar, CntrPar, objInst, PerfData, RootNa ALLOCATE(LocalVar%ACC_INFILE(LocalVar%ACC_INFILE_SIZE)) READ( Un, IOSTAT=ErrStat) LocalVar%ACC_INFILE READ( Un, IOSTAT=ErrStat) LocalVar%restart + READ( Un, IOSTAT=ErrStat) LocalVar%AWC_complexangle(1) + READ( Un, IOSTAT=ErrStat) LocalVar%AWC_complexangle(2) + READ( Un, IOSTAT=ErrStat) LocalVar%AWC_complexangle(3) READ( Un, IOSTAT=ErrStat) LocalVar%WE%om_r READ( Un, IOSTAT=ErrStat) LocalVar%WE%v_t READ( Un, IOSTAT=ErrStat) LocalVar%WE%v_m @@ -332,6 +499,16 @@ SUBROUTINE ReadRestartFile(avrSWAP, LocalVar, CntrPar, objInst, PerfData, RootNa READ( Un, IOSTAT=ErrStat) LocalVar%FP%lpf2_OutputSignalLast2 READ( Un, IOSTAT=ErrStat) LocalVar%FP%lpf2_InputSignalLast1 READ( Un, IOSTAT=ErrStat) LocalVar%FP%lpf2_OutputSignalLast1 + READ( Un, IOSTAT=ErrStat) LocalVar%FP%lpfV_a2 + READ( Un, IOSTAT=ErrStat) LocalVar%FP%lpfV_a1 + READ( Un, IOSTAT=ErrStat) LocalVar%FP%lpfV_a0 + READ( Un, IOSTAT=ErrStat) LocalVar%FP%lpfV_b2 + READ( Un, IOSTAT=ErrStat) LocalVar%FP%lpfV_b1 + READ( Un, IOSTAT=ErrStat) LocalVar%FP%lpfV_b0 + READ( Un, IOSTAT=ErrStat) LocalVar%FP%lpfV_InputSignalLast2 + READ( Un, IOSTAT=ErrStat) LocalVar%FP%lpfV_OutputSignalLast2 + READ( Un, IOSTAT=ErrStat) LocalVar%FP%lpfV_InputSignalLast1 + READ( Un, IOSTAT=ErrStat) LocalVar%FP%lpfV_OutputSignalLast1 READ( Un, IOSTAT=ErrStat) LocalVar%FP%hpf_InputSignalLast READ( Un, IOSTAT=ErrStat) LocalVar%FP%hpf_OutputSignalLast READ( Un, IOSTAT=ErrStat) LocalVar%FP%nfs_OutputSignalLast1 @@ -356,16 +533,19 @@ SUBROUTINE ReadRestartFile(avrSWAP, LocalVar, CntrPar, objInst, PerfData, RootNa READ( Un, IOSTAT=ErrStat) LocalVar%piP%ITermLast READ( Un, IOSTAT=ErrStat) LocalVar%piP%ITerm2 READ( Un, IOSTAT=ErrStat) LocalVar%piP%ITermLast2 + READ( Un, IOSTAT=ErrStat) LocalVar%rlP%LastSignal READ( Un, IOSTAT=ErrStat) objInst%instLPF READ( Un, IOSTAT=ErrStat) objInst%instSecLPF + READ( Un, IOSTAT=ErrStat) objInst%instSecLPFV READ( Un, IOSTAT=ErrStat) objInst%instHPF READ( Un, IOSTAT=ErrStat) objInst%instNotchSlopes READ( Un, IOSTAT=ErrStat) objInst%instNotch READ( Un, IOSTAT=ErrStat) objInst%instPI + READ( Un, IOSTAT=ErrStat) objInst%instRL Close ( Un ) ENDIF ! Read Parameter files - CALL ReadControlParameterFileSub(CntrPar, zmqVar, LocalVar%ACC_INFILE, LocalVar%ACC_INFILE_SIZE, ErrVar) + CALL ReadControlParameterFileSub(CntrPar, zmqVar, LocalVar%ACC_INFILE, LocalVar%ACC_INFILE_SIZE, RootName, ErrVar) IF (CntrPar%WE_Mode > 0) THEN CALL READCpFile(CntrPar, PerfData, ErrVar) ENDIF @@ -383,7 +563,7 @@ SUBROUTINE Debug(LocalVar, CntrPar, DebugVar, ErrVar, avrSWAP, RootName, size_av INTEGER(IntKi), INTENT(IN) :: size_avcOUTNAME INTEGER(IntKi) :: I , nDebugOuts, nLocalVars ! Generic index. CHARACTER(1), PARAMETER :: Tab = CHAR(9) ! The tab character. - CHARACTER(29), PARAMETER :: FmtDat = "(F20.5,TR5,99(ES20.5E2,TR5:))" ! The format of the debugging data + CHARACTER(100) :: FmtDat ! The format of the debugging data INTEGER(IntKi), SAVE :: UnDb ! I/O unit for the debugging information INTEGER(IntKi), SAVE :: UnDb2 ! I/O unit for the debugging information, avrSWAP INTEGER(IntKi), SAVE :: UnDb3 ! I/O unit for the debugging information, avrSWAP @@ -391,6 +571,13 @@ SUBROUTINE Debug(LocalVar, CntrPar, DebugVar, ErrVar, avrSWAP, RootName, size_av CHARACTER(size_avcOUTNAME-1), INTENT(IN) :: RootName ! a Fortran version of the input C string (not considered an array here) [subtract 1 for the C null-character] CHARACTER(200) :: Version ! git version of ROSCO CHARACTER(15), ALLOCATABLE :: DebugOutStrings(:), DebugOutUnits(:) + + ! Avr output writing + INTEGER(IntKi), SAVE, DIMENSION(:), ALLOCATABLE :: avrIndices + INTEGER(IntKi) :: avrBaseLength = 85 + INTEGER(IntKi) :: Ind + CHARACTER(100) :: avrFmt + REAL(DbKi), ALLOCATABLE :: DebugOutData(:) CHARACTER(15), ALLOCATABLE :: LocalVarOutStrings(:) @@ -422,19 +609,19 @@ SUBROUTINE Debug(LocalVar, CntrPar, DebugVar, ErrVar, avrSWAP, RootName, size_av DebugOutData(20) = DebugVar%YawRateCom DebugOutData(21) = DebugVar%NacHeadingTarget DebugOutData(22) = DebugVar%NacVaneOffset - DebugOutData(23) = DebugVar%Yaw_err + DebugOutData(23) = DebugVar%Yaw_Err DebugOutData(24) = DebugVar%YawState DebugOutStrings = [CHARACTER(15) :: 'WE_Cp', 'WE_b', 'WE_w', 'WE_t', 'WE_Vm', & 'WE_Vt', 'WE_Vw', 'WE_lambda', 'PC_PICommand', 'GenSpeedF', & 'RotSpeedF', 'NacIMU_FA_AccF', 'FA_AccF', 'Fl_PitCom', 'PC_MinPit', & 'axisTilt_1P', 'axisYaw_1P', 'axisTilt_2P', 'axisYaw_2P', 'YawRateCom', & - 'NacHeadingTarget', 'NacVaneOffset', 'Yaw_err', 'YawState'] + 'NacHeadingTarget', 'NacVaneOffset', 'Yaw_Err', 'YawState'] DebugOutUnits = [CHARACTER(15) :: '[-]', '[-]', '[-]', '[-]', '[m/s]', & '[m/s]', '[m/s]', '[rad]', '[rad]', '[rad/s]', & '[rad/s]', '[rad/s]', '[m/s]', '[rad]', '[rad]', & - '', '', '', '', '[rad/s]', & - '[rad]', '[rad]', '[rad]', ''] - nLocalVars = 69 + '[N/A]', '[N/A]', '[N/A]', '[N/A]', '[rad/s]', & + '[deg]', '[deg]', '[deg]', '[N/A]'] + nLocalVars = 100 Allocate(LocalVarOutData(nLocalVars)) Allocate(LocalVarOutStrings(nLocalVars)) LocalVarOutData(1) = LocalVar%iStatus @@ -449,77 +636,115 @@ SUBROUTINE Debug(LocalVar, CntrPar, DebugVar, ErrVar, avrSWAP, RootName, size_av LocalVarOutData(10) = LocalVar%rootMOOP(1) LocalVarOutData(11) = LocalVar%rootMOOPF(1) LocalVarOutData(12) = LocalVar%BlPitch(1) - LocalVarOutData(13) = LocalVar%Azimuth - LocalVarOutData(14) = LocalVar%NumBl - LocalVarOutData(15) = LocalVar%FA_Acc - LocalVarOutData(16) = LocalVar%NacIMU_FA_Acc - LocalVarOutData(17) = LocalVar%FA_AccHPF - LocalVarOutData(18) = LocalVar%FA_AccHPFI - LocalVarOutData(19) = LocalVar%FA_PitCom(1) - LocalVarOutData(20) = LocalVar%RotSpeedF - LocalVarOutData(21) = LocalVar%GenSpeedF - LocalVarOutData(22) = LocalVar%GenTq - LocalVarOutData(23) = LocalVar%GenTqMeas - LocalVarOutData(24) = LocalVar%GenArTq - LocalVarOutData(25) = LocalVar%GenBrTq - LocalVarOutData(26) = LocalVar%IPC_PitComF(1) - LocalVarOutData(27) = LocalVar%PC_KP - LocalVarOutData(28) = LocalVar%PC_KI - LocalVarOutData(29) = LocalVar%PC_KD - LocalVarOutData(30) = LocalVar%PC_TF - LocalVarOutData(31) = LocalVar%PC_MaxPit - LocalVarOutData(32) = LocalVar%PC_MinPit - LocalVarOutData(33) = LocalVar%PC_PitComT - LocalVarOutData(34) = LocalVar%PC_PitComT_Last - LocalVarOutData(35) = LocalVar%PC_PitComTF - LocalVarOutData(36) = LocalVar%PC_PitComT_IPC(1) - LocalVarOutData(37) = LocalVar%PC_PwrErr - LocalVarOutData(38) = LocalVar%PC_SpdErr - LocalVarOutData(39) = LocalVar%IPC_AxisTilt_1P - LocalVarOutData(40) = LocalVar%IPC_AxisYaw_1P - LocalVarOutData(41) = LocalVar%IPC_AxisTilt_2P - LocalVarOutData(42) = LocalVar%IPC_AxisYaw_2P - LocalVarOutData(43) = LocalVar%IPC_KI(1) - LocalVarOutData(44) = LocalVar%IPC_KP(1) - LocalVarOutData(45) = LocalVar%PC_State - LocalVarOutData(46) = LocalVar%PitCom(1) - LocalVarOutData(47) = LocalVar%PitComAct(1) - LocalVarOutData(48) = LocalVar%SS_DelOmegaF - LocalVarOutData(49) = LocalVar%TestType - LocalVarOutData(50) = LocalVar%VS_MaxTq - LocalVarOutData(51) = LocalVar%VS_LastGenTrq - LocalVarOutData(52) = LocalVar%VS_LastGenPwr - LocalVarOutData(53) = LocalVar%VS_MechGenPwr - LocalVarOutData(54) = LocalVar%VS_SpdErrAr - LocalVarOutData(55) = LocalVar%VS_SpdErrBr - LocalVarOutData(56) = LocalVar%VS_SpdErr - LocalVarOutData(57) = LocalVar%VS_State - LocalVarOutData(58) = LocalVar%VS_Rgn3Pitch - LocalVarOutData(59) = LocalVar%WE_Vw - LocalVarOutData(60) = LocalVar%WE_Vw_F - LocalVarOutData(61) = LocalVar%WE_VwI - LocalVarOutData(62) = LocalVar%WE_VwIdot - LocalVarOutData(63) = LocalVar%VS_LastGenTrqF - LocalVarOutData(64) = LocalVar%Fl_PitCom - LocalVarOutData(65) = LocalVar%NACIMU_FA_AccF - LocalVarOutData(66) = LocalVar%FA_AccF - LocalVarOutData(67) = LocalVar%Flp_Angle(1) - LocalVarOutData(68) = LocalVar%RootMyb_Last(1) - LocalVarOutData(69) = LocalVar%ACC_INFILE_SIZE + LocalVarOutData(13) = LocalVar%BlPitchCMeas + LocalVarOutData(14) = LocalVar%Azimuth + LocalVarOutData(15) = LocalVar%NumBl + LocalVarOutData(16) = LocalVar%FA_Acc + LocalVarOutData(17) = LocalVar%NacIMU_FA_Acc + LocalVarOutData(18) = LocalVar%FA_AccHPF + LocalVarOutData(19) = LocalVar%FA_AccHPFI + LocalVarOutData(20) = LocalVar%FA_PitCom(1) + LocalVarOutData(21) = LocalVar%RotSpeedF + LocalVarOutData(22) = LocalVar%GenSpeedF + LocalVarOutData(23) = LocalVar%GenTq + LocalVarOutData(24) = LocalVar%GenTqMeas + LocalVarOutData(25) = LocalVar%GenArTq + LocalVarOutData(26) = LocalVar%GenBrTq + LocalVarOutData(27) = LocalVar%IPC_PitComF(1) + LocalVarOutData(28) = LocalVar%PC_KP + LocalVarOutData(29) = LocalVar%PC_KI + LocalVarOutData(30) = LocalVar%PC_KD + LocalVarOutData(31) = LocalVar%PC_TF + LocalVarOutData(32) = LocalVar%PC_MaxPit + LocalVarOutData(33) = LocalVar%PC_MinPit + LocalVarOutData(34) = LocalVar%PC_PitComT + LocalVarOutData(35) = LocalVar%PC_PitComT_Last + LocalVarOutData(36) = LocalVar%PC_PitComTF + LocalVarOutData(37) = LocalVar%PC_PitComT_IPC(1) + LocalVarOutData(38) = LocalVar%PC_PwrErr + LocalVarOutData(39) = LocalVar%PC_SpdErr + LocalVarOutData(40) = LocalVar%IPC_AxisTilt_1P + LocalVarOutData(41) = LocalVar%IPC_AxisYaw_1P + LocalVarOutData(42) = LocalVar%IPC_AxisTilt_2P + LocalVarOutData(43) = LocalVar%IPC_AxisYaw_2P + LocalVarOutData(44) = LocalVar%axisTilt_1P + LocalVarOutData(45) = LocalVar%axisYaw_1P + LocalVarOutData(46) = LocalVar%axisYawF_1P + LocalVarOutData(47) = LocalVar%axisTilt_2P + LocalVarOutData(48) = LocalVar%axisYaw_2P + LocalVarOutData(49) = LocalVar%axisYawF_2P + LocalVarOutData(50) = LocalVar%IPC_KI(1) + LocalVarOutData(51) = LocalVar%IPC_KP(1) + LocalVarOutData(52) = LocalVar%IPC_IntSat + LocalVarOutData(53) = LocalVar%PC_State + LocalVarOutData(54) = LocalVar%PitCom(1) + LocalVarOutData(55) = LocalVar%PitComAct(1) + LocalVarOutData(56) = LocalVar%SS_DelOmegaF + LocalVarOutData(57) = LocalVar%TestType + LocalVarOutData(58) = LocalVar%VS_MaxTq + LocalVarOutData(59) = LocalVar%VS_LastGenTrq + LocalVarOutData(60) = LocalVar%VS_LastGenPwr + LocalVarOutData(61) = LocalVar%VS_MechGenPwr + LocalVarOutData(62) = LocalVar%VS_SpdErrAr + LocalVarOutData(63) = LocalVar%VS_SpdErrBr + LocalVarOutData(64) = LocalVar%VS_SpdErr + LocalVarOutData(65) = LocalVar%VS_State + LocalVarOutData(66) = LocalVar%VS_Rgn3Pitch + LocalVarOutData(67) = LocalVar%WE_Vw + LocalVarOutData(68) = LocalVar%WE_Vw_F + LocalVarOutData(69) = LocalVar%WE_VwI + LocalVarOutData(70) = LocalVar%WE_VwIdot + LocalVarOutData(71) = LocalVar%VS_LastGenTrqF + LocalVarOutData(72) = LocalVar%Fl_PitCom + LocalVarOutData(73) = LocalVar%NACIMU_FA_AccF + LocalVarOutData(74) = LocalVar%FA_AccF + LocalVarOutData(75) = LocalVar%PtfmTDX + LocalVarOutData(76) = LocalVar%PtfmTDY + LocalVarOutData(77) = LocalVar%PtfmTDZ + LocalVarOutData(78) = LocalVar%PtfmRDX + LocalVarOutData(79) = LocalVar%PtfmRDY + LocalVarOutData(80) = LocalVar%PtfmRDZ + LocalVarOutData(81) = LocalVar%PtfmTVX + LocalVarOutData(82) = LocalVar%PtfmTVY + LocalVarOutData(83) = LocalVar%PtfmTVZ + LocalVarOutData(84) = LocalVar%PtfmRVX + LocalVarOutData(85) = LocalVar%PtfmRVY + LocalVarOutData(86) = LocalVar%PtfmRVZ + LocalVarOutData(87) = LocalVar%PtfmTAX + LocalVarOutData(88) = LocalVar%PtfmTAY + LocalVarOutData(89) = LocalVar%PtfmTAZ + LocalVarOutData(90) = LocalVar%PtfmRAX + LocalVarOutData(91) = LocalVar%PtfmRAY + LocalVarOutData(92) = LocalVar%PtfmRAZ + LocalVarOutData(93) = LocalVar%CC_DesiredL(1) + LocalVarOutData(94) = LocalVar%CC_ActuatedL(1) + LocalVarOutData(95) = LocalVar%CC_ActuatedDL(1) + LocalVarOutData(96) = LocalVar%StC_Input(1) + LocalVarOutData(97) = LocalVar%Flp_Angle(1) + LocalVarOutData(98) = LocalVar%RootMyb_Last(1) + LocalVarOutData(99) = LocalVar%ACC_INFILE_SIZE + LocalVarOutData(100) = LocalVar%AWC_complexangle(1) LocalVarOutStrings = [CHARACTER(15) :: 'iStatus', 'Time', 'DT', 'VS_GenPwr', 'GenSpeed', & 'RotSpeed', 'NacHeading', 'NacVane', 'HorWindV', 'rootMOOP', & - 'rootMOOPF', 'BlPitch', 'Azimuth', 'NumBl', 'FA_Acc', & - 'NacIMU_FA_Acc', 'FA_AccHPF', 'FA_AccHPFI', 'FA_PitCom', 'RotSpeedF', & - 'GenSpeedF', 'GenTq', 'GenTqMeas', 'GenArTq', 'GenBrTq', & - 'IPC_PitComF', 'PC_KP', 'PC_KI', 'PC_KD', 'PC_TF', & - 'PC_MaxPit', 'PC_MinPit', 'PC_PitComT', 'PC_PitComT_Last', 'PC_PitComTF', & - 'PC_PitComT_IPC', 'PC_PwrErr', 'PC_SpdErr', 'IPC_AxisTilt_1P', 'IPC_AxisYaw_1P', & - 'IPC_AxisTilt_2P', 'IPC_AxisYaw_2P', 'IPC_KI', 'IPC_KP', 'PC_State', & - 'PitCom', 'PitComAct', 'SS_DelOmegaF', 'TestType', 'VS_MaxTq', & - 'VS_LastGenTrq', 'VS_LastGenPwr', 'VS_MechGenPwr', 'VS_SpdErrAr', 'VS_SpdErrBr', & - 'VS_SpdErr', 'VS_State', 'VS_Rgn3Pitch', 'WE_Vw', 'WE_Vw_F', & - 'WE_VwI', 'WE_VwIdot', 'VS_LastGenTrqF', 'Fl_PitCom', 'NACIMU_FA_AccF', & - 'FA_AccF', 'Flp_Angle', 'RootMyb_Last', 'ACC_INFILE_SIZE'] + 'rootMOOPF', 'BlPitch', 'BlPitchCMeas', 'Azimuth', 'NumBl', & + 'FA_Acc', 'NacIMU_FA_Acc', 'FA_AccHPF', 'FA_AccHPFI', 'FA_PitCom', & + 'RotSpeedF', 'GenSpeedF', 'GenTq', 'GenTqMeas', 'GenArTq', & + 'GenBrTq', 'IPC_PitComF', 'PC_KP', 'PC_KI', 'PC_KD', & + 'PC_TF', 'PC_MaxPit', 'PC_MinPit', 'PC_PitComT', 'PC_PitComT_Last', & + 'PC_PitComTF', 'PC_PitComT_IPC', 'PC_PwrErr', 'PC_SpdErr', 'IPC_AxisTilt_1P', & + 'IPC_AxisYaw_1P', 'IPC_AxisTilt_2P', 'IPC_AxisYaw_2P', 'axisTilt_1P', 'axisYaw_1P', & + 'axisYawF_1P', 'axisTilt_2P', 'axisYaw_2P', 'axisYawF_2P', 'IPC_KI', & + 'IPC_KP', 'IPC_IntSat', 'PC_State', 'PitCom', 'PitComAct', & + 'SS_DelOmegaF', 'TestType', 'VS_MaxTq', 'VS_LastGenTrq', 'VS_LastGenPwr', & + 'VS_MechGenPwr', 'VS_SpdErrAr', 'VS_SpdErrBr', 'VS_SpdErr', 'VS_State', & + 'VS_Rgn3Pitch', 'WE_Vw', 'WE_Vw_F', 'WE_VwI', 'WE_VwIdot', & + 'VS_LastGenTrqF', 'Fl_PitCom', 'NACIMU_FA_AccF', 'FA_AccF', 'PtfmTDX', & + 'PtfmTDY', 'PtfmTDZ', 'PtfmRDX', 'PtfmRDY', 'PtfmRDZ', & + 'PtfmTVX', 'PtfmTVY', 'PtfmTVZ', 'PtfmRVX', 'PtfmRVY', & + 'PtfmRVZ', 'PtfmTAX', 'PtfmTAY', 'PtfmTAZ', 'PtfmRAX', & + 'PtfmRAY', 'PtfmRAZ', 'CC_DesiredL', 'CC_ActuatedL', 'CC_ActuatedDL', & + 'StC_Input', 'Flp_Angle', 'RootMyb_Last', 'ACC_INFILE_SIZE', 'AWC_complexangle' & + ] ! Initialize debug file IF ((LocalVar%iStatus == 0) .OR. (LocalVar%iStatus == -9)) THEN ! .TRUE. if we're on the first call to the DLL IF (CntrPar%LoggingLevel > 0) THEN @@ -534,35 +759,75 @@ SUBROUTINE Debug(LocalVar, CntrPar, DebugVar, ErrVar, avrSWAP, RootName, size_av CALL GetNewUnit(UnDb2, ErrVar) OPEN(unit=UnDb2, FILE=TRIM(RootName)//'.RO.dbg2') WRITE(UnDb2, *) 'Generated on '//CurDate()//' at '//CurTime()//' using ROSCO-'//TRIM(rosco_version) - WRITE(UnDb2, '(99(a20,TR5:))') 'Time', LocalVarOutStrings - WRITE(UnDb2, '(99(a20,TR5:))') + WRITE(UnDb2, '(101(a20,TR5:))') 'Time', LocalVarOutStrings + WRITE(UnDb2, '(101(a20,TR5:))') END IF IF (CntrPar%LoggingLevel > 2) THEN + ! Set avrIndices, start with basic indices + Allocate(avrIndices(avrBaseLength)) + DO Ind = 1, avrBaseLength + avrIndices(Ind) = Ind + END DO + + ! Cable control indices + IF (CntrPar%CC_Mode > 0) THEN + DO Ind = 1, SIZE(CntrPar%CC_GroupIndex) + Call AddToList(avrIndices,CntrPar%CC_GroupIndex(Ind)) + Call AddToList(avrIndices,CntrPar%CC_GroupIndex(Ind)+1) + END DO + END IF + + ! Structural control indices + IF (CntrPar%StC_Mode > 0) THEN + DO Ind = 1, SIZE(CntrPar%StC_GroupIndex) + Call AddToList(avrIndices,CntrPar%StC_GroupIndex(Ind)) + END DO + END IF + + ! Format string + avrFmt = '(A21,'//TRIM(Int2LStr(SIZE(avrIndices)))//'(TR12,"'//'AvrSWAP(",I4,")"))' + CALL GetNewUnit(UnDb3, ErrVar) OPEN(unit=UnDb3, FILE=TRIM(RootName)//'.RO.dbg3') WRITE(UnDb3,'(/////)') - WRITE(UnDb3,'(A,85("'//Tab//'AvrSWAP(",I2,")"))') 'LocalVar%Time ', (i,i=1, 85) - WRITE(UnDb3,'(A,85("'//Tab//'(-)"))') '(s)' + WRITE(UnDb3,avrFmt) 'LocalVar%Time ', (avrIndices) + WRITE(UnDb3,'(A21,'//TRIM(Int2LStr(SIZE(avrIndices)))//'(TR22,"(-)"))') '(s)' END IF END IF + ! Print simulation status, every 10 seconds IF (MODULO(LocalVar%Time, 10.0_DbKi) == 0) THEN WRITE(*, 100) LocalVar%GenSpeedF*RPS2RPM, LocalVar%BlPitch(1)*R2D, avrSWAP(15)/1000.0, LocalVar%WE_Vw 100 FORMAT('Generator speed: ', f6.1, ' RPM, Pitch angle: ', f5.1, ' deg, Power: ', f7.1, ' kW, Est. wind Speed: ', f5.1, ' m/s') END IF + ! Process DebugOutData, LocalVarOutData + ! Remove very small numbers that cause ******** outputs + DO I = 1,SIZE(DebugOutData) + IF (ABS(DebugOutData(I)) < 1E-10) THEN + DebugOutData(I) = 0 + END IF + END DO + + DO I = 1,SIZE(LocalVarOutData) + IF (ABS(LocalVarOutData(I)) < 1E-10) THEN + LocalVarOutData(I) = 0 + END IF + END DO + ! Write debug files + FmtDat = "(F20.5,TR5,100(ES20.5E2,TR5:))" ! The format of the debugging data IF(CntrPar%LoggingLevel > 0) THEN - WRITE (UnDb, FmtDat) LocalVar%Time, DebugOutData + WRITE (UnDb, TRIM(FmtDat)) LocalVar%Time, DebugOutData END IF IF(CntrPar%LoggingLevel > 1) THEN - WRITE (UnDb2, FmtDat) LocalVar%Time, LocalVarOutData + WRITE (UnDb2, TRIM(FmtDat)) LocalVar%Time, LocalVarOutData END IF IF(CntrPar%LoggingLevel > 2) THEN - WRITE (UnDb3, FmtDat) LocalVar%Time, avrSWAP(1: 85) + WRITE (UnDb3, TRIM(FmtDat)) LocalVar%Time, avrSWAP(avrIndices) END IF END SUBROUTINE Debug diff --git a/ROSCO/ROSCO/src/ROSCO_Types.f90 b/ROSCO/ROSCO/src/ROSCO_Types.f90 index 46c26a098..ec19d6b8d 100644 --- a/ROSCO/ROSCO/src/ROSCO_Types.f90 +++ b/ROSCO/ROSCO/src/ROSCO_Types.f90 @@ -1,5 +1,5 @@ ! ROSCO Registry -! This file is automatically generated by write_registry.py using ROSCO v2.6.0 +! This file is automatically generated by write_registry.py using ROSCO v2.8.0 ! For any modification to the registry, please edit the rosco_types.yaml accordingly MODULE ROSCO_Types @@ -9,6 +9,7 @@ MODULE ROSCO_Types TYPE, PUBLIC :: ControlParameters INTEGER(IntKi) :: LoggingLevel ! 0 - write no debug files, 1 - write standard output .dbg-file, 2 - write standard output .dbg-file and complete avrSWAP-array .dbg2-file + INTEGER(IntKi) :: Echo ! 0 - no Echo, 1 - Echo input data to .echo INTEGER(IntKi) :: F_LPFType ! Low pass filter on the rotor and generator speed {1 - first-order low-pass filter, 2 - second-order low-pass filter}, [rad/s] INTEGER(IntKi) :: F_NotchType ! Notch on the measured generator speed {0 - disable, 1 - enable} REAL(DbKi) :: F_LPFCornerFreq ! Corner frequency (-3dB point) in the first-order low-pass filter, [rad/s] @@ -28,6 +29,7 @@ MODULE ROSCO_Types INTEGER(IntKi) :: IPC_ControlMode ! Turn Individual Pitch Control (IPC) for fatigue load reductions (pitch contribution) {0 - off, 1 - 1P reductions, 2 - 1P+2P reductions} REAL(DbKi), DIMENSION(:), ALLOCATABLE :: IPC_Vramp ! Wind speeds for IPC cut-in sigma function [m/s] REAL(DbKi) :: IPC_IntSat ! Integrator saturation (maximum signal amplitude contrbution to pitch from IPC) + INTEGER(IntKi) :: IPC_SatMode ! IPC Saturation method IPC Saturation method (0 - no saturation (except by PC_MinPit), 1 - saturate by PS_BldPitchMin, 2 - saturate sotfly (full IPC cycle) by PC_MinPit, 3 - saturate softly by PS_BldPitchMin) REAL(DbKi), DIMENSION(:), ALLOCATABLE :: IPC_KP ! Integral gain for the individual pitch controller, [-]. REAL(DbKi), DIMENSION(:), ALLOCATABLE :: IPC_KI ! Integral gain for the individual pitch controller, [-]. REAL(DbKi), DIMENSION(:), ALLOCATABLE :: IPC_aziOffset ! Phase offset added to the azimuth angle for the individual pitch controller, [rad]. @@ -105,14 +107,27 @@ MODULE ROSCO_Types INTEGER(IntKi) :: Ind_BldPitch ! The column in OL_Filename that contains the blade pitch input in rad INTEGER(IntKi) :: Ind_GenTq ! The column in OL_Filename that contains the generator torque in Nm INTEGER(IntKi) :: Ind_YawRate ! The column in OL_Filename that contains the generator torque in Nm + INTEGER(IntKi), DIMENSION(:), ALLOCATABLE :: Ind_CableControl ! The column in OL_Filename that contains the cable control inputs in m + INTEGER(IntKi), DIMENSION(:), ALLOCATABLE :: Ind_StructControl ! The column in OL_Filename that contains the structural control inputs in various units REAL(DbKi), DIMENSION(:), ALLOCATABLE :: OL_Breakpoints ! Open loop breakpoints in timeseries REAL(DbKi), DIMENSION(:), ALLOCATABLE :: OL_BldPitch ! Open blade pitch timeseries + REAL(DbKi), DIMENSION(:,:), ALLOCATABLE :: OL_CableControl ! None + REAL(DbKi), DIMENSION(:,:), ALLOCATABLE :: OL_StructControl ! None REAL(DbKi), DIMENSION(:), ALLOCATABLE :: OL_GenTq ! Open generator torque timeseries REAL(DbKi), DIMENSION(:), ALLOCATABLE :: OL_YawRate ! Open yaw rate timeseries REAL(DbKi), DIMENSION(:,:), ALLOCATABLE :: OL_Channels ! Open loop channels in timeseries INTEGER(IntKi) :: PA_Mode ! Pitch actuator mode {0 - not used, 1 - first order filter, 2 - second order filter} REAL(DbKi) :: PA_CornerFreq ! Pitch actuator bandwidth/cut-off frequency [rad/s] REAL(DbKi) :: PA_Damping ! Pitch actuator damping ratio [-, unused if PA_Mode = 1] + INTEGER(IntKi) :: AWC_Mode ! Active wake control mode [0 - unused, 1 - SNL method, 2 - NREL method] + INTEGER(IntKi) :: AWC_NumModes ! AWC- Number of modes to include [-] + INTEGER(IntKi), DIMENSION(:), ALLOCATABLE :: AWC_n ! AWC azimuthal mode [-] + INTEGER(IntKi), DIMENSION(:), ALLOCATABLE :: AWC_harmonic ! AWC AWC Coleman transform harmonic [-] + REAL(DbKi), DIMENSION(:), ALLOCATABLE :: AWC_freq ! AWC frequency [Hz] + REAL(DbKi), DIMENSION(:), ALLOCATABLE :: AWC_amp ! AWC amplitude [deg] + REAL(DbKi), DIMENSION(:), ALLOCATABLE :: AWC_clockangle ! AWC clocking angle [deg] + INTEGER(IntKi) :: PF_Mode ! Pitch actuator fault mode {0 - not used, 1 - offsets on one or more blades} + REAL(DbKi), DIMENSION(:), ALLOCATABLE :: PF_Offsets ! Pitch actuator fault offsets for blade 1-3 [rad/s] INTEGER(IntKi) :: Ext_Mode ! External control mode (0 - not used, 1 - call external control library) CHARACTER(1024) :: DLL_FileName ! File name of external dynamic library CHARACTER(1024) :: DLL_InFile ! Name of input file called by dynamic library (DISCON.IN, e.g.) @@ -120,6 +135,13 @@ MODULE ROSCO_Types INTEGER(IntKi) :: ZMQ_Mode ! Flag for ZeroMQ (0-off, 1-yaw} CHARACTER(256) :: ZMQ_CommAddress ! Comm Address to zeroMQ client REAL(DbKi) :: ZMQ_UpdatePeriod ! Integer for zeromq update frequency + INTEGER(IntKi) :: CC_Mode ! Flag for ZeroMQ (0-off, 1-yaw} + INTEGER(IntKi) :: CC_Group_N ! Number of cable control groups + REAL(DbKi) :: CC_ActTau ! Time constant for line actuator [s] + INTEGER(IntKi), DIMENSION(:), ALLOCATABLE :: CC_GroupIndex ! Cable control group indices + INTEGER(IntKi) :: StC_Mode ! Flag for StC Control + INTEGER(IntKi) :: StC_Group_N ! Number of cable control groups + INTEGER(IntKi), DIMENSION(:), ALLOCATABLE :: StC_GroupIndex ! Cable control group indices REAL(DbKi) :: PC_RtTq99 ! 99% of the rated torque value, using for switching between pitch and torque control, [Nm]. REAL(DbKi) :: VS_MaxOMTq ! Maximum torque at the end of the below-rated region 2, [Nm] REAL(DbKi) :: VS_MinOMTq ! Minimum torque at the beginning of the below-rated region 2, [Nm] @@ -152,6 +174,16 @@ MODULE ROSCO_Types REAL(DbKi), DIMENSION(99) :: lpf2_OutputSignalLast2 ! Second order filter - Previous output 2 REAL(DbKi), DIMENSION(99) :: lpf2_InputSignalLast1 ! Second order filter - Previous input 1 REAL(DbKi), DIMENSION(99) :: lpf2_OutputSignalLast1 ! Second order filter - Previous output 1 + REAL(DbKi), DIMENSION(99) :: lpfV_a2 ! Second order filter - Denominator coefficient 1 + REAL(DbKi), DIMENSION(99) :: lpfV_a1 ! Second order filter - Denominator coefficient 1 + REAL(DbKi), DIMENSION(99) :: lpfV_a0 ! Second order filter - Denominator coefficient 0 + REAL(DbKi), DIMENSION(99) :: lpfV_b2 ! Second order filter - Numerator coefficient 2 + REAL(DbKi), DIMENSION(99) :: lpfV_b1 ! Second order filter - Numerator coefficient 1 + REAL(DbKi), DIMENSION(99) :: lpfV_b0 ! Second order filter - Numerator coefficient 0 + REAL(DbKi), DIMENSION(99) :: lpfV_InputSignalLast2 ! Second order filter - Previous input 2 + REAL(DbKi), DIMENSION(99) :: lpfV_OutputSignalLast2 ! Second order filter - Previous output 2 + REAL(DbKi), DIMENSION(99) :: lpfV_InputSignalLast1 ! Second order filter - Previous input 1 + REAL(DbKi), DIMENSION(99) :: lpfV_OutputSignalLast1 ! Second order filter - Previous output 1 REAL(DbKi), DIMENSION(99) :: hpf_InputSignalLast ! High pass filter - Previous output 1 REAL(DbKi), DIMENSION(99) :: hpf_OutputSignalLast ! High pass filter - Previous output 1 REAL(DbKi), DIMENSION(99) :: nfs_OutputSignalLast1 ! Notch filter slopes previous output 1 @@ -174,6 +206,10 @@ MODULE ROSCO_Types REAL(DbKi), DIMENSION(99) :: nf_a0 ! Notch filter denominator coefficient 0 END TYPE FilterParameters +TYPE, PUBLIC :: rlParams + REAL(DbKi), DIMENSION(99) :: LastSignal ! Last input signal +END TYPE rlParams + TYPE, PUBLIC :: piParams REAL(DbKi), DIMENSION(99) :: ITerm ! Integrator term REAL(DbKi), DIMENSION(99) :: ITermLast ! Previous integrator term @@ -194,6 +230,7 @@ MODULE ROSCO_Types REAL(DbKi) :: rootMOOP(3) ! Blade root bending moment [Nm] REAL(DbKi) :: rootMOOPF(3) ! Filtered Blade root bending moment [Nm] REAL(DbKi) :: BlPitch(3) ! Blade pitch [rad] + REAL(DbKi) :: BlPitchCMeas ! Mean (collective) blade pitch [rad] REAL(DbKi) :: Azimuth ! Rotor aziumuth angle [rad] INTEGER(IntKi) :: NumBl ! Number of blades [-] REAL(DbKi) :: FA_Acc ! Tower fore-aft acceleration [m/s^2] @@ -224,11 +261,18 @@ MODULE ROSCO_Types REAL(DbKi) :: IPC_AxisYaw_1P ! Integral of quadrature, 1P REAL(DbKi) :: IPC_AxisTilt_2P ! Integral of the direct axis, 2P REAL(DbKi) :: IPC_AxisYaw_2P ! Integral of quadrature, 2P + REAL(DbKi) :: axisTilt_1P ! Tilt moment, 1P + REAL(DbKi) :: axisYaw_1P ! Yaw moment, 1P + REAL(DbKi) :: axisYawF_1P ! Filtered yaw moment, 1P + REAL(DbKi) :: axisTilt_2P ! Tilt moment, 2P + REAL(DbKi) :: axisYaw_2P ! Yaw moment, 2P + REAL(DbKi) :: axisYawF_2P ! Filtered yaw moment, 2P REAL(DbKi) :: IPC_KI(2) ! Integral gain for IPC, after ramp [-] REAL(DbKi) :: IPC_KP(2) ! Proportional gain for IPC, after ramp [-] + REAL(DbKi) :: IPC_IntSat ! Integrator saturation (maximum signal amplitude contrbution to pitch from IPC) INTEGER(IntKi) :: PC_State ! State of the pitch control system REAL(DbKi) :: PitCom(3) ! Commanded pitch of each blade the last time the controller was called [rad]. - REAL(DbKi) :: PitComAct(3) ! Actuated pitch of each blade the last time the controller was called [rad]. + REAL(DbKi) :: PitComAct(3) ! Actuated pitch command of each blade [rad]. REAL(DbKi) :: SS_DelOmegaF ! Filtered setpoint shifting term defined in setpoint smoother [rad/s]. REAL(DbKi) :: TestType ! Test variable, no use REAL(DbKi) :: VS_MaxTq ! Maximum allowable generator torque [Nm]. @@ -249,23 +293,49 @@ MODULE ROSCO_Types REAL(DbKi) :: Fl_PitCom ! Shutdown, .FALSE. if inactive, .TRUE. if active REAL(DbKi) :: NACIMU_FA_AccF ! None REAL(DbKi) :: FA_AccF ! None + REAL(DbKi) :: PtfmTDX ! Platform motion -- Displacement TDX (m)') + REAL(DbKi) :: PtfmTDY ! Platform motion -- Displacement TDY (m)') + REAL(DbKi) :: PtfmTDZ ! Platform motion -- Displacement TDZ (m)') + REAL(DbKi) :: PtfmRDX ! Platform motion -- Displacement RDX (rad)') + REAL(DbKi) :: PtfmRDY ! Platform motion -- Displacement RDY (rad)') + REAL(DbKi) :: PtfmRDZ ! Platform motion -- Displacement RDZ (rad)') + REAL(DbKi) :: PtfmTVX ! Platform motion -- Velocity TVX (m/s)') + REAL(DbKi) :: PtfmTVY ! Platform motion -- Velocity TVY (m/s)') + REAL(DbKi) :: PtfmTVZ ! Platform motion -- Velocity TVZ (m/s)') + REAL(DbKi) :: PtfmRVX ! Platform motion -- Velocity RVX (rad/s)') + REAL(DbKi) :: PtfmRVY ! Platform motion -- Velocity RVY (rad/s)') + REAL(DbKi) :: PtfmRVZ ! Platform motion -- Velocity RVZ (rad/s)') + REAL(DbKi) :: PtfmTAX ! Platform motion -- Acceleration TAX (m/s^2)') + REAL(DbKi) :: PtfmTAY ! Platform motion -- Acceleration TAY (m/s^2)') + REAL(DbKi) :: PtfmTAZ ! Platform motion -- Acceleration TAZ (m/s^2)') + REAL(DbKi) :: PtfmRAX ! Platform motion -- Acceleration RAX (rad/s^2)') + REAL(DbKi) :: PtfmRAY ! Platform motion -- Acceleration RAY (rad/s^2)') + REAL(DbKi) :: PtfmRAZ ! Platform motion -- Acceleration RAZ (rad/s^2)') + REAL(DbKi) :: CC_DesiredL(12) ! None + REAL(DbKi) :: CC_ActuatedL(12) ! None + REAL(DbKi) :: CC_ActuatedDL(12) ! None + REAL(DbKi) :: StC_Input(12) ! None REAL(DbKi) :: Flp_Angle(3) ! Flap Angle (rad) REAL(DbKi) :: RootMyb_Last(3) ! Last blade root bending moment (Nm) INTEGER(IntKi) :: ACC_INFILE_SIZE ! Length of parameter input filename CHARACTER, DIMENSION(:), ALLOCATABLE :: ACC_INFILE ! Parameter input filename LOGICAL :: restart ! Restart flag + COMPLEX(DbKi) :: AWC_complexangle(3) ! Complex angle for each blade, sum of modes? TYPE(WE) :: WE ! Wind speed estimator parameters derived type TYPE(FilterParameters) :: FP ! Filter parameters derived type TYPE(piParams) :: piP ! PI parameters derived type + TYPE(rlParams) :: rlP ! Rate limiter parameters derived type END TYPE LocalVariables TYPE, PUBLIC :: ObjectInstances INTEGER(IntKi) :: instLPF ! Low-pass filter instance INTEGER(IntKi) :: instSecLPF ! Second order low-pass filter instance + INTEGER(IntKi) :: instSecLPFV ! Second order low-pass filter instance INTEGER(IntKi) :: instHPF ! High-pass filter instance INTEGER(IntKi) :: instNotchSlopes ! Notch filter slopes instance INTEGER(IntKi) :: instNotch ! Notch filter instance INTEGER(IntKi) :: instPI ! PI controller instance + INTEGER(IntKi) :: instRL ! Rate limiter instance END TYPE ObjectInstances TYPE, PUBLIC :: PerformanceData @@ -297,9 +367,9 @@ MODULE ROSCO_Types REAL(DbKi) :: axisTilt_2P ! Tilt component of coleman transformation, 2P REAL(DbKi) :: axisYaw_2P ! Yaw component of coleman transformation, 2P REAL(DbKi) :: YawRateCom ! Commanded yaw rate [rad/s]. - REAL(DbKi) :: NacHeadingTarget ! Target nacelle heading [rad]. - REAL(DbKi) :: NacVaneOffset ! Nacelle vane angle with offset [rad]. - REAL(DbKi) :: Yaw_err ! Yaw error [rad]. + REAL(DbKi) :: NacHeadingTarget ! Target nacelle heading [deg]. + REAL(DbKi) :: NacVaneOffset ! Nacelle vane angle with offset [deg]. + REAL(DbKi) :: Yaw_Err ! Yaw error [deg]. REAL(DbKi) :: YawState ! State of yaw controller END TYPE DebugVariables @@ -324,7 +394,7 @@ MODULE ROSCO_Types END TYPE ZMQ_Variables TYPE, PUBLIC :: ExtControlType - REAL(C_FLOAT), DIMENSION(:), ALLOCATABLE :: avrSWAP ! The swap array- used to pass data to and from the DLL controller [see Bladed DLL documentation] + REAL(ReKi), DIMENSION(:), ALLOCATABLE :: avrSWAP ! The swap array- used to pass data to and from the DLL controller [see Bladed DLL documentation] END TYPE ExtControlType END MODULE ROSCO_Types \ No newline at end of file diff --git a/ROSCO/ROSCO/src/ReadSetParameters.f90 b/ROSCO/ROSCO/src/ReadSetParameters.f90 index a0ac9e382..23a5bde7a 100644 --- a/ROSCO/ROSCO/src/ReadSetParameters.f90 +++ b/ROSCO/ROSCO/src/ReadSetParameters.f90 @@ -19,18 +19,21 @@ MODULE ReadSetParameters USE Functions USE SysSubs USE ROSCO_Helpers - IMPLICIT NONE CONTAINS ! ----------------------------------------------------------------------------------- ! Read avrSWAP array passed from ServoDyn - SUBROUTINE ReadAvrSWAP(avrSWAP, LocalVar) + SUBROUTINE ReadAvrSWAP(avrSWAP, LocalVar, CntrPar) USE ROSCO_Types, ONLY : LocalVariables, ZMQ_Variables REAL(ReKi), INTENT(INOUT) :: avrSWAP(*) ! The swap array, used to pass data to, and receive data from, the DLL controller. TYPE(LocalVariables), INTENT(INOUT) :: LocalVar + TYPE(ControlParameters), INTENT(IN) :: CntrPar + + ! Allocate Variables: + INTEGER(IntKi) :: K ! Index used for looping through blades. ! Load variables from calling program (See Appendix A of Bladed User's Guide): LocalVar%iStatus = NINT(avrSWAP(1)) @@ -46,23 +49,62 @@ SUBROUTINE ReadAvrSWAP(avrSWAP, LocalVar) LocalVar%rootMOOP(1) = avrSWAP(30) LocalVar%rootMOOP(2) = avrSWAP(31) LocalVar%rootMOOP(3) = avrSWAP(32) + LocalVar%NacHeading = avrSWAP(37) * R2D LocalVar%FA_Acc = avrSWAP(53) LocalVar%NacIMU_FA_Acc = avrSWAP(83) LocalVar%Azimuth = avrSWAP(60) LocalVar%NumBl = NINT(avrSWAP(61)) + ! Platform signals + LocalVar%PtfmTDX = avrSWAP(1001) + LocalVar%PtfmTDY = avrSWAP(1002) + LocalVar%PtfmTDZ = avrSWAP(1003) + LocalVar%PtfmRDX = avrSWAP(1004) + LocalVar%PtfmRDY = avrSWAP(1005) + LocalVar%PtfmRDZ = avrSWAP(1006) + LocalVar%PtfmTVX = avrSWAP(1007) + LocalVar%PtfmTVY = avrSWAP(1008) + LocalVar%PtfmTVZ = avrSWAP(1009) + LocalVar%PtfmRVX = avrSWAP(1010) + LocalVar%PtfmRVY = avrSWAP(1011) + LocalVar%PtfmRVZ = avrSWAP(1012) + LocalVar%PtfmTAX = avrSWAP(1013) + LocalVar%PtfmTAY = avrSWAP(1014) + LocalVar%PtfmTAZ = avrSWAP(1015) + LocalVar%PtfmRAX = avrSWAP(1016) + LocalVar%PtfmRAY = avrSWAP(1017) + LocalVar%PtfmRAZ = avrSWAP(1018) + + ! GenTemp = avrSWAP(1026) + + ! WRITE(1000,*) LocalVar%GenSpeed*RPS2RPM, GenTemp + + + ! --- NJA: usually feedback back the previous pitch command helps for numerical stability, sometimes it does not... IF (LocalVar%iStatus == 0) THEN LocalVar%BlPitch(1) = avrSWAP(4) LocalVar%BlPitch(2) = avrSWAP(33) LocalVar%BlPitch(3) = avrSWAP(34) ELSE - LocalVar%BlPitch(1) = LocalVar%PitCom(1) - LocalVar%BlPitch(2) = LocalVar%PitCom(2) - LocalVar%BlPitch(3) = LocalVar%PitCom(3) + + ! Subtract pitch actuator fault for blade K - This in a sense would make the controller blind to the pitch fault + IF (CntrPar%PF_Mode == 1) THEN + DO K = 1, LocalVar%NumBl + ! This assumes that the pitch actuator fault is hardware fault + LocalVar%BlPitch(K) = LocalVar%PitComAct(K) - CntrPar%PF_Offsets(K) ! why is PitCom used and not PitComAct?? + END DO + ELSE + LocalVar%BlPitch(1) = LocalVar%PitComAct(1) + LocalVar%BlPitch(2) = LocalVar%PitComAct(2) + LocalVar%BlPitch(3) = LocalVar%PitComAct(3) + END IF + ENDIF - IF (LocalVar%iStatus == 0) THEN + LocalVar%BlPitchCMeas = (1 / REAL(LocalVar%NumBl)) * (LocalVar%BlPitch(1) + LocalVar%BlPitch(2) + LocalVar%BlPitch(3)) + + IF (LocalVar%iStatus == 0) THEN ! TODO: Technically, LocalVar%Time > 0, too, but this restart is in many places as a reset LocalVar%restart = .True. ELSE LocalVar%restart = .False. @@ -71,7 +113,7 @@ SUBROUTINE ReadAvrSWAP(avrSWAP, LocalVar) END SUBROUTINE ReadAvrSWAP ! ----------------------------------------------------------------------------------- ! Define parameters for control actions - SUBROUTINE SetParameters(avrSWAP, accINFILE, size_avcMSG, CntrPar, LocalVar, objInst, PerfData, zmqVar, ErrVar) + SUBROUTINE SetParameters(avrSWAP, accINFILE, size_avcMSG, CntrPar, LocalVar, objInst, PerfData, zmqVar, RootName, ErrVar) USE ROSCO_Types, ONLY : ControlParameters, LocalVariables, ObjectInstances, PerformanceData, ErrorVariables, ZMQ_Variables @@ -85,9 +127,15 @@ SUBROUTINE SetParameters(avrSWAP, accINFILE, size_avcMSG, CntrPar, LocalVar, obj TYPE(PerformanceData), INTENT(INOUT) :: PerfData TYPE(ZMQ_Variables), INTENT(INOUT) :: zmqVar TYPE(ErrorVariables), INTENT(INOUT) :: ErrVar + CHARACTER(NINT(avrSWAP(50))-1), INTENT(IN) :: RootName - INTEGER(IntKi) :: K ! Index used for looping through blades. + INTEGER(IntKi) :: K, I, I_OL ! Index used for looping through blades. + CHARACTER(1024) :: OL_String ! Open description loop string + INTEGER(IntKi) :: OL_Count ! Number of open loop channels + + INTEGER(IntKi) :: N_OL_Cables + INTEGER(IntKi) :: N_OL_StCs CHARACTER(*), PARAMETER :: RoutineName = 'SetParameters' @@ -102,10 +150,12 @@ SUBROUTINE SetParameters(avrSWAP, accINFILE, size_avcMSG, CntrPar, LocalVar, obj ! Initialize all filter instance counters at 1 objInst%instLPF = 1 objInst%instSecLPF = 1 + objInst%instSecLPFV = 1 objInst%instHPF = 1 objInst%instNotchSlopes = 1 objInst%instNotch = 1 objInst%instPI = 1 + objInst%instRL = 1 ! Set unused outputs to zero (See Appendix A of Bladed User's Guide): avrSWAP(35) = 1.0 ! Generator contactor status: 1=main (high speed) variable-speed generator @@ -116,7 +166,7 @@ SUBROUTINE SetParameters(avrSWAP, accINFILE, size_avcMSG, CntrPar, LocalVar, obj avrSWAP(56) = 0.0 ! Torque override: 0=yes avrSWAP(65) = 0.0 ! Number of variables returned for logging avrSWAP(72) = 0.0 ! Generator start-up resistance - avrSWAP(79) = 0.0 ! Request for loads: 0=none + avrSWAP(79) = 4.0 ! Request for loads: 0=none avrSWAP(80) = 0.0 ! Variable slip current status avrSWAP(81) = 0.0 ! Variable slip current demand @@ -139,7 +189,7 @@ SUBROUTINE SetParameters(avrSWAP, accINFILE, size_avcMSG, CntrPar, LocalVar, obj LocalVar%ACC_INFILE = accINFILE ! Read Control Parameter File - CALL ReadControlParameterFileSub(CntrPar, zmqVar, accINFILE, NINT(avrSWAP(50)),ErrVar) + CALL ReadControlParameterFileSub(CntrPar, zmqVar, accINFILE, NINT(avrSWAP(50)), RootName, ErrVar) ! If there's been an file reading error, don't continue ! Add RoutineName to error message IF (ErrVar%aviFAIL < 0) THEN @@ -173,6 +223,97 @@ SUBROUTINE SetParameters(avrSWAP, accINFILE, size_avcMSG, CntrPar, LocalVar, obj ! Check validity of input parameters: CALL CheckInputs(LocalVar, CntrPar, avrSWAP, ErrVar, size_avcMSG) + ! Initialize variables + LocalVar%CC_DesiredL = 0 + LocalVar%CC_ActuatedL = 0 + LocalVar%CC_ActuatedDL = 0 + LocalVar%StC_Input = 0 + + ! Initialize open loop control + ! Read open loop input, if desired + IF (CntrPar%OL_Mode == 1) THEN + OL_String = '' ! Display string + OL_Count = 1 + IF (CntrPar%Ind_BldPitch > 0) THEN + OL_String = TRIM(OL_String)//' BldPitch ' + OL_Count = OL_Count + 1 + ENDIF + + IF (CntrPar%Ind_GenTq > 0) THEN + OL_String = TRIM(OL_String)//' GenTq ' + OL_Count = OL_Count + 1 + ENDIF + + IF (CntrPar%Ind_YawRate > 0) THEN + OL_String = TRIM(OL_String)//' YawRate ' + OL_Count = OL_Count + 1 + ENDIF + + N_OL_Cables = 0 + IF (ANY(CntrPar%Ind_CableControl > 0)) THEN + DO I = 1,SIZE(CntrPar%Ind_CableControl) + IF (CntrPar%Ind_CableControl(I) > 0) THEN + OL_String = TRIM(OL_String)//' Cable'//TRIM(Int2LStr(I))//' ' + OL_Count = OL_Count + 1 + N_OL_Cables = N_OL_Cables + 1 + ENDIF + ENDDO + ENDIF + + N_OL_StCs = 0 + IF (ANY(CntrPar%Ind_StructControl > 0)) THEN + DO I = 1,SIZE(CntrPar%Ind_StructControl) + IF (CntrPar%Ind_StructControl(I) > 0) THEN + OL_String = TRIM(OL_String)//' StC'//TRIM(Int2LStr(I))//' ' + OL_Count = OL_Count + 1 + N_OL_StCs = N_OL_StCs + 1 + ENDIF + ENDDO + ENDIF + + + PRINT *, 'ROSCO: Implementing open loop control for'//TRIM(OL_String) + CALL Read_OL_Input(CntrPar%OL_Filename,110_IntKi,OL_Count,CntrPar%OL_Channels, ErrVar) + + CntrPar%OL_Breakpoints = CntrPar%OL_Channels(:,CntrPar%Ind_Breakpoint) + + IF (CntrPar%Ind_BldPitch > 0) THEN + CntrPar%OL_BldPitch = CntrPar%OL_Channels(:,CntrPar%Ind_BldPitch) + ENDIF + + IF (CntrPar%Ind_GenTq > 0) THEN + CntrPar%OL_GenTq = CntrPar%OL_Channels(:,CntrPar%Ind_GenTq) + ENDIF + + IF (CntrPar%Ind_YawRate > 0) THEN + CntrPar%OL_YawRate = CntrPar%OL_Channels(:,CntrPar%Ind_YawRate) + ENDIF + + IF (ANY(CntrPar%Ind_CableControl > 0)) THEN + ALLOCATE(CntrPar%OL_CableControl(N_OL_Cables,SIZE(CntrPar%OL_Channels,DIM=1))) + I_OL = 1 + DO I = 1,SIZE(CntrPar%Ind_CableControl) + IF (CntrPar%Ind_CableControl(I) > 0) THEN + CntrPar%OL_CableControl(I_OL,:) = CntrPar%OL_Channels(:,CntrPar%Ind_CableControl(I)) + I_OL = I_OL + 1 + ENDIF + ENDDO + ENDIF + + IF (ANY(CntrPar%Ind_StructControl > 0)) THEN + ALLOCATE(CntrPar%OL_StructControl(N_OL_StCs,SIZE(CntrPar%OL_Channels,DIM=1))) + I_OL = 1 + DO I = 1,SIZE(CntrPar%Ind_StructControl) + IF (CntrPar%Ind_StructControl(I) > 0) THEN + CntrPar%OL_StructControl(I_OL,:) = CntrPar%OL_Channels(:,CntrPar%Ind_StructControl(I)) + I_OL = I_OL + 1 + ENDIF + ENDDO + ENDIF + + END IF + + ! Add RoutineName to error message IF (ErrVar%aviFAIL < 0) THEN ErrVar%ErrMsg = RoutineName//':'//TRIM(ErrVar%ErrMsg) @@ -183,11 +324,12 @@ SUBROUTINE SetParameters(avrSWAP, accINFILE, size_avcMSG, CntrPar, LocalVar, obj zmqVar%ZMQ_Flag = .TRUE. ENDIF + ENDIF END SUBROUTINE SetParameters ! ----------------------------------------------------------------------------------- ! Read all constant control parameters from DISCON.IN parameter file - SUBROUTINE ReadControlParameterFileSub(CntrPar, zmqVar, accINFILE, accINFILE_size,ErrVar)!, accINFILE_size) + SUBROUTINE ReadControlParameterFileSub(CntrPar, zmqVar, accINFILE, accINFILE_size, RootName, ErrVar)!, accINFILE_size) USE, INTRINSIC :: ISO_C_Binding USE ROSCO_Types, ONLY : ControlParameters, ErrorVariables, ZMQ_Variables @@ -196,260 +338,270 @@ SUBROUTINE ReadControlParameterFileSub(CntrPar, zmqVar, accINFILE, accINFILE_siz TYPE(ControlParameters), INTENT(INOUT) :: CntrPar ! Control parameter type TYPE(ErrorVariables), INTENT(INOUT) :: ErrVar ! Control parameter type TYPE(ZMQ_Variables), INTENT(INOUT) :: zmqVar ! Control parameter type + CHARACTER(accINFILE_size), INTENT(IN) :: RootName + INTEGER(IntKi) :: UnControllerParameters ! Unit number to open file - INTEGER(IntKi) :: CurLine - ! INTEGER(IntKi), PARAMETER :: UnControllerParameters = 89 ! Unit number to open file - - CHARACTER(1024) :: OL_String ! Open description loop string - INTEGER(IntKi) :: OL_Count ! Number of open loop channels CHARACTER(1024) :: PriPath ! Path name of the primary DISCON file - + CHARACTER(2048) :: TmpLine ! Path name of the primary DISCON file + INTEGER(IntKi) :: NumLines, IOS, I_LINE, ErrStat + INTEGER(IntKi) :: UnEc + CHARACTER(128) :: EchoFilename ! Input checkpoint file + CHARACTER(MaxLineLength), DIMENSION(:), ALLOCATABLE :: FileLines + CHARACTER(*), PARAMETER :: RoutineName = 'ReadControlParameterFileSub' - CurLine = 1 - ! Get primary path of DISCON.IN file (accINFILE(1) here) CALL GetPath( accINFILE(1), PriPath ) ! Input files will be relative to the path where the primary input file is located. CALL GetNewUnit(UnControllerParameters, ErrVar) OPEN(unit=UnControllerParameters, file=accINFILE(1), status='old', action='read') - - !----------------------- HEADER ------------------------ - CALL ReadEmptyLine(UnControllerParameters,CurLine) - CALL ReadEmptyLine(UnControllerParameters,CurLine) - CALL ReadEmptyLine(UnControllerParameters,CurLine) - !----------------------- DEBUG -------------------------- - CALL ReadEmptyLine(UnControllerParameters,CurLine) + ! Read all lines, first get the number of lines + NumLines = 0 + IOS = 0 + DO WHILE (IOS == 0) ! read the rest of the file (until an error occurs) + NumLines = NumLines + 1 + READ(UnControllerParameters,'(A)',IOSTAT=IOS) TmpLine + END DO !WHILE - CALL ParseInput(UnControllerParameters,CurLine,'LoggingLevel',accINFILE(1),CntrPar%LoggingLevel,ErrVar) + ALLOCATE(FileLines(NumLines)) + REWIND( UnControllerParameters ) - CALL ReadEmptyLine(UnControllerParameters,CurLine) + DO I_LINE = 1,NumLines + READ(UnControllerParameters,'(A)',IOSTAT=IOS) FileLines(I_LINE) + END DO + + !----------------------- DEBUG -------------------------- + CALL ParseInput(FileLines,'LoggingLevel', CntrPar%LoggingLevel, accINFILE(1), ErrVar) + CALL ParseInput(FileLines,'Echo', CntrPar%Echo, accINFILE(1), ErrVar) + IF (ErrVar%aviFAIL < 0) RETURN + + ! Set up echo file + UnEc = 0 + IF (CntrPar%Echo > 0) THEN + EchoFilename = TRIM(RootName)//'.RO.echo' + CALL GetNewUnit(UnEc, ErrVar) + OPEN(unit=UnEc, FILE=TRIM(EchoFilename), IOSTAT=ErrStat, ACTION='WRITE' ) + IF ( ErrStat /= 0 ) THEN + ErrVar%ErrMsg = 'Cannot open file '//TRIM( EchoFilename )//'. Another program may have locked it for writing.' + ErrVar%aviFAIL = 1 + ELSE + WRITE( UnEc, *) 'ROSCO ECHO file' + WRITE( UnEc, *) 'Generated on '//CurDate()//' at '//CurTime()//' using ROSCO-'//TRIM(rosco_version) + WRITE( UnEc, *) NEW_LINE('A') + WRITE( UnEc, *) 'Line Number',Tab,'Parameter',Tab,'Value' + WRITE( UnEc, *) '-----------------------------------------' + ENDIF + ENDIF !----------------- CONTROLLER FLAGS --------------------- - CALL ReadEmptyLine(UnControllerParameters,CurLine) - CALL ParseInput(UnControllerParameters,CurLine,'F_LPFType',accINFILE(1),CntrPar%F_LPFType,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'F_NotchType',accINFILE(1),CntrPar%F_NotchType,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'IPC_ControlMode',accINFILE(1),CntrPar%IPC_ControlMode,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'VS_ControlMode',accINFILE(1),CntrPar%VS_ControlMode,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'PC_ControlMode',accINFILE(1),CntrPar%PC_ControlMode,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'Y_ControlMode',accINFILE(1),CntrPar%Y_ControlMode,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'SS_Mode',accINFILE(1),CntrPar%SS_Mode,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'WE_Mode',accINFILE(1),CntrPar%WE_Mode,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'PS_Mode',accINFILE(1),CntrPar%PS_Mode,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'SD_Mode',accINFILE(1),CntrPar%SD_Mode,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'FL_Mode',accINFILE(1),CntrPar%FL_Mode,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'TD_Mode',accINFILE(1),CntrPar%TD_Mode,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'Flp_Mode',accINFILE(1),CntrPar%Flp_Mode,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'OL_Mode',accINFILE(1),CntrPar%OL_Mode,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'PA_Mode',accINFILE(1),CntrPar%PA_Mode,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'Ext_Mode',accINFILE(1),CntrPar%Ext_Mode,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'ZMQ_Mode',accINFILE(1), CntrPar%ZMQ_Mode,ErrVar) - - CALL ReadEmptyLine(UnControllerParameters,CurLine) + CALL ParseInput(FileLines,'F_LPFType', CntrPar%F_LPFType, accINFILE(1), ErrVar, UnEc=UnEc) + CALL ParseInput(FileLines,'F_NotchType', CntrPar%F_NotchType, accINFILE(1), ErrVar, UnEc=UnEc) + CALL ParseInput(FileLines,'IPC_ControlMode', CntrPar%IPC_ControlMode, accINFILE(1), ErrVar, UnEc=UnEc) + CALL ParseInput(FileLines,'VS_ControlMode', CntrPar%VS_ControlMode, accINFILE(1), ErrVar, UnEc=UnEc) + CALL ParseInput(FileLines,'PC_ControlMode', CntrPar%PC_ControlMode, accINFILE(1), ErrVar, UnEc=UnEc) + CALL ParseInput(FileLines,'Y_ControlMode', CntrPar%Y_ControlMode, accINFILE(1), ErrVar, UnEc=UnEc) + CALL ParseInput(FileLines,'SS_Mode', CntrPar%SS_Mode, accINFILE(1), ErrVar, UnEc=UnEc) + CALL ParseInput(FileLines,'WE_Mode', CntrPar%WE_Mode, accINFILE(1), ErrVar, UnEc=UnEc) + CALL ParseInput(FileLines,'PS_Mode', CntrPar%PS_Mode, accINFILE(1), ErrVar, UnEc=UnEc) + CALL ParseInput(FileLines,'SD_Mode', CntrPar%SD_Mode, accINFILE(1), ErrVar, UnEc=UnEc) + CALL ParseInput(FileLines,'FL_Mode', CntrPar%FL_Mode, accINFILE(1), ErrVar, UnEc=UnEc) + CALL ParseInput(FileLines,'TD_Mode', CntrPar%TD_Mode, accINFILE(1), ErrVar, UnEc=UnEc) + CALL ParseInput(FileLines,'Flp_Mode', CntrPar%Flp_Mode, accINFILE(1), ErrVar, UnEc=UnEc) + CALL ParseInput(FileLines,'OL_Mode', CntrPar%OL_Mode, accINFILE(1), ErrVar, UnEc=UnEc) + CALL ParseInput(FileLines,'PA_Mode', CntrPar%PA_Mode, accINFILE(1), ErrVar, UnEc=UnEc) + CALL ParseInput(FileLines,'PF_Mode', CntrPar%PF_Mode, accINFILE(1), ErrVar, UnEc=UnEc) + CALL ParseInput(FileLines,'AWC_Mode', CntrPar%AWC_Mode, accINFILE(1), ErrVar, UnEc=UnEc) + CALL ParseInput(FileLines,'Ext_Mode', CntrPar%Ext_Mode, accINFILE(1), ErrVar, UnEc=UnEc) + CALL ParseInput(FileLines,'ZMQ_Mode', CntrPar%ZMQ_Mode, accINFILE(1), ErrVar, UnEc=UnEc) + CALL ParseInput(FileLines,'CC_Mode', CntrPar%CC_Mode, accINFILE(1), ErrVar, UnEc=UnEc) + CALL ParseInput(FileLines,'StC_Mode', CntrPar%StC_Mode, accINFILE(1), ErrVar, UnEc=UnEc) + IF (ErrVar%aviFAIL < 0) RETURN !----------------- FILTER CONSTANTS --------------------- - CALL ReadEmptyLine(UnControllerParameters,CurLine) - CALL ParseInput(UnControllerParameters,CurLine,'F_LPFCornerFreq',accINFILE(1),CntrPar%F_LPFCornerFreq,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'F_LPFDamping',accINFILE(1),CntrPar%F_LPFDamping,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'F_NotchCornerFreq',accINFILE(1),CntrPar%F_NotchCornerFreq,ErrVar) - CALL ParseAry(UnControllerParameters, CurLine, 'F_NotchBetaNumDen', CntrPar%F_NotchBetaNumDen, 2, accINFILE(1), ErrVar ) - CALL ParseInput(UnControllerParameters,CurLine,'F_SSCornerFreq',accINFILE(1),CntrPar%F_SSCornerFreq,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'F_WECornerFreq',accINFILE(1),CntrPar%F_WECornerFreq,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'F_YawErr',accINFILE(1),CntrPar%F_YawErr, ErrVar) - CALL ParseAry(UnControllerParameters, CurLine, 'F_FlCornerFreq', CntrPar%F_FlCornerFreq, 2, accINFILE(1), ErrVar ) - CALL ParseInput(UnControllerParameters,CurLine,'F_FlHighPassFreq',accINFILE(1),CntrPar%F_FlHighPassFreq,ErrVar) - CALL ParseAry(UnControllerParameters, CurLine, 'F_FlpCornerFreq', CntrPar%F_FlpCornerFreq, 2, accINFILE(1), ErrVar ) - CALL ReadEmptyLine(UnControllerParameters,CurLine) + CALL ParseInput(FileLines, 'F_LPFCornerFreq', CntrPar%F_LPFCornerFreq, accINFILE(1), ErrVar, .FALSE., UnEc) + CALL ParseInput(FileLines, 'F_LPFDamping', CntrPar%F_LPFDamping, accINFILE(1), ErrVar, CntrPar%F_LPFType == 1, UnEc) + CALL ParseInput(FileLines, 'F_NotchCornerFreq', CntrPar%F_NotchCornerFreq, accINFILE(1), ErrVar, CntrPar%F_NotchType == 0, UnEc) + CALL ParseAry( FileLines, 'F_NotchBetaNumDen', CntrPar%F_NotchBetaNumDen, 2, accINFILE(1), ErrVar, CntrPar%F_NotchType == 0, UnEc) + CALL ParseInput(FileLines, 'F_SSCornerFreq', CntrPar%F_SSCornerFreq, accINFILE(1), ErrVar, CntrPar%SS_Mode == 0, UnEc) + CALL ParseInput(FileLines, 'F_WECornerFreq', CntrPar%F_WECornerFreq, accINFILE(1), ErrVar, .FALSE., UnEc) + CALL ParseInput(FileLines, 'F_YawErr', CntrPar%F_YawErr, accINFILE(1), ErrVar, CntrPar%Y_ControlMode == 0, UnEc) + CALL ParseAry( FileLines, 'F_FlCornerFreq', CntrPar%F_FlCornerFreq, 2, accINFILE(1), ErrVar, CntrPar%FL_Mode == 0, UnEc) + CALL ParseInput(FileLines, 'F_FlHighPassFreq', CntrPar%F_FlHighPassFreq, accINFILE(1), ErrVar, CntrPar%FL_Mode == 0, UnEc) + CALL ParseAry( FileLines, 'F_FlpCornerFreq', CntrPar%F_FlpCornerFreq, 2, accINFILE(1), ErrVar, CntrPar%Flp_Mode == 0, UnEc) + IF (ErrVar%aviFAIL < 0) RETURN !----------- BLADE PITCH CONTROLLER CONSTANTS ----------- - CALL ReadEmptyLine(UnControllerParameters,CurLine) - CALL ParseInput(UnControllerParameters,CurLine,'PC_GS_n',accINFILE(1),CntrPar%PC_GS_n,ErrVar) - CALL ParseAry(UnControllerParameters, CurLine, 'PC_GS_angles', CntrPar%PC_GS_angles, CntrPar%PC_GS_n, accINFILE(1), ErrVar ) - CALL ParseAry(UnControllerParameters, CurLine, 'PC_GS_KP', CntrPar%PC_GS_KP, CntrPar%PC_GS_n, accINFILE(1), ErrVar ) - CALL ParseAry(UnControllerParameters, CurLine, 'PC_GS_KI', CntrPar%PC_GS_KI, CntrPar%PC_GS_n, accINFILE(1), ErrVar ) - CALL ParseAry(UnControllerParameters, CurLine, 'PC_GS_KD', CntrPar%PC_GS_KD, CntrPar%PC_GS_n, accINFILE(1), ErrVar ) - CALL ParseAry(UnControllerParameters, CurLine, 'PC_GS_TF', CntrPar%PC_GS_TF, CntrPar%PC_GS_n, accINFILE(1), ErrVar ) - CALL ParseInput(UnControllerParameters,CurLine,'PC_MaxPit',accINFILE(1),CntrPar%PC_MaxPit,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'PC_MinPit',accINFILE(1),CntrPar%PC_MinPit,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'PC_MaxRat',accINFILE(1),CntrPar%PC_MaxRat,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'PC_MinRat',accINFILE(1),CntrPar%PC_MinRat,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'PC_RefSpd',accINFILE(1),CntrPar%PC_RefSpd,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'PC_FinePit',accINFILE(1),CntrPar%PC_FinePit,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'PC_Switch',accINFILE(1),CntrPar%PC_Switch,ErrVar) - CALL ReadEmptyLine(UnControllerParameters,CurLine) + CALL ParseInput(FileLines, 'PC_GS_n', CntrPar%PC_GS_n, accINFILE(1), ErrVar, CntrPar%PC_ControlMode == 0, UnEc) + CALL ParseAry( FileLines, 'PC_GS_angles', CntrPar%PC_GS_angles, CntrPar%PC_GS_n, accINFILE(1), ErrVar, CntrPar%PC_ControlMode == 0, UnEc) + CALL ParseAry( FileLines, 'PC_GS_KP', CntrPar%PC_GS_KP, CntrPar%PC_GS_n, accINFILE(1), ErrVar, CntrPar%PC_ControlMode == 0, UnEc) + CALL ParseAry( FileLines, 'PC_GS_KI', CntrPar%PC_GS_KI, CntrPar%PC_GS_n, accINFILE(1), ErrVar, CntrPar%PC_ControlMode == 0, UnEc) + CALL ParseAry( FileLines, 'PC_GS_KD', CntrPar%PC_GS_KD, CntrPar%PC_GS_n, accINFILE(1), ErrVar, CntrPar%PC_ControlMode == 0, UnEc) + CALL ParseAry( FileLines, 'PC_GS_TF', CntrPar%PC_GS_TF, CntrPar%PC_GS_n, accINFILE(1), ErrVar, CntrPar%PC_ControlMode == 0, UnEc) + CALL ParseInput(FileLines, 'PC_MaxPit', CntrPar%PC_MaxPit, accINFILE(1), ErrVar, CntrPar%PC_ControlMode == 0, UnEc) + CALL ParseInput(FileLines, 'PC_MinPit', CntrPar%PC_MinPit, accINFILE(1), ErrVar, CntrPar%PC_ControlMode == 0, UnEc) + CALL ParseInput(FileLines, 'PC_MaxRat', CntrPar%PC_MaxRat, accINFILE(1), ErrVar, CntrPar%PC_ControlMode == 0, UnEc) + CALL ParseInput(FileLines, 'PC_MinRat', CntrPar%PC_MinRat, accINFILE(1), ErrVar, CntrPar%PC_ControlMode == 0, UnEc) + CALL ParseInput(FileLines, 'PC_RefSpd', CntrPar%PC_RefSpd, accINFILE(1), ErrVar, CntrPar%PC_ControlMode == 0, UnEc) + CALL ParseInput(FileLines, 'PC_FinePit', CntrPar%PC_FinePit, accINFILE(1), ErrVar, CntrPar%PC_ControlMode == 0, UnEc) + CALL ParseInput(FileLines, 'PC_Switch', CntrPar%PC_Switch, accINFILE(1), ErrVar, CntrPar%PC_ControlMode == 0, UnEc) + IF (ErrVar%aviFAIL < 0) RETURN !------------------- IPC CONSTANTS ----------------------- - CALL ReadEmptyLine(UnControllerParameters,CurLine) - CALL ParseAry(UnControllerParameters, CurLine, 'IPC_Vramp', CntrPar%IPC_Vramp, 2, accINFILE(1), ErrVar ) - CALL ParseInput(UnControllerParameters,CurLine,'IPC_IntSat',accINFILE(1),CntrPar%IPC_IntSat,ErrVar) - CALL ParseAry(UnControllerParameters, CurLine, 'IPC_KP', CntrPar%IPC_KP, 2, accINFILE(1), ErrVar ) - CALL ParseAry(UnControllerParameters, CurLine, 'IPC_KI', CntrPar%IPC_KI, 2, accINFILE(1), ErrVar ) - CALL ParseAry(UnControllerParameters, CurLine, 'IPC_aziOffset', CntrPar%IPC_aziOffset, 2, accINFILE(1), ErrVar ) - CALL ParseInput(UnControllerParameters,CurLine,'IPC_CornerFreqAct',accINFILE(1),CntrPar%IPC_CornerFreqAct,ErrVar) - CALL ReadEmptyLine(UnControllerParameters,CurLine) + CALL ParseAry( FileLines, 'IPC_Vramp', CntrPar%IPC_Vramp, 2, accINFILE(1), ErrVar, CntrPar%IPC_ControlMode == 0, UnEc) + CALL ParseInput(FileLines, 'IPC_SatMode', CntrPar%IPC_SatMode, accINFILE(1), ErrVar, CntrPar%IPC_ControlMode == 0, UnEc) + CALL ParseInput(FileLines, 'IPC_IntSat', CntrPar%IPC_IntSat, accINFILE(1), ErrVar, CntrPar%IPC_ControlMode == 0, UnEc) + CALL ParseAry( FileLines, 'IPC_KP', CntrPar%IPC_KP, 2, accINFILE(1), ErrVar, CntrPar%IPC_ControlMode == 0, UnEc) + CALL ParseAry( FileLines, 'IPC_KI', CntrPar%IPC_KI, 2, accINFILE(1), ErrVar, CntrPar%IPC_ControlMode == 0, UnEc) + CALL ParseAry( FileLines, 'IPC_aziOffset', CntrPar%IPC_aziOffset, 2, accINFILE(1), ErrVar, CntrPar%IPC_ControlMode == 0, UnEc) + CALL ParseInput(FileLines, 'IPC_CornerFreqAct',CntrPar%IPC_CornerFreqAct, accINFILE(1), ErrVar, CntrPar%IPC_ControlMode == 0, UnEc) + IF (ErrVar%aviFAIL < 0) RETURN !------------ VS TORQUE CONTROL CONSTANTS ---------------- - CALL ReadEmptyLine(UnControllerParameters,CurLine) - CALL ParseInput(UnControllerParameters,CurLine,'VS_GenEff',accINFILE(1),CntrPar%VS_GenEff,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'VS_ArSatTq',accINFILE(1),CntrPar%VS_ArSatTq,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'VS_MaxRat',accINFILE(1),CntrPar%VS_MaxRat,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'VS_MaxTq',accINFILE(1),CntrPar%VS_MaxTq,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'VS_MinTq',accINFILE(1),CntrPar%VS_MinTq,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'VS_MinOMSpd',accINFILE(1),CntrPar%VS_MinOMSpd,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'VS_Rgn2K',accINFILE(1),CntrPar%VS_Rgn2K,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'VS_RtPwr',accINFILE(1),CntrPar%VS_RtPwr,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'VS_RtTq',accINFILE(1),CntrPar%VS_RtTq,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'VS_RefSpd',accINFILE(1),CntrPar%VS_RefSpd,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'VS_n',accINFILE(1),CntrPar%VS_n,ErrVar) - CALL ParseAry(UnControllerParameters, CurLine, 'VS_KP', CntrPar%VS_KP, CntrPar%VS_n, accINFILE(1), ErrVar ) - CALL ParseAry(UnControllerParameters, CurLine, 'VS_KI', CntrPar%VS_KI, CntrPar%VS_n, accINFILE(1), ErrVar ) - CALL ParseInput(UnControllerParameters,CurLine,'VS_TSRopt',accINFILE(1),CntrPar%VS_TSRopt,ErrVar) - CALL ReadEmptyLine(UnControllerParameters,CurLine) + CALL ParseInput(FileLines, 'VS_GenEff', CntrPar%VS_GenEff, accINFILE(1), ErrVar, .FALSE., UnEc) + CALL ParseInput(FileLines, 'VS_ArSatTq', CntrPar%VS_ArSatTq, accINFILE(1), ErrVar, CntrPar%VS_ControlMode > 1, UnEc) + CALL ParseInput(FileLines, 'VS_MaxRat', CntrPar%VS_MaxRat, accINFILE(1), ErrVar, CntrPar%VS_ControlMode > 1, UnEc) + CALL ParseInput(FileLines, 'VS_MaxTq', CntrPar%VS_MaxTq, accINFILE(1), ErrVar, .FALSE., UnEc) + CALL ParseInput(FileLines, 'VS_MinTq', CntrPar%VS_MinTq, accINFILE(1), ErrVar, .FALSE., UnEc) + CALL ParseInput(FileLines, 'VS_MinOMSpd', CntrPar%VS_MinOMSpd, accINFILE(1), ErrVar) ! Default 0 is fin, UnEce + CALL ParseInput(FileLines, 'VS_Rgn2K', CntrPar%VS_Rgn2K, accINFILE(1), ErrVar, CntrPar%VS_ControlMode > 1, UnEc) + CALL ParseInput(FileLines, 'VS_RtPwr', CntrPar%VS_RtPwr, accINFILE(1), ErrVar, .FALSE., UnEc) + CALL ParseInput(FileLines, 'VS_RtTq', CntrPar%VS_RtTq, accINFILE(1), ErrVar, .FALSE., UnEc) + CALL ParseInput(FileLines, 'VS_RefSpd', CntrPar%VS_RefSpd, accINFILE(1), ErrVar, .FALSE., UnEc) + CALL ParseInput(FileLines, 'VS_n', CntrPar%VS_n, accINFILE(1), ErrVar, .FALSE., UnEc) + CALL ParseAry( FileLines, 'VS_KP', CntrPar%VS_KP, CntrPar%VS_n, accINFILE(1), ErrVar, .FALSE., UnEc) + CALL ParseAry( FileLines, 'VS_KI', CntrPar%VS_KI, CntrPar%VS_n, accINFILE(1), ErrVar, .FALSE., UnEc) + CALL ParseInput(FileLines, 'VS_TSRopt', CntrPar%VS_TSRopt, accINFILE(1), ErrVar, CntrPar%VS_ControlMode < 2, UnEc) + IF (ErrVar%aviFAIL < 0) RETURN !------- Setpoint Smoother -------------------------------- - CALL ReadEmptyLine(UnControllerParameters,CurLine) - CALL ParseInput(UnControllerParameters,CurLine,'SS_VSGain',accINFILE(1),CntrPar%SS_VSGain,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'SS_PCGain',accINFILE(1),CntrPar%SS_PCGain,ErrVar) - CALL ReadEmptyLine(UnControllerParameters,CurLine) + CALL ParseInput(FileLines, 'SS_VSGain', CntrPar%SS_VSGain, accINFILE(1), ErrVar, CntrPar%SS_Mode == 0, UnEc) + CALL ParseInput(FileLines, 'SS_PCGain', CntrPar%SS_PCGain, accINFILE(1), ErrVar, CntrPar%SS_Mode == 0, UnEc) + IF (ErrVar%aviFAIL < 0) RETURN !------------ WIND SPEED ESTIMATOR CONTANTS -------------- - CALL ReadEmptyLine(UnControllerParameters,CurLine) - CALL ParseInput(UnControllerParameters,CurLine,'WE_BladeRadius',accINFILE(1),CntrPar%WE_BladeRadius,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'WE_CP_n',accINFILE(1),CntrPar%WE_CP_n,ErrVar) - CALL ParseAry(UnControllerParameters, CurLine, 'WE_CP', CntrPar%WE_CP, CntrPar%WE_CP_n, accINFILE(1), ErrVar, .FALSE. ) - CALL ParseInput(UnControllerParameters,CurLine,'WE_Gamma',accINFILE(1),CntrPar%WE_Gamma,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'WE_GearboxRatio',accINFILE(1),CntrPar%WE_GearboxRatio,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'WE_Jtot',accINFILE(1),CntrPar%WE_Jtot,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'WE_RhoAir',accINFILE(1),CntrPar%WE_RhoAir,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'PerfFileName',accINFILE(1),CntrPar%PerfFileName,ErrVar) - CALL ParseAry(UnControllerParameters, CurLine, 'PerfTableSize', CntrPar%PerfTableSize, 2, accINFILE(1), ErrVar ) - CALL ParseInput(UnControllerParameters,CurLine,'WE_FOPoles_N',accINFILE(1),CntrPar%WE_FOPoles_N,ErrVar) - CALL ParseAry(UnControllerParameters, CurLine, 'WE_FOPoles_v', CntrPar%WE_FOPoles_v, CntrPar%WE_FOPoles_N, accINFILE(1), ErrVar ) - CALL ParseAry(UnControllerParameters, CurLine, 'WE_FOPoles', CntrPar%WE_FOPoles, CntrPar%WE_FOPoles_N, accINFILE(1), ErrVar ) - CALL ReadEmptyLine(UnControllerParameters,CurLine) + CALL ParseInput(FileLines, 'WE_BladeRadius', CntrPar%WE_BladeRadius, accINFILE(1), ErrVar, .FALSE., UnEc) + CALL ParseInput(FileLines, 'WE_Gamma', CntrPar%WE_Gamma, accINFILE(1), ErrVar, CntrPar%WE_Mode .NE. 1, UnEc) + CALL ParseInput(FileLines, 'WE_GearboxRatio', CntrPar%WE_GearboxRatio, accINFILE(1), ErrVar, .FALSE., UnEc) + CALL ParseInput(FileLines, 'WE_Jtot', CntrPar%WE_Jtot, accINFILE(1), ErrVar, CntrPar%WE_Mode == 0, UnEc) + CALL ParseInput(FileLines, 'WE_RhoAir', CntrPar%WE_RhoAir, accINFILE(1), ErrVar, CntrPar%WE_Mode .NE. 2, UnEc) + CALL ParseInput(FileLines, 'PerfFileName', CntrPar%PerfFileName, accINFILE(1), ErrVar, CntrPar%WE_Mode == 0, UnEc ) + CALL ParseAry( FileLines, 'PerfTableSize', CntrPar%PerfTableSize, 2, accINFILE(1), ErrVar, CntrPar%WE_Mode == 0, UnEc) + CALL ParseInput(FileLines, 'WE_FOPoles_N', CntrPar%WE_FOPoles_N, accINFILE(1), ErrVar, CntrPar%WE_Mode .NE. 2, UnEc) + CALL ParseAry(FileLines, 'WE_FOPoles_v', CntrPar%WE_FOPoles_v, CntrPar%WE_FOPoles_N, accINFILE(1), ErrVar, CntrPar%WE_Mode .NE. 2, UnEc) + CALL ParseAry(FileLines, 'WE_FOPoles', CntrPar%WE_FOPoles, CntrPar%WE_FOPoles_N, accINFILE(1), ErrVar, CntrPar%WE_Mode .NE. 2, UnEc) + IF (ErrVar%aviFAIL < 0) RETURN + + ! Retired WSE inputs: not used anywhere in code + ! CALL ParseInput(FileLines, 'WE_CP_n',accINFILE(1),CntrPar%WE_CP_n,ErrVar, UnEc) + ! CALL ParseAry( FileLines, 'WE_CP', CntrPar%WE_CP, CntrPar%WE_CP_n, accINFILE(1), ErrVar, .FALSE. , UnEc) !-------------- YAW CONTROLLER CONSTANTS ----------------- - CALL ReadEmptyLine(UnControllerParameters,CurLine) - CALL ParseInput(UnControllerParameters,CurLine,'Y_uSwitch',accINFILE(1),CntrPar%Y_uSwitch,ErrVar) - CALL ParseAry(UnControllerParameters, CurLine, 'Y_ErrThresh', CntrPar%Y_ErrThresh, 2, accINFILE(1), ErrVar ) - CALL ParseInput(UnControllerParameters,CurLine,'Y_Rate',accINFILE(1),CntrPar%Y_Rate,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'Y_MErrSet',accINFILE(1),CntrPar%Y_MErrSet,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'Y_IPC_IntSat',accINFILE(1),CntrPar%Y_IPC_IntSat,ErrVar) - CALL ParseInput(UnControllerParameters, CurLine,'Y_IPC_KP', accINFILE(1), CntrPar%Y_IPC_KP, ErrVar ) - CALL ParseInput(UnControllerParameters, CurLine,'Y_IPC_KI', accINFILE(1), CntrPar%Y_IPC_KI, ErrVar ) - CALL ReadEmptyLine(UnControllerParameters,CurLine) + CALL ParseInput(FileLines, 'Y_uSwitch', CntrPar%Y_uSwitch, accINFILE(1), ErrVar, CntrPar%Y_ControlMode == 0, UnEc) + CALL ParseAry( FileLines, 'Y_ErrThresh', CntrPar%Y_ErrThresh, 2, accINFILE(1), ErrVar, CntrPar%Y_ControlMode == 0, UnEc) + CALL ParseInput(FileLines, 'Y_Rate', CntrPar%Y_Rate, accINFILE(1), ErrVar, CntrPar%Y_ControlMode == 0, UnEc) + CALL ParseInput(FileLines, 'Y_MErrSet', CntrPar%Y_MErrSet, accINFILE(1), ErrVar, CntrPar%Y_ControlMode == 0, UnEc) + CALL ParseInput(FileLines, 'Y_IPC_IntSat', CntrPar%Y_IPC_IntSat, accINFILE(1), ErrVar, CntrPar%Y_ControlMode == 0, UnEc) + CALL ParseInput(FileLines, 'Y_IPC_KP', CntrPar%Y_IPC_KP, accINFILE(1), ErrVar, CntrPar%Y_ControlMode == 0, UnEc) + CALL ParseInput(FileLines, 'Y_IPC_KI', CntrPar%Y_IPC_KI, accINFILE(1), ErrVar, CntrPar%Y_ControlMode == 0, UnEc) + IF (ErrVar%aviFAIL < 0) RETURN !------------ FORE-AFT TOWER DAMPER CONSTANTS ------------ - CALL ReadEmptyLine(UnControllerParameters,CurLine) - CALL ParseInput(UnControllerParameters,CurLine,'FA_KI',accINFILE(1),CntrPar%FA_KI,ErrVar) - ! Don't check this name until we make an API change - CALL ParseInput(UnControllerParameters,CurLine,'FA_HPFCornerFreq',accINFILE(1),CntrPar%FA_HPFCornerFreq,ErrVar,.FALSE.) - CALL ParseInput(UnControllerParameters,CurLine,'FA_IntSat',accINFILE(1),CntrPar%FA_IntSat,ErrVar) - CALL ReadEmptyLine(UnControllerParameters,CurLine) + CALL ParseInput(FileLines, 'FA_KI', CntrPar%FA_KI, accINFILE(1), ErrVar, .NOT. ((CntrPar%TD_Mode > 0) .OR. (CntrPar%Y_ControlMode == 2)), UnEc) + CALL ParseInput(FileLines, 'FA_HPFCornerFreq', CntrPar%FA_HPFCornerFreq, accINFILE(1), ErrVar, .NOT. ((CntrPar%TD_Mode > 0) .OR. (CntrPar%Y_ControlMode == 2)), UnEc) + CALL ParseInput(FileLines, 'FA_IntSat', CntrPar%FA_IntSat, accINFILE(1), ErrVar, .NOT. ((CntrPar%TD_Mode > 0) .OR. (CntrPar%Y_ControlMode == 2)), UnEc) + IF (ErrVar%aviFAIL < 0) RETURN !------------ PEAK SHAVING ------------ - CALL ReadEmptyLine(UnControllerParameters,CurLine) - CALL ParseInput(UnControllerParameters,CurLine,'PS_BldPitchMin_N',accINFILE(1),CntrPar%PS_BldPitchMin_N,ErrVar) - CALL ParseAry(UnControllerParameters, CurLine, 'PS_WindSpeeds', CntrPar%PS_WindSpeeds, CntrPar%PS_BldPitchMin_N, accINFILE(1), ErrVar ) - CALL ParseAry(UnControllerParameters, CurLine, 'PS_BldPitchMin', CntrPar%PS_BldPitchMin, CntrPar%PS_BldPitchMin_N, accINFILE(1), ErrVar ) - CALL ReadEmptyLine(UnControllerParameters,CurLine) + CALL ParseInput(FileLines, 'PS_BldPitchMin_N', CntrPar%PS_BldPitchMin_N, accINFILE(1), ErrVar, CntrPar%PS_Mode == 0, UnEc) + CALL ParseAry( FileLines, 'PS_WindSpeeds', CntrPar%PS_WindSpeeds, CntrPar%PS_BldPitchMin_N, accINFILE(1), ErrVar, CntrPar%PS_Mode == 0, UnEc) + CALL ParseAry( FileLines, 'PS_BldPitchMin', CntrPar%PS_BldPitchMin, CntrPar%PS_BldPitchMin_N, accINFILE(1), ErrVar, CntrPar%PS_Mode == 0, UnEc) + IF (ErrVar%aviFAIL < 0) RETURN !------------ SHUTDOWN ------------ - CALL ReadEmptyLine(UnControllerParameters,CurLine) - CALL ParseInput(UnControllerParameters,CurLine,'SD_MaxPit',accINFILE(1),CntrPar%SD_MaxPit,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'SD_CornerFreq',accINFILE(1),CntrPar%SD_CornerFreq,ErrVar) - CALL ReadEmptyLine(UnControllerParameters,CurLine) + CALL ParseInput(FileLines, 'SD_MaxPit', CntrPar%SD_MaxPit, accINFILE(1), ErrVar, CntrPar%SD_Mode == 0, UnEc) + CALL ParseInput(FileLines, 'SD_CornerFreq', CntrPar%SD_CornerFreq, accINFILE(1), ErrVar, CntrPar%SD_Mode == 0, UnEc) + IF (ErrVar%aviFAIL < 0) RETURN !------------ FLOATING ------------ - CALL ReadEmptyLine(UnControllerParameters,CurLine) - CALL ParseInput(UnControllerParameters,CurLine,'Fl_Kp',accINFILE(1),CntrPar%Fl_Kp,ErrVar) - CALL ReadEmptyLine(UnControllerParameters,CurLine) + CALL ParseInput(FileLines, 'Fl_Kp', CntrPar%Fl_Kp, accINFILE(1), ErrVar, CntrPar%FL_Mode == 0, UnEc) + IF (ErrVar%aviFAIL < 0) RETURN !------------ Flaps ------------ - CALL ReadEmptyLine(UnControllerParameters,CurLine) - CALL ParseInput(UnControllerParameters,CurLine,'Flp_Angle',accINFILE(1),CntrPar%Flp_Angle,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'Flp_Kp',accINFILE(1),CntrPar%Flp_Kp,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'Flp_Ki',accINFILE(1),CntrPar%Flp_Ki,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'Flp_MaxPit',accINFILE(1),CntrPar%Flp_MaxPit,ErrVar) - CALL ReadEmptyLine(UnControllerParameters,CurLine) + CALL ParseInput(FileLines, 'Flp_Angle', CntrPar%Flp_Angle, accINFILE(1), ErrVar, CntrPar%Flp_Mode == 0, UnEc) + CALL ParseInput(FileLines, 'Flp_Kp', CntrPar%Flp_Kp, accINFILE(1), ErrVar, CntrPar%Flp_Mode == 0, UnEc) + CALL ParseInput(FileLines, 'Flp_Ki', CntrPar%Flp_Ki, accINFILE(1), ErrVar, CntrPar%Flp_Mode == 0, UnEc) + CALL ParseInput(FileLines, 'Flp_MaxPit', CntrPar%Flp_MaxPit, accINFILE(1), ErrVar, CntrPar%Flp_Mode == 0, UnEc) + IF (ErrVar%aviFAIL < 0) RETURN !------------ Open loop input ------------ - CALL ReadEmptyLine(UnControllerParameters,CurLine) - CALL ParseInput(UnControllerParameters,CurLine,'OL_Filename',accINFILE(1),CntrPar%OL_Filename,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'Ind_Breakpoint',accINFILE(1),CntrPar%Ind_Breakpoint,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'Ind_BldPitch',accINFILE(1),CntrPar%Ind_BldPitch,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'Ind_GenTq',accINFILE(1),CntrPar%Ind_GenTq,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'Ind_YawRate',accINFILE(1),CntrPar%Ind_YawRate,ErrVar) - CALL ReadEmptyLine(UnControllerParameters,CurLine) + ! Indices can be left 0 by default, checked later + CALL ParseInput(FileLines, 'OL_Filename', CntrPar%OL_Filename, accINFILE(1), ErrVar, CntrPar%OL_Mode == 0, UnEc) + CALL ParseInput(FileLines, 'Ind_Breakpoint', CntrPar%Ind_Breakpoint, accINFILE(1), ErrVar, UnEc=UnEc) + CALL ParseInput(FileLines, 'Ind_BldPitch', CntrPar%Ind_BldPitch, accINFILE(1), ErrVar, UnEc=UnEc) + CALL ParseInput(FileLines, 'Ind_GenTq', CntrPar%Ind_GenTq, accINFILE(1), ErrVar, UnEc=UnEc) + CALL ParseInput(FileLines, 'Ind_YawRate', CntrPar%Ind_YawRate, accINFILE(1), ErrVar, UnEc=UnEc) + IF (ErrVar%aviFAIL < 0) RETURN + !------------ Pitch Actuator Inputs ------------ - CALL ReadEmptyLine(UnControllerParameters,CurLine) - CALL ParseInput(UnControllerParameters,CurLine,'PA_CornerFreq',accINFILE(1),CntrPar%PA_CornerFreq,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'PA_Damping',accINFILE(1),CntrPar%PA_Damping,ErrVar) - CALL ReadEmptyLine(UnControllerParameters,CurLine) - + CALL ParseInput(FileLines, 'PA_CornerFreq', CntrPar%PA_CornerFreq, accINFILE(1), ErrVar, CntrPar%PA_Mode == 0, UnEc) + CALL ParseInput(FileLines, 'PA_Damping', CntrPar%PA_Damping, accINFILE(1), ErrVar, CntrPar%PA_Mode == 0, UnEc) + IF (ErrVar%aviFAIL < 0) RETURN + + !------------ Pitch Actuator Faults ------------ + CALL ParseAry(FileLines, 'PF_Offsets', CntrPar%PF_Offsets, 3, accINFILE(1), ErrVar, CntrPar%PF_Mode == 0, UnEc) + IF (ErrVar%aviFAIL < 0) RETURN + + !------------ AWC input ------------ + CALL ParseInput(FileLines, 'AWC_NumModes', CntrPar%AWC_NumModes, accINFILE(1), ErrVar, CntrPar%AWC_Mode == 0, UnEc) + CALL ParseAry( FileLines, 'AWC_n', CntrPar%AWC_n, CntrPar%AWC_NumModes, accINFILE(1), ErrVar, CntrPar%AWC_Mode /= 1, UnEc) + CALL ParseAry( FileLines, 'AWC_harmonic', CntrPar%AWC_harmonic, CntrPar%AWC_NumModes, accINFILE(1), ErrVar, CntrPar%AWC_Mode < 2, UnEc) + CALL ParseAry( FileLines, 'AWC_freq', CntrPar%AWC_freq, CntrPar%AWC_NumModes, accINFILE(1), ErrVar, CntrPar%AWC_Mode == 0, UnEc) + CALL ParseAry( FileLines, 'AWC_amp', CntrPar%AWC_amp, CntrPar%AWC_NumModes, accINFILE(1), ErrVar, CntrPar%AWC_Mode == 0, UnEc) + CALL ParseAry( FileLines, 'AWC_clockangle', CntrPar%AWC_clockangle, CntrPar%AWC_NumModes, accINFILE(1), ErrVar, CntrPar%AWC_Mode == 0, UnEc) + IF (ErrVar%aviFAIL < 0) RETURN + !------------ External control interface ------------ - CALL ReadEmptyLine(UnControllerParameters,CurLine) - CALL ParseInput(UnControllerParameters,CurLine,'DLL_FileName',accINFILE(1),CntrPar%DLL_FileName,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'DLL_InFile',accINFILE(1),CntrPar%DLL_InFile,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'DLL_ProcName',accINFILE(1),CntrPar%DLL_ProcName,ErrVar) - CALL ReadEmptyLine(UnControllerParameters,CurLine) + CALL ParseInput(FileLines, 'DLL_FileName', CntrPar%DLL_FileName, accINFILE(1), ErrVar, CntrPar%Ext_Mode == 0, UnEc) + CALL ParseInput(FileLines, 'DLL_InFile', CntrPar%DLL_InFile, accINFILE(1), ErrVar, CntrPar%Ext_Mode == 0, UnEc) + CALL ParseInput(FileLines, 'DLL_ProcName', CntrPar%DLL_ProcName, accINFILE(1), ErrVar, CntrPar%Ext_Mode == 0, UnEc) + IF (ErrVar%aviFAIL < 0) RETURN !------------ ZeroMQ ------------ - CALL ReadEmptyLine(UnControllerParameters,CurLine) - CALL ParseInput(UnControllerParameters,CurLine,'ZMQ_CommAddress',accINFILE(1), CntrPar%ZMQ_CommAddress,ErrVar) - CALL ParseInput(UnControllerParameters,CurLine,'ZMQ_UpdatePeriod',accINFILE(1), CntrPar%ZMQ_UpdatePeriod,ErrVar) + CALL ParseInput(FileLines, 'ZMQ_CommAddress', CntrPar%ZMQ_CommAddress, accINFILE(1), ErrVar, CntrPar%ZMQ_Mode == 0, UnEc) + CALL ParseInput(FileLines, 'ZMQ_UpdatePeriod', CntrPar%ZMQ_UpdatePeriod, accINFILE(1), ErrVar, CntrPar%ZMQ_Mode == 0, UnEc) + IF (ErrVar%aviFAIL < 0) RETURN - ! Fix Paths (add relative paths if called from another dir) - IF (PathIsRelative(CntrPar%PerfFileName)) CntrPar%PerfFileName = TRIM(PriPath)//TRIM(CntrPar%PerfFileName) - IF (PathIsRelative(CntrPar%OL_Filename)) CntrPar%OL_Filename = TRIM(PriPath)//TRIM(CntrPar%OL_Filename) - - ! Read open loop input, if desired - IF (CntrPar%OL_Mode == 1) THEN - OL_String = '' ! Display string - OL_Count = 1 - IF (CntrPar%Ind_BldPitch > 0) THEN - OL_String = TRIM(OL_String)//' BldPitch ' - OL_Count = OL_Count + 1 - ENDIF + !------------- Cable Control ----- + CALL ParseInput(FileLines, 'CC_Group_N', CntrPar%CC_Group_N, accINFILE(1), ErrVar, CntrPar%CC_Mode == 0, UnEc) + CALL ParseAry( FileLines, 'CC_GroupIndex', CntrPar%CC_GroupIndex, CntrPar%CC_Group_N, accINFILE(1), ErrVar, CntrPar%CC_Mode == 0, UnEc) + CALL ParseInput(FileLines, 'CC_ActTau', CntrPar%CC_ActTau, accINFILE(1), ErrVar, CntrPar%CC_Mode == 0, UnEc) + IF (ErrVar%aviFAIL < 0) RETURN - IF (CntrPar%Ind_GenTq > 0) THEN - OL_String = TRIM(OL_String)//' GenTq ' - OL_Count = OL_Count + 1 - ENDIF - - IF (CntrPar%Ind_YawRate > 0) THEN - OL_String = TRIM(OL_String)//' YawRate ' - OL_Count = OL_Count + 1 - ENDIF - - PRINT *, 'ROSCO: Implementing open loop control for'//TRIM(OL_String) - CALL Read_OL_Input(CntrPar%OL_Filename,110_IntKi,OL_Count,CntrPar%OL_Channels, ErrVar) + !------------- StC Control ----- + CALL ParseInput(FileLines, 'StC_Group_N', CntrPar%StC_Group_N, accINFILE(1), ErrVar, CntrPar%StC_Mode == 0, UnEc) + CALL ParseAry( FileLines, 'StC_GroupIndex', CntrPar%StC_GroupIndex, CntrPar%StC_Group_N, accINFILE(1), ErrVar, CntrPar%StC_Mode == 0, UnEc) + IF (ErrVar%aviFAIL < 0) RETURN - CntrPar%OL_Breakpoints = CntrPar%OL_Channels(:,CntrPar%Ind_Breakpoint) + ! Open loop cable, structural control, needs number of groups + CALL ParseAry( FileLines, 'Ind_CableControl', CntrPar%Ind_CableControl, CntrPar%CC_Group_N, accINFILE(1), ErrVar, CntrPar%CC_Mode .NE. 2, UnEc=UnEc) + CALL ParseAry( FileLines, 'Ind_StructControl', CntrPar%Ind_StructControl, CntrPar%StC_Group_N, accINFILE(1), ErrVar, CntrPar%StC_Mode .NE. 2, UnEc=UnEc) + IF (ErrVar%aviFAIL < 0) RETURN - IF (CntrPar%Ind_BldPitch > 0) THEN - CntrPar%OL_BldPitch = CntrPar%OL_Channels(:,CntrPar%Ind_BldPitch) - ENDIF + IF (UnEc > 0) CLOSE(UnEc) ! Close echo file - IF (CntrPar%Ind_GenTq > 0) THEN - CntrPar%OL_GenTq = CntrPar%OL_Channels(:,CntrPar%Ind_GenTq) - ENDIF - - IF (CntrPar%Ind_YawRate > 0) THEN - CntrPar%OL_YawRate = CntrPar%OL_Channels(:,CntrPar%Ind_YawRate) - ENDIF - END IF + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + ! Fix Paths (add relative paths if called from another dir, UnEc) + IF (PathIsRelative(CntrPar%PerfFileName)) CntrPar%PerfFileName = TRIM(PriPath)//TRIM(CntrPar%PerfFileName) + IF (PathIsRelative(CntrPar%OL_Filename)) CntrPar%OL_Filename = TRIM(PriPath)//TRIM(CntrPar%OL_Filename) + ! Convert yaw rate to deg/s CntrPar%Y_Rate = CntrPar%Y_Rate * R2D - ! Debugging outputs (echo someday) - ! write(400,*) CntrPar%OL_YawRate - ! END OF INPUT FILE ! Close Input File @@ -463,6 +615,7 @@ SUBROUTINE ReadControlParameterFileSub(CntrPar, zmqVar, accINFILE, accINFILE_siz !------------------- HOUSEKEEPING ----------------------- CntrPar%PerfFileName = TRIM(CntrPar%PerfFileName) + ! Add RoutineName to error message IF (ErrVar%aviFAIL < 0) THEN @@ -550,10 +703,14 @@ SUBROUTINE CheckInputs(LocalVar, CntrPar, avrSWAP, ErrVar, size_avcMSG) TYPE(LocalVariables), INTENT(IN ) :: LocalVar TYPE(ErrorVariables), INTENT(INOUT) :: ErrVar INTEGER(IntKi), INTENT(IN ) :: size_avcMSG + INTEGER(IntKi) :: Imode ! Index used for looping through AWC modes REAL(ReKi), INTENT(IN ) :: avrSWAP(*) ! The swap array, used to pass data to, and receive data from, the DLL controller. CHARACTER(*), PARAMETER :: RoutineName = 'CheckInputs' ! Local + + INTEGER(IntKi) :: I + INTEGER(IntKi), ALLOCATABLE :: All_OL_Indices(:) !.............................................................................................................................. ! Check validity of input parameters: @@ -700,12 +857,6 @@ SUBROUTINE CheckInputs(LocalVar, CntrPar, avrSWAP, ErrVar, size_avcMSG) ErrVar%ErrMsg = 'F_WECornerFreq must be greater than zero.' ENDIF - ! F_FlHighPassFreq - IF (CntrPar%F_FlHighPassFreq <= 0.0) THEN - ErrVar%aviFAIL = -1 - ErrVar%ErrMsg = 'F_FlHighPassFreq must be greater than zero.' - ENDIF - IF (CntrPar%Fl_Mode > 0) THEN ! F_FlCornerFreq(1) (frequency) IF (CntrPar%F_FlCornerFreq(1) <= 0.0) THEN @@ -718,6 +869,12 @@ SUBROUTINE CheckInputs(LocalVar, CntrPar, avrSWAP, ErrVar, size_avcMSG) ErrVar%aviFAIL = -1 ErrVar%ErrMsg = 'F_FlCornerFreq(2) must be greater than zero.' ENDIF + + ! F_FlHighPassFreq + IF (CntrPar%F_FlHighPassFreq <= 0.0) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = 'F_FlHighPassFreq must be greater than zero.' + ENDIF ENDIF IF (CntrPar%Flp_Mode > 0) THEN @@ -783,6 +940,11 @@ SUBROUTINE CheckInputs(LocalVar, CntrPar, avrSWAP, ErrVar, size_avcMSG) ErrVar%ErrMsg = 'Corner frequency of IPC actuator model must be positive, or set to 0 to disable.' ENDIF + IF (CntrPar%IPC_SatMode < 0 .OR. CntrPar%IPC_SatMode > 3) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = 'IPC_SatMode must be 0, 1, 2, or 3.' + ENDIF + IF (CntrPar%IPC_KI(1) < 0.0) THEN ErrVar%aviFAIL = -1 ErrVar%ErrMsg = 'IPC_KI(1) must be zero or greater than zero.' @@ -913,9 +1075,8 @@ SUBROUTINE CheckInputs(LocalVar, CntrPar, avrSWAP, ErrVar, size_avcMSG) ENDIF ! WE_FOPoles_v - IF (.NOT. NonDecreasing(CntrPar%WE_FOPoles_v)) THEN + IF (CntrPar%WE_Mode == 2 .AND. .NOT. NonDecreasing(CntrPar%WE_FOPoles_v)) THEN ErrVar%aviFAIL = -1 - write(400,*) CntrPar%WE_FOPoles_v ErrVar%ErrMsg = 'WE_FOPoles_v must be non-decreasing.' ENDIF @@ -961,17 +1122,57 @@ SUBROUTINE CheckInputs(LocalVar, CntrPar, avrSWAP, ErrVar, size_avcMSG) ENDIF ! --- Open loop control --- - IF (((CntrPar%Ind_Breakpoint) < 0) .OR. & - (CntrPar%Ind_BldPitch < 0) .OR. & - (CntrPar%Ind_GenTq < 0) .OR. & - (CntrPar%Ind_YawRate < 0)) THEN - ErrVar%aviFAIL = -1 - ErrVar%ErrMsg = 'All open loop control indices must be greater than zero' + IF (CntrPar%OL_Mode > 0) THEN + ! Get all open loop indices + ALLOCATE(All_OL_Indices(3)) ! Will need to increase to 5 when IPC + All_OL_Indices = (/CntrPar%Ind_BldPitch, & + CntrPar%Ind_GenTq, & + CntrPar%Ind_YawRate/) + + DO I = 1,SIZE(CntrPar%Ind_CableControl) + Call AddToList(All_OL_Indices, CntrPar%Ind_CableControl(I)) + ENDDO + + DO I = 1,SIZE(CntrPar%Ind_StructControl) + Call AddToList(All_OL_Indices, CntrPar%Ind_StructControl(I)) + ENDDO + + IF (ANY(All_OL_Indices < 0)) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = 'All open loop control indices must be greater than zero' + ENDIF + + IF (CntrPar%Ind_Breakpoint < 1) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = 'Ind_Breakpoint must be non-zero if OL_Mode is non-zero' + ENDIF + + IF (ALL(All_OL_Indices < 1)) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = 'At least one open loop input channel must be non-zero' + ENDIF + + IF (ANY(CntrPar%Ind_CableControl > 0) .AND. CntrPar%CC_Mode .NE. 2) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = 'CC_Mode must be 2 if using open loop cable control via Ind_CableControl' + ENDIF + + IF (ANY(CntrPar%Ind_StructControl > 0) .AND. CntrPar%StC_Mode .NE. 2) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = 'CC_Mode must be 2 if using open loop struct control via Ind_StructControl' + ENDIF + + + ENDIF + + ! ---- AWC vs. IPC + IF (CntrPar%AWC_Mode > 0 .AND. CntrPar%IPC_ControlMode > 0) THEN + PRINT *, "ROSCO WARNING: Individual pitch control and active wake control are both enabled. Performance may be compromised." ENDIF ! --- Pitch Actuator --- IF (CntrPar%PA_Mode > 0) THEN - IF ((CntrPar%PA_Mode < 0) .OR. (CntrPar%PA_Mode < 2)) THEN + IF ((CntrPar%PA_Mode < 0) .OR. (CntrPar%PA_Mode > 2)) THEN ErrVar%aviFAIL = -1 ErrVar%ErrMsg = 'PA_Mode must be 0, 1, or 2' END IF @@ -984,6 +1185,88 @@ SUBROUTINE CheckInputs(LocalVar, CntrPar, avrSWAP, ErrVar, size_avcMSG) ErrVar%ErrMsg = 'PA_Damping must be greater than 0' END IF END IF + + ! --- Active Wake Control --- + IF (CntrPar%AWC_Mode > 0) THEN + IF (CntrPar%AWC_NumModes < 0) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = 'AWC_NumModes must be a positive integer if AWC_Mode = 1' + END IF + DO Imode = 1,CntrPar%AWC_NumModes + IF (CntrPar%AWC_freq(Imode) < 0.0) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = 'AWC_freq cannot be less than 0' + END IF + IF (CntrPar%AWC_amp(Imode) < 0.0) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = 'AWC_amp cannot be less than 0' + END IF + END DO + IF (CntrPar%AWC_Mode == 1) THEN + DO Imode = 1,CntrPar%AWC_NumModes + IF ((CntrPar%AWC_clockangle(Imode) > 360.0) .OR. (CntrPar%AWC_clockangle(Imode) < 0.0)) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = 'AWC_clockangle must be between 0 and 360 in AWC_Mode = 1' + END IF + END DO + END IF + + IF (CntrPar%AWC_Mode == 2) THEN + IF ((CntrPar%AWC_NumModes > 2) .OR. (CntrPar%AWC_NumModes < 1)) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = 'AWC_NumModes must be either 1 or 2 if AWC_Mode = 2' + END IF + DO Imode = 1,CntrPar%AWC_NumModes + IF ((CntrPar%AWC_clockangle(Imode) > 360.0) .OR. (CntrPar%AWC_clockangle(Imode) < -360.0)) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = 'AWC_clockangle must be between -360 and 360 in AWC_Mode = 2' + END IF + IF (CntrPar%AWC_harmonic(Imode) < 0) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = 'AWC_harmonic must be a positive integer' + END IF + END DO + END IF + END IF + + IF ((CntrPar%CC_Mode < 0) .OR. (CntrPar%CC_Mode > 2)) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = 'CC_Mode must be 0 or 1' + END IF + + IF (CntrPar%CC_Mode > 0) THEN + IF (CntrPar%CC_ActTau .LE. 0) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = 'CC_ActTau must be greater than 0.' + END IF + + DO I = 1,CntrPar%CC_Group_N + IF (CntrPar%CC_GroupIndex(I) < 2601) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = 'CC_GroupIndices must be greater than 2601.' !< Starting index for the cable control + END IF + END DO + END IF + + IF (CntrPar%StC_Mode > 0) THEN + DO I = 1,CntrPar%StC_Group_N + IF (CntrPar%StC_GroupIndex(I) < 2801) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = 'StC_GroupIndices must be greater than 2801.' !< Starting index for the cable control + END IF + END DO + END IF + + ! Check that open loop control active if using open loop cable/struct control + IF (CntrPar%CC_Mode == 2 .AND. CntrPar%OL_Mode .NE. 1) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = 'OL_Mode must be 1 if using CC_Mode = 2 (open loop)' + END IF + + IF (CntrPar%StC_Mode == 2 .AND. CntrPar%OL_Mode .NE. 1) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = 'OL_Mode must be 1 if using StC_Mode = 2 (open loop)' + END IF @@ -996,7 +1279,13 @@ SUBROUTINE CheckInputs(LocalVar, CntrPar, avrSWAP, ErrVar, size_avcMSG) IF (NINT(avrSWAP(28)) == 0 .AND. ((CntrPar%IPC_ControlMode > 0) .OR. (CntrPar%Y_ControlMode > 1))) THEN ErrVar%aviFAIL = -1 - ErrVar%ErrMsg = 'IPC enabled, but Ptch_Cntrl in ServoDyn has a value of 0. Set it to 1.' + ErrVar%ErrMsg = 'IPC enabled, but Ptch_Cntrl in ServoDyn has a value of 0. Set it to 1 for individual pitch control.' + ENDIF + + ! PF_Mode = 1 + IF (NINT(avrSWAP(28)) == 0 .AND. (CntrPar%PF_Mode == 1)) THEN + ErrVar%aviFAIL = -1 + ErrVar%ErrMsg = 'Pitch offset fault enabled (PF_Mode = 1), but Ptch_Cntrl in ServoDyn has a value of 0. Set it to 1 for individual pitch control.' ENDIF ! DT diff --git a/ROSCO/ROSCO_testing/ROSCO_testing.py b/ROSCO/ROSCO_testing/ROSCO_testing.py index d65eaa3a0..7ddfea70e 100644 --- a/ROSCO/ROSCO_testing/ROSCO_testing.py +++ b/ROSCO/ROSCO_testing/ROSCO_testing.py @@ -17,7 +17,6 @@ import glob import multiprocessing as mp -import ROSCO_toolbox.ofTools.fast_io.read_fast_input as fast_io from ROSCO_toolbox.ofTools.fast_io.FAST_reader import InputReader_OpenFAST from ROSCO_toolbox.ofTools.case_gen.CaseGen_IEC import CaseGen_IEC from ROSCO_toolbox.ofTools.case_gen.runFAST_pywrapper import runFAST_pywrapper_batch @@ -47,7 +46,6 @@ def __init__(self, **kwargs): self.rosco_path = glob.glob(os.path.join(os.path.dirname(os.path.realpath(__file__)),'../ROSCO/build/libdiscon.*'))[0] except: print('No compiled ROSCO version found, please provide ROSCO_testing.rosco_path.') - self.dev_branch = True # openfast dev branch? self.debug_level = 2 # debug level. 0 - no outputs, 1 - minimal outputs, 2 - all outputs self.overwrite = False # overwrite existing files? self.cores = 4 # number of cores to use @@ -114,8 +112,7 @@ def ROSCO_Test_lite(self, more_case_inputs={}, U=[]): else: WindSpeeds = [5, 8, 11, 14, 17] - fastRead = InputReader_OpenFAST( - FAST_ver=self.FAST_ver, dev_branch=self.dev_branch) + fastRead = InputReader_OpenFAST() fastRead.FAST_InputFile = self.FAST_InputFile # FAST input file (ext=.fst) # Path to fst directory files fastRead.FAST_directory = self.FAST_directory @@ -215,7 +212,6 @@ def ROSCO_Test_lite(self, more_case_inputs={}, U=[]): fastBatch.FAST_InputFile = self.FAST_InputFile # FAST input file (ext=.fst) fastBatch.FAST_directory = self.FAST_directory # Path to fst directory files fastBatch.debug_level = self.debug_level - fastBatch.dev_branch = self.dev_branch fastBatch.case_list = case_list fastBatch.case_name_list = case_name_list @@ -270,8 +266,7 @@ def ROSCO_Test_heavy(self, more_case_inputs={}, U=[]): else: WindSpeeds = [[4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24], [8.88, 12.88]] - fastRead = InputReader_OpenFAST( - FAST_ver=self.FAST_ver, dev_branch=self.dev_branch) + fastRead = InputReader_OpenFAST() fastRead.FAST_InputFile = self.FAST_InputFile # FAST input file (ext=.fst) # Path to fst directory files fastRead.FAST_directory = self.FAST_directory @@ -301,6 +296,7 @@ def ROSCO_Test_heavy(self, more_case_inputs={}, U=[]): iec.D = fastRead.fst_vt['ElastoDyn']['TipRad']*2. iec.z_hub = fastRead.fst_vt['InflowWind']['RefHt'] iec.TMax = self.TMax + iec.TStart = 300 iec.dlc_inputs = {} iec.dlc_inputs['DLC'] = [1.3, 1.4] @@ -343,7 +339,7 @@ def ROSCO_Test_heavy(self, more_case_inputs={}, U=[]): case_inputs[('ServoDyn', 'DLL_FileName')] = {'vals': [self.rosco_path], 'group': 0} case_inputs[("AeroDyn15", "WakeMod")] = {'vals': [1], 'group': 0} - case_inputs[("AeroDyn15", "AFAeroMod")] = {'vals': [2], 'group': 0} + case_inputs[("AeroDyn15", "AFAeroMod")] = {'vals': [1], 'group': 0} case_inputs[("AeroDyn15", "TwrPotent")] = {'vals': [0], 'group': 0} case_inputs[("AeroDyn15", "TwrShadow")] = {'vals': ['False'], 'group': 0} case_inputs[("AeroDyn15", "TwrAero")] = {'vals': ['False'], 'group': 0} @@ -380,7 +376,6 @@ def ROSCO_Test_heavy(self, more_case_inputs={}, U=[]): fastBatch.FAST_InputFile = self.FAST_InputFile # FAST input file (ext=.fst) fastBatch.FAST_directory = self.FAST_directory # Path to fst directory files fastBatch.debug_level = self.debug_level - fastBatch.dev_branch = self.dev_branch fastBatch.case_list = case_list fastBatch.case_name_list = case_name_list @@ -549,33 +544,32 @@ def print_results(self,outfiles): if __name__=='__main__': rt = ROSCO_testing() + this_dir = os.path.dirname(__file__) + ## =================== INITIALIZATION =================== # Setup simulation parameters rt.namebase = 'IEA-15MW' # Base name for FAST files rt.FAST_exe = 'openfast' # OpenFAST executable path rt.Turbsim_exe = 'turbsim' # Turbsim executable path - rt.FAST_ver = 'OpenFAST' # FAST version # path to compiled ROSCO controller if platform.system() == 'Windows': - rt.rosco_path = os.path.join(os.getcwd(), '../ROSCO/build/libdiscon.dll') + rt.rosco_path = os.path.join(this_dir, '../ROSCO/build/libdiscon.dll') elif platform.system() == 'Darwin': - rt.rosco_path = os.path.join(os.getcwd(), '../ROSCO/build/libdiscon.dylib') + rt.rosco_path = os.path.join(this_dir, '../ROSCO/build/libdiscon.dylib') else: - rt.rosco_path = os.path.join(os.getcwd(), '../ROSCO/build/libdiscon.so') - rt.dev_branch = True # dev branch of Openfast? + rt.rosco_path = os.path.join(this_dir, '../ROSCO/build/libdiscon.so') rt.debug_level = 2 # debug level. 0 - no outputs, 1 - minimal outputs, 2 - all outputs rt.overwrite = True # overwite fast sims? - rt.cores = 4 # number of cores if multiprocessings + rt.cores = 1 # number of cores if multiprocessings rt.mpi_run = False # run using mpi rt.mpi_comm_map_down = [] # core mapping for MPI rt.outfile_fmt = 2 # 1 = .txt, 2 = binary, 3 = both - rt.dev_branch= 'True' # Setup turbine rt.Turbine_Class = 'I' rt.Turbulence_Class = 'B' - rt.FAST_directory = os.path.join(os.getcwd(), '../Test_Cases/IEA-15-240-RWT-UMaineSemi') + rt.FAST_directory = os.path.join(this_dir, '../Test_Cases/IEA-15-240-RWT-UMaineSemi') rt.FAST_InputFile = 'IEA-15-240-RWT-UMaineSemi.fst' # Additional inputs @@ -591,7 +585,7 @@ def print_results(self,outfiles): case_inputs[('DISCON_in', 'WE_Mode')] = {'vals': [2], 'group': 0} # Wind Speeds - U = [5, 9, 12, 15] + U = [5] # Run test rt.ROSCO_Test_lite(more_case_inputs=case_inputs, U=U) diff --git a/ROSCO/ROSCO_testing/run_Testing.py b/ROSCO/ROSCO_testing/run_Testing.py index ef201d424..f10c0d011 100644 --- a/ROSCO/ROSCO_testing/run_Testing.py +++ b/ROSCO/ROSCO_testing/run_Testing.py @@ -91,7 +91,6 @@ def run_testing(turbine2test, testtype, rosco_binaries=[], discon_files=[], **kw rt_kwargs['wind_dir'] = os.path.join('/scratch/dzalkind/ROSCO_testing','wind','IEA-15_heavy') # OpenFAST executable path rt_kwargs['Turbsim_exe']= 'turbsim' # Turbsim executable path rt_kwargs['FAST_ver'] = 'OpenFAST' # FAST version - rt_kwargs['dev_branch'] = True # dev branch of Openfast? rt_kwargs['debug_level']= 2 # debug level. 0 - no outputs, 1 - minimal outputs, 2 - all outputs rt_kwargs['overwrite'] = False # overwite fast sims? rt_kwargs['cores'] = 36 # number of cores if multiprocessing diff --git a/ROSCO/ROSCO_testing/test_checkpoint.py b/ROSCO/ROSCO_testing/test_checkpoint.py index d42c7e747..e1d15f039 100644 --- a/ROSCO/ROSCO_testing/test_checkpoint.py +++ b/ROSCO/ROSCO_testing/test_checkpoint.py @@ -53,6 +53,7 @@ def test_restart(self): case_inputs[('Fst', 'OutFileFmt')] = {'vals': [2], 'group': 1} case_inputs[('Fst', 'DT')] = {'vals': [0.025], 'group': 0} case_inputs[('DISCON_in', 'LoggingLevel')] = {'vals': [2], 'group': 1} + case_inputs[('ElastoDyn', 'RotSpeed')] = {'vals': [7], 'group': 0} # Generate cases run_dir = os.path.join(test_out_dir, 'restart') @@ -110,7 +111,7 @@ def test_restart(self): if False: # Plotting for debug import matplotlib.pyplot as plt cases = {} - cases['Baseline'] = ['Wind1VelX', 'BldPitch1', 'GenTq', 'RotSpeed', 'NacYaw'] + cases['Baseline'] = ['Wind1VelX', 'BldPitch1', 'GenTq', 'RotSpeed', 'NacYaw','GenPwr'] fig, ax = op.plot_fast_out(cases=cases, showplot=False) plt.show() diff --git a/ROSCO/ROSCO_toolbox/__init__.py b/ROSCO/ROSCO_toolbox/__init__.py index afbd37e5f..e200b2d2d 100644 --- a/ROSCO/ROSCO_toolbox/__init__.py +++ b/ROSCO/ROSCO_toolbox/__init__.py @@ -2,5 +2,5 @@ """Top-level package for ROSCO_toolbox Repo.""" __author__ = """Nikhar J. Abbas and Daniel S. Zalkind""" -__email__ = 'nikhar.abbas@nrel.gov' -__version__ = '2.6.0' +__email__ = 'daniel.zalkind@nrel.gov' +__version__ = '2.8.0' diff --git a/ROSCO/ROSCO_toolbox/control_interface.py b/ROSCO/ROSCO_toolbox/control_interface.py index 5514bf6a4..4d17dba21 100644 --- a/ROSCO/ROSCO_toolbox/control_interface.py +++ b/ROSCO/ROSCO_toolbox/control_interface.py @@ -82,6 +82,8 @@ def init_discon(self): self.avrSWAP[32] = 0 * np.deg2rad(1) self.avrSWAP[33] = 0 * np.deg2rad(1) + self.avrSWAP[27] = 1 # IPC + # Torque initial condition self.avrSWAP[22] = 0 @@ -209,8 +211,13 @@ def null_free_dll(*spam): # pragma: no cover extra_libs = [] if OS == "Windows": # pragma: Windows - _dlclose = ctypes.windll.kernel32.FreeLibrary - dlclose = lambda handle: 0 if _dlclose(handle) else 1 + try: + _dlclose = ctypes.windll.kernel32.FreeLibrary + dlclose = lambda handle: 0 if _dlclose(handle) else 1 + except: + kernel32 = ctypes.WinDLL('kernel32',use_last_error=True) + kernel32.FreeLibrary.argtypes = [ctypes.wintypes.HMODULE] + dlclose = lambda handle: 0 if kernel32.FreeLibrary(handle) else 1 # There's some controversy as to whether this DLL is guaranteed to exist. # It always has so far but isn't documented. However, MinGW assumes that it # is so, should this DLL be removed, then we have much bigger problems than diff --git a/ROSCO/ROSCO_toolbox/controller.py b/ROSCO/ROSCO_toolbox/controller.py index b4e3c353a..c58965176 100644 --- a/ROSCO/ROSCO_toolbox/controller.py +++ b/ROSCO/ROSCO_toolbox/controller.py @@ -63,9 +63,13 @@ def __init__(self, controller_params): self.Fl_Mode = controller_params['Fl_Mode'] self.TD_Mode = controller_params['TD_Mode'] self.Flp_Mode = controller_params['Flp_Mode'] - self.PA_Mode = controller_params['PA_Mode'] + self.PA_Mode = controller_params['PA_Mode'] + self.PF_Mode = controller_params['PF_Mode'] + self.AWC_Mode = controller_params['AWC_Mode'] self.Ext_Mode = controller_params['Ext_Mode'] self.ZMQ_Mode = controller_params['ZMQ_Mode'] + self.CC_Mode = controller_params['CC_Mode'] + self.StC_Mode = controller_params['StC_Mode'] # Necessary parameters self.U_pc = list_check(controller_params['U_pc'], return_bool=False) @@ -138,6 +142,8 @@ def __init__(self, controller_params): self.OL_Mode = int(controller_params['open_loop']['flag']) self.OL_Filename = controller_params['open_loop']['filename'] self.OL_Ind_Breakpoint = self.OL_Ind_BldPitch = self.OL_Ind_GenTq = self.OL_Ind_YawRate = 0 + self.OL_Ind_CableControl = [0] + self.OL_Ind_StructControl = [0] if self.OL_Mode: ol_params = controller_params['open_loop'] @@ -145,6 +151,8 @@ def __init__(self, controller_params): self.OL_Ind_BldPitch = ol_params['OL_Ind_BldPitch'] self.OL_Ind_GenTq = ol_params['OL_Ind_GenTq'] self.OL_Ind_YawRate = ol_params['OL_Ind_YawRate'] + self.OL_Ind_CableControl = ol_params['OL_Ind_CableControl'] + self.OL_Ind_StructControl = ol_params['OL_Ind_StructControl'] # Check that file exists because we won't write it if not os.path.exists(self.OL_Filename): @@ -664,7 +672,7 @@ def __init__(self, **kwargs): self.ol_timeseries = {} self.ol_timeseries['time'] = np.arange(0,self.t_max,self.dt) - self.allowed_controls = ['blade_pitch','generator_torque','nacelle_yaw','nacelle_yaw_rate'] + self.allowed_controls = ['blade_pitch','generator_torque','nacelle_yaw','nacelle_yaw_rate','cable_control','struct_control'] def const_timeseries(self,control,value): @@ -683,7 +691,8 @@ def interp_timeseries(self,control,breakpoints,values,method='sigma'): if len(breakpoints) != len(values): raise Exception('Open loop breakpoints and values do not have the same length') - if control not in self.allowed_controls: + # Check if control in allowed controls, cable_control_* is in cable_control + if not any([ac in control for ac in self.allowed_controls]): raise Exception(f'Open loop control of {control} is not allowed') else: @@ -748,8 +757,11 @@ def write_input(self,ol_filename): ol_timeseries = self.ol_timeseries + # Init indices OL_Ind_Breakpoint = 1 OL_Ind_BldPitch = OL_Ind_GenTq = OL_Ind_YawRate = 0 + OL_Ind_CableControl = [] + OL_Ind_StructControl = [] self.OL_Ind_Breakpoint = 1 ol_index_counter = 2 # start input index at 2 @@ -781,6 +793,32 @@ def write_input(self,ol_filename): if 'nacelle_yaw' in ol_timeseries and 'nacelle_yaw_rate' not in ol_timeseries: raise Exception('nacelle_yaw is in ol_timeseries and nacelle_yaw_rate is not. ROSCO can only command yaw rate. Use compute_yaw_rate() to convert.') + # Cable control + is_cable_chan = np.array(['cable_control' in ol_chan for ol_chan in ol_timeseries.keys()]) + if any(is_cable_chan): + # if any channels are cable_control_* + n_cable_chan = np.sum(is_cable_chan) + cable_chan_names = np.array(list(ol_timeseries.keys()))[is_cable_chan] + + # Let's assume they are 1-indexed and all there, otherwise a key error will be thrown + for cable_chan in cable_chan_names: + ol_control_array = np.c_[ol_control_array,ol_timeseries[cable_chan]] + OL_Ind_CableControl.append(ol_index_counter) + ol_index_counter += 1 + + # Struct control + is_struct_chan = ['struct_control' in ol_chan for ol_chan in ol_timeseries.keys()] + if any(is_struct_chan): + # if any channels are struct_control_* + n_struct_chan = np.sum(np.array(is_struct_chan)) + + # Let's assume they are 1-indexed and all there, otherwise a key error will be thrown + for i_chan in range(1,n_struct_chan+1): + ol_control_array = np.c_[ol_control_array,ol_timeseries[f'struct_control_{i_chan}']] + OL_Ind_StructControl.append(ol_index_counter) + ol_index_counter += 1 + + # Open file if not os.path.exists(os.path.dirname(os.path.abspath(ol_filename))): os.makedirs(os.path.dirname(os.path.abspath(ol_filename))) @@ -801,6 +839,20 @@ def write_input(self,ol_filename): header_line += '\t\tYawRate' unit_line += '\t\t(rad/s)' + if OL_Ind_CableControl: + for i_chan in range(1,n_cable_chan+1): + header_line += f'\t\tCable{i_chan}' + unit_line += '\t\t(m)' + else: + OL_Ind_CableControl = [0] + + if OL_Ind_StructControl: + for i_chan in range(1,n_struct_chan+1): + header_line += f'\t\tStruct{i_chan}' + unit_line += '\t\t(m)' + else: + OL_Ind_StructControl = [0] + header_line += '\n' unit_line += '\n' @@ -820,6 +872,8 @@ def write_input(self,ol_filename): open_loop['OL_Ind_BldPitch'] = OL_Ind_BldPitch open_loop['OL_Ind_GenTq'] = OL_Ind_GenTq open_loop['OL_Ind_YawRate'] = OL_Ind_YawRate + open_loop['OL_Ind_CableControl'] = OL_Ind_CableControl + open_loop['OL_Ind_StructControl'] = OL_Ind_StructControl return open_loop diff --git a/ROSCO/ROSCO_toolbox/inputs/schema2rst.py b/ROSCO/ROSCO_toolbox/inputs/schema2rst.py index a72343f3e..e88f63f5f 100644 --- a/ROSCO/ROSCO_toolbox/inputs/schema2rst.py +++ b/ROSCO/ROSCO_toolbox/inputs/schema2rst.py @@ -84,7 +84,7 @@ def __init__(self, fname): def write_rst(self): self.f = open(self.fout, "w") self.write_header() - self.write_loop(self.yaml["properties"], 0, self.fname.replace("yaml", "")) + self.write_loop(self.yaml["properties"], 0, 'toolbox_schema') self.f.close() def write_header(self): diff --git a/ROSCO/ROSCO_toolbox/inputs/toolbox_schema.yaml b/ROSCO/ROSCO_toolbox/inputs/toolbox_schema.yaml index c3e0c80b6..80a5486d2 100644 --- a/ROSCO/ROSCO_toolbox/inputs/toolbox_schema.yaml +++ b/ROSCO/ROSCO_toolbox/inputs/toolbox_schema.yaml @@ -99,7 +99,7 @@ properties: type: number description: 0- write no debug files, 1- write standard output .dbg-file, 2- write standard output .dbg-file and complete avrSWAP-array .dbg2-file minimum: 0 - maximum: 2 + maximum: 3 default: 1 F_LPFType: type: number @@ -197,12 +197,36 @@ properties: maximum: 2 default: 0 description: Pitch actuator mode {0 - not used, 1 - first order filter, 2 - second order filter} + PF_Mode: + type: number + minimum: 0 + maximum: 1 + default: 0 + description: Pitch fault mode {0 - not used, 1 - constant offset on one or more blades} + AWC_Mode: + type: number + minimum: 0 + maximum: 2 + default: 0 + description: Active wake control mode {0 - not used, 1 - SNL method, 2 - NREL method} Ext_Mode: type: number minimum: 0 maximum: 1 default: 0 - description: External control mode {{0 - not used, 1 - call external dynamic library}} + description: External control mode [0 - not used, 1 - call external dynamic library] + CC_Mode: + type: number + minimum: 0 + maximum: 2 + default: 0 + description: Cable control mode [0- unused, 1- User defined, 2- Open loop control] + StC_Mode: + type: number + minimum: 0 + maximum: 2 + default: 0 + description: Structural control mode [0- unused, 1- User defined, 2- Open loop control] U_pc: type: array description: List of wind speeds to schedule pitch control zeta and omega @@ -462,6 +486,10 @@ properties: LoggingLevel: type: number description: (0- write no debug files, 1- write standard output .dbg-file, 2- write standard output .dbg-file and complete avrSWAP-array .dbg2-file) + Echo: + type: number + description: 0 - no Echo, 1 - Echo input data to .echo + default: 0 F_LPFType: type: number description: 1- first-order low-pass filter, 2- second-order low-pass filter (currently filters generator speed and pitch control signals @@ -600,6 +628,9 @@ properties: type: number description: Integrator saturation (maximum signal amplitude contribution to pitch from IPC) units: rad + IPC_SatMode: + type: integer + description: IPC Saturation method (0 - no saturation, 1 - saturate by PC_MinPit, 2 - saturate by PS_BldPitchMin) IPC_KP: type: array items: @@ -837,6 +868,18 @@ properties: Ind_YawRate: type: number description: The column in OL_Filename that contains the generator torque in Nm + Ind_CableControl: + type: array + items: + type: number + description: The column in OL_Filename that contains the cable control inputs in m + # default: [0] # No default because it's defined in controller and DISCON_Dict + Ind_StructControl: + type: array + items: + type: number + description: The column in OL_Filename that contains the structural control inputs in various units + # default: [0] # No default because it's defined in controller and DISCON_Dict DLL_FileName: type: string description: Name/location of the dynamic library {.dll [Windows] or .so [Linux]} in the Bladed-DLL format @@ -849,6 +892,81 @@ properties: type: string description: Name of procedure in DLL to be called default: DISCON + PF_Offsets: + type: array + items: + type: number + description: Pitch angle offsets for each blade (array with length of 3) + units: rad + default: [0,0,0] + CC_Group_N: + type: number + description: Number of cable control groups + default: 0 + CC_GroupIndex: + type: array + items: + type: number + description: First index for cable control group, should correspond to deltaL + default: [0] + CC_ActTau: + type: number + description: Time constant for line actuator [s] + default: 20 + StC_Group_N: + type: number + description: Number of cable control groups + default: 0 + StC_GroupIndex: + type: array + items: + type: number + description: First index for structural control group, options specified in ServoDyn summary output + default: [0] + AWC_Mode: + type: number + minimum: 0 + maximum: 2 + default: 0 + description: Active wake control mode {0 - not used, 1 - complex number method, 2 - Coleman transformation method} + AWC_NumModes: + type: number + description: Number of AWC modes + units: rad + default: 1 + AWC_n: + type: array + items: + type: number + description: AWC azimuthal number (only used in complex number method) + default: [1] + AWC_harmonic: + type: array + items: + type: integer + description: AWC Coleman transform harmonic (only used in Coleman transform method) + default: [1] + AWC_freq: + type: array + items: + type: number + description: AWC frequency [Hz] + units: Hz + default: [0.05] + AWC_amp: + type: array + items: + type: number + description: AWC amplitude [deg] + units: deg + default: [1.0] + AWC_clockangle: + type: array + items: + type: number + description: AWC clock angle [deg] + units: deg + default: [0] linmodel_tuning: type: object diff --git a/ROSCO/ROSCO_toolbox/linear/linear_models.py b/ROSCO/ROSCO_toolbox/linear/linear_models.py index 5a4d6969d..f096ce563 100644 --- a/ROSCO/ROSCO_toolbox/linear/linear_models.py +++ b/ROSCO/ROSCO_toolbox/linear/linear_models.py @@ -15,7 +15,7 @@ from scipy.io import loadmat try: - import pyFAST.linearization.mbc.mbc3 as mbc + import pyFAST.linearization.mbc as mbc except ImportError: import weis.control.mbc.mbc3 as mbc except ImportError: @@ -43,7 +43,6 @@ def __init__(self, lin_file_dir, lin_file_names, nlin=12, reduceStates=False, fr u_ops = np.array([], []) all_MBC = [] all_matData = [] - all_FAST_linData = [] if load_parallel: import time @@ -52,7 +51,7 @@ def __init__(self, lin_file_dir, lin_file_names, nlin=12, reduceStates=False, fr lin_file_dir, lin_file_names[iCase] + '.{}.lin'.format(i_lin+1))) for i_lin in range(0, nlin)] for iCase in range(0,n_lin_cases)] cores = mp.cpu_count() pool = mp.Pool(cores) - all_MBC, all_matData, all_FAST_linData = zip(*pool.map(run_mbc3, all_linfiles)) + all_MBC, all_matData = zip(*pool.map(run_mbc3, all_linfiles)) pool.close() pool.join() print('loaded in parallel in {} seconds'.format(time.time()-t1)) @@ -62,10 +61,9 @@ def __init__(self, lin_file_dir, lin_file_names, nlin=12, reduceStates=False, fr for iCase in range(0, n_lin_cases): lin_files_i = [os.path.realpath(os.path.join( lin_file_dir, lin_file_names[iCase] + '.{}.lin'.format(i_lin+1))) for i_lin in range(0, nlin)] - MBC, matData, FAST_linData = run_mbc3(lin_files_i) + MBC, matData = run_mbc3(lin_files_i) all_MBC.append(MBC) all_matData.append(matData) - all_FAST_linData.append(FAST_linData) print('loaded in serial in {} seconds'.format(time.time()-t1)) @@ -74,7 +72,6 @@ def __init__(self, lin_file_dir, lin_file_names, nlin=12, reduceStates=False, fr MBC = all_MBC[iCase] matData = all_matData[iCase] - FAST_linData = all_FAST_linData[iCase] if not iCase: # first time through # Initialize operating points, matrices @@ -713,9 +710,9 @@ def run_mbc3(fnames): Helper function to run mbc3 ''' print('Loading linearizations from:', ''.join(fnames[0].split('.')[:-2])) - MBC, matData, FAST_linData = mbc.fx_mbc3(fnames, verbose=False) + MBC, matData = mbc.fx_mbc3(fnames, verbose=False) - return MBC, matData, FAST_linData + return MBC, matData def connect_ml(mods, inputs, outputs): ''' diff --git a/ROSCO/ROSCO_toolbox/ofTools/case_gen/CaseGen_General.py b/ROSCO/ROSCO_toolbox/ofTools/case_gen/CaseGen_General.py index 87bb7bae2..8c46e5224 100644 --- a/ROSCO/ROSCO_toolbox/ofTools/case_gen/CaseGen_General.py +++ b/ROSCO/ROSCO_toolbox/ofTools/case_gen/CaseGen_General.py @@ -155,10 +155,8 @@ def CaseGen_General(case_inputs, dir_matrix='', namebase='', save_matrix=True): for g in matrix_group_idx[j]: row_out[g] = change_vals[g][val] matrix_out.append(row_out) - try: - matrix_out = np.asarray(matrix_out, dtype=str) - except: - matrix_out = np.asarray(matrix_out) + + matrix_out = np.asarray(matrix_out, dtype=object) n_cases = np.shape(matrix_out)[0] # case naming diff --git a/ROSCO/ROSCO_toolbox/ofTools/case_gen/CaseGen_IEC.py b/ROSCO/ROSCO_toolbox/ofTools/case_gen/CaseGen_IEC.py index 408cb1891..d8cdb4ecd 100644 --- a/ROSCO/ROSCO_toolbox/ofTools/case_gen/CaseGen_IEC.py +++ b/ROSCO/ROSCO_toolbox/ofTools/case_gen/CaseGen_IEC.py @@ -151,6 +151,9 @@ def execute(self, case_inputs={}): iecwind_ex.setup() _, V_e50, V_e1, V_50, V_1 = iecwind_ex.EWM(0.) + if dlc == 1.4: + case_inputs_i[("AeroDyn15","AFAeroMod")]= {'vals':[1], 'group':0} + if dlc == 5.1: case_inputs_i[("ServoDyn","TPitManS1")] = {'vals':[self.TStart], 'group':0} diff --git a/ROSCO/ROSCO_toolbox/ofTools/case_gen/CaseLibrary.py b/ROSCO/ROSCO_toolbox/ofTools/case_gen/CaseLibrary.py index 72fe07635..e6aef0bf3 100644 --- a/ROSCO/ROSCO_toolbox/ofTools/case_gen/CaseLibrary.py +++ b/ROSCO/ROSCO_toolbox/ofTools/case_gen/CaseLibrary.py @@ -54,7 +54,7 @@ def load_tuning_yaml(tuning_yaml): cp_filename = os.path.join(tune_case_dir,path_params['FAST_directory'],path_params['rotor_performance_filename']) turbine.load_from_fast(path_params['FAST_InputFile'], \ os.path.join(tune_case_dir,path_params['FAST_directory']), \ - dev_branch=True,rot_source='txt',\ + rot_source='txt',\ txt_filename=cp_filename) return turbine, controller, cp_filename @@ -127,10 +127,14 @@ def power_curve(**wind_case_opts): # Constant wind speed, multiple wind speeds, define below # Runtime - T_max = 400. + T_max = wind_case_opts.get('TMax',400.) if 'U' in wind_case_opts: U = wind_case_opts['U'] + if type(U) != list: + U = [U] + elif type(U) == np.ndarray: + U = U.tolist() else: # default # Run conditions U = np.arange(4,14.5,.5).tolist() @@ -171,6 +175,9 @@ def simp_step(**wind_case_opts): else: #default T_step = 150 + # Wind directory, default is run_dir + wind_case_opts['wind_dir'] = wind_case_opts.get('wind_dir',wind_case_opts['run_dir']) + # Step Wind Setup # Make Default step wind object @@ -356,6 +363,42 @@ def user_hh(**wind_case_opts): case_inputs[("InflowWind","Filename_Uni")] = {'vals':wind_case_opts['wind_filenames'], 'group':1} return case_inputs + +def ramp(**wind_case_opts): + U_start = wind_case_opts.get('U_start',8.) + U_end = wind_case_opts.get('U_end',15.) + t_start = wind_case_opts.get('t_start',100.) + t_end = wind_case_opts.get('t_end',400.) + vert_shear = wind_case_opts.get('vert_shear',.2) + both_dir = wind_case_opts.get('both_dir',False) # ramp up and down + + # Make Default step wind object + hh_wind = HH_WindFile() + hh_wind.t_max = t_end + hh_wind.filename = os.path.join(wind_case_opts['run_dir'],'ramp.hh') + + # Step Wind Setup + if both_dir: + hh_wind.time = [0, t_start, (t_start + t_end) / 2, t_end] + hh_wind.wind_speed = [U_start, U_start, U_end, U_start] + else: + hh_wind.time = [0, t_start, t_end] + hh_wind.wind_speed = [U_start, U_start, U_end] + + hh_wind.vert_shear = [vert_shear] * len(hh_wind.time) + + hh_wind.resample() + hh_wind.write() + + case_inputs = base_op_case() + case_inputs[("Fst","TMax")] = {'vals':[t_end], 'group':0} + case_inputs[("InflowWind","WindType")] = {'vals':[2], 'group':0} + case_inputs[("InflowWind","Filename_Uni")] = {'vals':[hh_wind.filename], 'group':0} + + return case_inputs + + + ############################################################################################## # @@ -388,7 +431,7 @@ def sweep_rated_torque(start_group, **control_sweep_opts): cp_filename = os.path.join(tune_case_dir,path_params['FAST_directory'],path_params['rotor_performance_filename']) turbine.load_from_fast(path_params['FAST_InputFile'], \ os.path.join(tune_case_dir,path_params['FAST_directory']), \ - dev_branch=True,rot_source='txt',\ + rot_source='txt',\ txt_filename=cp_filename) controller.tune_controller(turbine) @@ -425,9 +468,9 @@ def sweep_pitch_act(start_group, **control_sweep_opts): def sweep_ipc_gains(start_group, **control_sweep_opts): case_inputs_control = {} - kis = np.linspace(0,3,6).tolist() + kis = np.linspace(0,1,8).tolist() # kis = [0.,0.6,1.2,1.8,2.4,3.] - KIs = [[ki * 1e-8,0.] for ki in kis] + KIs = [[ki * 12e-9,0.] for ki in kis] case_inputs_control[('DISCON_in','IPC_ControlMode')] = {'vals': [1], 'group': 0} # case_inputs_control[('DISCON_in','IPC_KI')] = {'vals': [[0.,0.],[1e-8,0.]], 'group': start_group} case_inputs_control[('DISCON_in','IPC_KI')] = {'vals': KIs, 'group': start_group} @@ -472,7 +515,7 @@ def sweep_ps_percent(start_group, **control_sweep_opts): # make default controller, turbine objects for ROSCO_toolbox turbine = ROSCO_turbine.Turbine(turbine_params) - turbine.load_from_fast( path_params['FAST_InputFile'],path_params['FAST_directory'], dev_branch=True) + turbine.load_from_fast( path_params['FAST_InputFile'],path_params['FAST_directory']) controller = ROSCO_controller.Controller(controller_params) @@ -497,6 +540,15 @@ def sweep_ps_percent(start_group, **control_sweep_opts): return case_inputs_control +def test_pitch_offset(start_group, **control_sweep_opts): + case_inputs_control = {} + case_inputs_control[('DISCON_in','PF_Mode')] = {'vals': [1], 'group': start_group} + case_inputs_control[('DISCON_in','PF_Offsets')] = {'vals': [[0,float(np.radians(2)),0]], 'group': start_group} + return case_inputs_control + + + + # def sweep_pc_mode(cont_yaml,omega=np.linspace(.05,.35,8,endpoint=True).tolist(),zeta=[1.5],group=2): @@ -507,7 +559,7 @@ def sweep_ps_percent(start_group, **control_sweep_opts): # # make default controller, turbine objects for ROSCO_toolbox # turbine = ROSCO_turbine.Turbine(turbine_params) -# turbine.load_from_fast( path_params['FAST_InputFile'],path_params['FAST_directory'], dev_branch=True) +# turbine.load_from_fast( path_params['FAST_InputFile'],path_params['FAST_directory']) # controller = ROSCO_controller.Controller(controller_params) diff --git a/ROSCO/ROSCO_toolbox/ofTools/case_gen/HH_WindFile.py b/ROSCO/ROSCO_toolbox/ofTools/case_gen/HH_WindFile.py index a74205ce7..54ed2ff5e 100644 --- a/ROSCO/ROSCO_toolbox/ofTools/case_gen/HH_WindFile.py +++ b/ROSCO/ROSCO_toolbox/ofTools/case_gen/HH_WindFile.py @@ -44,16 +44,38 @@ def __init__(self,**kwargs): super(HH_WindFile, self).__init__() + def resample(self): + # Using time index, check if constant, otherwise throw a warning + if len(set(self.wind_dir)) != 1: # all same + print('ROSCO Warning: all wind_dir elements not equal in resample') + if len(set(self.vert_speed)) != 1: # all same + print('ROSCO Warning: all vert_speed elements not equal in resample') + if len(set(self.horiz_shear)) != 1: # all same + print('ROSCO Warning: all horiz_shear elements not equal in resample') + if len(set(self.vert_shear)) != 1: # all same + print('ROSCO Warning: all vert_shear elements not equal in resample') + if len(set(self.linv_shear)) != 1: # all same + print('ROSCO Warning: all linv_shear elements not equal in resample') + if len(set(self.gust_speed)) != 1: # all same + print('ROSCO Warning: all gust_speed elements not equal in resample') + + self.wind_dir = len(self.time) * [self.wind_dir[0]] + self.vert_speed = len(self.time) * [self.vert_speed[0]] + self.horiz_shear = len(self.time) * [self.horiz_shear[0]] + self.vert_shear = len(self.time) * [self.vert_shear[0]] + self.linv_shear = len(self.time) * [self.linv_shear[0]] + self.gust_speed = len(self.time) * [self.gust_speed[0]] + def write(self): if not os.path.isdir(os.path.dirname(self.filename)): os.makedirs(os.path.dirname(self.filename)) with open(self.filename,'w') as f: f.write('!\tTime\tWind Speed\tWind Dir\tVert. Spd.\tHoriz. Shr.\t Vert. Shr.\t LinV. Shr.\tGust Speed\n') - for t, ws, wd, vs, hs, vs, ls, gs in zip(self.time,self.wind_speed,self.wind_dir,self.vert_speed, \ + for t, ws, wd, vsp, hs, vsh, ls, gs in zip(self.time,self.wind_speed,self.wind_dir,self.vert_speed, \ self.horiz_shear, self.vert_shear, self.linv_shear, self.gust_speed): f.write('{:6.6f}\t{:6.6f}\t{:6.6f}\t{:6.6f}\t{:6.6f}\t{:6.6f}\t{:6.6f}\t{:6.6f}\n'.format( - t,ws,wd,vs,hs,vs,ls,gs)) + t,ws,wd,vsp,hs,vsh,ls,gs)) def plot(self): diff --git a/ROSCO/ROSCO_toolbox/ofTools/case_gen/run_FAST.py b/ROSCO/ROSCO_toolbox/ofTools/case_gen/run_FAST.py index a0c31925e..acff382f5 100644 --- a/ROSCO/ROSCO_toolbox/ofTools/case_gen/run_FAST.py +++ b/ROSCO/ROSCO_toolbox/ofTools/case_gen/run_FAST.py @@ -2,9 +2,12 @@ Example script to run the DLCs in OpenFAST +This script is designed to work as-is if ROSCO is installed in 'develop' mode, i.e., python setup.py develop +Otherwise, the directories can be defined as attributes of the run_FAST_ROSCO + """ -from ROSCO_toolbox.ofTools.case_gen.runFAST_pywrapper import runFAST_pywrapper, runFAST_pywrapper_batch +from ROSCO_toolbox.ofTools.case_gen.runFAST_pywrapper import runFAST_pywrapper_batch from ROSCO_toolbox.ofTools.case_gen.CaseGen_IEC import CaseGen_IEC from ROSCO_toolbox.ofTools.case_gen.CaseGen_General import CaseGen_General from ROSCO_toolbox.ofTools.case_gen import CaseLibrary as cl @@ -17,29 +20,44 @@ from ROSCO_toolbox import controller as ROSCO_controller from ROSCO_toolbox import turbine as ROSCO_turbine -# Globals -this_dir = os.path.dirname(os.path.abspath(__file__)) -tune_case_dir = os.path.realpath(os.path.join(this_dir,'../../../Tune_Cases')) -rosco_dir = os.path.realpath(os.path.join(this_dir,'../../..')) - +this_dir = os.path.dirname(os.path.abspath(__file__)) class run_FAST_ROSCO(): def __init__(self): # Set default parameters - self.tuning_yaml = os.path.join(tune_case_dir,'IEA15MW.yaml') + self.tuning_yaml = 'IEA15MW.yaml' self.wind_case_fcn = cl.power_curve self.wind_case_opts = {} self.control_sweep_opts = {} self.control_sweep_fcn = None self.case_inputs = {} self.rosco_dll = '' - self.save_dir = os.path.join(rosco_dir,'outputs') self.n_cores = 1 self.base_name = '' self.controller_params = {} + self.fst_vt = {} + self.openfast_exe = 'openfast' + + # Directories + self.tune_case_dir = '' + self.rosco_dir = '' + self.save_dir = '' + def run_FAST(self): + + # handle directories, set defaults + if not self.rosco_dir: + self.rosco_dir = os.path.realpath(os.path.join(this_dir,'../../..')) + + if not self.tune_case_dir: + self.tune_case_dir = os.path.realpath(os.path.join(self.rosco_dir,'Tune_Cases')) + + if not self.save_dir: + self.save_dir = os.path.join(self.rosco_dir,'outputs') + + # set up run directory if self.control_sweep_fcn: sweep_name = self.control_sweep_fcn.__name__ @@ -55,7 +73,7 @@ def run_FAST(self): # Start with tuning yaml definition of controller if not os.path.isabs(self.tuning_yaml): - self.tuning_yaml = os.path.join(tune_case_dir,self.tuning_yaml) + self.tuning_yaml = os.path.join(self.tune_case_dir,self.tuning_yaml) # Load yaml file inps = load_rosco_yaml(self.tuning_yaml) @@ -77,10 +95,12 @@ def run_FAST(self): path_params['FAST_directory'], path_params['rotor_performance_filename'] ) - turbine.load_from_fast(path_params['FAST_InputFile'], \ - os.path.join(tune_yaml_dir,path_params['FAST_directory']), \ - dev_branch=True,rot_source='txt',\ - txt_filename=cp_filename) + turbine.load_from_fast( + path_params['FAST_InputFile'], + os.path.join(tune_yaml_dir,path_params['FAST_directory']), + rot_source='txt', + txt_filename=cp_filename + ) # tune base controller defined by the yaml controller.tune_controller(turbine) @@ -98,13 +118,12 @@ def run_FAST(self): # Set up rosco_dll if not self.rosco_dll: - rosco_dir = os.path.realpath(os.path.join(os.path.dirname(__file__),'../../..')) if platform.system() == 'Windows': - rosco_dll = os.path.join(rosco_dir, 'ROSCO/build/libdiscon.dll') + rosco_dll = os.path.join(self.rosco_dir, 'ROSCO/build/libdiscon.dll') elif platform.system() == 'Darwin': - rosco_dll = os.path.join(rosco_dir, 'ROSCO/build/libdiscon.dylib') + rosco_dll = os.path.join(self.rosco_dir, 'ROSCO/build/libdiscon.dylib') else: - rosco_dll = os.path.join(rosco_dir, 'ROSCO/build/libdiscon.so') + rosco_dll = os.path.join(self.rosco_dir, 'ROSCO/build/libdiscon.so') case_inputs[('ServoDyn','DLL_FileName')] = {'vals': [rosco_dll], 'group': 0} @@ -153,8 +172,8 @@ def run_FAST(self): fastBatch.FAST_runDirectory = run_dir fastBatch.case_list = case_list fastBatch.case_name_list = case_name_list - fastBatch.debug_level = 2 - fastBatch.FAST_exe = 'openfast' + fastBatch.fst_vt = self.fst_vt + fastBatch.FAST_exe = self.openfast_exe if MPI: fastBatch.run_mpi(comm_map_down) @@ -179,7 +198,7 @@ def run_FAST(self): if __name__ == "__main__": # Simulation config - sim_config = 11 + sim_config = 1 r = run_FAST_ROSCO() @@ -187,7 +206,7 @@ def run_FAST(self): if sim_config == 1: # FOCAL single wind speed testing - r.tuning_yaml = os.path.join(tune_case_dir,'IEA15MW.yaml') + r.tuning_yaml = 'IEA15MW.yaml' r.wind_case_fcn = cl.simp_step r.sweep_mode = None r.save_dir = '/Users/dzalkind/Tools/ROSCO/outputs' @@ -195,15 +214,15 @@ def run_FAST(self): elif sim_config == 6: # FOCAL rated wind speed tuning - r.tuning_yaml = os.path.join(tune_case_dir,'IEA15MW_FOCAL.yaml') - r.wind_case_fcn = power_curve + r.tuning_yaml = 'IEA15MW_FOCAL.yaml' + r.wind_case_fcn = cl.power_curve r.sweep_mode = cl.sweep_rated_torque r.save_dir = '/Users/dzalkind/Projects/FOCAL/drop_torque' elif sim_config == 7: # FOCAL rated wind speed tuning - r.tuning_yaml = os.path.join(tune_case_dir,'IEA15MW.yaml') + r.tuning_yaml = 'IEA15MW.yaml' r.wind_case_fcn = cl.steps r.wind_case_opts = { 'tt': [100,200], @@ -227,8 +246,8 @@ def run_FAST(self): r.wind_case_opts = { 'U': [16], } - r.save_dir = '/Users/dzalkind/Projects/RAAW/RAAW_OpenFAST/outputs/IPC_play' - r.control_sweep_fcn = cl.sweep_ipc_gains + r.save_dir = '/Users/dzalkind/Tools/ROSCO/outputs/offset_test' + r.control_sweep_fcn = cl.test_pitch_offset elif sim_config == 9: diff --git a/ROSCO/ROSCO_toolbox/ofTools/fast_io/FAST_reader.py b/ROSCO/ROSCO_toolbox/ofTools/fast_io/FAST_reader.py index f4fb2f597..fe4fc0b52 100644 --- a/ROSCO/ROSCO_toolbox/ofTools/fast_io/FAST_reader.py +++ b/ROSCO/ROSCO_toolbox/ofTools/fast_io/FAST_reader.py @@ -4,7 +4,7 @@ from functools import reduce import operator -from ROSCO_toolbox.ofTools.fast_io.FAST_vars import FstModel +from ROSCO_toolbox.ofTools.fast_io.FAST_vars_out import FstOutput from ROSCO_toolbox.utilities import read_DISCON, load_from_txt from ROSCO_toolbox import turbine as ROSCO_turbine ROSCO = True @@ -18,8 +18,6 @@ def readline_filterComments(f): read = False return line - - def fix_path(name): """ split a path, then reconstruct it using os.path.join """ name = re.split("\\\|/", name) @@ -28,6 +26,26 @@ def fix_path(name): new = os.path.join(new, name[i]) return new +def read_array(f,len,array_type=str): + strings = re.split(',| ',f.readline().strip()) + while '' in strings: # remove empties + strings.remove('') + + arr = strings[:len] # select len strings + + if array_type==str: + arr = [ar.replace('"','') for ar in arr] # remove quotes and commas + elif array_type==float: + arr = [float_read(ar) for ar in arr] + elif array_type==int: + arr = [int_read(ar) for ar in arr] + elif array_type==bool: + arr = [bool_read(ar) for ar in arr] + else: + raise Exception(f"read_array with type {str(array_type)} not currently supported") + + return arr + def bool_read(text): # convert true/false strings to boolean if 'default' in text.lower(): @@ -48,7 +66,6 @@ def float_read(text): except: return str(text) - def int_read(text): # return int with error handing for "default" values if 'default' in text.lower(): @@ -59,30 +76,34 @@ def int_read(text): except: return str(text) +class InputReader_OpenFAST(object): + """ OpenFAST input file reader """ -class InputReader_Common(object): - """ Methods for reading input files that are (relatively) unchanged across FAST versions.""" + def __init__(self): - def __init__(self, **kwargs): - - self.FAST_ver = 'OPENFAST' self.FAST_InputFile = None # FAST input file (ext=.fst) self.FAST_directory = None # Path to fst directory files self.path2dll = None # Path to dll file - self.fst_vt = FstModel - - # Optional population class attributes from key word arguments - for (k, w) in kwargs.items(): - try: - setattr(self, k, w) - except: - pass - - super(InputReader_Common, self).__init__() - - def read_yaml(self): - f = open(self.FAST_yamlfile, 'r') - self.fst_vt = yaml.load(f) + self.fst_vt = {} + self.fst_vt['Fst'] = {} + self.fst_vt['outlist'] = FstOutput + self.fst_vt['ElastoDyn'] = {} + self.fst_vt['ElastoDynBlade'] = {} + self.fst_vt['ElastoDynTower'] = {} + self.fst_vt['InflowWind'] = {} + self.fst_vt['AeroDyn15'] = {} + self.fst_vt['AeroDyn14'] = {} + self.fst_vt['AeroDynBlade'] = {} + self.fst_vt['AeroDynTower'] = {} + self.fst_vt['AeroDynPolar'] = {} + self.fst_vt['ServoDyn'] = {} + self.fst_vt['DISCON_in'] = {} + self.fst_vt['HydroDyn'] = {} + self.fst_vt['MoorDyn'] = {} + self.fst_vt['SubDyn'] = {} + self.fst_vt['MAP'] = {} + self.fst_vt['BeamDyn'] = {} + self.fst_vt['BeamDynBlade'] = {} def set_outlist(self, vartree_head, channel_list): """ Loop through a list of output channel names, recursively set them to True in the nested outlist dict """ @@ -109,325 +130,6 @@ def loop_dict(vartree, search_var, branch): var = var.replace(' ', '') loop_dict(vartree_head, var, []) - def read_ElastoDynBlade(self): - # ElastoDyn v1.00 Blade Input File - # Currently no differences between FASTv8.16 and OpenFAST. - if self.FAST_ver.lower() == 'fast7': - blade_file = os.path.join(self.FAST_directory, self.fst_vt['Fst7']['BldFile1']) - else: - blade_file = os.path.join(self.FAST_directory, self.fst_vt['ElastoDyn']['BldFile1']) - - f = open(blade_file) - # print blade_file - f.readline() - f.readline() - f.readline() - if self.FAST_ver.lower() == 'fast7': - f.readline() - - # Blade Parameters - self.fst_vt['ElastoDynBlade']['NBlInpSt'] = int(f.readline().split()[0]) - if self.FAST_ver.lower() == 'fast7': - self.fst_vt['ElastoDynBlade']['CalcBMode'] = bool_read(f.readline().split()[0]) - self.fst_vt['ElastoDynBlade']['BldFlDmp1'] = float_read(f.readline().split()[0]) - self.fst_vt['ElastoDynBlade']['BldFlDmp2'] = float_read(f.readline().split()[0]) - self.fst_vt['ElastoDynBlade']['BldEdDmp1'] = float_read(f.readline().split()[0]) - - # Blade Adjustment Factors - f.readline() - self.fst_vt['ElastoDynBlade']['FlStTunr1'] = float_read(f.readline().split()[0]) - self.fst_vt['ElastoDynBlade']['FlStTunr2'] = float_read(f.readline().split()[0]) - self.fst_vt['ElastoDynBlade']['AdjBlMs'] = float_read(f.readline().split()[0]) - self.fst_vt['ElastoDynBlade']['AdjFlSt'] = float_read(f.readline().split()[0]) - self.fst_vt['ElastoDynBlade']['AdjEdSt'] = float_read(f.readline().split()[0]) - - # Distrilbuted Blade Properties - f.readline() - f.readline() - f.readline() - self.fst_vt['ElastoDynBlade']['BlFract'] = [None] * self.fst_vt['ElastoDynBlade']['NBlInpSt'] - self.fst_vt['ElastoDynBlade']['PitchAxis'] = [None] * self.fst_vt['ElastoDynBlade']['NBlInpSt'] - self.fst_vt['ElastoDynBlade']['StrcTwst'] = [None] * self.fst_vt['ElastoDynBlade']['NBlInpSt'] - self.fst_vt['ElastoDynBlade']['BMassDen'] = [None] * self.fst_vt['ElastoDynBlade']['NBlInpSt'] - self.fst_vt['ElastoDynBlade']['FlpStff'] = [None] * self.fst_vt['ElastoDynBlade']['NBlInpSt'] - self.fst_vt['ElastoDynBlade']['EdgStff'] = [None] * self.fst_vt['ElastoDynBlade']['NBlInpSt'] - if self.FAST_ver.lower() == 'fast7': - self.fst_vt['ElastoDynBlade']['GJStff'] = [None] * self.fst_vt['ElastoDynBlade']['NBlInpSt'] - self.fst_vt['ElastoDynBlade']['EAStff'] = [None] * self.fst_vt['ElastoDynBlade']['NBlInpSt'] - self.fst_vt['ElastoDynBlade']['Alpha'] = [None] * self.fst_vt['ElastoDynBlade']['NBlInpSt'] - self.fst_vt['ElastoDynBlade']['FlpIner'] = [None] * self.fst_vt['ElastoDynBlade']['NBlInpSt'] - self.fst_vt['ElastoDynBlade']['EdgIner'] = [None] * self.fst_vt['ElastoDynBlade']['NBlInpSt'] - self.fst_vt['ElastoDynBlade']['PrecrvRef'] = [None] * self.fst_vt['ElastoDynBlade']['NBlInpSt'] - self.fst_vt['ElastoDynBlade']['PreswpRef'] = [None] * self.fst_vt['ElastoDynBlade']['NBlInpSt'] - self.fst_vt['ElastoDynBlade']['FlpcgOf'] = [None] * self.fst_vt['ElastoDynBlade']['NBlInpSt'] - self.fst_vt['ElastoDynBlade']['Edgcgof'] = [None] * self.fst_vt['ElastoDynBlade']['NBlInpSt'] - self.fst_vt['ElastoDynBlade']['FlpEAOf'] = [None] * self.fst_vt['ElastoDynBlade']['NBlInpSt'] - self.fst_vt['ElastoDynBlade']['EdgEAOf'] = [None] * self.fst_vt['ElastoDynBlade']['NBlInpSt'] - for i in range(self.fst_vt['ElastoDynBlade']['NBlInpSt']): - data = f.readline().split() - self.fst_vt['ElastoDynBlade']['BlFract'][i] = float_read(data[0]) - self.fst_vt['ElastoDynBlade']['PitchAxis'][i] = float_read(data[1]) - self.fst_vt['ElastoDynBlade']['StrcTwst'][i] = float_read(data[2]) - self.fst_vt['ElastoDynBlade']['BMassDen'][i] = float_read(data[3]) - self.fst_vt['ElastoDynBlade']['FlpStff'][i] = float_read(data[4]) - self.fst_vt['ElastoDynBlade']['EdgStff'][i] = float_read(data[5]) - if self.FAST_ver.lower() == 'fast7': - self.fst_vt['ElastoDynBlade']['GJStff'][i] = float_read(data[6]) - self.fst_vt['ElastoDynBlade']['EAStff'][i] = float_read(data[7]) - self.fst_vt['ElastoDynBlade']['Alpha'][i] = float_read(data[8]) - self.fst_vt['ElastoDynBlade']['FlpIner'][i] = float_read(data[9]) - self.fst_vt['ElastoDynBlade']['EdgIner'][i] = float_read(data[10]) - self.fst_vt['ElastoDynBlade']['PrecrvRef'][i] = float_read(data[11]) - self.fst_vt['ElastoDynBlade']['PreswpRef'][i] = float_read(data[12]) - self.fst_vt['ElastoDynBlade']['FlpcgOf'][i] = float_read(data[13]) - self.fst_vt['ElastoDynBlade']['Edgcgof'][i] = float_read(data[14]) - self.fst_vt['ElastoDynBlade']['FlpEAOf'][i] = float_read(data[15]) - self.fst_vt['ElastoDynBlade']['EdgEAOf'][i] = float_read(data[16]) - - f.readline() - self.fst_vt['ElastoDynBlade']['BldFl1Sh'] = [None] * 5 - self.fst_vt['ElastoDynBlade']['BldFl2Sh'] = [None] * 5 - self.fst_vt['ElastoDynBlade']['BldEdgSh'] = [None] * 5 - for i in range(5): - self.fst_vt['ElastoDynBlade']['BldFl1Sh'][i] = float_read(f.readline().split()[0]) - for i in range(5): - self.fst_vt['ElastoDynBlade']['BldFl2Sh'][i] = float_read(f.readline().split()[0]) - for i in range(5): - self.fst_vt['ElastoDynBlade']['BldEdgSh'][i] = float_read(f.readline().split()[0]) - - f.close() - - def read_ElastoDynTower(self): - # ElastoDyn v1.00 Tower Input Files - # Currently no differences between FASTv8.16 and OpenFAST. - - if self.FAST_ver.lower() == 'fast7': - tower_file = os.path.join(self.FAST_directory, self.fst_vt['Fst7']['TwrFile']) - else: - tower_file = os.path.join(self.FAST_directory, self.fst_vt['ElastoDyn']['TwrFile']) - - f = open(tower_file) - - f.readline() - f.readline() - if self.FAST_ver.lower() == 'fast7': - f.readline() - - # General Tower Paramters - f.readline() - self.fst_vt['ElastoDynTower']['NTwInpSt'] = int(f.readline().split()[0]) - if self.FAST_ver.lower() == 'fast7': - self.fst_vt['ElastoDynTower']['CalcTMode'] = bool_read(f.readline().split()[0]) - self.fst_vt['ElastoDynTower']['TwrFADmp1'] = float_read(f.readline().split()[0]) - self.fst_vt['ElastoDynTower']['TwrFADmp2'] = float_read(f.readline().split()[0]) - self.fst_vt['ElastoDynTower']['TwrSSDmp1'] = float_read(f.readline().split()[0]) - self.fst_vt['ElastoDynTower']['TwrSSDmp2'] = float_read(f.readline().split()[0]) - - # Tower Adjustment Factors - f.readline() - self.fst_vt['ElastoDynTower']['FAStTunr1'] = float_read(f.readline().split()[0]) - self.fst_vt['ElastoDynTower']['FAStTunr2'] = float_read(f.readline().split()[0]) - self.fst_vt['ElastoDynTower']['SSStTunr1'] = float_read(f.readline().split()[0]) - self.fst_vt['ElastoDynTower']['SSStTunr2'] = float_read(f.readline().split()[0]) - self.fst_vt['ElastoDynTower']['AdjTwMa'] = float_read(f.readline().split()[0]) - self.fst_vt['ElastoDynTower']['AdjFASt'] = float_read(f.readline().split()[0]) - self.fst_vt['ElastoDynTower']['AdjSSSt'] = float_read(f.readline().split()[0]) - - # Distributed Tower Properties - f.readline() - f.readline() - f.readline() - self.fst_vt['ElastoDynTower']['HtFract'] = [None] * self.fst_vt['ElastoDynTower']['NTwInpSt'] - self.fst_vt['ElastoDynTower']['TMassDen'] = [None] * self.fst_vt['ElastoDynTower']['NTwInpSt'] - self.fst_vt['ElastoDynTower']['TwFAStif'] = [None] * self.fst_vt['ElastoDynTower']['NTwInpSt'] - self.fst_vt['ElastoDynTower']['TwSSStif'] = [None] * self.fst_vt['ElastoDynTower']['NTwInpSt'] - if self.FAST_ver.lower() == 'fast7': - self.fst_vt['ElastoDynTower']['TwGJStif'] = [None] * self.fst_vt['ElastoDynTower']['NTwInpSt'] - self.fst_vt['ElastoDynTower']['TwEAStif'] = [None] * self.fst_vt['ElastoDynTower']['NTwInpSt'] - self.fst_vt['ElastoDynTower']['TwFAIner'] = [None] * self.fst_vt['ElastoDynTower']['NTwInpSt'] - self.fst_vt['ElastoDynTower']['TwSSIner'] = [None] * self.fst_vt['ElastoDynTower']['NTwInpSt'] - self.fst_vt['ElastoDynTower']['TwFAcgOf'] = [None] * self.fst_vt['ElastoDynTower']['NTwInpSt'] - self.fst_vt['ElastoDynTower']['TwSScgOf'] = [None] * self.fst_vt['ElastoDynTower']['NTwInpSt'] - - for i in range(self.fst_vt['ElastoDynTower']['NTwInpSt']): - data = f.readline().split() - self.fst_vt['ElastoDynTower']['HtFract'][i] = float_read(data[0]) - self.fst_vt['ElastoDynTower']['TMassDen'][i] = float_read(data[1]) - self.fst_vt['ElastoDynTower']['TwFAStif'][i] = float_read(data[2]) - self.fst_vt['ElastoDynTower']['TwSSStif'][i] = float_read(data[3]) - if self.FAST_ver.lower() == 'fast7': - self.fst_vt['ElastoDynTower']['TwGJStif'][i] = float_read(data[4]) - self.fst_vt['ElastoDynTower']['TwEAStif'][i] = float_read(data[5]) - self.fst_vt['ElastoDynTower']['TwFAIner'][i] = float_read(data[6]) - self.fst_vt['ElastoDynTower']['TwSSIner'][i] = float_read(data[7]) - self.fst_vt['ElastoDynTower']['TwFAcgOf'][i] = float_read(data[8]) - self.fst_vt['ElastoDynTower']['TwSScgOf'][i] = float_read(data[9]) - - # Tower Mode Shapes - f.readline() - self.fst_vt['ElastoDynTower']['TwFAM1Sh'] = [None] * 5 - self.fst_vt['ElastoDynTower']['TwFAM2Sh'] = [None] * 5 - for i in range(5): - self.fst_vt['ElastoDynTower']['TwFAM1Sh'][i] = float_read(f.readline().split()[0]) - for i in range(5): - self.fst_vt['ElastoDynTower']['TwFAM2Sh'][i] = float_read(f.readline().split()[0]) - f.readline() - self.fst_vt['ElastoDynTower']['TwSSM1Sh'] = [None] * 5 - self.fst_vt['ElastoDynTower']['TwSSM2Sh'] = [None] * 5 - for i in range(5): - self.fst_vt['ElastoDynTower']['TwSSM1Sh'][i] = float_read(f.readline().split()[0]) - for i in range(5): - self.fst_vt['ElastoDynTower']['TwSSM2Sh'][i] = float_read(f.readline().split()[0]) - - f.close() - - def read_AeroDyn14Polar(self, aerodynFile): - # AeroDyn v14 Airfoil Polar Input File - - # open aerodyn file - f = open(aerodynFile, 'r') - - airfoil = copy.copy(self.fst_vt['AeroDynPolar']) - - # skip through header - airfoil['description'] = f.readline().rstrip() # remove newline - f.readline() - airfoil['number_tables'] = int(f.readline().split()[0]) - - IDParam = [float_read(val) for val in f.readline().split()[0:airfoil['number_tables']]] - StallAngle = [float_read(val) for val in f.readline().split()[0:airfoil['number_tables']]] - f.readline() - f.readline() - f.readline() - ZeroCn = [float_read(val) for val in f.readline().split()[0:airfoil['number_tables']]] - CnSlope = [float_read(val) for val in f.readline().split()[0:airfoil['number_tables']]] - CnPosStall = [float_read(val) for val in f.readline().split()[0:airfoil['number_tables']]] - CnNegStall = [float_read(val) for val in f.readline().split()[0:airfoil['number_tables']]] - alphaCdMin = [float_read(val) for val in f.readline().split()[0:airfoil['number_tables']]] - CdMin = [float_read(val) for val in f.readline().split()[0:airfoil['number_tables']]] - - data = [] - airfoil['af_tables'] = [] - while True: - line = f.readline() - if 'EOT' in line: - break - line = [float_read(s) for s in line.split()] - if len(line) < 1: - break - data.append(line) - - # loop through tables - for i in range(airfoil['number_tables']): - polar = {} - polar['IDParam'] = IDParam[i] - polar['StallAngle'] = StallAngle[i] - polar['ZeroCn'] = ZeroCn[i] - polar['CnSlope'] = CnSlope[i] - polar['CnPosStall'] = CnPosStall[i] - polar['CnNegStall'] = CnNegStall[i] - polar['alphaCdMin'] = alphaCdMin[i] - polar['CdMin'] = CdMin[i] - - alpha = [] - cl = [] - cd = [] - cm = [] - # read polar information line by line - for datai in data: - if len(datai) == airfoil['number_tables']*3+1: - alpha.append(datai[0]) - cl.append(datai[1 + 3*i]) - cd.append(datai[2 + 3*i]) - cm.append(datai[3 + 3*i]) - elif len(datai) == airfoil['number_tables']*2+1: - alpha.append(datai[0]) - cl.append(datai[1 + 2*i]) - cd.append(datai[2 + 2*i]) - - polar['alpha'] = alpha - polar['cl'] = cl - polar['cd'] = cd - polar['cm'] = cm - airfoil['af_tables'].append(polar) - - f.close() - - return airfoil - - # def WndWindReader(self, wndfile): - # # .Wnd Wind Input File for Inflow - # wind_file = os.path.join(self.FAST_directory, wndfile) - # f = open(wind_file) - - # data = [] - # while 1: - # line = f.readline() - # if not line: - # break - # if line.strip().split()[0] != '!' and line[0] != '!': - # data.append(line.split()) - - # self.fst_vt['wnd_wind']['TimeSteps'] = len(data) - # self.fst_vt['wnd_wind']['Time'] = [None] * len(data) - # self.fst_vt['wnd_wind']['HorSpd'] = [None] * len(data) - # self.fst_vt['wnd_wind']['WindDir'] = [None] * len(data) - # self.fst_vt['wnd_wind']['VerSpd'] = [None] * len(data) - # self.fst_vt['wnd_wind']['HorShr'] = [None] * len(data) - # self.fst_vt['wnd_wind']['VerShr'] = [None] * len(data) - # self.fst_vt['wnd_wind']['LnVShr'] = [None] * len(data) - # self.fst_vt['wnd_wind']['GstSpd'] = [None] * len(data) - # for i in range(len(data)): - # self.fst_vt['wnd_wind']['Time'][i] = float_read(data[i][0]) - # self.fst_vt['wnd_wind']['HorSpd'][i] = float_read(data[i][1]) - # self.fst_vt['wnd_wind']['WindDir'][i] = float_read(data[i][2]) - # self.fst_vt['wnd_wind']['VerSpd'][i] = float_read(data[i][3]) - # self.fst_vt['wnd_wind']['HorShr'][i] = float_read(data[i][4]) - # self.fst_vt['wnd_wind']['VerShr'][i] = float_read(data[i][5]) - # self.fst_vt['wnd_wind']['LnVShr'][i] = float_read(data[i][6]) - # self.fst_vt['wnd_wind']['GstSpd'][i] = float_read(data[i][7]) - - # f.close() - - -class InputReader_OpenFAST(InputReader_Common): - """ OpenFAST / FAST 8.16 input file reader """ - - def execute(self): - - self.read_MainInput() - self.read_ElastoDyn() - self.read_ElastoDynBlade() - self.read_ElastoDynTower() - self.read_InflowWind() - - # if file_wind.split('.')[1] == 'wnd': - # self.WndWindReader(file_wind) - # else: - # print 'Wind reader for file type .%s not implemented yet.' % file_wind.split('.')[1] - # AeroDyn version selection - if self.fst_vt['Fst']['CompAero'] == 1: - self.read_AeroDyn14() - elif self.fst_vt['Fst']['CompAero'] == 2: - self.read_AeroDyn15() - - self.read_ServoDyn() - if ROSCO: - self.read_DISCON_in() - - - if self.fst_vt['Fst']['CompHydro'] == 1: # SubDyn not yet implimented - self.read_HydroDyn() - if self.fst_vt['Fst']['CompSub'] == 1: # SubDyn not yet implimented - self.read_SubDyn() - if self.fst_vt['Fst']['CompMooring'] == 1: # only MAP++ implimented for mooring models - self.read_MAP() - if self.fst_vt['Fst']['CompMooring'] == 3: # MoorDyn implimented - self.read_MoorDyn() - - if self.fst_vt['Fst']['CompElast'] == 2: # BeamDyn read assumes all 3 blades are the same - self.read_BeamDyn() - def read_MainInput(self): # Main FAST v8.16-v8.17 Input File # Currently no differences between FASTv8.16 and OpenFAST. @@ -536,11 +238,10 @@ def read_MainInput(self): self.fst_vt['Fst']['MooringFile_path'] = os.path.split(self.fst_vt['Fst']['MooringFile'])[0] self.fst_vt['Fst']['IceFile_path'] = os.path.split(self.fst_vt['Fst']['IceFile'])[0] - def read_ElastoDyn(self): + def read_ElastoDyn(self, ed_file): # ElastoDyn v1.03 Input File # Currently no differences between FASTv8.16 and OpenFAST. - ed_file = os.path.join(self.FAST_directory, self.fst_vt['Fst']['EDFile']) f = open(ed_file) f.readline() @@ -670,54 +371,168 @@ def read_ElastoDyn(self): # Tower (tower) f.readline() - self.fst_vt['ElastoDyn']['TwrNodes'] = int(f.readline().split()[0]) - self.fst_vt['ElastoDyn']['TwrFile'] = f.readline().split()[0][1:-1] + self.fst_vt['ElastoDyn']['TwrNodes'] = int(f.readline().split()[0]) + self.fst_vt['ElastoDyn']['TwrFile'] = f.readline().split()[0][1:-1] + + # ED Output Parameters (ed_out_params) + f.readline() + self.fst_vt['ElastoDyn']['SumPrint'] = bool_read(f.readline().split()[0]) + self.fst_vt['ElastoDyn']['OutFile'] = int(f.readline().split()[0]) + self.fst_vt['ElastoDyn']['TabDelim'] = bool_read(f.readline().split()[0]) + self.fst_vt['ElastoDyn']['OutFmt'] = f.readline().split()[0][1:-1] + self.fst_vt['ElastoDyn']['TStart'] = float_read(f.readline().split()[0]) + self.fst_vt['ElastoDyn']['DecFact'] = int(f.readline().split()[0]) + self.fst_vt['ElastoDyn']['NTwGages'] = int(f.readline().split()[0]) + if self.fst_vt['ElastoDyn']['NTwGages'] != 0: #loop over elements if there are gauges to be added, otherwise assign directly + self.fst_vt['ElastoDyn']['TwrGagNd'] = f.readline().strip().split()[:self.fst_vt['ElastoDyn']['NTwGages']] + for i, bldgag in enumerate(self.fst_vt['ElastoDyn']['TwrGagNd']): + self.fst_vt['ElastoDyn']['TwrGagNd'][i] = int(bldgag.strip(',')) + else: + self.fst_vt['ElastoDyn']['TwrGagNd'] = 0 + f.readline() + self.fst_vt['ElastoDyn']['NBlGages'] = int(f.readline().split()[0]) + if self.fst_vt['ElastoDyn']['NBlGages'] != 0: + self.fst_vt['ElastoDyn']['BldGagNd'] = f.readline().strip().split()[:self.fst_vt['ElastoDyn']['NBlGages']] + for i, bldgag in enumerate(self.fst_vt['ElastoDyn']['BldGagNd']): + self.fst_vt['ElastoDyn']['BldGagNd'][i] = int(bldgag.strip(',')) + else: + self.fst_vt['ElastoDyn']['BldGagNd'] = 0 + f.readline() + + # Loop through output channel lines + f.readline() + data = f.readline() + if data != '': + while data.split()[0] != 'END': + channels = data.split('"') + channel_list = channels[1].split(',') + self.set_outlist(self.fst_vt['outlist']['ElastoDyn'], channel_list) + + data = f.readline() + + f.close() + + def read_ElastoDynBlade(self, blade_file): + # ElastoDyn v1.00 Blade Input File + # Currently no differences between FASTv8.16 and OpenFAST. + + f = open(blade_file) + # print blade_file + f.readline() + f.readline() + f.readline() + + # Blade Parameters + self.fst_vt['ElastoDynBlade']['NBlInpSt'] = int(f.readline().split()[0]) + self.fst_vt['ElastoDynBlade']['BldFlDmp1'] = float_read(f.readline().split()[0]) + self.fst_vt['ElastoDynBlade']['BldFlDmp2'] = float_read(f.readline().split()[0]) + self.fst_vt['ElastoDynBlade']['BldEdDmp1'] = float_read(f.readline().split()[0]) + + # Blade Adjustment Factors + f.readline() + self.fst_vt['ElastoDynBlade']['FlStTunr1'] = float_read(f.readline().split()[0]) + self.fst_vt['ElastoDynBlade']['FlStTunr2'] = float_read(f.readline().split()[0]) + self.fst_vt['ElastoDynBlade']['AdjBlMs'] = float_read(f.readline().split()[0]) + self.fst_vt['ElastoDynBlade']['AdjFlSt'] = float_read(f.readline().split()[0]) + self.fst_vt['ElastoDynBlade']['AdjEdSt'] = float_read(f.readline().split()[0]) + + # Distrilbuted Blade Properties + f.readline() + f.readline() + f.readline() + self.fst_vt['ElastoDynBlade']['BlFract'] = [None] * self.fst_vt['ElastoDynBlade']['NBlInpSt'] + self.fst_vt['ElastoDynBlade']['PitchAxis'] = [None] * self.fst_vt['ElastoDynBlade']['NBlInpSt'] + self.fst_vt['ElastoDynBlade']['StrcTwst'] = [None] * self.fst_vt['ElastoDynBlade']['NBlInpSt'] + self.fst_vt['ElastoDynBlade']['BMassDen'] = [None] * self.fst_vt['ElastoDynBlade']['NBlInpSt'] + self.fst_vt['ElastoDynBlade']['FlpStff'] = [None] * self.fst_vt['ElastoDynBlade']['NBlInpSt'] + self.fst_vt['ElastoDynBlade']['EdgStff'] = [None] * self.fst_vt['ElastoDynBlade']['NBlInpSt'] + + for i in range(self.fst_vt['ElastoDynBlade']['NBlInpSt']): + data = f.readline().split() + self.fst_vt['ElastoDynBlade']['BlFract'][i] = float_read(data[0]) + self.fst_vt['ElastoDynBlade']['PitchAxis'][i] = float_read(data[1]) + self.fst_vt['ElastoDynBlade']['StrcTwst'][i] = float_read(data[2]) + self.fst_vt['ElastoDynBlade']['BMassDen'][i] = float_read(data[3]) + self.fst_vt['ElastoDynBlade']['FlpStff'][i] = float_read(data[4]) + self.fst_vt['ElastoDynBlade']['EdgStff'][i] = float_read(data[5]) + + f.readline() + self.fst_vt['ElastoDynBlade']['BldFl1Sh'] = [None] * 5 + self.fst_vt['ElastoDynBlade']['BldFl2Sh'] = [None] * 5 + self.fst_vt['ElastoDynBlade']['BldEdgSh'] = [None] * 5 + for i in range(5): + self.fst_vt['ElastoDynBlade']['BldFl1Sh'][i] = float_read(f.readline().split()[0]) + for i in range(5): + self.fst_vt['ElastoDynBlade']['BldFl2Sh'][i] = float_read(f.readline().split()[0]) + for i in range(5): + self.fst_vt['ElastoDynBlade']['BldEdgSh'][i] = float_read(f.readline().split()[0]) + + f.close() + + def read_ElastoDynTower(self, tower_file): + # ElastoDyn v1.00 Tower Input Files + # Currently no differences between FASTv8.16 and OpenFAST. + + f = open(tower_file) + + f.readline() + f.readline() + + # General Tower Paramters + f.readline() + self.fst_vt['ElastoDynTower']['NTwInpSt'] = int(f.readline().split()[0]) + self.fst_vt['ElastoDynTower']['TwrFADmp1'] = float_read(f.readline().split()[0]) + self.fst_vt['ElastoDynTower']['TwrFADmp2'] = float_read(f.readline().split()[0]) + self.fst_vt['ElastoDynTower']['TwrSSDmp1'] = float_read(f.readline().split()[0]) + self.fst_vt['ElastoDynTower']['TwrSSDmp2'] = float_read(f.readline().split()[0]) + + # Tower Adjustment Factors + f.readline() + self.fst_vt['ElastoDynTower']['FAStTunr1'] = float_read(f.readline().split()[0]) + self.fst_vt['ElastoDynTower']['FAStTunr2'] = float_read(f.readline().split()[0]) + self.fst_vt['ElastoDynTower']['SSStTunr1'] = float_read(f.readline().split()[0]) + self.fst_vt['ElastoDynTower']['SSStTunr2'] = float_read(f.readline().split()[0]) + self.fst_vt['ElastoDynTower']['AdjTwMa'] = float_read(f.readline().split()[0]) + self.fst_vt['ElastoDynTower']['AdjFASt'] = float_read(f.readline().split()[0]) + self.fst_vt['ElastoDynTower']['AdjSSSt'] = float_read(f.readline().split()[0]) + + # Distributed Tower Properties + f.readline() + f.readline() + f.readline() + self.fst_vt['ElastoDynTower']['HtFract'] = [None] * self.fst_vt['ElastoDynTower']['NTwInpSt'] + self.fst_vt['ElastoDynTower']['TMassDen'] = [None] * self.fst_vt['ElastoDynTower']['NTwInpSt'] + self.fst_vt['ElastoDynTower']['TwFAStif'] = [None] * self.fst_vt['ElastoDynTower']['NTwInpSt'] + self.fst_vt['ElastoDynTower']['TwSSStif'] = [None] * self.fst_vt['ElastoDynTower']['NTwInpSt'] - # ED Output Parameters (ed_out_params) + for i in range(self.fst_vt['ElastoDynTower']['NTwInpSt']): + data = f.readline().split() + self.fst_vt['ElastoDynTower']['HtFract'][i] = float_read(data[0]) + self.fst_vt['ElastoDynTower']['TMassDen'][i] = float_read(data[1]) + self.fst_vt['ElastoDynTower']['TwFAStif'][i] = float_read(data[2]) + self.fst_vt['ElastoDynTower']['TwSSStif'][i] = float_read(data[3]) + + # Tower Mode Shapes f.readline() - self.fst_vt['ElastoDyn']['SumPrint'] = bool_read(f.readline().split()[0]) - self.fst_vt['ElastoDyn']['OutFile'] = int(f.readline().split()[0]) - self.fst_vt['ElastoDyn']['TabDelim'] = bool_read(f.readline().split()[0]) - self.fst_vt['ElastoDyn']['OutFmt'] = f.readline().split()[0][1:-1] - self.fst_vt['ElastoDyn']['TStart'] = float_read(f.readline().split()[0]) - self.fst_vt['ElastoDyn']['DecFact'] = int(f.readline().split()[0]) - self.fst_vt['ElastoDyn']['NTwGages'] = int(f.readline().split()[0]) - twrg = f.readline().split(',') - if self.fst_vt['ElastoDyn']['NTwGages'] != 0: #loop over elements if there are gauges to be added, otherwise assign directly - for i in range(self.fst_vt['ElastoDyn']['NTwGages']): - self.fst_vt['ElastoDyn']['TwrGagNd'].append(twrg[i]) - self.fst_vt['ElastoDyn']['TwrGagNd'][-1] = self.fst_vt['ElastoDyn']['TwrGagNd'][-1][:-1] #remove last (newline) character - else: - self.fst_vt['ElastoDyn']['TwrGagNd'] = twrg - self.fst_vt['ElastoDyn']['TwrGagNd'][-1] = self.fst_vt['ElastoDyn']['TwrGagNd'][-1][:-1] - self.fst_vt['ElastoDyn']['NBlGages'] = int(f.readline().split()[0]) - if self.fst_vt['ElastoDyn']['NBlGages'] != 0: - self.fst_vt['ElastoDyn']['BldGagNd'] = f.readline().strip().split()[:self.fst_vt['ElastoDyn']['NBlGages']] - for i, bldgag in enumerate(self.fst_vt['ElastoDyn']['BldGagNd']): - self.fst_vt['ElastoDyn']['BldGagNd'][i] = int(bldgag.strip(',')) - else: - self.fst_vt['ElastoDyn']['BldGagNd'] = 0 - f.readline() - - # Loop through output channel lines + self.fst_vt['ElastoDynTower']['TwFAM1Sh'] = [None] * 5 + self.fst_vt['ElastoDynTower']['TwFAM2Sh'] = [None] * 5 + for i in range(5): + self.fst_vt['ElastoDynTower']['TwFAM1Sh'][i] = float_read(f.readline().split()[0]) + for i in range(5): + self.fst_vt['ElastoDynTower']['TwFAM2Sh'][i] = float_read(f.readline().split()[0]) f.readline() - data = f.readline() - if data != '': - while data.split()[0] != 'END': - channels = data.split('"') - channel_list = channels[1].split(',') - self.set_outlist(self.fst_vt['outlist']['ElastoDyn'], channel_list) - - data = f.readline() + self.fst_vt['ElastoDynTower']['TwSSM1Sh'] = [None] * 5 + self.fst_vt['ElastoDynTower']['TwSSM2Sh'] = [None] * 5 + for i in range(5): + self.fst_vt['ElastoDynTower']['TwSSM1Sh'][i] = float_read(f.readline().split()[0]) + for i in range(5): + self.fst_vt['ElastoDynTower']['TwSSM2Sh'][i] = float_read(f.readline().split()[0]) f.close() - def read_BeamDyn(self): + def read_BeamDyn(self, bd_file): # BeamDyn Input File - - bd_file = os.path.join(self.FAST_directory, self.fst_vt['Fst']['BDBldFile(1)']) f = open(bd_file) - f.readline() f.readline() f.readline() @@ -728,7 +543,7 @@ def read_BeamDyn(self): self.fst_vt['BeamDyn']['quadrature'] = int_read(f.readline().split()[0]) self.fst_vt['BeamDyn']['refine'] = int_read(f.readline().split()[0]) self.fst_vt['BeamDyn']['n_fact'] = int_read(f.readline().split()[0]) - self.fst_vt['BeamDyn']['DTBeam'] = float_read(f.readline().split()[0]) + self.fst_vt['BeamDyn']['DTBeam'] = float_read(f.readline().split()[0]) self.fst_vt['BeamDyn']['load_retries'] = int_read(f.readline().split()[0]) self.fst_vt['BeamDyn']['NRMax'] = int_read(f.readline().split()[0]) self.fst_vt['BeamDyn']['stop_tol'] = float_read(f.readline().split()[0]) @@ -906,112 +721,24 @@ def read_InflowWind(self): f.readline() self.fst_vt['InflowWind']['SumPrint'] = bool_read(f.readline().split()[0]) - # NO INFLOW WIND OUTPUT PARAMETERS YET DEFINED IN FAST - # f.readline() - # data = f.readline() - # while data.split()[0] != 'END': - # channels = data.split('"') - # channel_list = channels[1].split(',') - # for i in range(len(channel_list)): - # channel_list[i] = channel_list[i].replace(' ','') - # if channel_list[i] in self.fst_vt.outlist.inflow_wind_vt.__dict__.keys(): - # self.fst_vt.outlist.inflow_wind_vt.__dict__[channel_list[i]] = True - # data = f.readline() - - f.close() - - def read_AeroDyn14(self): - # AeroDyn v14.04 - - ad_file = os.path.join(self.FAST_directory, self.fst_vt['Fst']['AeroFile']) - f = open(ad_file) - # AeroDyn file header (aerodyn) - f.readline() - f.readline() - self.fst_vt['AeroDyn14']['StallMod'] = f.readline().split()[0] - self.fst_vt['AeroDyn14']['UseCm'] = f.readline().split()[0] - self.fst_vt['AeroDyn14']['InfModel'] = f.readline().split()[0] - self.fst_vt['AeroDyn14']['IndModel'] = f.readline().split()[0] - self.fst_vt['AeroDyn14']['AToler'] = float_read(f.readline().split()[0]) - self.fst_vt['AeroDyn14']['TLModel'] = f.readline().split()[0] - self.fst_vt['AeroDyn14']['HLModel'] = f.readline().split()[0] - self.fst_vt['AeroDyn14']['TwrShad'] = f.readline().split()[0] - self.fst_vt['AeroDyn14']['TwrPotent'] = bool_read(f.readline().split()[0]) - self.fst_vt['AeroDyn14']['TwrShadow'] = bool_read(f.readline().split()[0]) - self.fst_vt['AeroDyn14']['TwrFile'] = f.readline().split()[0].replace('"','').replace("'",'') - self.fst_vt['AeroDyn14']['CalcTwrAero'] = bool_read(f.readline().split()[0]) - self.fst_vt['AeroDyn14']['AirDens'] = float_read(f.readline().split()[0]) - self.fst_vt['AeroDyn14']['KinVisc'] = float_read(f.readline().split()[0]) - self.fst_vt['AeroDyn14']['DTAero'] = float_read(f.readline().split()[0]) - - # AeroDyn Blade Properties (blade_aero) - self.fst_vt['AeroDyn14']['NumFoil'] = int(f.readline().split()[0]) - self.fst_vt['AeroDyn14']['FoilNm'] = [None] * self.fst_vt['AeroDyn14']['NumFoil'] - for i in range(self.fst_vt['AeroDyn14']['NumFoil']): - af_filename = f.readline().split()[0] - af_filename = fix_path(af_filename) - self.fst_vt['AeroDyn14']['FoilNm'][i] = af_filename[1:-1] - - self.fst_vt['AeroDynBlade']['BldNodes'] = int(f.readline().split()[0]) + # InflowWind Outlist f.readline() - self.fst_vt['AeroDynBlade']['RNodes'] = [None] * self.fst_vt['AeroDynBlade']['BldNodes'] - self.fst_vt['AeroDynBlade']['AeroTwst'] = [None] * self.fst_vt['AeroDynBlade']['BldNodes'] - self.fst_vt['AeroDynBlade']['DRNodes'] = [None] * self.fst_vt['AeroDynBlade']['BldNodes'] - self.fst_vt['AeroDynBlade']['Chord'] = [None] * self.fst_vt['AeroDynBlade']['BldNodes'] - self.fst_vt['AeroDynBlade']['NFoil'] = [None] * self.fst_vt['AeroDynBlade']['BldNodes'] - self.fst_vt['AeroDynBlade']['PrnElm'] = [None] * self.fst_vt['AeroDynBlade']['BldNodes'] - for i in range(self.fst_vt['AeroDynBlade']['BldNodes']): - data = f.readline().split() - self.fst_vt['AeroDynBlade']['RNodes'][i] = float_read(data[0]) - self.fst_vt['AeroDynBlade']['AeroTwst'][i] = float_read(data[1]) - self.fst_vt['AeroDynBlade']['DRNodes'][i] = float_read(data[2]) - self.fst_vt['AeroDynBlade']['Chord'][i] = float_read(data[3]) - self.fst_vt['AeroDynBlade']['NFoil'][i] = int(data[4]) - self.fst_vt['AeroDynBlade']['PrnElm'][i] = data[5] + data = f.readline() + while data.split()[0] != 'END': + if data.find('"')>=0: + channels = data.split('"') + channel_list = channels[1].split(',') + else: + row_string = data.split(',') + if len(row_string)==1: + channel_list = row_string[0].split('\n')[0] + else: + channel_list = row_string + self.set_outlist(self.fst_vt['outlist']['InflowWind'], channel_list) + data = f.readline() f.close() - - # create airfoil objects - self.fst_vt['AeroDynBlade']['af_data'] = [] - for i in range(self.fst_vt['AeroDynBlade']['NumFoil']): - self.fst_vt['AeroDynBlade']['af_data'].append(self.read_AeroDyn14Polar(os.path.join(self.FAST_directory,self.fst_vt['AeroDyn14']['FoilNm'][i]))) - - # tower - self.read_AeroDyn14Tower() - - def read_AeroDyn14Tower(self): - # AeroDyn v14.04 Tower - - ad_tower_file = os.path.join(self.FAST_directory, self.fst_vt['aerodyn']['TwrFile']) - f = open(ad_tower_file) - - f.readline() - f.readline() - self.fst_vt['AeroDynTower']['NTwrHt'] = int(f.readline().split()[0]) - self.fst_vt['AeroDynTower']['NTwrRe'] = int(f.readline().split()[0]) - self.fst_vt['AeroDynTower']['NTwrCD'] = int(f.readline().split()[0]) - self.fst_vt['AeroDynTower']['Tower_Wake_Constant'] = float_read(f.readline().split()[0]) - - f.readline() - f.readline() - self.fst_vt['AeroDynTower']['TwrHtFr'] = [None]*self.fst_vt['AeroDynTower']['NTwrHt'] - self.fst_vt['AeroDynTower']['TwrWid'] = [None]*self.fst_vt['AeroDynTower']['NTwrHt'] - self.fst_vt['AeroDynTower']['NTwrCDCol'] = [None]*self.fst_vt['AeroDynTower']['NTwrHt'] - for i in range(self.fst_vt['AeroDynTower']['NTwrHt']): - data = [float(val) for val in f.readline().split()] - self.fst_vt['AeroDynTower']['TwrHtFr'][i] = data[0] - self.fst_vt['AeroDynTower']['TwrWid'][i] = data[1] - self.fst_vt['AeroDynTower']['NTwrCDCol'][i] = data[2] - - f.readline() - f.readline() - self.fst_vt['AeroDynTower']['TwrRe'] = [None]*self.fst_vt['AeroDynTower']['NTwrRe'] - self.fst_vt['AeroDynTower']['TwrCD'] = np.zeros((self.fst_vt['AeroDynTower']['NTwrRe'], self.fst_vt['AeroDynTower']['NTwrCD'])) - for i in range(self.fst_vt['AeroDynTower']['NTwrRe']): - data = [float(val) for val in f.readline().split()] - self.fst_vt['AeroDynTower']['TwrRe'][i] = data[0] - self.fst_vt['AeroDynTower']['TwrCD'][i,:] = data[1:] - + def read_AeroDyn15(self): # AeroDyn v15.03 @@ -1027,10 +754,11 @@ def read_AeroDyn15(self): self.fst_vt['AeroDyn15']['WakeMod'] = int(f.readline().split()[0]) self.fst_vt['AeroDyn15']['AFAeroMod'] = int(f.readline().split()[0]) self.fst_vt['AeroDyn15']['TwrPotent'] = int(f.readline().split()[0]) - self.fst_vt['AeroDyn15']['TwrShadow'] = int(f.readline().split()[0]) + self.fst_vt['AeroDyn15']['TwrShadow'] = int(f.readline().split()[0]) self.fst_vt['AeroDyn15']['TwrAero'] = bool_read(f.readline().split()[0]) self.fst_vt['AeroDyn15']['FrozenWake'] = bool_read(f.readline().split()[0]) self.fst_vt['AeroDyn15']['CavitCheck'] = bool_read(f.readline().split()[0]) + self.fst_vt['AeroDyn15']['Buoyancy'] = bool_read(f.readline().split()[0]) self.fst_vt['AeroDyn15']['CompAA'] = bool_read(f.readline().split()[0]) self.fst_vt['AeroDyn15']['AA_InputFile'] = f.readline().split()[0] @@ -1045,8 +773,8 @@ def read_AeroDyn15(self): # Blade-Element/Momentum Theory Options f.readline() - self.fst_vt['AeroDyn15']['SkewMod'] = int(f.readline().split()[0]) - self.fst_vt['AeroDyn15']['SkewModFactor'] = float_read(f.readline().split()[0]) + self.fst_vt['AeroDyn15']['SkewMod'] = int_read(f.readline().split()[0]) + self.fst_vt['AeroDyn15']['SkewModFactor'] = float_read(f.readline().split()[0]) self.fst_vt['AeroDyn15']['TipLoss'] = bool_read(f.readline().split()[0]) self.fst_vt['AeroDyn15']['HubLoss'] = bool_read(f.readline().split()[0]) self.fst_vt['AeroDyn15']['TanInd'] = bool_read(f.readline().split()[0]) @@ -1069,8 +797,21 @@ def read_AeroDyn15(self): f.readline() self.fst_vt['AeroDyn15']['UAMod'] = int(f.readline().split()[0]) self.fst_vt['AeroDyn15']['FLookup'] = bool_read(f.readline().split()[0]) - self.fst_vt['AeroDyn15']['UAStartRad'] = float_read(f.readline().split()[0]) - self.fst_vt['AeroDyn15']['UAEndRad'] = float_read(f.readline().split()[0]) + + file_pos = f.tell() + line = f.readline() + if 'UAStartRad' in line: + self.fst_vt['AeroDyn15']['UAStartRad'] = float_read(line.split()[0]) + else: + f.seek(file_pos) + + file_pos = f.tell() + line = f.readline() + if 'UAEndRad' in line: + self.fst_vt['AeroDyn15']['UAEndRad'] = float_read(line.split()[0]) + else: + f.seek(file_pos) + # Airfoil Information f.readline() @@ -1093,21 +834,36 @@ def read_AeroDyn15(self): self.fst_vt['AeroDyn15']['ADBlFile2'] = f.readline().split()[0][1:-1] self.fst_vt['AeroDyn15']['ADBlFile3'] = f.readline().split()[0][1:-1] + # Hub, nacelle, and tail fin aerodynamics + f.readline() + self.fst_vt['AeroDyn15']['VolHub'] = float_read(f.readline().split()[0]) + self.fst_vt['AeroDyn15']['HubCenBx'] = float_read(f.readline().split()[0]) + f.readline() + self.fst_vt['AeroDyn15']['VolNac'] = float_read(f.readline().split()[0]) + # data = [float(val) for val in f.readline().split(',')] + self.fst_vt['AeroDyn15']['NacCenB'] = [idx.strip() for idx in f.readline().split('NacCenB')[0].split(',')] + f.readline() + self.fst_vt['AeroDyn15']['TFinAero'] = bool_read(f.readline().split()[0]) + tfa_filename = fix_path(f.readline().split()[0])[1:-1] + self.fst_vt['AeroDyn15']['TFinFile'] = os.path.abspath(os.path.join(self.FAST_directory, tfa_filename)) + # Tower Influence and Aerodynamics f.readline() self.fst_vt['AeroDyn15']['NumTwrNds'] = int(f.readline().split()[0]) f.readline() f.readline() - self.fst_vt['AeroDyn15']['TwrElev'] = [None]*self.fst_vt['AeroDyn15']['NumTwrNds'] - self.fst_vt['AeroDyn15']['TwrDiam'] = [None]*self.fst_vt['AeroDyn15']['NumTwrNds'] - self.fst_vt['AeroDyn15']['TwrCd'] = [None]*self.fst_vt['AeroDyn15']['NumTwrNds'] - self.fst_vt['AeroDyn15']['TwrTI'] = [None]*self.fst_vt['AeroDyn15']['NumTwrNds'] + self.fst_vt['AeroDyn15']['TwrElev'] = [None]*self.fst_vt['AeroDyn15']['NumTwrNds'] + self.fst_vt['AeroDyn15']['TwrDiam'] = [None]*self.fst_vt['AeroDyn15']['NumTwrNds'] + self.fst_vt['AeroDyn15']['TwrCd'] = [None]*self.fst_vt['AeroDyn15']['NumTwrNds'] + self.fst_vt['AeroDyn15']['TwrTI'] = [None]*self.fst_vt['AeroDyn15']['NumTwrNds'] + self.fst_vt['AeroDyn15']['TwrCb'] = [None]*self.fst_vt['AeroDyn15']['NumTwrNds'] for i in range(self.fst_vt['AeroDyn15']['NumTwrNds']): data = [float(val) for val in f.readline().split()] self.fst_vt['AeroDyn15']['TwrElev'][i] = data[0] self.fst_vt['AeroDyn15']['TwrDiam'][i] = data[1] self.fst_vt['AeroDyn15']['TwrCd'][i] = data[2] self.fst_vt['AeroDyn15']['TwrTI'][i] = data[3] + self.fst_vt['AeroDyn15']['TwrCb'][i] = data[4] # Outputs f.readline() @@ -1121,8 +877,15 @@ def read_AeroDyn15(self): f.readline() data = f.readline() while data.split()[0] != 'END': - channels = data.split('"') - channel_list = channels[1].split(',') + if data.find('"')>=0: + channels = data.split('"') + channel_list = channels[1].split(',') + else: + row_string = data.split(',') + if len(row_string)==1: + channel_list = row_string[0].split('\n')[0] + else: + channel_list = row_string self.set_outlist(self.fst_vt['outlist']['AeroDyn'], channel_list) data = f.readline() @@ -1131,10 +894,9 @@ def read_AeroDyn15(self): self.read_AeroDyn15Blade() self.read_AeroDyn15Polar() self.read_AeroDyn15Coord() - if self.fst_vt['AeroDyn15']['WakeMod'] == 3: - if self.fst_vt['AeroDyn15']['AFAeroMod'] == 2: - raise Exception('OLAF is called with unsteady airfoil aerodynamics, but OLAF currently only supports AFAeroMod == 1') - self.read_AeroDyn15OLAF() + olaf_filename = os.path.join(self.FAST_directory, self.fst_vt['AeroDyn15']['OLAFInputFileName']) + if os.path.isfile(olaf_filename): + self.read_AeroDyn15OLAF(olaf_filename) def read_AeroDyn15Blade(self): # AeroDyn v5.00 Blade Definition File @@ -1197,6 +959,8 @@ def read_AeroDyn15Polar(self): polar['alpha0'] = float_read(readline_filterComments(f).split()[0]) polar['alpha1'] = float_read(readline_filterComments(f).split()[0]) polar['alpha2'] = float_read(readline_filterComments(f).split()[0]) + # polar['alphaUpper'] = float_read(readline_filterComments(f).split()[0]) + # polar['alphaLower'] = float_read(readline_filterComments(f).split()[0]) polar['eta_e'] = float_read(readline_filterComments(f).split()[0]) polar['C_nalpha'] = float_read(readline_filterComments(f).split()[0]) polar['T_f0'] = float_read(readline_filterComments(f).split()[0]) @@ -1254,13 +1018,12 @@ def read_AeroDyn15Polar(self): def read_AeroDyn15Coord(self): self.fst_vt['AeroDyn15']['af_coord'] = [] - self.fst_vt['AeroDyn15']['ac'] = np.zeros(len(self.fst_vt['AeroDyn15']['AFNames'])) + self.fst_vt['AeroDyn15']['ac'] = np.zeros(len(self.fst_vt['AeroDyn15']['AFNames'])) for afi, af_filename in enumerate(self.fst_vt['AeroDyn15']['AFNames']): self.fst_vt['AeroDyn15']['af_coord'].append({}) if not (self.fst_vt['AeroDyn15']['af_data'][afi][0]['NumCoords'] == 0 or self.fst_vt['AeroDyn15']['af_data'][afi][0]['NumCoords'] == '0'): - coord_filename = af_filename[0:af_filename.rfind( - os.sep)] + os.sep + self.fst_vt['AeroDyn15']['af_data'][afi][0]['NumCoords'][2:-1] + coord_filename = af_filename[0:af_filename.rfind(os.sep)] + os.sep + self.fst_vt['AeroDyn15']['af_data'][afi][0]['NumCoords'][2:-1] f = open(coord_filename) n_coords = int_read(readline_filterComments(f).split()[0]) x = np.zeros(n_coords) @@ -1275,60 +1038,233 @@ def read_AeroDyn15Coord(self): for j in range(n_coords - 1): x[j], y[j] = f.readline().split() - self.fst_vt['AeroDyn15']['af_coord'][afi]['x'] = x - self.fst_vt['AeroDyn15']['af_coord'][afi]['y'] = y + self.fst_vt['AeroDyn15']['af_coord'][afi]['x'] = x + self.fst_vt['AeroDyn15']['af_coord'][afi]['y'] = y + + f.close() + + def read_AeroDyn15OLAF(self, olaf_filename): + + self.fst_vt['AeroDyn15']['OLAF'] = {} + f = open(olaf_filename) + f.readline() + f.readline() + f.readline() + self.fst_vt['AeroDyn15']['OLAF']['IntMethod'] = int_read(f.readline().split()[0]) + self.fst_vt['AeroDyn15']['OLAF']['DTfvw'] = float_read(f.readline().split()[0]) + self.fst_vt['AeroDyn15']['OLAF']['FreeWakeStart'] = float_read(f.readline().split()[0]) + self.fst_vt['AeroDyn15']['OLAF']['FullCircStart'] = float_read(f.readline().split()[0]) + f.readline() + self.fst_vt['AeroDyn15']['OLAF']['CircSolvMethod'] = int_read(f.readline().split()[0]) + self.fst_vt['AeroDyn15']['OLAF']['CircSolvConvCrit'] = float_read(f.readline().split()[0]) + self.fst_vt['AeroDyn15']['OLAF']['CircSolvRelaxation'] = float_read(f.readline().split()[0]) + self.fst_vt['AeroDyn15']['OLAF']['CircSolvMaxIter'] = int_read(f.readline().split()[0]) + self.fst_vt['AeroDyn15']['OLAF']['PrescribedCircFile'] = f.readline().split()[0] + f.readline() + f.readline() + f.readline() + self.fst_vt['AeroDyn15']['OLAF']['nNWPanels'] = int_read(f.readline().split()[0]) + self.fst_vt['AeroDyn15']['OLAF']['nNWPanelsFree'] = int_read(f.readline().split()[0]) + self.fst_vt['AeroDyn15']['OLAF']['nFWPanels'] = int_read(f.readline().split()[0]) + self.fst_vt['AeroDyn15']['OLAF']['nFWPanelsFree'] = int_read(f.readline().split()[0]) + self.fst_vt['AeroDyn15']['OLAF']['FWShedVorticity'] = bool_read(f.readline().split()[0]) + f.readline() + self.fst_vt['AeroDyn15']['OLAF']['DiffusionMethod'] = int_read(f.readline().split()[0]) + self.fst_vt['AeroDyn15']['OLAF']['RegDeterMethod'] = int_read(f.readline().split()[0]) + self.fst_vt['AeroDyn15']['OLAF']['RegFunction'] = int_read(f.readline().split()[0]) + self.fst_vt['AeroDyn15']['OLAF']['WakeRegMethod'] = int_read(f.readline().split()[0]) + self.fst_vt['AeroDyn15']['OLAF']['WakeRegFactor'] = float(f.readline().split()[0]) + self.fst_vt['AeroDyn15']['OLAF']['WingRegFactor'] = float(f.readline().split()[0]) + self.fst_vt['AeroDyn15']['OLAF']['CoreSpreadEddyVisc'] = int(f.readline().split()[0]) + f.readline() + self.fst_vt['AeroDyn15']['OLAF']['TwrShadowOnWake'] = bool_read(f.readline().split()[0]) + self.fst_vt['AeroDyn15']['OLAF']['ShearModel'] = int_read(f.readline().split()[0]) + f.readline() + self.fst_vt['AeroDyn15']['OLAF']['VelocityMethod'] = int_read(f.readline().split()[0]) + self.fst_vt['AeroDyn15']['OLAF']['TreeBranchFactor']= float_read(f.readline().split()[0]) + self.fst_vt['AeroDyn15']['OLAF']['PartPerSegment'] = int(f.readline().split()[0]) + f.readline() + f.readline() + self.fst_vt['AeroDyn15']['OLAF']['WrVTk'] = int(f.readline().split()[0]) + self.fst_vt['AeroDyn15']['OLAF']['nVTKBlades'] = int(f.readline().split()[0]) + self.fst_vt['AeroDyn15']['OLAF']['VTKCoord'] = int_read(f.readline().split()[0]) + self.fst_vt['AeroDyn15']['OLAF']['VTK_fps'] = float_read(f.readline().split()[0]) + self.fst_vt['AeroDyn15']['OLAF']['nGridOut'] = int_read(f.readline().split()[0]) + f.readline() + f.close() + + def read_AeroDyn14(self): + # AeroDyn v14.04 + + ad_file = os.path.join(self.FAST_directory, self.fst_vt['Fst']['AeroFile']) + f = open(ad_file) + # AeroDyn file header (aerodyn) + f.readline() + f.readline() + self.fst_vt['AeroDyn14']['StallMod'] = f.readline().split()[0] + self.fst_vt['AeroDyn14']['UseCm'] = f.readline().split()[0] + self.fst_vt['AeroDyn14']['InfModel'] = f.readline().split()[0] + self.fst_vt['AeroDyn14']['IndModel'] = f.readline().split()[0] + self.fst_vt['AeroDyn14']['AToler'] = float_read(f.readline().split()[0]) + self.fst_vt['AeroDyn14']['TLModel'] = f.readline().split()[0] + self.fst_vt['AeroDyn14']['HLModel'] = f.readline().split()[0] + self.fst_vt['AeroDyn14']['TwrShad'] = int(f.readline().split()[0]) + if self.fst_vt['AeroDyn14']['TwrShad'] > 0: + self.fst_vt['AeroDyn14']['TwrPotent'] = bool_read(f.readline().split()[0]) + self.fst_vt['AeroDyn14']['TwrShadow'] = bool_read(f.readline().split()[0]) + self.fst_vt['AeroDyn14']['TwrFile'] = f.readline().split()[0].replace('"','').replace("'",'') + self.fst_vt['AeroDyn14']['CalcTwrAero'] = bool_read(f.readline().split()[0]) + else: + self.fst_vt['AeroDyn14']['ShadHWid'] = float_read(f.readline().split()[0]) + self.fst_vt['AeroDyn14']['T_Shad_Refpt'] = float_read(f.readline().split()[0]) + self.fst_vt['AeroDyn14']['AirDens'] = float_read(f.readline().split()[0]) + self.fst_vt['AeroDyn14']['KinVisc'] = float_read(f.readline().split()[0]) + self.fst_vt['AeroDyn14']['DTAero'] = float_read(f.readline().split()[0]) + + # AeroDyn Blade Properties (blade_aero) + self.fst_vt['AeroDyn14']['NumFoil'] = int(f.readline().split()[0]) + self.fst_vt['AeroDyn14']['FoilNm'] = [None] * self.fst_vt['AeroDyn14']['NumFoil'] + for i in range(self.fst_vt['AeroDyn14']['NumFoil']): + af_filename = f.readline().split()[0] + af_filename = fix_path(af_filename) + self.fst_vt['AeroDyn14']['FoilNm'][i] = af_filename[1:-1] + + self.fst_vt['AeroDynBlade']['BldNodes'] = int(f.readline().split()[0]) + f.readline() + self.fst_vt['AeroDynBlade']['RNodes'] = [None] * self.fst_vt['AeroDynBlade']['BldNodes'] + self.fst_vt['AeroDynBlade']['AeroTwst'] = [None] * self.fst_vt['AeroDynBlade']['BldNodes'] + self.fst_vt['AeroDynBlade']['DRNodes'] = [None] * self.fst_vt['AeroDynBlade']['BldNodes'] + self.fst_vt['AeroDynBlade']['Chord'] = [None] * self.fst_vt['AeroDynBlade']['BldNodes'] + self.fst_vt['AeroDynBlade']['NFoil'] = [None] * self.fst_vt['AeroDynBlade']['BldNodes'] + self.fst_vt['AeroDynBlade']['PrnElm'] = [None] * self.fst_vt['AeroDynBlade']['BldNodes'] + for i in range(self.fst_vt['AeroDynBlade']['BldNodes']): + data = f.readline().split() + self.fst_vt['AeroDynBlade']['RNodes'][i] = float_read(data[0]) + self.fst_vt['AeroDynBlade']['AeroTwst'][i] = float_read(data[1]) + self.fst_vt['AeroDynBlade']['DRNodes'][i] = float_read(data[2]) + self.fst_vt['AeroDynBlade']['Chord'][i] = float_read(data[3]) + self.fst_vt['AeroDynBlade']['NFoil'][i] = int(data[4]) + self.fst_vt['AeroDynBlade']['PrnElm'][i] = data[5] + + f.close() + + # create airfoil objects + self.fst_vt['AeroDynBlade']['af_data'] = [] + for i in range(self.fst_vt['AeroDyn14']['NumFoil']): + self.fst_vt['AeroDynBlade']['af_data'].append(self.read_AeroDyn14Polar(os.path.join(self.FAST_directory,self.fst_vt['AeroDyn14']['FoilNm'][i]))) - f.close() + # tower + if self.fst_vt['AeroDyn14']['TwrShad'] > 0: + self.read_AeroDyn14Tower() + + def read_AeroDyn14Tower(self): + # AeroDyn v14.04 Tower + + ad_tower_file = os.path.join(self.FAST_directory, self.fst_vt['AeroDyn14']['TwrFile']) + f = open(ad_tower_file) - def read_AeroDyn15OLAF(self): - - self.fst_vt['AeroDyn15']['OLAF'] = {} - olaf_filename = os.path.join(self.FAST_directory, self.fst_vt['AeroDyn15']['OLAFInputFileName']) - f = open(olaf_filename) - f.readline() - f.readline() - f.readline() - self.fst_vt['AeroDyn15']['OLAF']['IntMethod'] = int_read(f.readline().split()[0]) - self.fst_vt['AeroDyn15']['OLAF']['DTfvw'] = float_read(f.readline().split()[0]) - self.fst_vt['AeroDyn15']['OLAF']['FreeWakeStart'] = float_read(f.readline().split()[0]) - self.fst_vt['AeroDyn15']['OLAF']['FullCircStart'] = float_read(f.readline().split()[0]) f.readline() - self.fst_vt['AeroDyn15']['OLAF']['CircSolvingMethod'] = int_read(f.readline().split()[0]) - self.fst_vt['AeroDyn15']['OLAF']['CircSolvConvCrit'] = float_read(f.readline().split()[0]) - self.fst_vt['AeroDyn15']['OLAF']['CircSolvRelaxation'] = float_read(f.readline().split()[0]) - self.fst_vt['AeroDyn15']['OLAF']['CircSolvMaxIter'] = int_read(f.readline().split()[0]) - self.fst_vt['AeroDyn15']['OLAF']['PrescribedCircFile'] = f.readline().split()[0] f.readline() + self.fst_vt['AeroDynTower']['NTwrHt'] = int(f.readline().split()[0]) + self.fst_vt['AeroDynTower']['NTwrRe'] = int(f.readline().split()[0]) + self.fst_vt['AeroDynTower']['NTwrCD'] = int(f.readline().split()[0]) + self.fst_vt['AeroDynTower']['Tower_Wake_Constant'] = float_read(f.readline().split()[0]) + f.readline() f.readline() - self.fst_vt['AeroDyn15']['OLAF']['nNWPanel'] = int(f.readline().split()[0]) - self.fst_vt['AeroDyn15']['OLAF']['WakeLength'] = int(f.readline().split()[0]) - self.fst_vt['AeroDyn15']['OLAF']['FreeWakeLength'] = int_read(f.readline().split()[0]) - self.fst_vt['AeroDyn15']['OLAF']['FWShedVorticity'] = float_read(f.readline().split()[0]) + self.fst_vt['AeroDynTower']['TwrHtFr'] = [None]*self.fst_vt['AeroDynTower']['NTwrHt'] + self.fst_vt['AeroDynTower']['TwrWid'] = [None]*self.fst_vt['AeroDynTower']['NTwrHt'] + self.fst_vt['AeroDynTower']['NTwrCDCol'] = [None]*self.fst_vt['AeroDynTower']['NTwrHt'] + for i in range(self.fst_vt['AeroDynTower']['NTwrHt']): + data = [float(val) for val in f.readline().split()] + self.fst_vt['AeroDynTower']['TwrHtFr'][i] = data[0] + self.fst_vt['AeroDynTower']['TwrWid'][i] = data[1] + self.fst_vt['AeroDynTower']['NTwrCDCol'][i] = data[2] + f.readline() - self.fst_vt['AeroDyn15']['OLAF']['DiffusionMethod'] = int_read(f.readline().split()[0]) - self.fst_vt['AeroDyn15']['OLAF']['RegDeterMethod'] = int_read(f.readline().split()[0]) - self.fst_vt['AeroDyn15']['OLAF']['RegFunction'] = int_read(f.readline().split()[0]) - self.fst_vt['AeroDyn15']['OLAF']['WakeRegMethod'] = int_read(f.readline().split()[0]) - self.fst_vt['AeroDyn15']['OLAF']['WakeRegFactor'] = float(f.readline().split()[0]) - self.fst_vt['AeroDyn15']['OLAF']['WingRegFactor'] = float(f.readline().split()[0]) - self.fst_vt['AeroDyn15']['OLAF']['CoreSpreadEddyVisc'] = int(f.readline().split()[0]) f.readline() - self.fst_vt['AeroDyn15']['OLAF']['TwrShadowOnWake'] = bool_read(f.readline().split()[0]) - self.fst_vt['AeroDyn15']['OLAF']['ShearModel'] = int_read(f.readline().split()[0]) + self.fst_vt['AeroDynTower']['TwrRe'] = [None]*self.fst_vt['AeroDynTower']['NTwrRe'] + self.fst_vt['AeroDynTower']['TwrCD'] = np.zeros((self.fst_vt['AeroDynTower']['NTwrRe'], self.fst_vt['AeroDynTower']['NTwrCD'])) + for i in range(self.fst_vt['AeroDynTower']['NTwrRe']): + data = [float(val) for val in f.readline().split()] + self.fst_vt['AeroDynTower']['TwrRe'][i] = data[0] + self.fst_vt['AeroDynTower']['TwrCD'][i,:] = data[1:] + + f.close() + + def read_AeroDyn14Polar(self, aerodynFile): + # AeroDyn v14 Airfoil Polar Input File + + # open aerodyn file + f = open(aerodynFile, 'r') + + airfoil = copy.copy(self.fst_vt['AeroDynPolar']) + + # skip through header + airfoil['description'] = f.readline().rstrip() # remove newline f.readline() - self.fst_vt['AeroDyn15']['OLAF']['VelocityMethod'] = int_read(f.readline().split()[0]) - self.fst_vt['AeroDyn15']['OLAF']['TreeBranchFactor']= float_read(f.readline().split()[0]) - self.fst_vt['AeroDyn15']['OLAF']['PartPerSegment'] = int(f.readline().split()[0]) + airfoil['number_tables'] = int(f.readline().split()[0]) + + IDParam = [float_read(val) for val in f.readline().split()[0:airfoil['number_tables']]] + StallAngle = [float_read(val) for val in f.readline().split()[0:airfoil['number_tables']]] f.readline() f.readline() - self.fst_vt['AeroDyn15']['OLAF']['WrVTk'] = int(f.readline().split()[0]) - self.fst_vt['AeroDyn15']['OLAF']['nVTKBlades'] = int(f.readline().split()[0]) - self.fst_vt['AeroDyn15']['OLAF']['VTKCoord'] = int_read(f.readline().split()[0]) - self.fst_vt['AeroDyn15']['OLAF']['VTK_fps'] = float_read(f.readline().split()[0]) f.readline() + ZeroCn = [float_read(val) for val in f.readline().split()[0:airfoil['number_tables']]] + CnSlope = [float_read(val) for val in f.readline().split()[0:airfoil['number_tables']]] + CnPosStall = [float_read(val) for val in f.readline().split()[0:airfoil['number_tables']]] + CnNegStall = [float_read(val) for val in f.readline().split()[0:airfoil['number_tables']]] + alphaCdMin = [float_read(val) for val in f.readline().split()[0:airfoil['number_tables']]] + CdMin = [float_read(val) for val in f.readline().split()[0:airfoil['number_tables']]] + + data = [] + airfoil['af_tables'] = [] + while True: + line = f.readline() + if 'EOT' in line: + break + line = [float_read(s) for s in line.split()] + if len(line) < 1: + break + data.append(line) + + # loop through tables + for i in range(airfoil['number_tables']): + polar = {} + polar['IDParam'] = IDParam[i] + polar['StallAngle'] = StallAngle[i] + polar['ZeroCn'] = ZeroCn[i] + polar['CnSlope'] = CnSlope[i] + polar['CnPosStall'] = CnPosStall[i] + polar['CnNegStall'] = CnNegStall[i] + polar['alphaCdMin'] = alphaCdMin[i] + polar['CdMin'] = CdMin[i] + + alpha = [] + cl = [] + cd = [] + cm = [] + # read polar information line by line + for datai in data: + if len(datai) == airfoil['number_tables']*3+1: + alpha.append(datai[0]) + cl.append(datai[1 + 3*i]) + cd.append(datai[2 + 3*i]) + cm.append(datai[3 + 3*i]) + elif len(datai) == airfoil['number_tables']*2+1: + alpha.append(datai[0]) + cl.append(datai[1 + 2*i]) + cd.append(datai[2 + 2*i]) + + polar['alpha'] = alpha + polar['cl'] = cl + polar['cd'] = cd + polar['cm'] = cm + airfoil['af_tables'].append(polar) + f.close() + return airfoil def read_ServoDyn(self): # ServoDyn v1.05 Input File @@ -1424,13 +1360,13 @@ def read_ServoDyn(self): # Structural Control f.readline() self.fst_vt['ServoDyn']['NumBStC'] = int(f.readline().split()[0]) - self.fst_vt['ServoDyn']['BStCfiles'] = f.readline().split()[0][1:-1] + self.fst_vt['ServoDyn']['BStCfiles'] = read_array(f,self.fst_vt['ServoDyn']['NumBStC'],str) self.fst_vt['ServoDyn']['NumNStC'] = int(f.readline().split()[0]) - self.fst_vt['ServoDyn']['NStCfiles'] = f.readline().split()[0][1:-1] + self.fst_vt['ServoDyn']['NStCfiles'] = read_array(f,self.fst_vt['ServoDyn']['NumNStC'],str) self.fst_vt['ServoDyn']['NumTStC'] = int(f.readline().split()[0]) - self.fst_vt['ServoDyn']['TStCfiles'] = f.readline().split()[0][1:-1] + self.fst_vt['ServoDyn']['TStCfiles'] = read_array(f,self.fst_vt['ServoDyn']['NumTStC'],str) self.fst_vt['ServoDyn']['NumSStC'] = int(f.readline().split()[0]) - self.fst_vt['ServoDyn']['SStCfiles'] = f.readline().split()[0][1:-1] + self.fst_vt['ServoDyn']['SStCfiles'] = read_array(f,self.fst_vt['ServoDyn']['NumSStC'],str) # Initialize Struct Control trees self.fst_vt['BStC'] = [] * self.fst_vt['ServoDyn']['NumBStC'] @@ -1503,6 +1439,121 @@ def read_ServoDyn(self): f.close() + def read_StC(self,filename): + ''' + return StC vt so it can be appended to fst_vt['XStC'] list + ''' + StC_vt = {} + + with open(os.path.join(self.FAST_directory, filename)) as f: + + f.readline() + f.readline() + f.readline() + StC_vt['Echo'] = bool_read(f.readline().split()[0]) # Echo - Echo input data to .ech (flag) + f.readline() # StC DEGREES OF FREEDOM + StC_vt['StC_DOF_MODE'] = int_read(f.readline().split()[0]) # 4 StC_DOF_MODE - DOF mode (switch) {0: No StC or TLCD DOF; 1: StC_X_DOF, StC_Y_DOF, and/or StC_Z_DOF (three independent StC DOFs); 2: StC_XY_DOF (Omni-Directional StC); 3: TLCD; 4: Prescribed force/moment time series} + StC_vt['StC_X_DOF'] = bool_read(f.readline().split()[0]) # false StC_X_DOF - DOF on or off for StC X (flag) [Used only when StC_DOF_MODE=1] + StC_vt['StC_Y_DOF'] = bool_read(f.readline().split()[0]) # false StC_Y_DOF - DOF on or off for StC Y (flag) [Used only when StC_DOF_MODE=1] + StC_vt['StC_Z_DOF'] = bool_read(f.readline().split()[0]) # false StC_Z_DOF - DOF on or off for StC Z (flag) [Used only when StC_DOF_MODE=1] + f.readline() # StC LOCATION + StC_vt['StC_P_X'] = float_read(f.readline().split()[0]) # -51.75 StC_P_X - At rest X position of StC (m) + StC_vt['StC_P_Y'] = float_read(f.readline().split()[0]) # 0 StC_P_Y - At rest Y position of StC (m) + StC_vt['StC_P_Z'] = float_read(f.readline().split()[0]) # -10 StC_P_Z - At rest Z position of StC (m) + f.readline() # StC INITIAL CONDITIONS + StC_vt['StC_X_DSP'] = float_read(f.readline().split()[0]) # 0 StC_X_DSP - StC X initial displacement (m) [relative to at rest position] + StC_vt['StC_Y_DSP'] = float_read(f.readline().split()[0]) # 0 StC_Y_DSP - StC Y initial displacement (m) [relative to at rest position] + StC_vt['StC_Z_DSP'] = float_read(f.readline().split()[0]) # 0 StC_Z_DSP - StC Z initial displacement (m) [relative to at rest position; used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] + StC_vt['StC_Z_PreLd'] = f.readline().split()[0] # "none" StC_Z_PreLd - StC Z prefloat_read(f.readline().split()[0]) #-load (N) {"gravity" to offset for gravity load; "none" or 0 to turn off} [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] + f.readline() # StC CONFIGURATION + StC_vt['StC_X_NSP'] = float_read(f.readline().split()[0]) # 0 StC_X_NSP - Negative stop position (minimum X mass displacement) (m) + StC_vt['StC_X_PSP'] = float_read(f.readline().split()[0]) # 0 StC_X_PSP - Positive stop position (maximum X mass displacement) (m) + StC_vt['StC_Y_PSP'] = float_read(f.readline().split()[0]) # 0 StC_Y_PSP - Positive stop position (maximum Y mass displacement) (m) + StC_vt['StC_Y_NSP'] = float_read(f.readline().split()[0]) # 0 StC_Y_NSP - Negative stop position (minimum Y mass displacement) (m) + StC_vt['StC_Z_PSP'] = float_read(f.readline().split()[0]) # 0 StC_Z_PSP - Positive stop position (maximum Z mass displacement) (m) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] + StC_vt['StC_Z_NSP'] = float_read(f.readline().split()[0]) # 0 StC_Z_NSP - Negative stop position (minimum Z mass displacement) (m) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] + f.readline() # StC MASS, STIFFNESS, & DAMPING + StC_vt['StC_X_M'] = float_read(f.readline().split()[0]) # 0 StC_X_M - StC X mass (kg) [must equal StC_Y_M for StC_DOF_MODE = 2] + StC_vt['StC_Y_M'] = float_read(f.readline().split()[0]) # 50 StC_Y_M - StC Y mass (kg) [must equal StC_X_M for StC_DOF_MODE = 2] + StC_vt['StC_Z_M'] = float_read(f.readline().split()[0]) # 0 StC_Z_M - StC Z mass (kg) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] + StC_vt['StC_XY_M'] = float_read(f.readline().split()[0]) # 0 StC_XY_M - StC XY mass (kg) [used only when StC_DOF_MODE=2] + StC_vt['StC_X_K'] = float_read(f.readline().split()[0]) # 2300 StC_X_K - StC X stiffness (N/m) + StC_vt['StC_Y_K'] = float_read(f.readline().split()[0]) # 2300 StC_Y_K - StC Y stiffness (N/m) + StC_vt['StC_Z_K'] = float_read(f.readline().split()[0]) # 0 StC_Z_K - StC Z stiffness (N/m) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] + StC_vt['StC_X_C'] = float_read(f.readline().split()[0]) # 35 StC_X_C - StC X damping (N/(m/s)) + StC_vt['StC_Y_C'] = float_read(f.readline().split()[0]) #float_read(f.readline().split()[0]) # 35 StC_Y_C - StC Y damping (N/(m/s)) + StC_vt['StC_Z_C'] = float_read(f.readline().split()[0]) # 0 StC_Z_C - StC Z damping (N/(m/s)) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] + StC_vt['StC_X_KS'] = float_read(f.readline().split()[0]) # 0 StC_X_KS - Stop spring X stiffness (N/m) + StC_vt['StC_Y_KS'] = float_read(f.readline().split()[0]) # 0 StC_Y_KS - Stop spring Y stiffness (N/m) + StC_vt['StC_Z_KS'] = float_read(f.readline().split()[0]) # 0 StC_Z_KS - Stop spring Z stiffness (N/m) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] + StC_vt['StC_X_CS'] = float_read(f.readline().split()[0]) # 0 StC_X_CS - Stop spring X damping (N/(m/s)) + StC_vt['StC_Y_CS'] = float_read(f.readline().split()[0]) # 0 StC_Y_CS - Stop spring Y damping (N/(m/s)) + StC_vt['StC_Z_CS'] = float_read(f.readline().split()[0]) # 0 StC_Z_CS - Stop spring Z damping (N/(m/s)) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] + f.readline() # StC USER-DEFINED SPRING FORCES + StC_vt['Use_F_TBL'] = bool_read(f.readline().split()[0]) # False Use_F_TBL - Use spring force from user-defined table (flag) + StC_vt['NKInpSt'] = int_read(f.readline().split()[0]) # 17 NKInpSt - Number of spring force input stations + + StC_vt['SpringForceTable'] = {} + table = StC_vt['SpringForceTable'] + table['X'] = [None] * StC_vt['NKInpSt'] + table['F_X'] = [None] * StC_vt['NKInpSt'] + table['Y'] = [None] * StC_vt['NKInpSt'] + table['F_Y'] = [None] * StC_vt['NKInpSt'] + table['Z'] = [None] * StC_vt['NKInpSt'] + table['F_Z'] = [None] * StC_vt['NKInpSt'] + + f.readline() + # if StC_vt['Use_F_TBL']: + f.readline() + f.readline() + for i in range(StC_vt['NKInpSt']): + ln = f.readline().split() + table['X'][i] = float(ln[0]) + table['F_X'][i] = float(ln[1]) + table['Y'][i] = float(ln[2]) + table['F_Y'][i] = float(ln[3]) + table['Z'][i] = float(ln[4]) + table['F_Z'][i] = float(ln[5]) + # else: + # # Skip until next section + # data_line = f.readline().strip().split() + # while data_line[0][:3] != '---': + # data_line = f.readline().strip().split() + + # StructCtrl CONTROL, skip this readline() because it already happened + f.readline() + StC_vt['StC_CMODE'] = int_read(f.readline().split()[0]) # 5 StC_CMODE - Control mode (switch) {0:none; 1: Semi-Active Control Mode; 4: Active Control Mode through Simulink (not available); 5: Active Control Mode through Bladed interface} + StC_vt['StC_CChan'] = int_read(f.readline().split()[0]) # 0 StC_CChan - Control channel group (1:10) for stiffness and damping (StC_[XYZ]_K, StC_[XYZ]_C, and StC_[XYZ]_Brake) (specify additional channels for blade instances of StC active control -- one channel per blade) [used only when StC_DOF_MODE=1 or 2, and StC_CMODE=4 or 5] + StC_vt['StC_SA_MODE'] = int_read(f.readline().split()[0]) # 1 StC_SA_MODE - Semi-Active control mode {1: velocity-based ground hook control; 2: Inverse velocity-based ground hook control; 3: displacement-based ground hook control 4: Phase difference Algorithm with Friction Force 5: Phase difference Algorithm with Damping Force} (-) + StC_vt['StC_X_C_LOW'] = float_read(f.readline().split()[0]) # 0 StC_X_C_LOW - StC X low damping for ground hook control + StC_vt['StC_X_C_HIGH'] = float_read(f.readline().split()[0]) # 0 StC_X_C_HIGH - StC X high damping for ground hook control + StC_vt['StC_Y_C_HIGH'] = float_read(f.readline().split()[0]) # 0 StC_Y_C_HIGH - StC Y high damping for ground hook control + StC_vt['StC_Y_C_LOW'] = float_read(f.readline().split()[0]) # 0 StC_Y_C_LOW - StC Y low damping for ground hook control + StC_vt['StC_Z_C_HIGH'] = float_read(f.readline().split()[0]) # 0 StC_Z_C_HIGH - StC Z high damping for ground hook control [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] + StC_vt['StC_Z_C_LOW'] = float_read(f.readline().split()[0]) # 0 StC_Z_C_LOW - StC Z low damping for ground hook control [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] + StC_vt['StC_X_C_BRAKE'] = float_read(f.readline().split()[0]) # 0 StC_X_C_BRAKE - StC X high damping for braking the StC (Don't use it now. should be zero) + StC_vt['StC_Y_C_BRAKE'] = float_read(f.readline().split()[0]) # 0 StC_Y_C_BRAKE - StC Y high damping for braking the StC (Don't use it now. should be zero) + StC_vt['StC_Z_C_BRAKE'] = float_read(f.readline().split()[0]) # 0 StC_Z_C_BRAKE - StC Z high damping for braking the StC (Don't use it now. should be zero) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] + f.readline() # TLCD + StC_vt['L_X'] = float_read(f.readline().split()[0]) # 7.9325 L_X - X TLCD total length (m) + StC_vt['B_X'] = float_read(f.readline().split()[0]) # 6.5929 B_X - X TLCD horizontal length (m) + StC_vt['area_X'] = float_read(f.readline().split()[0]) # 2.0217 area_X - X TLCD cross-sectional area of vertical column (m^2) + StC_vt['area_ratio_X'] = float_read(f.readline().split()[0]) # 0.913 area_ratio_X - X TLCD cross-sectional area ratio (vertical column area divided by horizontal column area) (-) + StC_vt['headLossCoeff_X'] = float_read(f.readline().split()[0]) # 2.5265 headLossCoeff_X - X TLCD head loss coeff (-) + StC_vt['rho_X'] = float_read(f.readline().split()[0]) # 1000 rho_X - X TLCD liquid density (kg/m^3) + StC_vt['L_Y'] = float_read(f.readline().split()[0]) # 3.5767 L_Y - Y TLCD total length (m) + StC_vt['B_Y'] = float_read(f.readline().split()[0]) # 2.1788 B_Y - Y TLCD horizontal length (m) + StC_vt['area_Y'] = float_read(f.readline().split()[0]) # 1.2252 area_Y - Y TLCD cross-sectional area of vertical column (m^2) + StC_vt['area_ratio_Y'] = float_read(f.readline().split()[0]) # 2.7232 area_ratio_Y - Y TLCD cross-sectional area ratio (vertical column area divided by horizontal column area) (-) + StC_vt['headLossCoeff_Y'] = float_read(f.readline().split()[0]) # 0.6433 headLossCoeff_Y - Y TLCD head loss coeff (-) + StC_vt['rho_Y'] = float_read(f.readline().split()[0]) # 1000 rho_Y - Y TLCD liquid density (kg/m^3) + f.readline() # PRESCRIBED TIME SERIES + StC_vt['PrescribedForcesCoord'] = int_read(f.readline().split()[0]) # 2 PrescribedForcesCoord- Prescribed forces are in global or local coordinates (switch) {1: global; 2: local} + StC_vt['PrescribedForcesFile'] = f.readline().split()[0] # "Bld-TimeForceSeries.dat" PrescribedForcesFile - Time series force and moment (7 columns of time, FX, FY, FZ, MX, MY, MZ) + f.readline() + + return StC_vt + def read_DISCON_in(self): # Read the Bladed style Interface controller input file, intended for ROSCO https://github.com/NREL/ROSCO_toolbox @@ -1542,10 +1593,8 @@ def read_DISCON_in(self): else: del self.fst_vt['DISCON_in'] - def read_HydroDyn(self): - # AeroDyn v2.03 + def read_HydroDyn(self, hd_file): - hd_file = os.path.normpath(os.path.join(self.FAST_directory, self.fst_vt['Fst']['HydroFile'])) f = open(hd_file) f.readline() @@ -1906,10 +1955,8 @@ def read_HydroDyn(self): f.close() - def read_SubDyn(self): - # SubDyn v1.01 + def read_SubDyn(self, sd_file): - sd_file = os.path.normpath(os.path.join(self.FAST_directory, self.fst_vt['Fst']['SubFile'])) f = open(sd_file) f.readline() f.readline() @@ -1928,7 +1975,7 @@ def read_SubDyn(self): self.fst_vt['SubDyn']['Nmodes'] = int_read(f.readline().split()[0]) self.fst_vt['SubDyn']['JDampings'] = int_read(f.readline().split()[0]) self.fst_vt['SubDyn']['GuyanDampMod'] = int_read(f.readline().split()[0]) - self.fst_vt['SubDyn']['RayleighDamp'] = [float(m) for m in f.readline().strip().replace(',','').split()[:2]] + self.fst_vt['SubDyn']['RayleighDamp'] = [float(m.replace(',','')) for m in f.readline().split()[:2]] self.fst_vt['SubDyn']['GuyanDampSize'] = int_read(f.readline().split()[0]) self.fst_vt['SubDyn']['GuyanDamp'] = np.array([[float(idx) for idx in f.readline().strip().split()[:6]] for i in range(self.fst_vt['SubDyn']['GuyanDampSize'])]) f.readline() @@ -2062,12 +2109,13 @@ def read_SubDyn(self): self.fst_vt['SubDyn']['YoungE2'][i] = float(ln[1]) self.fst_vt['SubDyn']['ShearG2'][i] = float(ln[2]) self.fst_vt['SubDyn']['MatDens2'][i] = float(ln[3]) - self.fst_vt['SubDyn']['XsecA'][i] = float(ln[4]) - self.fst_vt['SubDyn']['XsecAsx'][i] = float(ln[5]) - self.fst_vt['SubDyn']['XsecAsy'][i] = float(ln[6]) - self.fst_vt['SubDyn']['XsecJxx'][i] = float(ln[7]) - self.fst_vt['SubDyn']['XsecJyy'][i] = float(ln[8]) - self.fst_vt['SubDyn']['XsecJ0'][i] = float(ln[9]) + self.fst_vt['SubDyn']['XsecA'][i] = float(ln[4]) + self.fst_vt['SubDyn']['XsecAsx'][i] = float(ln[5]) + self.fst_vt['SubDyn']['XsecAsy'][i] = float(ln[6]) + self.fst_vt['SubDyn']['XsecJxx'][i] = float(ln[7]) + self.fst_vt['SubDyn']['XsecJyy'][i] = float(ln[8]) + self.fst_vt['SubDyn']['XsecJ0'][i] = float(ln[9]) + # CABLE PROPERTIES f.readline() self.fst_vt['SubDyn']['NCablePropSets'] = int_read(f.readline().split()[0]) self.fst_vt['SubDyn']['CablePropSetID'] = [None]*self.fst_vt['SubDyn']['NCablePropSets'] @@ -2185,14 +2233,12 @@ def read_SubDyn(self): f.close() - def read_MAP(self): + def read_MAP(self, map_file): # MAP++ # TODO: this is likely not robust enough, only tested on the Hywind Spar # additional lines in these tables are likely - map_file = os.path.normpath(os.path.join(self.FAST_directory, self.fst_vt['Fst']['MooringFile'])) - f = open(map_file) f.readline() f.readline() @@ -2236,11 +2282,9 @@ def read_MAP(self): f.readline() f.readline() self.fst_vt['MAP']['Option'] = [str(val) for val in f.readline().strip().split()] + f.close() - - def read_MoorDyn(self): - - moordyn_file = os.path.normpath(os.path.join(self.FAST_directory, self.fst_vt['Fst']['MooringFile'])) + def read_MoorDyn(self, moordyn_file): f = open(moordyn_file) @@ -2249,7 +2293,6 @@ def read_MoorDyn(self): f.readline() self.fst_vt['MoorDyn']['Echo'] = bool_read(f.readline().split()[0]) f.readline() - self.fst_vt['MoorDyn']['NTypes'] = int_read(f.readline().split()[0]) f.readline() f.readline() self.fst_vt['MoorDyn']['Name'] = [] @@ -2257,77 +2300,90 @@ def read_MoorDyn(self): self.fst_vt['MoorDyn']['MassDen'] = [] self.fst_vt['MoorDyn']['EA'] = [] self.fst_vt['MoorDyn']['BA_zeta'] = [] - self.fst_vt['MoorDyn']['Can'] = [] - self.fst_vt['MoorDyn']['Cat'] = [] - self.fst_vt['MoorDyn']['Cdn'] = [] - self.fst_vt['MoorDyn']['Cdt'] = [] - for i in range(self.fst_vt['MoorDyn']['NTypes']): - data_line = f.readline().strip().split() + self.fst_vt['MoorDyn']['EI'] = [] + self.fst_vt['MoorDyn']['Cd'] = [] + self.fst_vt['MoorDyn']['Ca'] = [] + self.fst_vt['MoorDyn']['CdAx'] = [] + self.fst_vt['MoorDyn']['CaAx'] = [] + data_line = f.readline().strip().split() + while data_line[0][:3] != '---': # OpenFAST searches for ---, so we'll do the same self.fst_vt['MoorDyn']['Name'].append(str(data_line[0])) self.fst_vt['MoorDyn']['Diam'].append(float(data_line[1])) self.fst_vt['MoorDyn']['MassDen'].append(float(data_line[2])) self.fst_vt['MoorDyn']['EA'].append(float(data_line[3])) self.fst_vt['MoorDyn']['BA_zeta'].append(float(data_line[4])) - self.fst_vt['MoorDyn']['Can'].append(float(data_line[5])) - self.fst_vt['MoorDyn']['Cat'].append(float(data_line[6])) - self.fst_vt['MoorDyn']['Cdn'].append(float(data_line[7])) - self.fst_vt['MoorDyn']['Cdt'].append(float(data_line[8])) - f.readline() - self.fst_vt['MoorDyn']['NConnects'] = int_read(f.readline().split()[0]) + self.fst_vt['MoorDyn']['EI'].append(float(data_line[5])) + self.fst_vt['MoorDyn']['Cd'].append(float(data_line[6])) + self.fst_vt['MoorDyn']['Ca'].append(float(data_line[7])) + self.fst_vt['MoorDyn']['CdAx'].append(float(data_line[8])) + self.fst_vt['MoorDyn']['CaAx'].append(float(data_line[9])) + data_line = f.readline().strip().split() f.readline() f.readline() - self.fst_vt['MoorDyn']['Node'] = [] - self.fst_vt['MoorDyn']['Type'] = [] + self.fst_vt['MoorDyn']['Point_ID'] = [] + self.fst_vt['MoorDyn']['Attachment'] = [] self.fst_vt['MoorDyn']['X'] = [] self.fst_vt['MoorDyn']['Y'] = [] self.fst_vt['MoorDyn']['Z'] = [] self.fst_vt['MoorDyn']['M'] = [] self.fst_vt['MoorDyn']['V'] = [] - self.fst_vt['MoorDyn']['FX'] = [] - self.fst_vt['MoorDyn']['FY'] = [] - self.fst_vt['MoorDyn']['FZ'] = [] self.fst_vt['MoorDyn']['CdA'] = [] self.fst_vt['MoorDyn']['CA'] = [] - for i in range(self.fst_vt['MoorDyn']['NConnects']): - data_line = f.readline().strip().split() - self.fst_vt['MoorDyn']['Node'].append(int(data_line[0])) - self.fst_vt['MoorDyn']['Type'].append(str(data_line[1])) + data_line = f.readline().strip().split() + while data_line[0][:3] != '---': # OpenFAST searches for ---, so we'll do the same + self.fst_vt['MoorDyn']['Point_ID'].append(int(data_line[0])) + self.fst_vt['MoorDyn']['Attachment'].append(str(data_line[1])) self.fst_vt['MoorDyn']['X'].append(float(data_line[2])) self.fst_vt['MoorDyn']['Y'].append(float(data_line[3])) self.fst_vt['MoorDyn']['Z'].append(float(data_line[4])) self.fst_vt['MoorDyn']['M'].append(float(data_line[5])) self.fst_vt['MoorDyn']['V'].append(float(data_line[6])) - self.fst_vt['MoorDyn']['FX'].append(float(data_line[7])) - self.fst_vt['MoorDyn']['FY'].append(float(data_line[8])) - self.fst_vt['MoorDyn']['FZ'].append(float(data_line[9])) - self.fst_vt['MoorDyn']['CdA'].append(float(data_line[10])) - self.fst_vt['MoorDyn']['CA'].append(float(data_line[11])) - f.readline() - self.fst_vt['MoorDyn']['NLines'] = int_read(f.readline().split()[0]) - f.readline() - f.readline() - self.fst_vt['MoorDyn']['Line'] = [] - self.fst_vt['MoorDyn']['LineType'] = [] - self.fst_vt['MoorDyn']['UnstrLen'] = [] - self.fst_vt['MoorDyn']['NumSegs'] = [] - self.fst_vt['MoorDyn']['NodeAnch'] = [] - self.fst_vt['MoorDyn']['NodeFair'] = [] - self.fst_vt['MoorDyn']['Outputs'] = [] - self.fst_vt['MoorDyn']['CtrlChan'] = [] - for i in range(self.fst_vt['MoorDyn']['NLines']): + self.fst_vt['MoorDyn']['CdA'].append(float(data_line[7])) + self.fst_vt['MoorDyn']['CA'].append(float(data_line[8])) data_line = f.readline().strip().split() - self.fst_vt['MoorDyn']['Line'].append(int(data_line[0])) + f.readline() + f.readline() + self.fst_vt['MoorDyn']['Line_ID'] = [] + self.fst_vt['MoorDyn']['LineType'] = [] + self.fst_vt['MoorDyn']['AttachA'] = [] + self.fst_vt['MoorDyn']['AttachB'] = [] + self.fst_vt['MoorDyn']['UnstrLen'] = [] + self.fst_vt['MoorDyn']['NumSegs'] = [] + self.fst_vt['MoorDyn']['Outputs'] = [] + data_line = f.readline().strip().split() + while data_line[0][:3] != '---': # OpenFAST searches for ---, so we'll do the same + self.fst_vt['MoorDyn']['Line_ID'].append(int(data_line[0])) self.fst_vt['MoorDyn']['LineType'].append(str(data_line[1])) - self.fst_vt['MoorDyn']['UnstrLen'].append(float(data_line[2])) - self.fst_vt['MoorDyn']['NumSegs'].append(int(data_line[3])) - self.fst_vt['MoorDyn']['NodeAnch'].append(int(data_line[4])) - self.fst_vt['MoorDyn']['NodeFair'].append(int(data_line[5])) + self.fst_vt['MoorDyn']['AttachA'].append(int(data_line[2])) + self.fst_vt['MoorDyn']['AttachB'].append(int(data_line[3])) + self.fst_vt['MoorDyn']['UnstrLen'].append(float(data_line[4])) + self.fst_vt['MoorDyn']['NumSegs'].append(int(data_line[5])) self.fst_vt['MoorDyn']['Outputs'].append(str(data_line[6])) - if len(data_line) > 7: - self.fst_vt['MoorDyn']['CtrlChan'].append(int(data_line[7])) - else: - self.fst_vt['MoorDyn']['CtrlChan'].append(0) - f.readline() + data_line = f.readline().strip().split() + + # read optional control inputs, there are other optional MoorDyn sections/inputs + self.fst_vt['MoorDyn']['ChannelID'] = [] + self.fst_vt['MoorDyn']['Lines_Control'] = [] + if 'CONTROL' in [dl.upper() for dl in data_line]: + f.readline() + f.readline() + data_line = f.readline().strip().split() + while data_line[0][:3] != '---': # OpenFAST searches for ---, so we'll do the same + self.fst_vt['MoorDyn']['ChannelID'].append(int(data_line[0])) + # Line(s) is a list of mooring lines, spaces are allowed between commas + control_lines = [] + for lines in data_line[1:]: + for line in lines.split(','): + control_lines.append(line.strip(',')) + + # Spaces show up in control_lines as '', remove them all + while '' in control_lines: + control_lines.remove('') + + self.fst_vt['MoorDyn']['Lines_Control'].append(control_lines) + data_line = f.readline().strip().split() + + # Solver options, there are a few more optional MoorDyn inputs that can be added line 'CONTROL' self.fst_vt['MoorDyn']['dtM'] = float_read(f.readline().split()[0]) self.fst_vt['MoorDyn']['kbot'] = float_read(f.readline().split()[0]) self.fst_vt['MoorDyn']['cbot'] = float_read(f.readline().split()[0]) @@ -2343,318 +2399,66 @@ def read_MoorDyn(self): channel_list = channels.split(',') self.set_outlist(self.fst_vt['outlist']['MoorDyn'], channel_list) data = f.readline() - f.close() + f.close() -class InputReader_FAST7(InputReader_Common): - """ FASTv7.02 input file reader """ - def execute(self): + self.read_MainInput() - self.read_AeroDyn_FAST7() - # if self.fst_vt['aerodyn']['wind_file_type'][1] == 'wnd': - # self.WndWindReader(self.fst_vt['aerodyn']['WindFile']) - # else: - # print 'Wind reader for file type .%s not implemented yet.' % self.fst_vt['aerodyn']['wind_file_type'][1] - self.read_ElastoDynBlade() - self.read_ElastoDynTower() - - def read_MainInput(self): - - fst_file = os.path.join(self.FAST_directory, self.FAST_InputFile) - f = open(fst_file) - - # FAST Inputs - f.readline() - f.readline() - self.fst_vt['description'] = f.readline().rstrip() - f.readline() - f.readline() - self.fst_vt['Fst7']['Echo'] = bool_read(f.readline().split()[0]) - self.fst_vt['Fst7']['ADAMSPrep'] = int(f.readline().split()[0]) - self.fst_vt['Fst7']['AnalMode'] = int(f.readline().split()[0]) - self.fst_vt['Fst7']['NumBl'] = int(f.readline().split()[0]) - self.fst_vt['Fst7']['TMax'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['DT'] = float_read(f.readline().split()[0]) - f.readline() - self.fst_vt['Fst7']['YCMode'] = int(f.readline().split()[0]) - self.fst_vt['Fst7']['TYCOn'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['PCMode'] = int(f.readline().split()[0]) - self.fst_vt['Fst7']['TPCOn'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['VSContrl'] = int(f.readline().split()[0]) - self.fst_vt['Fst7']['VS_RtGnSp'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['VS_RtTq'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['VS_Rgn2K'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['VS_SlPc'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['GenModel'] = int(f.readline().split()[0]) - self.fst_vt['Fst7']['GenTiStr'] = bool(f.readline().split()[0]) - self.fst_vt['Fst7']['GenTiStp'] = bool(f.readline().split()[0]) - self.fst_vt['Fst7']['SpdGenOn'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TimGenOn'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TimGenOf'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['HSSBrMode'] = int(f.readline().split()[0]) - self.fst_vt['Fst7']['THSSBrDp'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TiDynBrk'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TTpBrDp1'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TTpBrDp2'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TTpBrDp3'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TBDepISp1'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TBDepISp2'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TBDepISp3'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TYawManS'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TYawManE'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['NacYawF'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TPitManS1'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TPitManS2'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TPitManS3'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TPitManE1'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TPitManE2'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TPitManE3'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['BlPitch1'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['BlPitch2'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['BlPitch3'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['B1PitchF1'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['B1PitchF2'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['B1PitchF3'] = float_read(f.readline().split()[0]) - f.readline() - self.fst_vt['Fst7']['Gravity'] = float_read(f.readline().split()[0]) - f.readline() - self.fst_vt['Fst7']['FlapDOF1'] = bool_read(f.readline().split()[0]) - self.fst_vt['Fst7']['FlapDOF2'] = bool_read(f.readline().split()[0]) - self.fst_vt['Fst7']['EdgeDOF'] = bool_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TeetDOF'] = bool_read(f.readline().split()[0]) - self.fst_vt['Fst7']['DrTrDOF'] = bool_read(f.readline().split()[0]) - self.fst_vt['Fst7']['GenDOF'] = bool_read(f.readline().split()[0]) - self.fst_vt['Fst7']['YawDOF'] = bool_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TwFADOF1'] = bool_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TwFADOF2'] = bool_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TwSSDOF1'] = bool_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TwSSDOF2'] = bool_read(f.readline().split()[0]) - self.fst_vt['Fst7']['CompAero'] = bool_read(f.readline().split()[0]) - self.fst_vt['Fst7']['CompNoise'] = bool_read(f.readline().split()[0]) - f.readline() - self.fst_vt['Fst7']['OoPDefl'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['IPDefl'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TeetDefl'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['Azimuth'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['RotSpeed'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['NacYaw'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TTDspFA'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TTDspSS'] = float_read(f.readline().split()[0]) - f.readline() - self.fst_vt['Fst7']['TipRad'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['HubRad'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['PSpnElN'] = int(f.readline().split()[0]) - self.fst_vt['Fst7']['UndSling'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['HubCM'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['OverHang'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['NacCMxn'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['NacCMyn'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['NacCMzn'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TowerHt'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['Twr2Shft'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TwrRBHt'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['ShftTilt'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['Delta3'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['PreCone(1)'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['PreCone(2)'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['PreCone(3)'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['AzimB1Up'] = float_read(f.readline().split()[0]) - f.readline() - self.fst_vt['Fst7']['YawBrMass'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['NacMass'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['HubMass'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TipMass(1)'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TipMass(2)'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TipMass(3)'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['NacYIner'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['GenIner'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['HubIner'] = float_read(f.readline().split()[0]) - f.readline() - self.fst_vt['Fst7']['GBoxEff'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['GenEff'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['GBRatio'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['GBRevers'] = bool_read(f.readline().split()[0]) - self.fst_vt['Fst7']['HSSBrTqF'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['HSSBrDT'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['DynBrkFi'] = f.readline().split()[0] - self.fst_vt['Fst7']['DTTorSpr'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['DTTorDmp'] = float_read(f.readline().split()[0]) - f.readline() - self.fst_vt['Fst7']['SIG_SlPc'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['SIG_SySp'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['SIG_RtTq'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['SIG_PORt'] = float_read(f.readline().split()[0]) - f.readline() - self.fst_vt['Fst7']['TEC_Freq'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TEC_NPol'] = int(f.readline().split()[0]) - self.fst_vt['Fst7']['TEC_SRes'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TEC_RRes'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TEC_VLL'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TEC_SLR'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TEC_RLR'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TEC_MR'] = float_read(f.readline().split()[0]) - f.readline() - self.fst_vt['Fst7']['PtfmModel'] = int(f.readline().split()[0]) - self.fst_vt['Fst7']['PtfmFile'] = f.readline().split()[0][1:-1] - f.readline() - self.fst_vt['Fst7']['TwrNodes'] = int(f.readline().split()[0]) - self.fst_vt['Fst7']['TwrFile'] = f.readline().split()[0][1:-1] - f.readline() - self.fst_vt['Fst7']['YawSpr'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['YawDamp'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['YawNeut'] = float_read(f.readline().split()[0]) - f.readline() - self.fst_vt['Fst7']['Furling'] = bool_read(f.readline().split()[0]) - self.fst_vt['Fst7']['FurlFile'] = f.readline().split()[0] - f.readline() - self.fst_vt['Fst7']['TeetMod'] = int(f.readline().split()[0]) - self.fst_vt['Fst7']['TeetDmpP'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TeetDmp'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TeetCDmp'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TeetSStP'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TeetHStP'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TeetSSSp'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TeetHSSp'] = float_read(f.readline().split()[0]) - f.readline() - self.fst_vt['Fst7']['TBDrConN'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TBDrConD'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['TpBrDT'] = float_read(f.readline().split()[0]) - f.readline() - self.fst_vt['Fst7']['BldFile1'] = f.readline().split()[0][1:-1] # TODO - different blade files - self.fst_vt['Fst7']['BldFile2'] = f.readline().split()[0][1:-1] - self.fst_vt['Fst7']['BldFile3'] = f.readline().split()[0][1:-1] - f.readline() - self.fst_vt['Fst7']['ADFile'] = f.readline().split()[0][1:-1] - f.readline() - self.fst_vt['Fst7']['NoiseFile'] = f.readline().split()[0] - f.readline() - self.fst_vt['Fst7']['ADAMSFile'] = f.readline().split()[0] - f.readline() - self.fst_vt['Fst7']['LinFile'] = f.readline().split()[0] - f.readline() - self.fst_vt['Fst7']['SumPrint'] = bool_read(f.readline().split()[0]) - self.fst_vt['Fst7']['OutFileFmt'] = int(f.readline().split()[0]) - self.fst_vt['Fst7']['TabDelim'] = bool_read(f.readline().split()[0]) - - self.fst_vt['Fst7']['OutFmt'] = f.readline().split()[0] - self.fst_vt['Fst7']['TStart'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['DecFact'] = int(f.readline().split()[0]) - self.fst_vt['Fst7']['SttsTime'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['NcIMUxn'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['NcIMUyn'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['NcIMUzn'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['ShftGagL'] = float_read(f.readline().split()[0]) - self.fst_vt['Fst7']['NTwGages'] = int(f.readline().split()[0]) - twrg = f.readline().split(',') - if self.fst_vt['Fst7']['NTwGages'] != 0: #loop over elements if there are gauges to be added, otherwise assign directly - for i in range(self.fst_vt['Fst7']['NTwGages']): - self.fst_vt['Fst7']['TwrGagNd'].append(twrg[i]) - self.fst_vt['Fst7']['TwrGagNd'][-1] = self.fst_vt['Fst7']['TwrGagNd'][-1][0:2] - else: - self.fst_vt['Fst7']['TwrGagNd'] = twrg - self.fst_vt['Fst7']['TwrGagNd'][-1] = self.fst_vt['Fst7']['TwrGagNd'][-1][0:4] - self.fst_vt['Fst7']['NBlGages'] = int(f.readline().split()[0]) - blg = f.readline().split(',') - if self.fst_vt['Fst7']['NBlGages'] != 0: - for i in range(self.fst_vt['Fst7']['NBlGages']): - self.fst_vt['Fst7']['BldGagNd'].append(blg[i]) - self.fst_vt['Fst7']['BldGagNd'][-1] = self.fst_vt['Fst7']['BldGagNd'][-1][0:2] - else: - self.fst_vt['Fst7']['BldGagNd'] = blg - self.fst_vt['Fst7']['BldGagNd'][-1] = self.fst_vt['Fst7']['BldGagNd'][-1][0:4] - - # Outlist (TODO - detailed categorization) - f.readline() - data = f.readline() - while data.split()[0] != 'END': - channels = data.split('"') - channel_list = channels[1].split(',') - self.set_outlist(self.fst_vt['outlist7'], channel_list) - data = f.readline() - - def read_AeroDyn_FAST7(self): - - ad_file = os.path.join(self.FAST_directory, self.fst_vt['Fst7']['ADFile']) - f = open(ad_file) - - # skip lines and check if nondimensional - f.readline() - self.fst_vt['AeroDyn14']['SysUnits'] = f.readline().split()[0] - self.fst_vt['AeroDyn14']['StallMod'] = f.readline().split()[0] - self.fst_vt['AeroDyn14']['UseCm'] = f.readline().split()[0] - self.fst_vt['AeroDyn14']['InfModel'] = f.readline().split()[0] - self.fst_vt['AeroDyn14']['IndModel'] = f.readline().split()[0] - self.fst_vt['AeroDyn14']['AToler'] = float_read(f.readline().split()[0]) - self.fst_vt['AeroDyn14']['TLModel'] = f.readline().split()[0] - self.fst_vt['AeroDyn14']['HLModel'] = f.readline().split()[0] - self.fst_vt['AeroDyn14']['WindFile'] = os.path.normpath(os.path.join(os.path.split(ad_file)[0], f.readline().split()[0][1:-1])) - self.fst_vt['AeroDyn14']['wind_file_type'] = self.fst_vt['AeroDyn14']['WindFile'].split('.') - self.fst_vt['AeroDyn14']['HH'] = float_read(f.readline().split()[0]) - self.fst_vt['AeroDyn14']['TwrShad'] = float_read(f.readline().split()[0]) - self.fst_vt['AeroDyn14']['ShadHWid'] = float_read(f.readline().split()[0]) - self.fst_vt['AeroDyn14']['T_Shad_Refpt'] = float_read(f.readline().split()[0]) - self.fst_vt['AeroDyn14']['AirDens'] = float_read(f.readline().split()[0]) - self.fst_vt['AeroDyn14']['KinVisc'] = float_read(f.readline().split()[0]) - self.fst_vt['AeroDyn14']['DTAero'] = float_read(f.readline().split()[0]) - - self.fst_vt['AeroDyn14']['NumFoil'] = int(f.readline().split()[0]) - self.fst_vt['AeroDyn14']['FoilNm'] = [None] * self.fst_vt['AeroDyn14']['NumFoil'] - for i in range(self.fst_vt['AeroDyn14']['NumFoil']): - af_filename = f.readline().split()[0] - af_filename = fix_path(af_filename) - self.fst_vt['AeroDyn14']['FoilNm'][i] = af_filename[1:-1] - - self.fst_vt['AeroDynBlade']['BldNodes'] = int(f.readline().split()[0]) - f.readline() - self.fst_vt['AeroDynBlade']['RNodes'] = [None] * self.fst_vt['AeroDynBlade']['BldNodes'] - self.fst_vt['AeroDynBlade']['AeroTwst'] = [None] * self.fst_vt['AeroDynBlade']['BldNodes'] - self.fst_vt['AeroDynBlade']['DRNodes'] = [None] * self.fst_vt['AeroDynBlade']['BldNodes'] - self.fst_vt['AeroDynBlade']['Chord'] = [None] * self.fst_vt['AeroDynBlade']['BldNodes'] - self.fst_vt['AeroDynBlade']['NFoil'] = [None] * self.fst_vt['AeroDynBlade']['BldNodes'] - self.fst_vt['AeroDynBlade']['PrnElm'] = [None] * self.fst_vt['AeroDynBlade']['BldNodes'] - for i in range(self.fst_vt['AeroDynBlade']['BldNodes']): - data = f.readline().split() - self.fst_vt['AeroDynBlade']['RNodes'][i] = float_read(data[0]) - self.fst_vt['AeroDynBlade']['AeroTwst'][i] = float_read(data[1]) - self.fst_vt['AeroDynBlade']['DRNodes'][i] = float_read(data[2]) - self.fst_vt['AeroDynBlade']['Chord'][i] = float_read(data[3]) - self.fst_vt['AeroDynBlade']['NFoil'][i] = int(data[4]) - self.fst_vt['AeroDynBlade']['PrnElm'][i] = data[5] - - f.close() - - # create airfoil objects - self.fst_vt['AeroDynBlade']['af_data'] = [] - for i in range(self.fst_vt['AeroDyn14']['NumFoil']): - self.fst_vt['AeroDynBlade']['af_data'].append(self.read_AeroDyn14Polar(os.path.join(self.FAST_directory,self.fst_vt['AeroDyn14']['FoilNm'][i]))) - + ed_file = os.path.join(self.FAST_directory, self.fst_vt['Fst']['EDFile']) + self.read_ElastoDyn(ed_file) + if not os.path.isabs(self.fst_vt['ElastoDyn']['BldFile1']): + ed_blade_file = os.path.join(os.path.dirname(ed_file), self.fst_vt['ElastoDyn']['BldFile1']) + self.read_ElastoDynBlade(ed_blade_file) + if not os.path.isabs(self.fst_vt['ElastoDyn']['TwrFile']): + ed_tower_file = os.path.join(os.path.dirname(ed_file), self.fst_vt['ElastoDyn']['TwrFile']) + self.read_ElastoDynTower(ed_tower_file) + self.read_InflowWind() + # AeroDyn version selection + if self.fst_vt['Fst']['CompAero'] == 1: + self.read_AeroDyn14() + elif self.fst_vt['Fst']['CompAero'] == 2: + self.read_AeroDyn15() + + if self.fst_vt['Fst']['CompServo'] == 1: + self.read_ServoDyn() + # Read StC Files + for StC_file in self.fst_vt['ServoDyn']['BStCfiles']: + self.fst_vt['BStC'].append(self.read_StC(StC_file)) + for StC_file in self.fst_vt['ServoDyn']['NStCfiles']: + self.fst_vt['NStC'].append(self.read_StC(StC_file)) + for StC_file in self.fst_vt['ServoDyn']['TStCfiles']: + self.fst_vt['TStC'].append(self.read_StC(StC_file)) + for StC_file in self.fst_vt['ServoDyn']['SStCfiles']: + self.fst_vt['SStC'].append(self.read_StC(StC_file)) + if ROSCO: + self.read_DISCON_in() + hd_file = os.path.normpath(os.path.join(self.FAST_directory, self.fst_vt['Fst']['HydroFile'])) + if os.path.isfile(hd_file): + self.read_HydroDyn(hd_file) + sd_file = os.path.normpath(os.path.join(self.FAST_directory, self.fst_vt['Fst']['SubFile'])) + if os.path.isfile(sd_file): + self.read_SubDyn(sd_file) + if self.fst_vt['Fst']['CompMooring'] == 1: # only MAP++ implemented for mooring models + map_file = os.path.normpath(os.path.join(self.FAST_directory, self.fst_vt['Fst']['MooringFile'])) + if os.path.isfile(map_file): + self.read_MAP(map_file) + if self.fst_vt['Fst']['CompMooring'] == 3: # MoorDyn implimented + moordyn_file = os.path.normpath(os.path.join(self.FAST_directory, self.fst_vt['Fst']['MooringFile'])) + if os.path.isfile(moordyn_file): + self.read_MoorDyn(moordyn_file) + bd_file = os.path.normpath(os.path.join(self.FAST_directory, self.fst_vt['Fst']['BDBldFile(1)'])) + if os.path.isfile(bd_file): + self.read_BeamDyn(bd_file) if __name__=="__main__": - FAST_ver = 'OpenFAST' - read_yaml = False - - if read_yaml: - fast = InputReader_Common(FAST_ver=FAST_ver) - fast.FAST_yamlfile = 'temp/OpenFAST/test.yaml' - fast.read_yaml() - - else: - if FAST_ver.lower() == 'fast7': - fast = InputReader_FAST7(FAST_ver=FAST_ver) - fast.FAST_InputFile = 'Test16.fst' # FAST input file (ext=.fst) - fast.FAST_directory = 'C:/Users/egaertne/WT_Codes/models/FAST_v7.02.00d-bjj/CertTest/' # Path to fst directory files - - elif FAST_ver.lower() == 'fast8': - fast = InputReader_OpenFAST(FAST_ver=FAST_ver) - fast.FAST_InputFile = 'NREL5MW_onshore.fst' # FAST input file (ext=.fst) - fast.FAST_directory = 'C:/Users/egaertne/WT_Codes/models/FAST_v8.16.00a-bjj/ref/5mw_onshore/' # Path to fst directory files - - elif FAST_ver.lower() == 'openfast': - fast = InputReader_OpenFAST(FAST_ver=FAST_ver) - fast.FAST_InputFile = '5MW_OC3Spar_DLL_WTurb_WavesIrr.fst' # FAST input file (ext=.fst) - fast.FAST_directory = 'C:/Users/egaertne/WT_Codes/models/openfast-dev/r-test/glue-codes/openfast/5MW_OC3Spar_DLL_WTurb_WavesIrr' # Path to fst directory files - - fast.execute() + examples_dir = os.path.dirname( os.path.dirname( os.path.dirname( os.path.realpath(__file__) ) ) ) + os.sep + + fast = InputReader_OpenFAST() + fast.FAST_InputFile = 'IEA-15-240-RWT-UMaineSemi.fst' # FAST input file (ext=.fst) + fast.FAST_directory = os.path.join(examples_dir, 'examples', '01_aeroelasticse', + 'OpenFAST_models', 'IEA-15-240-RWT', + 'IEA-15-240-RWT-UMaineSemi') # Path to fst directory files + fast.execute() diff --git a/ROSCO/ROSCO_toolbox/ofTools/fast_io/FAST_vars_out.py b/ROSCO/ROSCO_toolbox/ofTools/fast_io/FAST_vars_out.py index 61ef8dcc1..358af810d 100644 --- a/ROSCO/ROSCO_toolbox/ofTools/fast_io/FAST_vars_out.py +++ b/ROSCO/ROSCO_toolbox/ofTools/fast_io/FAST_vars_out.py @@ -2543,17 +2543,17 @@ AeroDyn['RtVAvgyh'] = False # (m/s); Rotor-disk-averaged relative wind velocity (y-component); the hub coordinate system AeroDyn['RtVAvgzh'] = False # (m/s); Rotor-disk-averaged relative wind velocity (z-component); the hub coordinate system AeroDyn['RtSkew'] = False # (deg); Rotor inflow-skew angle; -AeroDyn['RtAeroFxh'] = False # (N); Total rotor aerodynamic load (force in x direction); the hub coordinate system -AeroDyn['RtAeroFyh'] = False # (N); Total rotor aerodynamic load (force in y direction); the hub coordinate system -AeroDyn['RtAeroFzh'] = False # (N); Total rotor aerodynamic load (force in z direction); the hub coordinate system -AeroDyn['RtAeroMxh'] = False # (N m); Total rotor aerodynamic load (moment in x direction); the hub coordinate system -AeroDyn['RtAeroMyh'] = False # (N m); Total rotor aerodynamic load (moment in y direction); the hub coordinate system -AeroDyn['RtAeroMzh'] = False # (N m); Total rotor aerodynamic load (moment in z direction); the hub coordinate system -AeroDyn['RtAeroPwr'] = False # (W); Rotor aerodynamic power; +AeroDyn['RtFldFxh'] = False # (N); Total rotor aerodynamic load (force in x direction); the hub coordinate system +AeroDyn['RtFldFyh'] = False # (N); Total rotor aerodynamic load (force in y direction); the hub coordinate system +AeroDyn['RtFldFzh'] = False # (N); Total rotor aerodynamic load (force in z direction); the hub coordinate system +AeroDyn['RtFldMxh'] = False # (N m); Total rotor aerodynamic load (moment in x direction); the hub coordinate system +AeroDyn['RtFldMyh'] = False # (N m); Total rotor aerodynamic load (moment in y direction); the hub coordinate system +AeroDyn['RtFldMzh'] = False # (N m); Total rotor aerodynamic load (moment in z direction); the hub coordinate system +AeroDyn['RtFldPwr'] = False # (W); Rotor aerodynamic power; AeroDyn['RtArea'] = False # (m^2); Rotor swept area; -AeroDyn['RtAeroCp'] = False # (-); Rotor aerodynamic power coefficient; -AeroDyn['RtAeroCq'] = False # (-); Rotor aerodynamic torque coefficient; -AeroDyn['RtAeroCt'] = False # (-); Rotor aerodynamic thrust coefficient; +AeroDyn['RtFldCp'] = False # (-); Rotor aerodynamic power coefficient; +AeroDyn['RtFldCq'] = False # (-); Rotor aerodynamic torque coefficient; +AeroDyn['RtFldCt'] = False # (-); Rotor aerodynamic thrust coefficient; """ InflowWind """ diff --git a/ROSCO/ROSCO_toolbox/ofTools/fast_io/FAST_wrapper.py b/ROSCO/ROSCO_toolbox/ofTools/fast_io/FAST_wrapper.py index 66e73ff69..cc8780f58 100644 --- a/ROSCO/ROSCO_toolbox/ofTools/fast_io/FAST_wrapper.py +++ b/ROSCO/ROSCO_toolbox/ofTools/fast_io/FAST_wrapper.py @@ -54,7 +54,7 @@ def execute(self): print('OpenFAST Failed: {}'.format(e)) failed = True run_idx = 2 - except: + except Exception as e: print('OpenFAST Failed: {}'.format(e)) failed = True run_idx = 2 diff --git a/ROSCO/ROSCO_toolbox/ofTools/fast_io/FAST_writer.py b/ROSCO/ROSCO_toolbox/ofTools/fast_io/FAST_writer.py index c3f45edf1..8dd91db38 100644 --- a/ROSCO/ROSCO_toolbox/ofTools/fast_io/FAST_writer.py +++ b/ROSCO/ROSCO_toolbox/ofTools/fast_io/FAST_writer.py @@ -4,7 +4,7 @@ import numpy as np from functools import reduce -from ROSCO_toolbox.ofTools.fast_io.FAST_reader import InputReader_Common, InputReader_OpenFAST, InputReader_FAST7 +from ROSCO_toolbox.ofTools.fast_io.FAST_reader import InputReader_OpenFAST from ROSCO_toolbox.ofTools.fast_io.FAST_vars import FstModel from ROSCO_toolbox.utilities import write_rotor_performance, write_DISCON @@ -38,32 +38,16 @@ def int_default_out(val): def get_dict(vartree, branch): return reduce(operator.getitem, branch, vartree) -class InputWriter_Common(object): - """ Methods for writing input files that are (relatively) unchanged across FAST versions.""" +class InputWriter_OpenFAST(object): + """ Methods to write OpenFAST input files.""" - def __init__(self, **kwargs): + def __init__(self): - self.FAST_ver = 'OPENFAST' self.FAST_namingOut = None #Master FAST file self.FAST_runDirectory = None #Output directory - self.fst_vt = FstModel + self.fst_vt = {} self.fst_update = {} - # Optional population class attributes from key word arguments - for (k, w) in kwargs.items(): - try: - setattr(self, k, w) - except: - pass - - super(InputWriter_Common, self).__init__() - - def write_yaml(self): - self.FAST_yamlfile = os.path.join(self.FAST_runDirectory, self.FAST_namingOut+'.yaml') - f = open(self.FAST_yamlfile, "w") - yaml.dump(self.fst_vt, f) - - def update(self, fst_update={}): """ Change fast variables based on the user supplied values """ if fst_update: @@ -102,160 +86,6 @@ def loop_dict(vartree, branch): # set fast variables to update values loop_dict(self.fst_update, []) - - def write_ElastoDynBlade(self): - - self.fst_vt['ElastoDyn']['BldFile1'] = self.FAST_namingOut + '_ElastoDyn_blade.dat' - self.fst_vt['ElastoDyn']['BldFile2'] = self.fst_vt['ElastoDyn']['BldFile1'] - self.fst_vt['ElastoDyn']['BldFile3'] = self.fst_vt['ElastoDyn']['BldFile1'] - blade_file = os.path.join(self.FAST_runDirectory,self.fst_vt['ElastoDyn']['BldFile1']) - f = open(blade_file, 'w') - - f.write('------- ELASTODYN V1.00.* INDIVIDUAL BLADE INPUT FILE --------------------------\n') - f.write('Generated with AeroElasticSE FAST driver\n') - f.write('---------------------- BLADE PARAMETERS ----------------------------------------\n') - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['NBlInpSt'], 'NBlInpSt', '- Number of blade input stations (-)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldFlDmp1'], 'BldFlDmp1', '- Blade flap mode #1 structural damping in percent of critical (%)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldFlDmp2'], 'BldFlDmp2', '- Blade flap mode #2 structural damping in percent of critical (%)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldEdDmp1'], 'BldEdDmp1', '- Blade edge mode #1 structural damping in percent of critical (%)\n')) - f.write('---------------------- BLADE ADJUSTMENT FACTORS --------------------------------\n') - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['FlStTunr1'], 'FlStTunr1', '- Blade flapwise modal stiffness tuner, 1st mode (-)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['FlStTunr2'], 'FlStTunr2', '- Blade flapwise modal stiffness tuner, 2nd mode (-)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['AdjBlMs'], 'AdjBlMs', '- Factor to adjust blade mass density (-)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['AdjFlSt'], 'AdjFlSt', '- Factor to adjust blade flap stiffness (-)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['AdjEdSt'], 'AdjEdSt', '- Factor to adjust blade edge stiffness (-)\n')) - f.write('---------------------- DISTRIBUTED BLADE PROPERTIES ----------------------------\n') - f.write(' BlFract PitchAxis StrcTwst BMassDen FlpStff EdgStff\n') - f.write(' (-) (-) (deg) (kg/m) (Nm^2) (Nm^2)\n') - BlFract = self.fst_vt['ElastoDynBlade']['BlFract'] - PitchAxis = self.fst_vt['ElastoDynBlade']['PitchAxis'] - StrcTwst = self.fst_vt['ElastoDynBlade']['StrcTwst'] - BMassDen = self.fst_vt['ElastoDynBlade']['BMassDen'] - FlpStff = self.fst_vt['ElastoDynBlade']['FlpStff'] - EdgStff = self.fst_vt['ElastoDynBlade']['EdgStff'] - for BlFracti, PitchAxisi, StrcTwsti, BMassDeni, FlpStffi, EdgStffi in zip(BlFract, PitchAxis, StrcTwst, BMassDen, FlpStff, EdgStff): - f.write('{: 2.15e} {: 2.15e} {: 2.15e} {: 2.15e} {: 2.15e} {: 2.15e}\n'.format(BlFracti, PitchAxisi, StrcTwsti, BMassDeni, FlpStffi, EdgStffi)) - f.write('---------------------- BLADE MODE SHAPES ---------------------------------------\n') - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldFl1Sh'][0], 'BldFl1Sh(2)', '- Flap mode 1, coeff of x^2\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldFl1Sh'][1], 'BldFl1Sh(3)', '- , coeff of x^3\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldFl1Sh'][2], 'BldFl1Sh(4)', '- , coeff of x^4\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldFl1Sh'][3], 'BldFl1Sh(5)', '- , coeff of x^5\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldFl1Sh'][4], 'BldFl1Sh(6)', '- , coeff of x^6\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldFl2Sh'][0], 'BldFl2Sh(2)', '- Flap mode 2, coeff of x^2\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldFl2Sh'][1], 'BldFl2Sh(3)', '- , coeff of x^3\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldFl2Sh'][2], 'BldFl2Sh(4)', '- , coeff of x^4\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldFl2Sh'][3], 'BldFl2Sh(5)', '- , coeff of x^5\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldFl2Sh'][4], 'BldFl2Sh(6)', '- , coeff of x^6\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldEdgSh'][0], 'BldEdgSh(2)', '- Edge mode 1, coeff of x^2\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldEdgSh'][1], 'BldEdgSh(3)', '- , coeff of x^3\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldEdgSh'][2], 'BldEdgSh(4)', '- , coeff of x^4\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldEdgSh'][3], 'BldEdgSh(5)', '- , coeff of x^5\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldEdgSh'][4], 'BldEdgSh(6)', '- , coeff of x^6\n')) - - f.close() - - - def write_ElastoDynTower(self): - - self.fst_vt['ElastoDyn']['TwrFile'] = self.FAST_namingOut + '_ElastoDyn_tower.dat' - tower_file = os.path.join(self.FAST_runDirectory,self.fst_vt['ElastoDyn']['TwrFile']) - f = open(tower_file, 'w') - - f.write('------- ELASTODYN V1.00.* TOWER INPUT FILE -------------------------------------\n') - f.write('Generated with AeroElasticSE FAST driver\n') - f.write('---------------------- TOWER PARAMETERS ----------------------------------------\n') - if self.FAST_ver.lower() == 'fast7': - f.write('---\n') - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['NTwInpSt'], 'NTwInpSt', '- Number of input stations to specify tower geometry\n')) - if self.FAST_ver.lower() == 'fast7': - f.write('{:}\n'.format(self.fst_vt['ElastoDynTower']['CalcTMode'])) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwrFADmp1'], 'TwrFADmp(1)', '- Tower 1st fore-aft mode structural damping ratio (%)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwrFADmp2'], 'TwrFADmp(2)', '- Tower 2nd fore-aft mode structural damping ratio (%)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwrSSDmp1'], 'TwrSSDmp(1)', '- Tower 1st side-to-side mode structural damping ratio (%)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwrSSDmp2'], 'TwrSSDmp(2)', '- Tower 2nd side-to-side mode structural damping ratio (%)\n')) - f.write('---------------------- TOWER ADJUSTMUNT FACTORS --------------------------------\n') - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['FAStTunr1'], 'FAStTunr(1)', '- Tower fore-aft modal stiffness tuner, 1st mode (-)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['FAStTunr2'], 'FAStTunr(2)', '- Tower fore-aft modal stiffness tuner, 2nd mode (-)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['SSStTunr1'], 'SSStTunr(1)', '- Tower side-to-side stiffness tuner, 1st mode (-)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['SSStTunr2'], 'SSStTunr(2)', '- Tower side-to-side stiffness tuner, 2nd mode (-)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['AdjTwMa'], 'AdjTwMa', '- Factor to adjust tower mass density (-)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['AdjFASt'], 'AdjFASt', '- Factor to adjust tower fore-aft stiffness (-)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['AdjSSSt'], 'AdjSSSt', '- Factor to adjust tower side-to-side stiffness (-)\n')) - f.write('---------------------- DISTRIBUTED TOWER PROPERTIES ----------------------------\n') - f.write(' HtFract TMassDen TwFAStif TwSSStif\n') - f.write(' (-) (kg/m) (Nm^2) (Nm^2)\n') - HtFract = self.fst_vt['ElastoDynTower']['HtFract'] - TMassDen = self.fst_vt['ElastoDynTower']['TMassDen'] - TwFAStif = self.fst_vt['ElastoDynTower']['TwFAStif'] - TwSSStif = self.fst_vt['ElastoDynTower']['TwSSStif'] - if self.FAST_ver.lower() == 'fast7': - gs = self.fst_vt['ElastoDynTower']['TwGJStif'] - es = self.fst_vt['ElastoDynTower']['TwEAStif'] - fi = self.fst_vt['ElastoDynTower']['TwFAIner'] - si = self.fst_vt['ElastoDynTower']['TwSSIner'] - fo = self.fst_vt['ElastoDynTower']['TwFAcgOf'] - so = self.fst_vt['ElastoDynTower']['TwSScgOf'] - for a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 in zip(HtFract, TMassDen, TwFAStif, TwSSStif, gs, es, fi, si, fo, so): - f.write('{:.9e}\t{:.9e}\t{:.9e}\t{:.9e}\t{:.9e}\t{:.9e}\t{:.9e}\t{:.9e}\t{:.9e}\t{:.9e}\n'.\ - format(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)) - else: - for HtFracti, TMassDeni, TwFAStifi, TwSSStifi in zip(HtFract, TMassDen, TwFAStif, TwSSStif): - f.write('{: 2.15e} {: 2.15e} {: 2.15e} {: 2.15e}\n'.format(HtFracti, TMassDeni, TwFAStifi, TwSSStifi)) - f.write('---------------------- TOWER FORE-AFT MODE SHAPES ------------------------------\n') - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwFAM1Sh'][0], 'TwFAM1Sh(2)', '- Mode 1, coefficient of x^2 term\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwFAM1Sh'][1], 'TwFAM1Sh(3)', '- , coefficient of x^3 term\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwFAM1Sh'][2], 'TwFAM1Sh(4)', '- , coefficient of x^4 term\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwFAM1Sh'][3], 'TwFAM1Sh(5)', '- , coefficient of x^5 term\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwFAM1Sh'][4], 'TwFAM1Sh(6)', '- , coefficient of x^6 term\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwFAM2Sh'][0], 'TwFAM2Sh(2)', '- Mode 2, coefficient of x^2 term\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwFAM2Sh'][1], 'TwFAM2Sh(3)', '- , coefficient of x^3 term\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwFAM2Sh'][2], 'TwFAM2Sh(4)', '- , coefficient of x^4 term\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwFAM2Sh'][3], 'TwFAM2Sh(5)', '- , coefficient of x^5 term\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwFAM2Sh'][4], 'TwFAM2Sh(6)', '- , coefficient of x^6 term\n')) - f.write('---------------------- TOWER SIDE-TO-SIDE MODE SHAPES --------------------------\n') - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwSSM1Sh'][0], 'TwSSM1Sh(2)', '- Mode 1, coefficient of x^2 term\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwSSM1Sh'][1], 'TwSSM1Sh(3)', '- , coefficient of x^3 term\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwSSM1Sh'][2], 'TwSSM1Sh(4)', '- , coefficient of x^4 term\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwSSM1Sh'][3], 'TwSSM1Sh(5)', '- , coefficient of x^5 term\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwSSM1Sh'][4], 'TwSSM1Sh(6)', '- , coefficient of x^6 term\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwSSM2Sh'][0], 'TwSSM2Sh(2)', '- Mode 2, coefficient of x^2 term\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwSSM2Sh'][1], 'TwSSM2Sh(3)', '- , coefficient of x^3 term\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwSSM2Sh'][2], 'TwSSM2Sh(4)', '- , coefficient of x^4 term\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwSSM2Sh'][3], 'TwSSM2Sh(5)', '- , coefficient of x^5 term\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwSSM2Sh'][4], 'TwSSM2Sh(6)', '- , coefficient of x^6 term\n')) - - f.close() - - def write_AeroDyn14Polar(self, filename, a_i): - # AeroDyn v14 Airfoil Polar Input File - - f = open(filename, 'w') - f.write('AeroDyn airfoil file, Aerodyn v14.04 formatting\n') - f.write('Generated with AeroElasticSE FAST driver\n') - - f.write('{:9d}\t{:}'.format(self.fst_vt['AeroDynBlade']['af_data'][a_i]['number_tables'], 'Number of airfoil tables in this file\n')) - for i in range(self.fst_vt['AeroDynBlade']['af_data'][a_i]['number_tables']): - param = self.fst_vt['AeroDynBlade']['af_data'][a_i]['af_tables'][i] - f.write('{:9g}\t{:}'.format(i, 'Table ID parameter\n')) - f.write('{: f}\t{:}'.format(param['StallAngle'], 'Stall angle (deg)\n')) - f.write('{: f}\t{:}'.format(0, 'No longer used, enter zero\n')) - f.write('{: f}\t{:}'.format(0, 'No longer used, enter zero\n')) - f.write('{: f}\t{:}'.format(0, 'No longer used, enter zero\n')) - f.write('{: f}\t{:}'.format(param['ZeroCn'], 'Angle of attack for zero Cn for linear Cn curve (deg)\n')) - f.write('{: f}\t{:}'.format(param['CnSlope'], 'Cn slope for zero lift for linear Cn curve (1/rad)\n')) - f.write('{: f}\t{:}'.format(param['CnPosStall'], 'Cn at stall value for positive angle of attack for linear Cn curve\n')) - f.write('{: f}\t{:}'.format(param['CnNegStall'], 'Cn at stall value for negative angle of attack for linear Cn curve\n')) - f.write('{: f}\t{:}'.format(param['alphaCdMin'], 'Angle of attack for minimum CD (deg)\n')) - f.write('{: f}\t{:}'.format(param['CdMin'], 'Minimum CD value\n')) - if param['cm']: - for a, cl, cd, cm in zip(param['alpha'], param['cl'], param['cd'], param['cm']): - f.write('{: 6e} {: 6e} {: 6e} {: 6e}\n'.format(a, cl, cd, cm)) - else: - for a, cl, cd in zip(param['alpha'], param['cl'], param['cd']): - f.write('{: 6e} {: 6e} {: 6e}\n'.format(a, cl, cd)) - - f.close() - def get_outlist(self, vartree_head, channel_list=[]): """ Loop through a list of output channel names, recursively find values set to True in the nested outlist dict """ @@ -312,9 +142,6 @@ def loop_dict(vartree, search_var, val, branch): var = var.replace(' ', '') loop_dict(self.fst_vt['outlist'], var, val, []) - -class InputWriter_OpenFAST(InputWriter_Common): - def execute(self): if not os.path.exists(self.FAST_runDirectory): @@ -330,9 +157,18 @@ def execute(self): elif self.fst_vt['Fst']['CompAero'] == 2: self.write_AeroDyn15() - if 'DISCON_in' in self.fst_vt and ROSCO: - self.write_DISCON_in() - self.write_ServoDyn() + if self.fst_vt['Fst']['CompServo'] == 1: + if 'DISCON_in' in self.fst_vt and ROSCO: + self.write_DISCON_in() + self.write_ServoDyn() + for i_NStC, NStC in enumerate(self.fst_vt['NStC']): + self.write_StC(NStC,self.fst_vt['ServoDyn']['NStCfiles'][i_NStC]) + for i_BStC, BStC in enumerate(self.fst_vt['BStC']): + self.write_StC(BStC,self.fst_vt['ServoDyn']['BStCfiles'][i_BStC]) + for i_TStC, TStC in enumerate(self.fst_vt['TStC']): + self.write_StC(TStC,self.fst_vt['ServoDyn']['TStCfiles'][i_TStC]) + for i_SStC, SStC in enumerate(self.fst_vt['SStC']): + self.write_StC(SStC,self.fst_vt['ServoDyn']['SStCfiles'][i_SStC]) if self.fst_vt['Fst']['CompHydro'] == 1: self.write_HydroDyn() @@ -348,7 +184,6 @@ def execute(self): self.write_MainInput() - def write_MainInput(self): # Main FAST v8.16-v8.17 Input File # Currently no differences between FASTv8.16 and OpenFAST. @@ -434,7 +269,6 @@ def write_MainInput(self): f.close() - def write_ElastoDyn(self): self.fst_vt['Fst']['EDFile'] = self.FAST_namingOut + '_ElastoDyn.dat' @@ -560,9 +394,9 @@ def write_ElastoDyn(self): f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDyn']['DecFact'], 'DecFact', '- Decimation factor for tabular output {1: output every time step} (-) (currently unused)\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDyn']['NTwGages'], 'NTwGages', '- Number of tower nodes that have strain gages for output [0 to 9] (-)\n')) if self.fst_vt['ElastoDyn']['TwrGagNd'] != 0: - f.write('{:<22} {:<11} {:}'.format(', '.join(self.fst_vt['ElastoDyn']['TwrGagNd']), 'TwrGagNd', '- List of tower nodes that have strain gages [1 to TwrNodes] (-) [unused if NTwGages=0]\n')) + f.write('{:<22} {:<11} {:}'.format(', '.join(['%d'%i for i in self.fst_vt['ElastoDyn']['TwrGagNd']]), 'TwrGagNd', '- List of tower nodes that have strain gages [1 to TwrNodes] (-) [unused if NTwGages=0]\n')) else: - f.write('{:<22} {:<11} {:}'.format(0, 'TwrGagNd', '- List of tower nodes that have strain gages [1 to TwrNodes] (-) [unused if NTwGages=0]\n')) + f.write('{:<22} {:<11} {:}'.format('', 'TwrGagNd', '- List of tower nodes that have strain gages [1 to TwrNodes] (-) [unused if NTwGages=0]\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDyn']['NBlGages'], 'NBlGages', '- Number of blade nodes that have strain gages for output [0 to 9] (-)\n')) if self.fst_vt['ElastoDyn']['BldGagNd'] != 0: f.write('{:<22} {:<11} {:}'.format(', '.join(['%d'%i for i in self.fst_vt['ElastoDyn']['BldGagNd']]), 'BldGagNd', '- List of blade nodes that have strain gages [1 to BldNodes] (-) [unused if NBlGages=0]\n')) @@ -580,6 +414,112 @@ def write_ElastoDyn(self): f.write('---------------------------------------------------------------------------------------\n') f.close() + def write_ElastoDynBlade(self): + + self.fst_vt['ElastoDyn']['BldFile1'] = self.FAST_namingOut + '_ElastoDyn_blade.dat' + self.fst_vt['ElastoDyn']['BldFile2'] = self.fst_vt['ElastoDyn']['BldFile1'] + self.fst_vt['ElastoDyn']['BldFile3'] = self.fst_vt['ElastoDyn']['BldFile1'] + blade_file = os.path.join(self.FAST_runDirectory,self.fst_vt['ElastoDyn']['BldFile1']) + f = open(blade_file, 'w') + + f.write('------- ELASTODYN V1.00.* INDIVIDUAL BLADE INPUT FILE --------------------------\n') + f.write('Generated with AeroElasticSE FAST driver\n') + f.write('---------------------- BLADE PARAMETERS ----------------------------------------\n') + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['NBlInpSt'], 'NBlInpSt', '- Number of blade input stations (-)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldFlDmp1'], 'BldFlDmp1', '- Blade flap mode #1 structural damping in percent of critical (%)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldFlDmp2'], 'BldFlDmp2', '- Blade flap mode #2 structural damping in percent of critical (%)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldEdDmp1'], 'BldEdDmp1', '- Blade edge mode #1 structural damping in percent of critical (%)\n')) + f.write('---------------------- BLADE ADJUSTMENT FACTORS --------------------------------\n') + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['FlStTunr1'], 'FlStTunr1', '- Blade flapwise modal stiffness tuner, 1st mode (-)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['FlStTunr2'], 'FlStTunr2', '- Blade flapwise modal stiffness tuner, 2nd mode (-)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['AdjBlMs'], 'AdjBlMs', '- Factor to adjust blade mass density (-)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['AdjFlSt'], 'AdjFlSt', '- Factor to adjust blade flap stiffness (-)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['AdjEdSt'], 'AdjEdSt', '- Factor to adjust blade edge stiffness (-)\n')) + f.write('---------------------- DISTRIBUTED BLADE PROPERTIES ----------------------------\n') + f.write(' BlFract PitchAxis StrcTwst BMassDen FlpStff EdgStff\n') + f.write(' (-) (-) (deg) (kg/m) (Nm^2) (Nm^2)\n') + BlFract = self.fst_vt['ElastoDynBlade']['BlFract'] + PitchAxis = self.fst_vt['ElastoDynBlade']['PitchAxis'] + StrcTwst = self.fst_vt['ElastoDynBlade']['StrcTwst'] + BMassDen = self.fst_vt['ElastoDynBlade']['BMassDen'] + FlpStff = self.fst_vt['ElastoDynBlade']['FlpStff'] + EdgStff = self.fst_vt['ElastoDynBlade']['EdgStff'] + for BlFracti, PitchAxisi, StrcTwsti, BMassDeni, FlpStffi, EdgStffi in zip(BlFract, PitchAxis, StrcTwst, BMassDen, FlpStff, EdgStff): + f.write('{: 2.15e} {: 2.15e} {: 2.15e} {: 2.15e} {: 2.15e} {: 2.15e}\n'.format(BlFracti, PitchAxisi, StrcTwsti, BMassDeni, FlpStffi, EdgStffi)) + f.write('---------------------- BLADE MODE SHAPES ---------------------------------------\n') + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldFl1Sh'][0], 'BldFl1Sh(2)', '- Flap mode 1, coeff of x^2\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldFl1Sh'][1], 'BldFl1Sh(3)', '- , coeff of x^3\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldFl1Sh'][2], 'BldFl1Sh(4)', '- , coeff of x^4\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldFl1Sh'][3], 'BldFl1Sh(5)', '- , coeff of x^5\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldFl1Sh'][4], 'BldFl1Sh(6)', '- , coeff of x^6\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldFl2Sh'][0], 'BldFl2Sh(2)', '- Flap mode 2, coeff of x^2\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldFl2Sh'][1], 'BldFl2Sh(3)', '- , coeff of x^3\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldFl2Sh'][2], 'BldFl2Sh(4)', '- , coeff of x^4\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldFl2Sh'][3], 'BldFl2Sh(5)', '- , coeff of x^5\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldFl2Sh'][4], 'BldFl2Sh(6)', '- , coeff of x^6\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldEdgSh'][0], 'BldEdgSh(2)', '- Edge mode 1, coeff of x^2\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldEdgSh'][1], 'BldEdgSh(3)', '- , coeff of x^3\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldEdgSh'][2], 'BldEdgSh(4)', '- , coeff of x^4\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldEdgSh'][3], 'BldEdgSh(5)', '- , coeff of x^5\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynBlade']['BldEdgSh'][4], 'BldEdgSh(6)', '- , coeff of x^6\n')) + + f.close() + + def write_ElastoDynTower(self): + + self.fst_vt['ElastoDyn']['TwrFile'] = self.FAST_namingOut + '_ElastoDyn_tower.dat' + tower_file = os.path.join(self.FAST_runDirectory,self.fst_vt['ElastoDyn']['TwrFile']) + f = open(tower_file, 'w') + + f.write('------- ELASTODYN V1.00.* TOWER INPUT FILE -------------------------------------\n') + f.write('Generated with AeroElasticSE FAST driver\n') + f.write('---------------------- TOWER PARAMETERS ----------------------------------------\n') + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['NTwInpSt'], 'NTwInpSt', '- Number of input stations to specify tower geometry\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwrFADmp1'], 'TwrFADmp(1)', '- Tower 1st fore-aft mode structural damping ratio (%)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwrFADmp2'], 'TwrFADmp(2)', '- Tower 2nd fore-aft mode structural damping ratio (%)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwrSSDmp1'], 'TwrSSDmp(1)', '- Tower 1st side-to-side mode structural damping ratio (%)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwrSSDmp2'], 'TwrSSDmp(2)', '- Tower 2nd side-to-side mode structural damping ratio (%)\n')) + f.write('---------------------- TOWER ADJUSTMUNT FACTORS --------------------------------\n') + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['FAStTunr1'], 'FAStTunr(1)', '- Tower fore-aft modal stiffness tuner, 1st mode (-)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['FAStTunr2'], 'FAStTunr(2)', '- Tower fore-aft modal stiffness tuner, 2nd mode (-)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['SSStTunr1'], 'SSStTunr(1)', '- Tower side-to-side stiffness tuner, 1st mode (-)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['SSStTunr2'], 'SSStTunr(2)', '- Tower side-to-side stiffness tuner, 2nd mode (-)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['AdjTwMa'], 'AdjTwMa', '- Factor to adjust tower mass density (-)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['AdjFASt'], 'AdjFASt', '- Factor to adjust tower fore-aft stiffness (-)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['AdjSSSt'], 'AdjSSSt', '- Factor to adjust tower side-to-side stiffness (-)\n')) + f.write('---------------------- DISTRIBUTED TOWER PROPERTIES ----------------------------\n') + f.write(' HtFract TMassDen TwFAStif TwSSStif\n') + f.write(' (-) (kg/m) (Nm^2) (Nm^2)\n') + HtFract = self.fst_vt['ElastoDynTower']['HtFract'] + TMassDen = self.fst_vt['ElastoDynTower']['TMassDen'] + TwFAStif = self.fst_vt['ElastoDynTower']['TwFAStif'] + TwSSStif = self.fst_vt['ElastoDynTower']['TwSSStif'] + for HtFracti, TMassDeni, TwFAStifi, TwSSStifi in zip(HtFract, TMassDen, TwFAStif, TwSSStif): + f.write('{: 2.15e} {: 2.15e} {: 2.15e} {: 2.15e}\n'.format(HtFracti, TMassDeni, TwFAStifi, TwSSStifi)) + f.write('---------------------- TOWER FORE-AFT MODE SHAPES ------------------------------\n') + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwFAM1Sh'][0], 'TwFAM1Sh(2)', '- Mode 1, coefficient of x^2 term\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwFAM1Sh'][1], 'TwFAM1Sh(3)', '- , coefficient of x^3 term\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwFAM1Sh'][2], 'TwFAM1Sh(4)', '- , coefficient of x^4 term\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwFAM1Sh'][3], 'TwFAM1Sh(5)', '- , coefficient of x^5 term\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwFAM1Sh'][4], 'TwFAM1Sh(6)', '- , coefficient of x^6 term\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwFAM2Sh'][0], 'TwFAM2Sh(2)', '- Mode 2, coefficient of x^2 term\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwFAM2Sh'][1], 'TwFAM2Sh(3)', '- , coefficient of x^3 term\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwFAM2Sh'][2], 'TwFAM2Sh(4)', '- , coefficient of x^4 term\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwFAM2Sh'][3], 'TwFAM2Sh(5)', '- , coefficient of x^5 term\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwFAM2Sh'][4], 'TwFAM2Sh(6)', '- , coefficient of x^6 term\n')) + f.write('---------------------- TOWER SIDE-TO-SIDE MODE SHAPES --------------------------\n') + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwSSM1Sh'][0], 'TwSSM1Sh(2)', '- Mode 1, coefficient of x^2 term\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwSSM1Sh'][1], 'TwSSM1Sh(3)', '- , coefficient of x^3 term\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwSSM1Sh'][2], 'TwSSM1Sh(4)', '- , coefficient of x^4 term\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwSSM1Sh'][3], 'TwSSM1Sh(5)', '- , coefficient of x^5 term\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwSSM1Sh'][4], 'TwSSM1Sh(6)', '- , coefficient of x^6 term\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwSSM2Sh'][0], 'TwSSM2Sh(2)', '- Mode 2, coefficient of x^2 term\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwSSM2Sh'][1], 'TwSSM2Sh(3)', '- , coefficient of x^3 term\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwSSM2Sh'][2], 'TwSSM2Sh(4)', '- , coefficient of x^4 term\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwSSM2Sh'][3], 'TwSSM2Sh(5)', '- , coefficient of x^5 term\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDynTower']['TwSSM2Sh'][4], 'TwSSM2Sh(6)', '- , coefficient of x^6 term\n')) + + f.close() def write_BeamDyn(self): self.fst_vt['Fst']['BDBldFile(1)'] = self.FAST_namingOut + '_BeamDyn.dat' @@ -660,8 +600,8 @@ def write_BeamDyn(self): def write_BeamDynBlade(self): # bd_blade_file = self.fst_vt['BeamDyn']['BldFile'] - bd_blade_file = os.path.abspath(os.path.join(self.FAST_runDirectory, self.FAST_namingOut + '_BeamDyn_Blade.dat')) - self.fst_vt['BeamDyn']['BldFile'] = bd_blade_file + self.fst_vt['BeamDyn']['BldFile'] = self.FAST_namingOut + '_BeamDyn_Blade.dat' + bd_blade_file = os.path.abspath(os.path.join(self.FAST_runDirectory, self.fst_vt['BeamDyn']['BldFile'])) f = open(bd_blade_file, 'w') f.write('------- BEAMDYN V1.00.* INDIVIDUAL BLADE INPUT FILE --------------------------\n') @@ -687,7 +627,6 @@ def write_BeamDynBlade(self): f.write('\n') - def write_InflowWind(self): self.fst_vt['Fst']['InflowFile'] = self.FAST_namingOut + '_InflowFile.dat' inflow_file = os.path.join(self.FAST_runDirectory,self.fst_vt['Fst']['InflowFile']) @@ -723,148 +662,39 @@ def write_InflowWind(self): f.write('{:<22} {:<11} {:}'.format('"'+self.fst_vt['InflowWind']['FileName_w']+'"', 'FileName_w', '- name of the file containing the w-component fluctuating wind (.bin)\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['nx'], 'nx', '- number of grids in the x direction (in the 3 files above) (-)\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['ny'], 'ny', '- number of grids in the y direction (in the 3 files above) (-)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['nz'], 'nz', '- number of grids in the z direction (in the 3 files above) (-)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['dx'], 'dx', '- distance (in meters) between points in the x direction (m)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['dy'], 'dy', '- distance (in meters) between points in the y direction (m)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['dz'], 'dz', '- distance (in meters) between points in the z direction (m)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['RefHt_Hawc'], 'RefHt_Hawc', '- reference height; the height (in meters) of the vertical center of the grid (m)\n')) - f.write('------------- Scaling parameters for turbulence ---------------------------------------------------------\n') - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['ScaleMethod'], 'ScaleMethod', '- Turbulence scaling method [0 = none, 1 = direct scaling, 2 = calculate scaling factor based on a desired standard deviation]\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['SFx'], 'SFx', '- Turbulence scaling factor for the x direction (-) [ScaleMethod=1]\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['SFy'], 'SFy', '- Turbulence scaling factor for the y direction (-) [ScaleMethod=1]\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['SFz'], 'SFz', '- Turbulence scaling factor for the z direction (-) [ScaleMethod=1]\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['SigmaFx'], 'SigmaFx', '- Turbulence standard deviation to calculate scaling from in x direction (m/s) [ScaleMethod=2]\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['SigmaFy'], 'SigmaFy', '- Turbulence standard deviation to calculate scaling from in y direction (m/s) [ScaleMethod=2]\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['SigmaFz'], 'SigmaFz', '- Turbulence standard deviation to calculate scaling from in z direction (m/s) [ScaleMethod=2]\n')) - f.write('------------- Mean wind profile parameters (added to HAWC-format files) ---------------------------------\n') - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['URef'], 'URef', '- Mean u-component wind speed at the reference height (m/s)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['WindProfile'], 'WindProfile', '- Wind profile type (0=constant;1=logarithmic,2=power law)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['PLExp_Hawc'], 'PLExp_Hawc', '- Power law exponent (-) (used for PL wind profile type only)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['Z0'], 'Z0', '- Surface roughness length (m) (used for LG wind profile type only)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['XOffset'], 'XOffset', '- Initial offset in +x direction (shift of wind box) (-)\n')) - f.write('====================== OUTPUT ==================================================\n') - f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['SumPrint'], 'SumPrint', '- Print summary data to .IfW.sum (flag)\n')) - f.write('OutList - The next line(s) contains a list of output parameters. See OutListParameters.xlsx for a listing of available output channels, (-)\n') - - outlist = self.get_outlist(self.fst_vt['outlist'], ['InflowWind']) - for channel_list in outlist: - for i in range(len(channel_list)): - f.write('"' + channel_list[i] + '"\n') - - f.write('END of input file (the word "END" must appear in the first 3 columns of this last OutList line)\n') - f.write('---------------------------------------------------------------------------------------\n') - - f.close() - - # def WndWindWriter(self, wndfile): - - # wind_file = os.path.join(self.FAST_runDirectory,wndfile) - # f = open(wind_file, 'w') - - # for i in range(self.fst_vt['wnd_wind']['TimeSteps']): - # f.write('{: 2.15e}\t{: 2.15e}\t{: 2.15e}\t{: 2.15e}\t{: 2.15e}\t{: 2.15e}\t{: 2.15e}\t{: 2.15e}\n'.format(\ - # self.fst_vt['wnd_wind']['Time'][i], self.fst_vt['wnd_wind']['HorSpd'][i], self.fst_vt['wnd_wind']['WindDir'][i],\ - # self.fst_vt['wnd_wind']['VerSpd'][i], self.fst_vt['wnd_wind']['HorShr'][i],\ - # self.fst_vt['wnd_wind']['VerShr'][i], self.fst_vt['wnd_wind']['LnVShr'][i], self.fst_vt['wnd_wind']['GstSpd'][i])) - - # f.close() - - - def write_AeroDyn14(self): - - # ======= Airfoil Files ======== - # make directory for airfoil files - if not os.path.isdir(os.path.join(self.FAST_runDirectory,'AeroData')): - try: - os.mkdir(os.path.join(self.FAST_runDirectory,'AeroData')) - except: - try: - time.sleep(random.random()) - if not os.path.isdir(os.path.join(self.FAST_runDirectory,'AeroData')): - os.mkdir(os.path.join(self.FAST_runDirectory,'AeroData')) - except: - print("Error tring to make '%s'!"%os.path.join(self.FAST_runDirectory,'AeroData')) - - # create write airfoil objects to files - for i in range(self.fst_vt['AeroDyn14']['NumFoil']): - af_name = os.path.join(self.FAST_runDirectory, 'AeroData', 'Airfoil' + str(i) + '.dat') - self.fst_vt['AeroDyn14']['FoilNm'][i] = os.path.join('AeroData', 'Airfoil' + str(i) + '.dat') - self.write_AeroDyn14Polar(af_name, i) - - self.fst_vt['Fst']['AeroFile'] = self.FAST_namingOut + '_AeroDyn14.dat' - ad_file = os.path.join(self.FAST_runDirectory,self.fst_vt['Fst']['AeroFile']) - f = open(ad_file,'w') - - # create Aerodyn Tower - self.write_AeroDyn14Tower() - - # ======= Aerodyn Input File ======== - f.write('AeroDyn v14.04.* INPUT FILE\n\n') - - # f.write('{:}\n'.format(self.fst_vt['aerodyn']['SysUnits'])) - f.write('{:}\n'.format(self.fst_vt['AeroDyn14']['StallMod'])) - - f.write('{:}\n'.format(self.fst_vt['AeroDyn14']['UseCm'])) - f.write('{:}\n'.format(self.fst_vt['AeroDyn14']['InfModel'])) - f.write('{:}\n'.format(self.fst_vt['AeroDyn14']['IndModel'])) - f.write('{: 2.15e}\n'.format(self.fst_vt['AeroDyn14']['AToler'])) - f.write('{:}\n'.format(self.fst_vt['AeroDyn14']['TLModel'])) - f.write('{:}\n'.format(self.fst_vt['AeroDyn14']['HLModel'])) - f.write('{:}\n'.format(self.fst_vt['AeroDyn14']['TwrShad'])) - - f.write('{:}\n'.format(self.fst_vt['AeroDyn14']['TwrPotent'])) - - f.write('{:}\n'.format(self.fst_vt['AeroDyn14']['TwrShadow'])) - f.write('{:}\n'.format(self.fst_vt['AeroDyn14']['TwrFile'])) - f.write('{:}\n'.format(self.fst_vt['AeroDyn14']['CalcTwrAero'])) - - f.write('{: 2.15e}\n'.format(self.fst_vt['AeroDyn14']['AirDens'])) - - f.write('{: 2.15e}\n'.format(self.fst_vt['AeroDyn14']['KinVisc'])) - - f.write('{:2}\n'.format(self.fst_vt['AeroDyn14']['DTAero'])) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['nz'], 'nz', '- number of grids in the z direction (in the 3 files above) (-)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['dx'], 'dx', '- distance (in meters) between points in the x direction (m)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['dy'], 'dy', '- distance (in meters) between points in the y direction (m)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['dz'], 'dz', '- distance (in meters) between points in the z direction (m)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['RefHt_Hawc'], 'RefHt_Hawc', '- reference height; the height (in meters) of the vertical center of the grid (m)\n')) + f.write('------------- Scaling parameters for turbulence ---------------------------------------------------------\n') + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['ScaleMethod'], 'ScaleMethod', '- Turbulence scaling method [0 = none, 1 = direct scaling, 2 = calculate scaling factor based on a desired standard deviation]\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['SFx'], 'SFx', '- Turbulence scaling factor for the x direction (-) [ScaleMethod=1]\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['SFy'], 'SFy', '- Turbulence scaling factor for the y direction (-) [ScaleMethod=1]\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['SFz'], 'SFz', '- Turbulence scaling factor for the z direction (-) [ScaleMethod=1]\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['SigmaFx'], 'SigmaFx', '- Turbulence standard deviation to calculate scaling from in x direction (m/s) [ScaleMethod=2]\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['SigmaFy'], 'SigmaFy', '- Turbulence standard deviation to calculate scaling from in y direction (m/s) [ScaleMethod=2]\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['SigmaFz'], 'SigmaFz', '- Turbulence standard deviation to calculate scaling from in z direction (m/s) [ScaleMethod=2]\n')) + f.write('------------- Mean wind profile parameters (added to HAWC-format files) ---------------------------------\n') + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['URef'], 'URef', '- Mean u-component wind speed at the reference height (m/s)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['WindProfile'], 'WindProfile', '- Wind profile type (0=constant;1=logarithmic,2=power law)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['PLExp_Hawc'], 'PLExp_Hawc', '- Power law exponent (-) (used for PL wind profile type only)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['Z0'], 'Z0', '- Surface roughness length (m) (used for LG wind profile type only)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['XOffset'], 'XOffset', '- Initial offset in +x direction (shift of wind box) (-)\n')) + f.write('====================== OUTPUT ==================================================\n') + f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['SumPrint'], 'SumPrint', '- Print summary data to .IfW.sum (flag)\n')) + f.write('OutList - The next line(s) contains a list of output parameters. See OutListParameters.xlsx for a listing of available output channels, (-)\n') + outlist = self.get_outlist(self.fst_vt['outlist'], ['InflowWind']) + for channel_list in outlist: + for i in range(len(channel_list)): + f.write('"' + channel_list[i] + '"\n') - f.write('{:2}\n'.format(self.fst_vt['AeroDynBlade']['NumFoil'])) - for i in range (self.fst_vt['AeroDynBlade']['NumFoil']): - f.write('"{:}"\n'.format(self.fst_vt['AeroDynBlade']['FoilNm'][i])) - - f.write('{:2}\n'.format(self.fst_vt['AeroDynBlade']['BldNodes'])) - rnodes = self.fst_vt['AeroDynBlade']['RNodes'] - twist = self.fst_vt['AeroDynBlade']['AeroTwst'] - drnodes = self.fst_vt['AeroDynBlade']['DRNodes'] - chord = self.fst_vt['AeroDynBlade']['Chord'] - nfoil = self.fst_vt['AeroDynBlade']['NFoil'] - prnelm = self.fst_vt['AeroDynBlade']['PrnElm'] - f.write('Nodal properties\n') - for r, t, dr, c, a, p in zip(rnodes, twist, drnodes, chord, nfoil, prnelm): - f.write('{: 2.15e}\t{: 2.15e}\t{: 2.15e}\t{: 2.15e}\t{:5}\t{:}\n'.format(r, t, dr, c, a, p)) - - f.close() - - def write_AeroDyn14Tower(self): - # AeroDyn v14.04 Tower - self.fst_vt['AeroDyn14']['TwrFile'] = self.FAST_namingOut + '_AeroDyn14_tower.dat' - filename = os.path.join(self.FAST_runDirectory, self.fst_vt['AeroDyn14']['TwrFile']) - f = open(filename, 'w') + f.write('END of input file (the word "END" must appear in the first 3 columns of this last OutList line)\n') + f.write('---------------------------------------------------------------------------------------\n') - f.write('AeroDyn tower file, Aerodyn v14.04 formatting\n') - f.write('Generated with AeroElasticSE FAST driver\n') - f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDynTower']['NTwrHt'], 'NTwrHt', '- Number of tower input height stations listed (-)\n')) - f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDynTower']['NTwrRe'], 'NTwrRe', '- Number of tower Re values (-)\n')) - f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDynTower']['NTwrCD'], 'NTwrCD', '- Number of tower CD columns (-) Note: For current versions, this MUST be 1\n')) - f.write('{: 2.15e} {:<11} {:}'.format(self.fst_vt['AeroDynTower']['Tower_Wake_Constant'], 'Tower_Wake_Constant', '- Tower wake constant (-) {0.0: full potential flow, 0.1: Bak model}\n')) - f.write('---------------------- DISTRIBUTED TOWER PROPERTIES ----------------------------\n') - f.write('TwrHtFr TwrWid NTwrCDCol\n') - for HtFr, Wid, CDId in zip(self.fst_vt['AeroDynTower']['TwrHtFr'], self.fst_vt['AeroDynTower']['TwrWid'], self.fst_vt['AeroDynTower']['NTwrCDCol']): - f.write('{: 2.15e} {: 2.15e} {:d}\n'.format(HtFr, Wid, int(CDId))) - f.write('---------------------- Re v CD PROPERTIES --------------------------------------\n') - f.write('TwrRe '+ ' '.join(['TwrCD%d'%(i+1) for i in range(self.fst_vt['AeroDynTower']['NTwrCD'])]) +'\n') - for Re, CD in zip(self.fst_vt['AeroDynTower']['TwrRe'], self.fst_vt['AeroDynTower']['TwrCD']): - f.write('% 2.15e' %Re + ' '.join(['% 2.15e'%cdi for cdi in CD]) + '\n') - f.close() - + def write_AeroDyn15(self): # AeroDyn v15.03 @@ -879,6 +709,8 @@ def write_AeroDyn15(self): self.write_AeroDyn15Coord() if self.fst_vt['AeroDyn15']['WakeMod'] == 3: + if self.fst_vt['AeroDyn15']['AFAeroMod'] == 2: + raise Exception('OLAF is called with unsteady airfoil aerodynamics, but OLAF currently only supports AFAeroMod == 1') self.write_OLAF() # Generate AeroDyn v15.03 input file @@ -898,6 +730,7 @@ def write_AeroDyn15(self): f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['TwrAero'], 'TwrAero', '- Calculate tower aerodynamic loads? (flag)\n')) f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['FrozenWake'], 'FrozenWake', '- Assume frozen wake during linearization? (flag) [used only when WakeMod=1 and when linearizing]\n')) f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['CavitCheck'], 'CavitCheck', '- Perform cavitation check? (flag) [AFAeroMod must be 1 when CavitCheck=true]\n')) + f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['Buoyancy'], 'Buoyancy', '- Include buoyancy effects? (flag)\n')) f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['CompAA'], 'CompAA', '- Flag to compute AeroAcoustics calculation [only used when WakeMod=1 or 2]\n')) f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['AA_InputFile'], 'AA_InputFile', '- AeroAcoustics input file [used only when CompAA=true]\n')) f.write('====== Environmental Conditions ===================================================================\n') @@ -906,7 +739,7 @@ def write_AeroDyn15(self): f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['SpdSound'], 'SpdSound', '- Speed of sound (m/s)\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['Patm'], 'Patm', '- Atmospheric pressure (Pa) [used only when CavitCheck=True]\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['Pvap'], 'Pvap', '- Vapour pressure of fluid (Pa) [used only when CavitCheck=True]\n')) - f.write('====== Blade-Element/Momentum Theory Options ====================================================== [used only when WakeMod=1]\n') + f.write('====== Blade-Element/Momentum Theory Options ====================================================== [unused when WakeMod=0 or 3]\n') f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['SkewMod'], 'SkewMod', '- Type of skewed-wake correction model (switch) {1=uncoupled, 2=Pitt/Peters, 3=coupled} [unused when WakeMod=0 or 3]\n')) f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['SkewModFactor'], 'SkewModFactor', '- Constant used in Pitt/Peters skewed wake model {or "default" is 15/32*pi} (-) [used only when SkewMod=2; unused when WakeMod=0 or 3]\n')) f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['TipLoss'], 'TipLoss', '- Use the Prandtl tip-loss model? (flag) [unused when WakeMod=0 or 3]\n')) @@ -916,8 +749,8 @@ def write_AeroDyn15(self): f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['TIDrag'], 'TIDrag', '- Include the drag term in the tangential-induction calculation? (flag) [unused when WakeMod=0,3 or TanInd=FALSE]\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['IndToler'], 'IndToler', '- Convergence tolerance for BEMT nonlinear solve residual equation {or "default"} (-) [unused when WakeMod=0 or 3]\n')) f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['MaxIter'], 'MaxIter', '- Maximum number of iteration steps (-) [unused when WakeMod=0]\n')) - f.write('====== Dynamic Blade-Element/Momentum Theory Options ====================================================== [used only when WakeMod=1]\n') - f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['DBEMT_Mod'], 'DBEMT_Mod', '- Type of dynamic BEMT (DBEMT) model {1=constant tau1, 2=time-dependent tau1} (-) [used only when WakeMod=2]\n')) + f.write('====== Dynamic Blade-Element/Momentum Theory Options ====================================================== [used only when WakeMod=2]\n') + f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['DBEMT_Mod'], 'DBEMT_Mod', '- Type of dynamic BEMT (DBEMT) model {1=constant tau1, 2=time-dependent tau1, 3=constant tau1 with continuous formulation} (-) [used only when WakeMod=2]\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['tau1_const'], 'tau1_const', '- Time constant for DBEMT (s) [used only when WakeMod=2 and DBEMT_Mod=1]\n')) f.write('====== OLAF -- cOnvecting LAgrangian Filaments (Free Vortex Wake) Theory Options ================== [used only when WakeMod=3]\n') olaf_file = self.FAST_namingOut + '_OLAF.dat' @@ -925,8 +758,6 @@ def write_AeroDyn15(self): f.write('====== Beddoes-Leishman Unsteady Airfoil Aerodynamics Options ===================================== [used only when AFAeroMod=2]\n') f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['UAMod'], 'UAMod', "- Unsteady Aero Model Switch (switch) {1=Baseline model (Original), 2=Gonzalez's variant (changes in Cn,Cc,Cm), 3=Minnema/Pierce variant (changes in Cc and Cm)} [used only when AFAeroMod=2]\n")) f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['FLookup'], 'FLookup', "- Flag to indicate whether a lookup for f' will be calculated (TRUE) or whether best-fit exponential equations will be used (FALSE); if FALSE S1-S4 must be provided in airfoil input files (flag) [used only when AFAeroMod=2]\n")) - f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['UAStartRad'], 'UAStartRad', "- Starting radius for dynamic stall (fraction of rotor radius) [used only when AFAeroMod=2]\n")) - f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['UAEndRad'], 'UAEndRad', "- Ending radius for dynamic stall (fraction of rotor radius) [used only when AFAeroMod=2]\n")) f.write('====== Airfoil Information =========================================================================\n') f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['AFTabMod'], 'AFTabMod', '- Interpolation method for multiple airfoil tables {1=1D interpolation on AoA (first table only); 2=2D interpolation on AoA and Re; 3=2D interpolation on AoA and UserProp} (-)\n')) f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['InCol_Alfa'], 'InCol_Alfa', '- The column in the airfoil tables that contains the angle of attack (-)\n')) @@ -945,12 +776,21 @@ def write_AeroDyn15(self): f.write('{:<22} {:<11} {:}'.format('"'+self.fst_vt['AeroDyn15']['ADBlFile1']+'"', 'ADBlFile(1)', '- Name of file containing distributed aerodynamic properties for Blade #1 (-)\n')) f.write('{:<22} {:<11} {:}'.format('"'+self.fst_vt['AeroDyn15']['ADBlFile2']+'"', 'ADBlFile(2)', '- Name of file containing distributed aerodynamic properties for Blade #2 (-) [unused if NumBl < 2]\n')) f.write('{:<22} {:<11} {:}'.format('"'+self.fst_vt['AeroDyn15']['ADBlFile3']+'"', 'ADBlFile(3)', '- Name of file containing distributed aerodynamic properties for Blade #3 (-) [unused if NumBl < 3]\n')) - f.write('====== Tower Influence and Aerodynamics ============================================================= [used only when TwrPotent/=0, TwrShadow/=0, or TwrAero=True]\n') - f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['NumTwrNds'], 'NumTwrNds', '- Number of tower nodes used in the analysis (-) [used only when TwrPotent/=0, TwrShadow/=0, or TwrAero=True]\n')) - f.write('TwrElev TwrDiam TwrCd TwrTI (used only with TwrShadow=2)\n') - f.write('(m) (m) (-) (-)\n') - for TwrElev, TwrDiam, TwrCd, TwrTI in zip(self.fst_vt['AeroDyn15']['TwrElev'], self.fst_vt['AeroDyn15']['TwrDiam'], self.fst_vt['AeroDyn15']['TwrCd'], self.fst_vt['AeroDyn15']['TwrTI']): - f.write('{: 2.15e} {: 2.15e} {: 2.15e} {: 2.15e} \n'.format(TwrElev, TwrDiam, TwrCd, TwrTI)) + f.write('====== Hub Properties ============================================================================== [used only when Buoyancy=True]\n') + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['VolHub'], 'VolHub', '- Hub volume (m^3)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['HubCenBx'], 'HubCenBx', '- Hub center of buoyancy x direction offset (m)\n')) + f.write('====== Nacelle Properties ========================================================================== [used only when Buoyancy=True]\n') + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['VolNac'], 'VolNac', '- Nacelle volume (m^3)\n')) + f.write('{:<22} {:<11} {:}'.format(', '.join(np.array(self.fst_vt['AeroDyn15']['NacCenB'], dtype=str)), 'NacCenB', '- Position of nacelle center of buoyancy from yaw bearing in nacelle coordinates (m)\n')) + f.write('====== Tail Fin Aerodynamics ========================================================================\n') + f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['TFinAero'], 'TFinAero', '- Calculate tail fin aerodynamics model (flag)\n')) + f.write('{:<22} {:<11} {:}'.format('"'+self.fst_vt['AeroDyn15']['TFinFile']+'"', 'TFinFile', '- Input file for tail fin aerodynamics [used only when TFinAero=True]\n')) + f.write('====== Tower Influence and Aerodynamics ============================================================ [used only when TwrPotent/=0, TwrShadow/=0, TwrAero=True, or Buoyancy=True]\n') + f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['NumTwrNds'], 'NumTwrNds', '- Number of tower nodes used in the analysis (-) [used only when TwrPotent/=0, TwrShadow/=0, TwrAero=True, or Buoyancy=True]\n')) + f.write('TwrElev TwrDiam TwrCd TwrTI TwrCb !TwrTI used only with TwrShadow=2, TwrCb used only with Buoyancy=True\n') + f.write('(m) (m) (-) (-) (-)\n') + for TwrElev, TwrDiam, TwrCd, TwrTI, TwrCb in zip(self.fst_vt['AeroDyn15']['TwrElev'], self.fst_vt['AeroDyn15']['TwrDiam'], self.fst_vt['AeroDyn15']['TwrCd'], self.fst_vt['AeroDyn15']['TwrTI'], self.fst_vt['AeroDyn15']['TwrCb']): + f.write('{: 2.15e} {: 2.15e} {: 2.15e} {: 2.15e} {: 2.15e} \n'.format(TwrElev, TwrDiam, TwrCd, TwrTI, TwrCb)) f.write('====== Outputs ====================================================================================\n') f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['SumPrint'], 'SumPrint', '- Generate a summary file listing input options and interpolated properties to ".AD.sum"? (flag)\n')) f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['NBlOuts'], 'NBlOuts', '- Number of blade node outputs [0 - 9] (-)\n')) @@ -1027,7 +867,7 @@ def write_AeroDyn15Polar(self): f.write('! ------------------------------------------------------------------------------\n') f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['af_data'][afi][0]['InterpOrd'], 'InterpOrd', '! Interpolation order to use for quasi-steady table lookup {1=linear; 3=cubic spline; "default"} [default=3]\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['af_data'][afi][0]['NonDimArea'], 'NonDimArea', '! The non-dimensional area of the airfoil (area/chord^2) (set to 1.0 if unsure or unneeded)\n')) - if self.fst_vt['AeroDyn15']['af_data'][1][0]['NumCoords'] != '0': + if self.fst_vt['AeroDyn15']['af_data'][afi][0]['NumCoords'] != '0': f.write('@"{:}_AF{:02d}_Coords.txt" {:<11} {:}'.format(self.FAST_namingOut, afi, 'NumCoords', '! The number of coordinates in the airfoil shape file. Set to zero if coordinates not included.\n')) else: f.write('{:<22d} {:<11} {:}'.format(0, 'NumCoords', '! The number of coordinates in the airfoil shape file. Set to zero if coordinates not included.\n')) @@ -1041,8 +881,8 @@ def write_AeroDyn15Polar(self): num_tab = len(self.fst_vt['AeroDyn15']['af_data'][afi]) elif self.fst_vt['AeroDyn15']['AFTabMod'] == 3: # for tab_orig in range(self.fst_vt['AeroDyn15']['af_data'][afi][0]['NumTabs'] - 1): - if len(self.fst_vt['AeroDyn15']['af_data'][afi]) > 1 and \ - self.fst_vt['AeroDyn15']['af_data'][afi][0]['Ctrl'] == self.fst_vt['AeroDyn15']['af_data'][afi][1]['Ctrl']: + if len( self.fst_vt['AeroDyn15']['af_data'][afi]) == 1 or \ + self.fst_vt['AeroDyn15']['af_data'][afi][0]['Ctrl'] == self.fst_vt['AeroDyn15']['af_data'][afi][1]['Ctrl']: num_tab = 1 # assume that all Ctrl angles of the flaps are identical if the first two are -> no flaps! else: num_tab = self.fst_vt['AeroDyn15']['af_data'][afi][0]['NumTabs'] @@ -1166,57 +1006,187 @@ def write_AeroDyn15Coord(self): f.write(' '.join(['{: 2.14e}'.format(val) for val in row])+'\n') f.close() + def write_AeroDyn14(self): + + # ======= Airfoil Files ======== + # make directory for airfoil files + if not os.path.isdir(os.path.join(self.FAST_runDirectory,'AeroData')): + try: + os.mkdir(os.path.join(self.FAST_runDirectory,'AeroData')) + except: + try: + time.sleep(random.random()) + if not os.path.isdir(os.path.join(self.FAST_runDirectory,'AeroData')): + os.mkdir(os.path.join(self.FAST_runDirectory,'AeroData')) + except: + print("Error tring to make '%s'!"%os.path.join(self.FAST_runDirectory,'AeroData')) + + # create write airfoil objects to files + for i in range(self.fst_vt['AeroDyn14']['NumFoil']): + af_name = os.path.join(self.FAST_runDirectory, 'AeroData', 'Airfoil' + str(i) + '.dat') + self.fst_vt['AeroDyn14']['FoilNm'][i] = os.path.join('AeroData', 'Airfoil' + str(i) + '.dat') + self.write_AeroDyn14Polar(af_name, i) + + self.fst_vt['Fst']['AeroFile'] = self.FAST_namingOut + '_AeroDyn14.dat' + ad_file = os.path.join(self.FAST_runDirectory,self.fst_vt['Fst']['AeroFile']) + f = open(ad_file,'w') + + # create Aerodyn Tower + if self.fst_vt['AeroDyn14']['TwrShad'] > 0: + self.write_AeroDyn14Tower() + + # ======= Aerodyn Input File ======== + f.write('AeroDyn v14.04.* INPUT FILE\n\n') + + # f.write('{:}\n'.format(self.fst_vt['aerodyn']['SysUnits'])) + f.write('{:}\n'.format(self.fst_vt['AeroDyn14']['StallMod'])) + + f.write('{:}\n'.format(self.fst_vt['AeroDyn14']['UseCm'])) + f.write('{:}\n'.format(self.fst_vt['AeroDyn14']['InfModel'])) + f.write('{:}\n'.format(self.fst_vt['AeroDyn14']['IndModel'])) + f.write('{: 2.15e}\n'.format(self.fst_vt['AeroDyn14']['AToler'])) + f.write('{:}\n'.format(self.fst_vt['AeroDyn14']['TLModel'])) + f.write('{:}\n'.format(self.fst_vt['AeroDyn14']['HLModel'])) + f.write('{:}\n'.format(self.fst_vt['AeroDyn14']['TwrShad'])) + if self.fst_vt['AeroDyn14']['TwrShad'] > 0: + f.write('{:}\n'.format(self.fst_vt['AeroDyn14']['TwrPotent'])) + f.write('{:}\n'.format(self.fst_vt['AeroDyn14']['TwrShadow'])) + f.write('{:}\n'.format(self.fst_vt['AeroDyn14']['TwrFile'])) + f.write('{:}\n'.format(self.fst_vt['AeroDyn14']['CalcTwrAero'])) + else: + f.write('{: 2.15e}\n'.format(self.fst_vt['AeroDyn14']['ShadHWid'])) + f.write('{: 2.15e}\n'.format(self.fst_vt['AeroDyn14']['T_Shad_Refpt'])) + + f.write('{: 2.15e}\n'.format(self.fst_vt['AeroDyn14']['AirDens'])) + + f.write('{: 2.15e}\n'.format(self.fst_vt['AeroDyn14']['KinVisc'])) + + f.write('{:2}\n'.format(self.fst_vt['AeroDyn14']['DTAero'])) + + + f.write('{:2}\n'.format(self.fst_vt['AeroDyn14']['NumFoil'])) + for i in range (self.fst_vt['AeroDyn14']['NumFoil']): + f.write('"{:}"\n'.format(self.fst_vt['AeroDyn14']['FoilNm'][i])) + + f.write('{:2}\n'.format(self.fst_vt['AeroDynBlade']['BldNodes'])) + rnodes = self.fst_vt['AeroDynBlade']['RNodes'] + twist = self.fst_vt['AeroDynBlade']['AeroTwst'] + drnodes = self.fst_vt['AeroDynBlade']['DRNodes'] + chord = self.fst_vt['AeroDynBlade']['Chord'] + nfoil = self.fst_vt['AeroDynBlade']['NFoil'] + prnelm = self.fst_vt['AeroDynBlade']['PrnElm'] + f.write('Nodal properties\n') + for r, t, dr, c, a, p in zip(rnodes, twist, drnodes, chord, nfoil, prnelm): + f.write('{: 2.15e}\t{: 2.15e}\t{: 2.15e}\t{: 2.15e}\t{:5}\t{:}\n'.format(r, t, dr, c, a, p)) + + f.close() + + def write_AeroDyn14Tower(self): + # AeroDyn v14.04 Tower + self.fst_vt['AeroDyn14']['TwrFile'] = self.FAST_namingOut + '_AeroDyn14_tower.dat' + filename = os.path.join(self.FAST_runDirectory, self.fst_vt['AeroDyn14']['TwrFile']) + f = open(filename, 'w') + + f.write('AeroDyn tower file, Aerodyn v14.04 formatting\n') + f.write('Generated with AeroElasticSE FAST driver\n') + f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDynTower']['NTwrHt'], 'NTwrHt', '- Number of tower input height stations listed (-)\n')) + f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDynTower']['NTwrRe'], 'NTwrRe', '- Number of tower Re values (-)\n')) + f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDynTower']['NTwrCD'], 'NTwrCD', '- Number of tower CD columns (-) Note: For current versions, this MUST be 1\n')) + f.write('{: 2.15e} {:<11} {:}'.format(self.fst_vt['AeroDynTower']['Tower_Wake_Constant'], 'Tower_Wake_Constant', '- Tower wake constant (-) {0.0: full potential flow, 0.1: Bak model}\n')) + f.write('---------------------- DISTRIBUTED TOWER PROPERTIES ----------------------------\n') + f.write('TwrHtFr TwrWid NTwrCDCol\n') + for HtFr, Wid, CDId in zip(self.fst_vt['AeroDynTower']['TwrHtFr'], self.fst_vt['AeroDynTower']['TwrWid'], self.fst_vt['AeroDynTower']['NTwrCDCol']): + f.write('{: 2.15e} {: 2.15e} {:d}\n'.format(HtFr, Wid, int(CDId))) + f.write('---------------------- Re v CD PROPERTIES --------------------------------------\n') + f.write('TwrRe '+ ' '.join(['TwrCD%d'%(i+1) for i in range(self.fst_vt['AeroDynTower']['NTwrCD'])]) +'\n') + for Re, CD in zip(self.fst_vt['AeroDynTower']['TwrRe'], self.fst_vt['AeroDynTower']['TwrCD']): + f.write('% 2.15e' %Re + ' '.join(['% 2.15e'%cdi for cdi in CD]) + '\n') + + f.close() + + def write_AeroDyn14Polar(self, filename, a_i): + # AeroDyn v14 Airfoil Polar Input File + + f = open(filename, 'w') + f.write('AeroDyn airfoil file, Aerodyn v14.04 formatting\n') + f.write('Generated with AeroElasticSE FAST driver\n') + + f.write('{:9d}\t{:}'.format(self.fst_vt['AeroDynBlade']['af_data'][a_i]['number_tables'], 'Number of airfoil tables in this file\n')) + for i in range(self.fst_vt['AeroDynBlade']['af_data'][a_i]['number_tables']): + param = self.fst_vt['AeroDynBlade']['af_data'][a_i]['af_tables'][i] + f.write('{:9g}\t{:}'.format(i, 'Table ID parameter\n')) + f.write('{: f}\t{:}'.format(param['StallAngle'], 'Stall angle (deg)\n')) + f.write('{: f}\t{:}'.format(0, 'No longer used, enter zero\n')) + f.write('{: f}\t{:}'.format(0, 'No longer used, enter zero\n')) + f.write('{: f}\t{:}'.format(0, 'No longer used, enter zero\n')) + f.write('{: f}\t{:}'.format(param['ZeroCn'], 'Angle of attack for zero Cn for linear Cn curve (deg)\n')) + f.write('{: f}\t{:}'.format(param['CnSlope'], 'Cn slope for zero lift for linear Cn curve (1/rad)\n')) + f.write('{: f}\t{:}'.format(param['CnPosStall'], 'Cn at stall value for positive angle of attack for linear Cn curve\n')) + f.write('{: f}\t{:}'.format(param['CnNegStall'], 'Cn at stall value for negative angle of attack for linear Cn curve\n')) + f.write('{: f}\t{:}'.format(param['alphaCdMin'], 'Angle of attack for minimum CD (deg)\n')) + f.write('{: f}\t{:}'.format(param['CdMin'], 'Minimum CD value\n')) + if param['cm']: + for a, cl, cd, cm in zip(param['alpha'], param['cl'], param['cd'], param['cm']): + f.write('{: 6e} {: 6e} {: 6e} {: 6e}\n'.format(a, cl, cd, cm)) + else: + for a, cl, cd in zip(param['alpha'], param['cl'], param['cd']): + f.write('{: 6e} {: 6e} {: 6e}\n'.format(a, cl, cd)) + + f.close() + def write_OLAF(self): olaf_file = os.path.join(self.FAST_runDirectory, self.FAST_namingOut + '_OLAF.dat') f = open(olaf_file, 'w') f.write('--------------------------- OLAF (cOnvecting LAgrangian Filaments) INPUT FILE -----------------\n') - f.write('Free wake input file for the Helix test case\n') + f.write('Generated by WEIS\n') f.write('--------------------------- GENERAL OPTIONS ---------------------------------------------------\n') - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['IntMethod'], 'IntMethod', 'Integration method {5: Forward Euler 1st order, default: 5} (switch)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['DTfvw'], 'DTfvw', 'Time interval for wake propagation. {default: dtaero} (s)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['FreeWakeStart'], 'FreeWakeStart', 'Time when wake is free. (-) value = always free. {default: 0.0} (s)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['FullCircStart'], 'FullCircStart', 'Time at which full circulation is reached. {default: 0.0} (s)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['IntMethod'], 'IntMethod', '- Integration method {1: RK4, 5: Forward Euler 1st order, default: 5} (switch)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['DTfvw'], 'DTfvw', '- Time interval for wake propagation. {default: dtaero} (s)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['FreeWakeStart'], 'FreeWakeStart', '- Time when wake is free. (-) value = always free. {default: 0.0} (s)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['FullCircStart'], 'FullCircStart', '- Time at which full circulation is reached. {default: 0.0} (s)\n')) f.write('--------------------------- CIRCULATION SPECIFICATIONS ----------------------------------------\n') - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['CircSolvingMethod'], 'CircSolvingMethod', 'Circulation solving method {1: Cl-Based, 2: No-Flow Through, 3: Prescribed, default: 1 }(switch)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['CircSolvConvCrit'], 'CircSolvConvCrit', 'Convergence criteria {default: 0.001} [only if CircSolvingMethod=1] (-)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['CircSolvRelaxation'], 'CircSolvRelaxation', 'Relaxation factor {default: 0.1} [only if CircSolvingMethod=1] (-)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['CircSolvMaxIter'], 'CircSolvMaxIter', 'Maximum number of iterations for circulation solving {default: 30} (-)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['PrescribedCircFile'], 'PrescribedCircFile','File containing prescribed circulation [only if CircSolvingMethod=3] (quoted string)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['CircSolvMethod'], 'CircSolvingMethod', '- Circulation solving method {1: Cl-Based, 2: No-Flow Through, 3: Prescribed, default: 1 }(switch)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['CircSolvConvCrit'], 'CircSolvConvCrit', ' - Convergence criteria {default: 0.001} [only if CircSolvMethod=1] (-)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['CircSolvRelaxation'], 'CircSolvRelaxation', '- Relaxation factor {default: 0.1} [only if CircSolvMethod=1] (-)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['CircSolvMaxIter'], 'CircSolvMaxIter', ' - Maximum number of iterations for circulation solving {default: 30} (-)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['PrescribedCircFile'], 'PrescribedCircFile','- File containing prescribed circulation [only if CircSolvMethod=3] (quoted string)\n')) f.write('===============================================================================================\n') f.write('--------------------------- WAKE OPTIONS ------------------------------------------------------\n') f.write('------------------- WAKE EXTENT AND DISCRETIZATION --------------------------------------------\n') - f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['nNWPanel'], 'nNWPanel','Number of near-wake panels [integer] (-)\n')) - f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['WakeLength'], 'WakeLength','Total wake distance [integer] (number of time steps)\n')) - f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['FreeWakeLength'], 'FreeWakeLength','Wake length that is free [integer] (number of time steps) {default: WakeLength}\n')) - f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['FWShedVorticity'], 'FWShedVorticity','Include shed vorticity in the far wake {default: false}\n')) + f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['nNWPanels'], 'nNWPanels','- Number of near-wake panels (-)\n')) + f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['nNWPanelsFree'], 'nNWPanelsFree','- Number of free near-wake panels (-) {default: nNWPanels}\n')) + f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['nFWPanels'], 'nFWPanels','- Number of far-wake panels (-) {default: 0}\n')) + f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['nFWPanelsFree'], 'nFWPanelsFree','- Number of free far-wake panels (-) {default: nFWPanels}\n')) + f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['FWShedVorticity'], 'FWShedVorticity','- Include shed vorticity in the far wake {default: False}\n')) f.write('------------------- WAKE REGULARIZATIONS AND DIFFUSION -----------------------------------------\n') - f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['DiffusionMethod'], 'DiffusionMethod','Diffusion method to account for viscous effects {0: None, 1: Core Spreading, "default": 0}\n')) - f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['RegDeterMethod'], 'RegDeterMethod','Method to determine the regularization parameters {0: Manual, 1: Optimized, default: 0 }\n')) - f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['RegFunction'], 'RegFunction','Viscous diffusion function {0: None, 1: Rankine, 2: LambOseen, 3: Vatistas, 4: Denominator, "default": 3} (switch)\n')) - f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['WakeRegMethod'], 'WakeRegMethod','Wake regularization method {1: Constant, 2: Stretching, 3: Age, default: 1} (switch)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['WakeRegFactor'], 'WakeRegFactor','Wake regularization factor (m)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['WingRegFactor'], 'WingRegFactor','Wing regularization factor (m)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['CoreSpreadEddyVisc'], 'CoreSpreadEddyVisc','Eddy viscosity in core spreading methods, typical values 1-1000\n')) + f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['DiffusionMethod'], 'DiffusionMethod','- Diffusion method to account for viscous effects {0: None, 1: Core Spreading, "default": 0}\n')) + f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['RegDeterMethod'], 'RegDeterMethod','- Method to determine the regularization parameters {0: Manual, 1: Optimized, 2: Chord, 3: Span, default: 0 }\n')) + f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['RegFunction'], 'RegFunction','- Viscous diffusion function {0: None, 1: Rankine, 2: LambOseen, 3: Vatistas, 4: Denominator, "default": 3} (switch)\n')) + f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['WakeRegMethod'], 'WakeRegMethod','- Wake regularization method {1: Constant, 2: Stretching, 3: Age, default: 3} (switch)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['WakeRegFactor'], 'WakeRegFactor','- Wake regularization factor (m)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['WingRegFactor'], 'WingRegFactor','- Wing regularization factor (m)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['CoreSpreadEddyVisc'], 'CoreSpreadEddyVisc','- Eddy viscosity in core spreading methods, typical values 1-1000\n')) f.write('------------------- WAKE TREATMENT OPTIONS ---------------------------------------------------\n') - f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['TwrShadowOnWake'], 'TwrShadowOnWake','Include tower flow disturbance effects on wake convection {default:false} [only if TwrPotent or TwrShadow]\n')) - f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['ShearModel'], 'ShearModel','Shear Model {0: No treatment, 1: Mirrored vorticity, default: 0}\n')) + f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['TwrShadowOnWake'], 'TwrShadowOnWake','- Include tower flow disturbance effects on wake convection {default:false} [only if TwrPotent or TwrShadow]\n')) + f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['ShearModel'], 'ShearModel','- Shear Model {0: No treatment, 1: Mirrored vorticity, default: 0}\n')) f.write('------------------- SPEEDUP OPTIONS -----------------------------------------------------------\n') - f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['VelocityMethod'], 'VelocityMethod','Method to determine the velocity {1:Biot-Savart Segment, 2:Particle tree, default: 1}\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['TreeBranchFactor'], 'TreeBranchFactor','Branch radius fraction above which a multipole calculation is used {default: 2.0} [only if VelocityMethod=2]\n')) - f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['PartPerSegment'], 'PartPerSegment','Number of particles per segment [only if VelocityMethod=2]\n')) + f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['VelocityMethod'], 'VelocityMethod','- Method to determine the velocity {1:Segment N^2, 2:Particle tree, 3:Particle N^2, 4:Segment tree, default: 2}\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['TreeBranchFactor'], 'TreeBranchFactor','- Branch radius fraction above which a multipole calculation is used {default: 1.5} [only if VelocityMethod=2,4]\n')) + f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['PartPerSegment'], 'PartPerSegment','- Number of particles per segment {default: 1} [only if VelocityMethod=2,3]\n')) f.write('===============================================================================================\n') f.write('--------------------------- OUTPUT OPTIONS ---------------------------------------------------\n') - f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['WrVTk'], 'WrVTk','Outputs Visualization Toolkit (VTK) (independent of .fst option) {0: NoVTK, 1: Write VTK at each time step} (flag)\n')) - f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['nVTKBlades'], 'nVTKBlades','Number of blades for which VTK files are exported {0: No VTK per blade, n: VTK for blade 1 to n} (-)\n')) - f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['VTKCoord'], 'VTKCoord','Coordinate system used for VTK export. {1: Global, 2: Hub, "default": 1}\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['VTK_fps'], 'VTK_fps','Frame rate for VTK output (frames per second) {"all" for all glue code timesteps, "default" for all OLAF timesteps} [used only if WrVTK=1]\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['nGridOut'], 'nGridOut','GB DEBUG 7/8: Number of grid points for VTK output\n')) - f.write('--GridOutHeaders--\n') - f.write('--GridOutUnits--\n') - f.write('1.0 1.0 1.0\n') - f.write('------------------------------------------------------------------------------------------------\n') + f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['WrVTk'], 'WrVTk','- Outputs Visualization Toolkit (VTK) (independent of .fst option) {0: NoVTK, 1: Write VTK at VTK_fps, 2: Write VTK at init and final, default: 0} (flag)\n')) + f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['nVTKBlades'], 'nVTKBlades','- Number of blades for which VTK files are exported {0: No VTK per blade, n: VTK for blade 1 to n, default: 0} (-) \n')) + f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['VTKCoord'], 'VTKCoord','- Coordinate system used for VTK export. {1: Global, 2: Hub, 3: Both, default: 1} \n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['VTK_fps'], 'VTK_fps','- Frame rate for VTK output (frames per second) {"all" for all glue code timesteps, "default" for all OLAF timesteps} [only if WrVTK=1]\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['nGridOut'], 'nGridOut','- Number of grid outputs\n')) + f.write('GridName GridType TStart TEnd DTGrid XStart XEnd nX YStart YEnd nY ZStart ZEnd nZ\n') + f.write('(-) (-) (s) (s) (s) (m) (m) (-) (m) (m) (-) (m) (m) (-)\n') + f.write('===============================================================================================\n') + f.write('--------------------------- ADVANCED OPTIONS --------------------------------------------------\n') + f.write('===============================================================================================\n') f.close() @@ -1368,8 +1338,8 @@ def write_DISCON_in(self): turbine.Cq_table = self.fst_vt['DISCON_in']['Cq_table'] turbine.pitch_initial_rad = self.fst_vt['DISCON_in']['Cp_pitch_initial_rad'] turbine.TSR_initial = self.fst_vt['DISCON_in']['Cp_TSR_initial'] - turbine.TurbineName = self.fst_vt['description'] - + turbine.TurbineName = 'WEIS Turbine' + # Define DISCON infile paths self.fst_vt['ServoDyn']['DLL_InFile'] = self.FAST_namingOut + '_DISCON.IN' discon_in_file = os.path.join(self.FAST_runDirectory, self.fst_vt['ServoDyn']['DLL_InFile']) @@ -1410,7 +1380,14 @@ def write_HydroDyn(self): f.write('{:<22} {:<11} {:}'.format(self.fst_vt['HydroDyn']['WaveDT'], 'WaveDT', '- Time step for incident wave calculations (sec) [unused when WaveMod=0; 0.1<=WaveDT<=1.0 recommended; determines WaveOmegaMax=Pi/WaveDT in the IFFT]\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['HydroDyn']['WaveHs'], 'WaveHs', '- Significant wave height of incident waves (meters) [used only when WaveMod=1, 2, or 3]\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['HydroDyn']['WaveTp'], 'WaveTp', '- Peak-spectral period of incident waves (sec) [used only when WaveMod=1 or 2]\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['HydroDyn']['WavePkShp'], 'WavePkShp', '- Peak-shape parameter of incident wave spectrum (-) or DEFAULT (string) [used only when WaveMod=2; use 1.0 for Pierson-Moskowitz]\n')) + if isinstance(self.fst_vt['HydroDyn']['WavePkShp'], float): + if self.fst_vt['HydroDyn']['WavePkShp'] == 0.: + WavePkShp = 'Default' + else: + WavePkShp = self.fst_vt['HydroDyn']['WavePkShp'] + else: + WavePkShp = self.fst_vt['HydroDyn']['WavePkShp'] + f.write('{:<22} {:<11} {:}'.format(WavePkShp, 'WavePkShp', '- Peak-shape parameter of incident wave spectrum (-) or DEFAULT (string) [used only when WaveMod=2; use 1.0 for Pierson-Moskowitz]\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['HydroDyn']['WvLowCOff'], 'WvLowCOff', '- Low cut-off frequency or lower frequency limit of the wave spectrum beyond which the wave spectrum is zeroed (rad/s) [unused when WaveMod=0, 1, or 6]\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['HydroDyn']['WvHiCOff'], 'WvHiCOff', '- High cut-off frequency or upper frequency limit of the wave spectrum beyond which the wave spectrum is zeroed (rad/s) [unused when WaveMod=0, 1, or 6]\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['HydroDyn']['WaveDir'], 'WaveDir', '- Incident wave propagation heading direction (degrees) [unused when WaveMod=0 or 6]\n')) @@ -1419,7 +1396,13 @@ def write_HydroDyn(self): f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['HydroDyn']['WaveNDir'], 'WaveNDir', '- Number of wave directions (-) [only used when WaveMod=2,3, or 4 and WaveDirMod=1; odd number only]\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['HydroDyn']['WaveDirRange'], 'WaveDirRange', '- Range of wave directions (full range: WaveDir +/- 1/2*WaveDirRange) (degrees) [only used when WaveMod=2,3,or 4 and WaveDirMod=1]\n')) f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['HydroDyn']['WaveSeed1'], 'WaveSeed(1)', '- First random seed of incident waves [-2147483648 to 2147483647] (-) [unused when WaveMod=0, 5, or 6]\n')) - f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['HydroDyn']['WaveSeed2'], 'WaveSeed(2)', '- Second random seed of incident waves [-2147483648 to 2147483647] (-) [unused when WaveMod=0, 5, or 6]\n')) + + try: + seed2 = int(self.fst_vt['HydroDyn']['WaveSeed2']) + f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['HydroDyn']['WaveSeed2'], 'WaveSeed(2)', '- Second random seed of incident waves [-2147483648 to 2147483647] (-) [unused when WaveMod=0, 5, or 6]\n')) + except ValueError: + f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['HydroDyn']['WaveSeed2'], 'WaveSeed(2)', '- Second random seed of incident waves [-2147483648 to 2147483647] (-) [unused when WaveMod=0, 5, or 6] for intrinsic pRNG, or an alternative pRNG: "RanLux"\n')) + f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['HydroDyn']['WaveNDAmp'], 'WaveNDAmp', '- Flag for normally distributed amplitudes (flag) [only used when WaveMod=2, 3, or 4]\n')) f.write('{:<22} {:<11} {:}'.format('"'+self.fst_vt['HydroDyn']['WvKinFile']+'"', 'WvKinFile', '- Root name of externally generated wave data file(s) (quoted string) [used only when WaveMod=5 or 6]\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['HydroDyn']['NWaveElev'], 'NWaveElev', '- Number of points where the incident wave elevations can be computed (-) [maximum of 9 output locations]\n')) @@ -1517,7 +1500,7 @@ def write_HydroDyn(self): f.write(" ".join(ln) + '\n') f.write('---------------------- MEMBER JOINTS -------------------------------------------\n') f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['HydroDyn']['NJoints'], 'NJoints', '- Number of joints (-) [must be exactly 0 or at least 2]\n')) - f.write(" ".join(['{:^11s}'.format(i) for i in ['JointID', 'Jointxi', 'Jointyi', 'Jointzi', 'JointAxID', 'JointOvrlp']])+' [JointOvrlp= 0: do nothing at joint, 1: eliminate overlaps by calculating super member]\n') + f.write(" ".join(['{:^11s}'.format(i) for i in ['JointID', 'Jointxi', 'Jointyi', 'Jointzi', 'JointAxID', 'JointOvrlp']])+' ! [JointOvrlp= 0: do nothing at joint, 1: eliminate overlaps by calculating super member]\n') f.write(" ".join(['{:^11s}'.format(i) for i in ['(-)', '(m)', '(m)', '(m)', '(-)', '(switch)']])+'\n') for i in range(self.fst_vt['HydroDyn']['NJoints']): ln = [] @@ -1609,7 +1592,7 @@ def write_HydroDyn(self): f.write(" ".join(ln) + '\n') f.write('-------------------- MEMBERS -------------------------------------------------\n') f.write('{:<11d} {:<11} {:}'.format(self.fst_vt['HydroDyn']['NMembers'], 'NMembers', '- Number of members (-)\n')) - f.write(" ".join(['{:^11s}'.format(i) for i in ['MemberID', 'MJointID1', 'MJointID2', 'MPropSetID1', 'MPropSetID2', 'MDivSize', 'MCoefMod', 'PropPot']])+' [MCoefMod=1: use simple coeff table, 2: use depth-based coeff table, 3: use member-based coeff table] [ PropPot/=0 if member is modeled with potential-flow theory]\n') + f.write(" ".join(['{:^11s}'.format(i) for i in ['MemberID', 'MJointID1', 'MJointID2', 'MPropSetID1', 'MPropSetID2', 'MDivSize', 'MCoefMod', 'PropPot']])+' ! [MCoefMod=1: use simple coeff table, 2: use depth-based coeff table, 3: use member-based coeff table] [ PropPot/=0 if member is modeled with potential-flow theory]\n') f.write(" ".join(['{:^11s}'.format(i) for i in ['(-)', '(-)', '(-)', '(-)', '(-)', '(m)', '(switch)', '(flag)']])+'\n') for i in range(self.fst_vt['HydroDyn']['NMembers']): ln = [] @@ -1693,10 +1676,10 @@ def write_SubDyn(self): f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['SubDyn']['Nmodes'], 'Nmodes', '- Number of internal modes to retain (ignored if CBMod=False). If Nmodes=0 --> Guyan Reduction.\n')) JDampings = self.fst_vt['SubDyn']['JDampings'] - if isinstance(JDampings, int): + if isinstance(JDampings, float): f.write('{:<22} {:<11} {:}'.format(self.fst_vt['SubDyn']['JDampings'], 'JDampings', '- Damping Ratios for each retained mode (% of critical) If Nmodes>0, list Nmodes structural damping ratios for each retained mode (% of critical), or a single damping ratio to be applied to all retained modes. (last entered value will be used for all remaining modes).\n')) - else: - f.write('{:<22} {:<11} {:}'.format(", ".join(self.fst_vt['SubDyn']['JDampings']), 'JDampings', '- Damping Ratios for each retained mode (% of critical) If Nmodes>0, list Nmodes structural damping ratios for each retained mode (% of critical), or a single damping ratio to be applied to all retained modes. (last entered value will be used for all remaining modes).\n')) + else: # list of floats + f.write('{:<22} {:<11} {:}'.format(", ".join([f'{d:f}' for d in self.fst_vt['SubDyn']['JDampings']]), 'JDampings', '- Damping Ratios for each retained mode (% of critical) If Nmodes>0, list Nmodes structural damping ratios for each retained mode (% of critical), or a single damping ratio to be applied to all retained modes. (last entered value will be used for all remaining modes).\n')) f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['SubDyn']['GuyanDampMod'], 'GuyanDampMod', '- Guyan damping {0=none, 1=Rayleigh Damping, 2=user specified 6x6 matrix}.\n')) f.write('{:<10}, {:<10} {:<11} {:}'.format(self.fst_vt['SubDyn']['RayleighDamp'][0], self.fst_vt['SubDyn']['RayleighDamp'][1], 'RayleighDamp', '- Mass and stiffness proportional damping coefficients (Rayleigh Damping) [only if GuyanDampMod=1].\n')) f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['SubDyn']['GuyanDampSize'], 'GuyanDampSize', '- Guyan damping matrix (6x6) [only if GuyanDampMod=2].\n')) @@ -1726,7 +1709,7 @@ def write_SubDyn(self): f.write(" ".join(ln) + '\n') f.write('------------------- BASE REACTION JOINTS: 1/0 for Locked/Free DOF @ each Reaction Node ---------------------\n') f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['SubDyn']['NReact'], 'NReact', '- Number of Joints with reaction forces; be sure to remove all rigid motion DOFs of the structure (else det([K])=[0])\n')) - f.write(" ".join(['{:^11s}'.format(i) for i in ['RJointID', 'RctTDXss', 'RctTDYss', 'RctTDZss', 'RctRDXss', 'RctRDYss', 'RctRDZss','SSIfile']])+' [Global Coordinate System]\n') + f.write(" ".join(['{:^11s}'.format(i) for i in ['RJointID', 'RctTDXss', 'RctTDYss', 'RctTDZss', 'RctRDXss', 'RctRDYss', 'RctRDZss','SSIfile']])+' ! [Global Coordinate System]\n') f.write(" ".join(['{:^11s}'.format(i) for i in ['(-)', '(flag)', '(flag)', '(flag)', '(flag)', '(flag)', '(flag)', '(string)']])+'\n') for i in range(self.fst_vt['SubDyn']['NReact']): ln = [] @@ -1741,7 +1724,7 @@ def write_SubDyn(self): f.write(" ".join(ln) + '\n') f.write('------- INTERFACE JOINTS: 1/0 for Locked (to the TP)/Free DOF @each Interface Joint (only Locked-to-TP implemented thus far (=rigid TP)) ---------\n') f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['SubDyn']['NInterf'], 'NInterf', '- Number of interface joints locked to the Transition Piece (TP): be sure to remove all rigid motion dofs\n')) - f.write(" ".join(['{:^11s}'.format(i) for i in ['IJointID', 'ItfTDXss', 'ItfTDYss', 'ItfTDZss', 'ItfRDXss', 'ItfRDYss', 'ItfRDZss']])+' [Global Coordinate System]\n') + f.write(" ".join(['{:^11s}'.format(i) for i in ['IJointID', 'ItfTDXss', 'ItfTDYss', 'ItfTDZss', 'ItfRDXss', 'ItfRDYss', 'ItfRDZss']])+' ! [Global Coordinate System]\n') f.write(" ".join(['{:^11s}'.format(i) for i in ['(-)', '(flag)', '(flag)', '(flag)', '(flag)', '(flag)', '(flag)']])+'\n') for i in range(self.fst_vt['SubDyn']['NInterf']): ln = [] @@ -1864,7 +1847,7 @@ def write_SubDyn(self): f.write('{:<22} {:<11} {:}'.format(self.fst_vt['SubDyn']['OutSFmt'], 'OutSFmt', '- Output format for header strings in the .SD.out file\n')) f.write('------------------------- MEMBER OUTPUT LIST ------------------------------------------\n') f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['SubDyn']['NMOutputs'], 'NMOutputs', '- Number of members whose forces/displacements/velocities/accelerations will be output (-) [Must be <= 9].\n')) - f.write(" ".join(['{:^11s}'.format(i) for i in ['MemberID', 'NOutCnt', 'NodeCnt']])+'[NOutCnt=how many nodes to get output for [< 10]; NodeCnt are local ordinal numbers from the start of the member, and must be >=1 and <= NDiv+1] If NMOutputs=0 leave blank as well.\n') + f.write(" ".join(['{:^11s}'.format(i) for i in ['MemberID', 'NOutCnt', 'NodeCnt']])+' ! [NOutCnt=how many nodes to get output for [< 10]; NodeCnt are local ordinal numbers from the start of the member, and must be >=1 and <= NDiv+1] If NMOutputs=0 leave blank as well.\n') f.write(" ".join(['{:^11s}'.format(i) for i in ['(-)','(-)','(-)']])+'\n') for i in range(self.fst_vt['SubDyn']['NMOutputs']): ln = [] @@ -1951,55 +1934,60 @@ def write_MoorDyn(self): f.write('Generated with AeroElasticSE FAST driver\n') f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['MoorDyn']['Echo'], 'Echo', '- echo the input file data (flag)\n')) f.write('----------------------- LINE TYPES ------------------------------------------\n') - f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['MoorDyn']['NTypes'], 'NTypes', '- number of LineTypes\n')) - f.write(" ".join(['{:^11s}'.format(i) for i in ['Name', 'Diam', 'MassDen', 'EA', 'BA/-zeta', 'Can', 'Cat', 'Cdn', 'Cdt']])+'\n') - f.write(" ".join(['{:^11s}'.format(i) for i in ['(-)', '(m)', '(kg/m)', '(N)', '(N-s/-)', '(-)', '(-)', '(-)', '(-)']])+'\n') - for i in range(self.fst_vt['MoorDyn']['NTypes']): + f.write(" ".join(['{:^11s}'.format(i) for i in ['Name', 'Diam', 'MassDen', 'EA', 'BA/-zeta', 'EI', 'Cd', 'Ca', 'CdAx', 'CaAx']])+'\n') + f.write(" ".join(['{:^11s}'.format(i) for i in ['(-)', '(m)', '(kg/m)', '(N)', '(N-s/-)', '(-)', '(-)', '(-)', '(-)', '(-)']])+'\n') + for i in range(len(self.fst_vt['MoorDyn']['Name'])): ln = [] ln.append('{:^11}'.format(self.fst_vt['MoorDyn']['Name'][i])) ln.append('{:^11}'.format(self.fst_vt['MoorDyn']['Diam'][i])) ln.append('{:^11}'.format(self.fst_vt['MoorDyn']['MassDen'][i])) ln.append('{:^11}'.format(self.fst_vt['MoorDyn']['EA'][i])) ln.append('{:^11}'.format(self.fst_vt['MoorDyn']['BA_zeta'][i])) - ln.append('{:^11}'.format(self.fst_vt['MoorDyn']['Can'][i])) - ln.append('{:^11}'.format(self.fst_vt['MoorDyn']['Cat'][i])) - ln.append('{:^11}'.format(self.fst_vt['MoorDyn']['Cdn'][i])) - ln.append('{:^11}'.format(self.fst_vt['MoorDyn']['Cdt'][i])) + ln.append('{:^11}'.format(self.fst_vt['MoorDyn']['EI'][i])) + ln.append('{:^11}'.format(self.fst_vt['MoorDyn']['Cd'][i])) + ln.append('{:^11}'.format(self.fst_vt['MoorDyn']['Ca'][i])) + ln.append('{:^11}'.format(self.fst_vt['MoorDyn']['CdAx'][i])) + ln.append('{:^11}'.format(self.fst_vt['MoorDyn']['CaAx'][i])) f.write(" ".join(ln) + '\n') - f.write('---------------------- CONNECTION PROPERTIES --------------------------------\n') - f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['MoorDyn']['NConnects'], 'NConnects', '- number of connections including anchors and fairleads\n')) - f.write(" ".join(['{:^11s}'.format(i) for i in ['Node', 'Type', 'X', 'Y', 'Z', 'M', 'V', 'FX', 'FY', 'FZ', 'CdA', 'CA']])+'\n') - f.write(" ".join(['{:^11s}'.format(i) for i in ['(-)', '(-)', '(m)', '(m)', '(m)', '(kg)', '(m^3)', '(kN)', '(kN)', '(kN)', '(m^2)', '(-)']])+'\n') - for i in range(self.fst_vt['MoorDyn']['NConnects']): + f.write('---------------------- POINTS --------------------------------\n') + f.write(" ".join(['{:^11s}'.format(i) for i in ['ID', 'Attachment', 'X', 'Y', 'Z', 'M', 'V', 'CdA', 'CA']])+'\n') + f.write(" ".join(['{:^11s}'.format(i) for i in ['(-)', '(-)', '(m)', '(m)', '(m)', '(kg)', '(m^3)', '(m^2)', '(-)']])+'\n') + for i in range(len(self.fst_vt['MoorDyn']['Point_ID'])): ln = [] - ln.append('{:^11d}'.format(self.fst_vt['MoorDyn']['Node'][i])) - ln.append('{:^11}'.format(self.fst_vt['MoorDyn']['Type'][i])) + ln.append('{:^11d}'.format(self.fst_vt['MoorDyn']['Point_ID'][i])) + ln.append('{:^11}'.format(self.fst_vt['MoorDyn']['Attachment'][i])) ln.append('{:^11}'.format(self.fst_vt['MoorDyn']['X'][i])) ln.append('{:^11}'.format(self.fst_vt['MoorDyn']['Y'][i])) ln.append('{:^11}'.format(self.fst_vt['MoorDyn']['Z'][i])) ln.append('{:^11}'.format(self.fst_vt['MoorDyn']['M'][i])) ln.append('{:^11}'.format(self.fst_vt['MoorDyn']['V'][i])) - ln.append('{:^11}'.format(self.fst_vt['MoorDyn']['FX'][i])) - ln.append('{:^11}'.format(self.fst_vt['MoorDyn']['FY'][i])) - ln.append('{:^11}'.format(self.fst_vt['MoorDyn']['FZ'][i])) ln.append('{:^11}'.format(self.fst_vt['MoorDyn']['CdA'][i])) ln.append('{:^11}'.format(self.fst_vt['MoorDyn']['CA'][i])) f.write(" ".join(ln) + '\n') - f.write('---------------------- LINE PROPERTIES --------------------------------------\n') - f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['MoorDyn']['NLines'], 'NLines', '- number of line objects\n')) - f.write(" ".join(['{:^11s}'.format(i) for i in ['Line', 'LineType', 'UnstrLen', 'NumSegs', 'NodeAnch', 'NodeFair', 'Outputs', 'CtrlChan']])+'\n') - f.write(" ".join(['{:^11s}'.format(i) for i in ['(-)', '(-)', '(m)', '(-)', '(-)', '(-)', '(-)', '(-)']])+'\n') - for i in range(self.fst_vt['MoorDyn']['NLines']): + f.write('---------------------- LINES --------------------------------------\n') + f.write(" ".join(['{:^11s}'.format(i) for i in ['Line', 'LineType', 'AttachA', 'AttachB', 'UnstrLen', 'NumSegs', 'Outputs']])+'\n') + f.write(" ".join(['{:^11s}'.format(i) for i in ['(-)', '(-)', '(-)', '(-)', '(m)', '(-)', '(-)']])+'\n') + for i in range(len(self.fst_vt['MoorDyn']['Line_ID'])): ln = [] - ln.append('{:^11d}'.format(self.fst_vt['MoorDyn']['Line'][i])) + ln.append('{:^11d}'.format(self.fst_vt['MoorDyn']['Line_ID'][i])) ln.append('{:^11}'.format(self.fst_vt['MoorDyn']['LineType'][i])) + ln.append('{:^11d}'.format(self.fst_vt['MoorDyn']['AttachA'][i])) + ln.append('{:^11d}'.format(self.fst_vt['MoorDyn']['AttachB'][i])) ln.append('{:^11}'.format(self.fst_vt['MoorDyn']['UnstrLen'][i])) ln.append('{:^11d}'.format(self.fst_vt['MoorDyn']['NumSegs'][i])) - ln.append('{:^11d}'.format(self.fst_vt['MoorDyn']['NodeAnch'][i])) - ln.append('{:^11d}'.format(self.fst_vt['MoorDyn']['NodeFair'][i])) ln.append('{:^11}'.format(self.fst_vt['MoorDyn']['Outputs'][i])) - ln.append('{:^11}'.format(self.fst_vt['MoorDyn']['CtrlChan'][i])) f.write(" ".join(ln) + '\n') + + if self.fst_vt['MoorDyn']['ChannelID']: # There are control inputs + f.write('---------------------- CONTROL ---------------------------------------\n') + f.write(" ".join(['{:^11s}'.format(i) for i in ['ChannelID', 'Line(s)']])+'\n') + f.write(" ".join(['{:^11s}'.format(i) for i in ['()', '(,)']])+'\n') + for i_line in range(len(self.fst_vt['MoorDyn']['ChannelID'])): + ln = [] + ln.append('{:^11d}'.format(self.fst_vt['MoorDyn']['ChannelID'][i_line])) + ln.append(','.join(self.fst_vt['MoorDyn']['Lines_Control'][i_line])) + f.write(" ".join(ln) + '\n') + f.write('---------------------- SOLVER OPTIONS ---------------------------------------\n') f.write('{:<22} {:<11} {:}'.format(self.fst_vt['MoorDyn']['dtM'], 'dtM', '- time step to use in mooring integration (s)\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['MoorDyn']['kbot'], 'kbot', '- bottom stiffness (Pa/m)\n')) @@ -2016,350 +2004,146 @@ def write_MoorDyn(self): f.write('END\n') f.write('------------------------- need this line --------------------------------------\n') - f.close() - -class InputWriter_FAST7(InputWriter_Common): - - def execute(self): + f.close() - if not os.path.exists(self.FAST_runDirectory): - os.makedirs(self.FAST_runDirectory) - - # self.write_WindWnd() - self.write_ElastoDynBlade() - self.write_ElastoDynTower() - self.write_AeroDyn_FAST7() - - self.write_MainInput() - - def write_MainInput(self): - - self.FAST_InputFileOut = os.path.join(self.FAST_runDirectory, self.FAST_namingOut+'.fst') - ofh = open(self.FAST_InputFileOut, 'w') - - # FAST Inputs - ofh.write('---\n') - ofh.write('---\n') - ofh.write('{:}\n'.format(self.fst_vt['description'])) - ofh.write('---\n') - ofh.write('---\n') - ofh.write('{:}\n'.format(self.fst_vt['Fst7']['Echo'])) - ofh.write('{:3}\n'.format(self.fst_vt['Fst7']['ADAMSPrep'])) - ofh.write('{:3}\n'.format(self.fst_vt['Fst7']['AnalMode'])) - ofh.write('{:3}\n'.format(self.fst_vt['Fst7']['NumBl'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TMax'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['DT'])) - ofh.write('---\n') - ofh.write('{:3}\n'.format(self.fst_vt['Fst7']['YCMode'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TYCOn'])) - ofh.write('{:3}\n'.format(self.fst_vt['Fst7']['PCMode'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TPCOn'])) - ofh.write('{:3}\n'.format(self.fst_vt['Fst7']['VSContrl'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['VS_RtGnSp'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['VS_RtTq'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['VS_Rgn2K'])) - ofh.write('{:.5e}\n'.format(self.fst_vt['Fst7']['VS_SlPc'])) - ofh.write('{:3}\n'.format(self.fst_vt['Fst7']['GenModel'])) - ofh.write('{:}\n'.format(self.fst_vt['Fst7']['GenTiStr'])) - ofh.write('{:}\n'.format(self.fst_vt['Fst7']['GenTiStp'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['SpdGenOn'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TimGenOn'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TimGenOf'])) - ofh.write('{:3}\n'.format(self.fst_vt['Fst7']['HSSBrMode'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['THSSBrDp'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TiDynBrk'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TTpBrDp1'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TTpBrDp2'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TTpBrDp3'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TBDepISp1'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TBDepISp2'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TBDepISp3'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TYawManS'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TYawManE'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['NacYawF'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TPitManS1'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TPitManS2'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TPitManS3'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TPitManE1'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TPitManE2'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TPitManE3'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['BlPitch1'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['BlPitch2'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['BlPitch3'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['B1PitchF1'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['B1PitchF2'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['B1PitchF3'])) - ofh.write('---\n') - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['Gravity'])) - ofh.write('---\n') - ofh.write('{:}\n'.format(self.fst_vt['Fst7']['FlapDOF1'])) - ofh.write('{:}\n'.format(self.fst_vt['Fst7']['FlapDOF2'])) - ofh.write('{:}\n'.format(self.fst_vt['Fst7']['EdgeDOF'])) - ofh.write('{:}\n'.format(self.fst_vt['Fst7']['TeetDOF'])) - ofh.write('{:}\n'.format(self.fst_vt['Fst7']['DrTrDOF'])) - ofh.write('{:}\n'.format(self.fst_vt['Fst7']['GenDOF'])) - ofh.write('{:}\n'.format(self.fst_vt['Fst7']['YawDOF'])) - ofh.write('{:}\n'.format(self.fst_vt['Fst7']['TwFADOF1'])) - ofh.write('{:}\n'.format(self.fst_vt['Fst7']['TwFADOF2'])) - ofh.write('{:}\n'.format(self.fst_vt['Fst7']['TwSSDOF1'])) - ofh.write('{:}\n'.format(self.fst_vt['Fst7']['TwSSDOF2'])) - ofh.write('{:}\n'.format(self.fst_vt['Fst7']['CompAero'])) - ofh.write('{:}\n'.format(self.fst_vt['Fst7']['CompNoise'])) - ofh.write('---\n') - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['OoPDefl'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['IPDefl'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TeetDefl'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['Azimuth'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['RotSpeed'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['NacYaw'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TTDspFA'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TTDspSS'])) - ofh.write('---\n') - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TipRad'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['HubRad'])) - ofh.write('{:3}\n'.format(self.fst_vt['Fst7']['PSpnElN'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['UndSling'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['HubCM'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['OverHang'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['NacCMxn'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['NacCMyn'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['NacCMzn'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TowerHt'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['Twr2Shft'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TwrRBHt'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['ShftTilt'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['Delta3'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['PreCone(1)'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['PreCone(2)'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['PreCone(3)'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['AzimB1Up'])) - ofh.write('---\n') - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['YawBrMass'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['NacMass'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['HubMass'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TipMass(1)'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TipMass(2)'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TipMass(3)'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['NacYIner'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['GenIner'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['HubIner'])) - ofh.write('---\n') - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['GBoxEff'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['GenEff'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['GBRatio'])) - ofh.write('{:}\n'.format(self.fst_vt['Fst7']['GBRevers'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['HSSBrTqF'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['HSSBrDT'])) - ofh.write('{:}\n'.format(self.fst_vt['Fst7']['DynBrkFi'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['DTTorSpr'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['DTTorDmp'])) - ofh.write('---\n') - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['SIG_SlPc'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['SIG_SySp'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['SIG_RtTq'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['SIG_PORt'])) - ofh.write('---\n') - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TEC_Freq'])) - ofh.write('{:5}\n'.format(self.fst_vt['Fst7']['TEC_NPol'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TEC_SRes'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TEC_RRes'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TEC_VLL'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TEC_SLR'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TEC_RLR'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TEC_MR'])) - ofh.write('---\n') - ofh.write('{:3}\n'.format(self.fst_vt['Fst7']['PtfmModel'])) - ofh.write('"{:}"\n'.format(self.fst_vt['Fst7']['PtfmFile'])) - ofh.write('---\n') - ofh.write('{:3}\n'.format(self.fst_vt['Fst7']['TwrNodes'])) - ofh.write('"{:}"\n'.format(self.fst_vt['Fst7']['TwrFile'])) - ofh.write('---\n') - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['YawSpr'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['YawDamp'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['YawNeut'])) - ofh.write('---\n') - ofh.write('{:}\n'.format(self.fst_vt['Fst7']['Furling'])) - ofh.write('{:}\n'.format(self.fst_vt['Fst7']['FurlFile'])) - ofh.write('---\n') - ofh.write('{:}\n'.format(self.fst_vt['Fst7']['TeetMod'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TeetDmpP'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TeetDmp'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TeetCDmp'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TeetSStP'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TeetHStP'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TeetSSSp'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TeetHSSp'])) - ofh.write('---\n') - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TBDrConN'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TBDrConD'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TpBrDT'])) - ofh.write('---\n') - ofh.write('"{:}"\n'.format(self.fst_vt['Fst7']['BldFile1'])) - ofh.write('"{:}"\n'.format(self.fst_vt['Fst7']['BldFile2'])) - ofh.write('"{:}"\n'.format(self.fst_vt['Fst7']['BldFile3'])) - ofh.write('---\n') - ofh.write('"{:}"\n'.format(self.fst_vt['Fst7']['ADFile'])) - ofh.write('---\n') - ofh.write('{:}\n'.format(self.fst_vt['Fst7']['NoiseFile'])) - ofh.write('---\n') - ofh.write('{:}\n'.format(self.fst_vt['Fst7']['ADAMSFile'])) - ofh.write('---\n') - ofh.write('{:}\n'.format(self.fst_vt['Fst7']['LinFile'])) - ofh.write('---\n') - ofh.write('{:}\n'.format(self.fst_vt['Fst7']['SumPrint'])) - ofh.write('{:}\n'.format(self.fst_vt['Fst7']['OutFileFmt'])) - ofh.write('{:}\n'.format(self.fst_vt['Fst7']['TabDelim'])) - ofh.write('{:}\n'.format(self.fst_vt['Fst7']['OutFmt'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['TStart'])) - ofh.write('{:3}\n'.format(self.fst_vt['Fst7']['DecFact'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['SttsTime'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['NcIMUxn'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['NcIMUyn'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['NcIMUzn'])) - ofh.write('{:.9f}\n'.format(self.fst_vt['Fst7']['ShftGagL'])) - ofh.write('{:3}\n'.format(self.fst_vt['Fst7']['NTwGages'])) - for i in range(self.fst_vt['Fst7']['NTwGages']-1): - ofh.write('{:3}, '.format(self.fst_vt['Fst7']['TwrGagNd'][i])) - ofh.write('{:3}\n'.format(self.fst_vt['Fst7']['TwrGagNd'][-1])) - ofh.write('{:3}\n'.format(self.fst_vt['Fst7']['NBlGages'])) - for i in range(self.fst_vt['Fst7']['NBlGages']-1): - ofh.write('{:3}, '.format(self.fst_vt['Fst7']['BldGagNd'][i])) - ofh.write('{:3}\n'.format(self.fst_vt['Fst7']['BldGagNd'][-1])) - - # Outlist - ofh.write('Outlist\n') - outlist = self.get_outlist(self.fst_vt['outlist7'], ['OutList']) - for channel_list in outlist: - for i in range(len(channel_list)): - f.write('"' + channel_list[i] + '"\n') - ofh.write('END\n') - ofh.close() - ofh.close() - - def write_AeroDyn_FAST7(self): - if not os.path.isdir(os.path.join(self.FAST_runDirectory,'AeroData')): - os.mkdir(os.path.join(self.FAST_runDirectory,'AeroData')) + def write_StC(self,StC_vt,StC_filename): - # create airfoil objects - for i in range(self.fst_vt['AeroDyn14']['NumFoil']): - af_name = os.path.join(self.FAST_runDirectory, 'AeroData', 'Airfoil' + str(i) + '.dat') - self.fst_vt['AeroDyn14']['FoilNm'][i] = os.path.join('AeroData', 'Airfoil' + str(i) + '.dat') - self.write_AeroDyn14Polar(af_name, i) - - self.fst_vt['Fst7']['ADFile'] = self.FAST_namingOut + '_AeroDyn.dat' - ad_file = os.path.join(self.FAST_runDirectory,self.fst_vt['Fst7']['ADFile']) - ofh = open(ad_file,'w') + stc_file = os.path.join(self.FAST_runDirectory, StC_filename) + f = open(stc_file, 'w') - ofh.write('Aerodyn input file for FAST\n') + f.write('------- STRUCTURAL CONTROL (StC) INPUT FILE ----------------------------\n') + f.write('Generated with AeroElasticSE FAST driver within WEIS\n') - ofh.write('{:}\n'.format(self.fst_vt['AeroDyn14']['SysUnits'])) - ofh.write('{:}\n'.format(self.fst_vt['AeroDyn14']['StallMod'])) + f.write('---------------------- SIMULATION CONTROL --------------------------------------\n') + f.write('{!s:<22} {:<11} {:}'.format(StC_vt['Echo'], 'Echo', '- Echo input data to ".SD.ech" (flag)\n')) - ofh.write('{:}\n'.format(self.fst_vt['AeroDyn14']['UseCm'])) - ofh.write('{:}\n'.format(self.fst_vt['AeroDyn14']['InfModel'])) - ofh.write('{:}\n'.format(self.fst_vt['AeroDyn14']['IndModel'])) - ofh.write('{:.3f}\n'.format(self.fst_vt['AeroDyn14']['AToler'])) - ofh.write('{:}\n'.format(self.fst_vt['AeroDyn14']['TLModel'])) - ofh.write('{:}\n'.format(self.fst_vt['AeroDyn14']['HLModel'])) - ofh.write('"{:}"\n'.format(self.fst_vt['AeroDyn14']['WindFile'])) - ofh.write('{:f}\n'.format(self.fst_vt['AeroDyn14']['HH'])) - - ofh.write('{:.1f}\n'.format(self.fst_vt['AeroDyn14']['TwrShad'])) - - ofh.write('{:.1f}\n'.format(self.fst_vt['AeroDyn14']['ShadHWid'])) - - ofh.write('{:.1f}\n'.format(self.fst_vt['AeroDyn14']['T_Shad_Refpt'])) - - ofh.write('{:.3f}\n'.format(self.fst_vt['AeroDyn14']['AirDens'])) - - ofh.write('{:.9f}\n'.format(self.fst_vt['AeroDyn14']['KinVisc'])) - - ofh.write('{:2}\n'.format(self.fst_vt['AeroDyn14']['DTAero'])) + f.write('---------------------- StC DEGREES OF FREEDOM ----------------------------------\n') + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_DOF_MODE'], 'StC_DOF_MODE', '- DOF mode (switch) {0: No StC or TLCD DOF; 1: StC_X_DOF, StC_Y_DOF, and/or StC_Z_DOF (three independent StC DOFs); 2: StC_XY_DOF (Omni-Directional StC); 3: TLCD; 4: Prescribed force/moment time series}\n')) + f.write('{!s:<22} {:<11} {:}'.format(StC_vt['StC_X_DOF'], 'StC_X_DOF', '- DOF on or off for StC X (flag) [Used only when StC_DOF_MODE=1]\n')) + f.write('{!s:<22} {:<11} {:}'.format(StC_vt['StC_Y_DOF'], 'StC_Y_DOF', '- DOF on or off for StC Y (flag) [Used only when StC_DOF_MODE=1]\n')) + f.write('{!s:<22} {:<11} {:}'.format(StC_vt['StC_Z_DOF'], 'StC_Z_DOF', '- DOF on or off for StC Z (flag) [Used only when StC_DOF_MODE=1]\n')) + f.write('---------------------- StC LOCATION ------------------------------------------- [relative to the reference origin of component attached to]\n') + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_P_X'], 'StC_P_X', '- At rest X position of StC (m)\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_P_Y'], 'StC_P_Y', '- At rest Y position of StC (m)\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_P_Z'], 'StC_P_Z', '- At rest Z position of StC (m)\n')) + + f.write('---------------------- StC INITIAL CONDITIONS --------------------------------- [used only when StC_DOF_MODE=1 or 2]\n') + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_X_DSP'], 'StC_X_DSP', '- StC X initial displacement (m) [relative to at rest position]\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Y_DSP'], 'StC_Y_DSP', '- StC Y initial displacement (m) [relative to at rest position]\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Z_DSP'], 'StC_Z_DSP', '- StC Z initial displacement (m) [relative to at rest position; used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE]\n')) + f.write('{!s:<22} {:<11} {:}'.format(StC_vt['StC_Z_PreLd'], 'StC_Z_PreLd', '- StC Z pre-load (N) {"gravity" to offset for gravity load; "none" or 0 to turn off} [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE]\n')) + + f.write('---------------------- StC CONFIGURATION -------------------------------------- [used only when StC_DOF_MODE=1 or 2]\n') + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_X_PSP'], 'StC_X_PSP', '- Positive stop position (maximum X mass displacement) (m)\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_X_NSP'], 'StC_X_NSP', '- Negative stop position (minimum X mass displacement) (m)\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Y_PSP'], 'StC_Y_PSP', '- Positive stop position (maximum Y mass displacement) (m)\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Y_NSP'], 'StC_Y_NSP', '- Negative stop position (minimum Y mass displacement) (m)\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Z_PSP'], 'StC_Z_PSP', '- Positive stop position (maximum Z mass displacement) (m) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE]\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Z_NSP'], 'StC_Z_NSP', '- Negative stop position (minimum Z mass displacement) (m) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE]\n')) + + f.write('---------------------- StC MASS, STIFFNESS, & DAMPING ------------------------- [used only when StC_DOF_MODE=1 or 2]\n') + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_X_M'], 'StC_X_M', '- StC X mass (kg) [must equal StC_Y_M for StC_DOF_MODE = 2]\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Y_M'], 'StC_Y_M', '- StC Y mass (kg) [must equal StC_X_M for StC_DOF_MODE = 2]\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Z_M'], 'StC_Z_M', '- StC Z mass (kg) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE]\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_XY_M'], 'StC_XY_M', '- StC Z mass (kg) [used only when StC_DOF_MODE=2]\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_X_K'], 'StC_X_K', '- StC X stiffness (N/m)\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Y_K'], 'StC_Y_K', '- StC Y stiffness (N/m)\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Z_K'], 'StC_Z_K', '- StC Z stiffness (N/m) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE]\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_X_C'], 'StC_X_C', '- StC X damping (N/(m/s))\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Y_C'], 'StC_Y_C', '- StC Y damping (N/(m/s))\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Z_C'], 'StC_Z_C', '- StC Z damping (N/(m/s)) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE]\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_X_KS'], 'StC_X_KS', '- Stop spring X stiffness (N/m)\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Y_KS'], 'StC_Y_KS', '- Stop spring Y stiffness (N/m)\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Z_KS'], 'StC_Z_KS', '- Stop spring Z stiffness (N/m) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE]\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_X_CS'], 'StC_X_CS', '- Stop spring X damping (N/(m/s))\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Y_CS'], 'StC_Y_CS', '- Stop spring Y damping (N/(m/s))\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Z_CS'], 'StC_Z_CS', '- Stop spring Z damping (N/(m/s)) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE]\n')) + + f.write('---------------------- StC USER-DEFINED SPRING FORCES ------------------------- [used only when StC_DOF_MODE=1 or 2]\n') + f.write('{!s:<22} {:<11} {:}'.format(StC_vt['Use_F_TBL'], 'Use_F_TBL', '- Use spring force from user-defined table (flag)\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['NKInpSt'], 'NKInpSt', '- Number of spring force input stations\n')) + + f.write('---------------------- StC SPRING FORCES TABLE -------------------------------- [used only when StC_DOF_MODE=1 or 2]\n') + f.write('X F_X Y F_Y Z F_Z\n') + f.write('(m) (N) (m) (N) (m) (N)\n') + table = StC_vt['SpringForceTable'] + for x, f_x, y, f_y, z, f_z in zip(table['X'],table['F_X'],table['Y'],table['F_Y'],table['Z'],table['F_Z']): + row = [x, f_x, y, f_y, z, f_z] + f.write(' '.join(['{: 2.8e}'.format(val) for val in row])+'\n') + + f.write('---------------------- StructCtrl CONTROL -------------------------------------------- [used only when StC_DOF_MODE=1 or 2]\n') + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_CMODE'], 'StC_CMODE', '- Control mode (switch) {0:none; 1: Semi-Active Control Mode; 2: Active Control Mode}\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_CChan'], 'StC_CChan', '- Control channel group (1:10) for stiffness and damping (StC_[XYZ]_K, StC_[XYZ]_C, and StC_[XYZ]_Brake) (specify additional channels for blade instances of StC active control -- one channel per blade) [used only when StC_DOF_MODE=1 or 2, and StC_CMODE=4 or 5]\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_SA_MODE'], 'StC_SA_MODE', '- Semi-Active control mode {1: velocity-based ground hook control; 2: Inverse velocity-based ground hook control; 3: displacement-based ground hook control 4: Phase difference Algorithm with Friction Force 5: Phase difference Algorithm with Damping Force} (-)\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_X_C_HIGH'], 'StC_X_C_HIGH', '- StC X high damping for ground hook control\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_X_C_LOW'], 'StC_X_C_LOW', '- StC X low damping for ground hook control\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Y_C_HIGH'], 'StC_Y_C_HIGH', '- StC Y high damping for ground hook control\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Y_C_LOW'], 'StC_Y_C_LOW', '- StC Y low damping for ground hook control\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Z_C_HIGH'], 'StC_Z_C_HIGH', '- StC Z high damping for ground hook control [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE]\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Z_C_LOW'], 'StC_Z_C_LOW', '- StC Z low damping for ground hook control [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE]\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_X_C_BRAKE'], 'StC_X_C_BRAKE', '- StC X high damping for braking the StC (Don''t use it now. should be zero)\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Y_C_BRAKE'], 'StC_Y_C_BRAKE', '- StC Y high damping for braking the StC (Don''t use it now. should be zero)\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Z_C_BRAKE'], 'StC_Z_C_BRAKE', '- StC Z high damping for braking the StC (Don''t use it now. should be zero) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE]\n')) + + f.write('---------------------- TLCD --------------------------------------------------- [used only when StC_DOF_MODE=3]\n') + f.write('{:<22} {:<11} {:}'.format(StC_vt['L_X'], 'L_X', '- X TLCD total length (m)\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['B_X'], 'B_X', '- X TLCD horizontal length (m)\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['area_X'], 'area_X', '- X TLCD cross-sectional area of vertical column (m^2)\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['area_ratio_X'], 'area_ratio_X', '- X TLCD cross-sectional area ratio (vertical column area divided by horizontal column area) (-)\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['headLossCoeff_X'], 'headLossCoeff_X', '- X TLCD head loss coeff (-)\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['rho_X'], 'rho_X', '- X TLCD liquid density (kg/m^3)\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['L_Y'], 'L_Y', '- Y TLCD total length (m)\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['B_Y'], 'B_Y', '- Y TLCD horizontal length (m)\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['area_Y'], 'area_Y', '- Y TLCD cross-sectional area of vertical column (m^2)\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['area_ratio_Y'], 'area_ratio_Y', '- Y TLCD cross-sectional area ratio (vertical column area divided by horizontal column area) (-)\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['headLossCoeff_Y'], 'headLossCoeff_Y', '- Y TLCD head loss coeff (-)\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['rho_Y'], 'rho_Y', '- Y TLCD liquid density (kg/m^3)\n')) + + f.write('---------------------- PRESCRIBED TIME SERIES --------------------------------- [used only when StC_DOF_MODE=4]\n') + f.write('{:<22} {:<11} {:}'.format(StC_vt['PrescribedForcesCoord'], 'PrescribedForcesCoord', '- Prescribed forces are in global or local coordinates (switch) {1: global; 2: local}\n')) + f.write('{!s:<22} {:<11} {:}'.format(StC_vt['PrescribedForcesFile'], 'PrescribedForcesFile', '- Time series force and moment (7 columns of time, FX, FY, FZ, MX, MY, MZ)\n')) + f.write('-------------------------------------------------------------------------------\n') - ofh.write('{:2}\n'.format(self.fst_vt['AeroDyn14']['NumFoil'])) - for i in range (self.fst_vt['AeroDyn14']['NumFoil']): - ofh.write('"{:}"\n'.format(self.fst_vt['AeroDyn14']['FoilNm'][i])) - - ofh.write('{:2}\n'.format(self.fst_vt['AeroDynBlade']['BldNodes'])) - rnodes = self.fst_vt['AeroDynBlade']['RNodes'] - twist = self.fst_vt['AeroDynBlade']['AeroTwst'] - drnodes = self.fst_vt['AeroDynBlade']['DRNodes'] - chord = self.fst_vt['AeroDynBlade']['Chord'] - nfoil = self.fst_vt['AeroDynBlade']['NFoil'] - prnelm = self.fst_vt['AeroDynBlade']['PrnElm'] - ofh.write('Nodal properties\n') - for r, t, dr, c, a, p in zip(rnodes, twist, drnodes, chord, nfoil, prnelm): - ofh.write('{: 2.15e}\t{:.3f}\t{:.4f}\t{:.3f}\t{:5}\t{:}\n'.format(r, t, dr, c, a, p)) - - ofh.close() - - + f.close() if __name__=="__main__": - FAST_ver = 'openfast' - read_yaml = False - fst_update = {} fst_update['Fst', 'TMax'] = 20. fst_update['AeroDyn15', 'TwrAero'] = False + examples_dir = os.path.dirname( os.path.dirname( os.path.dirname( os.path.realpath(__file__) ) ) ) + os.sep - if read_yaml: - fast = InputReader_Common(FAST_ver=FAST_ver) - fast.FAST_yamlfile = 'temp/OpenFAST/test.yaml' - fast.read_yaml() - - if FAST_ver.lower() == 'fast7': - if not read_yaml: - fast = InputReader_FAST7(FAST_ver=FAST_ver) - fast.FAST_InputFile = 'Test16.fst' # FAST input file (ext=.fst) - fast.FAST_directory = 'C:/Users/egaertne/WT_Codes/models/FAST_v7.02.00d-bjj/CertTest/' # Path to fst directory files - fast.execute() - - fastout = InputWriter_FAST7(FAST_ver=FAST_ver) - fastout.fst_vt = fast.fst_vt - fastout.FAST_runDirectory = 'temp/FAST7' - fastout.FAST_namingOut = 'test' - fastout.execute() - - elif FAST_ver.lower() == 'fast8': - if not read_yaml: - fast = InputReader_OpenFAST(FAST_ver=FAST_ver) - fast.FAST_InputFile = 'NREL5MW_onshore.fst' # FAST input file (ext=.fst) - fast.FAST_directory = 'C:/Users/egaertne/WT_Codes/models/FAST_v8.16.00a-bjj/ref/5mw_onshore/' # Path to fst directory files - fast.execute() - - fastout = InputWriter_OpenFAST(FAST_ver=FAST_ver) - fastout.fst_vt = fast.fst_vt - fastout.FAST_runDirectory = 'temp/FAST8' - fastout.FAST_namingOut = 'test' - fastout.execute() - - elif FAST_ver.lower() == 'openfast': - if not read_yaml: - fast = InputReader_OpenFAST(FAST_ver=FAST_ver) - # fast.FAST_InputFile = '5MW_Land_DLL_WTurb.fst' # FAST input file (ext=.fst) - # fast.FAST_directory = 'C:/Users/egaertne/WT_Codes/models/openfast/glue-codes/fast/5MW_Land_DLL_WTurb' # Path to fst directory files - - # fast.FAST_InputFile = "5MW_OC4Jckt_DLL_WTurb_WavesIrr_MGrowth.fst" - # fast.FAST_directory = 'C:/Users/egaertne/WT_Codes/models/openfast-dev/r-test/glue-codes/openfast/5MW_OC4Jckt_DLL_WTurb_WavesIrr_MGrowth' - - fast.FAST_InputFile = '5MW_OC3Spar_DLL_WTurb_WavesIrr.fst' # FAST input file (ext=.fst) - fast.FAST_directory = 'C:/Users/egaertne/WT_Codes/models/openfast-dev/r-test/glue-codes/openfast/5MW_OC3Spar_DLL_WTurb_WavesIrr' # Path to fst directory files - - fast.execute() - - fastout = InputWriter_OpenFAST(FAST_ver=FAST_ver) - fastout.fst_vt = fast.fst_vt - fastout.FAST_runDirectory = 'temp/OpenFAST' - fastout.FAST_namingOut = 'test' - fastout.update(fst_update=fst_update) - fastout.execute() + # Read the model + fast = InputReader_OpenFAST() + fast.FAST_InputFile = 'IEA-15-240-RWT-UMaineSemi.fst' # FAST input file (ext=.fst) + fast.FAST_directory = os.path.join(examples_dir, 'examples', '01_aeroelasticse', + 'OpenFAST_models', 'IEA-15-240-RWT', + 'IEA-15-240-RWT-UMaineSemi') # Path to fst directory files + fast.execute() - fastout.write_yaml() + # Write out the model + fastout = InputWriter_OpenFAST() + fastout.fst_vt = fast.fst_vt + fastout.FAST_runDirectory = 'temp/OpenFAST' + fastout.FAST_namingOut = 'iea15' + fastout.update(fst_update=fst_update) + fastout.execute() + + # import pickle + # with open('fst_vt.pkl','rb') as f: + # fst_vt = pickle.load(f) + + # fastout = InputWriter_OpenFAST() + # fastout.FAST_runDirectory = 'none' + + # fst_vt['TStC'][0]['NKInpSt'] = 2 + + # for i_TStC, TStC in enumerate(fst_vt['TStC']): + # fastout.write_StC(TStC,fst_vt['ServoDyn']['TStCfiles'][i_TStC]) + # print('here') diff --git a/ROSCO/ROSCO_toolbox/ofTools/fast_io/output_processing.py b/ROSCO/ROSCO_toolbox/ofTools/fast_io/output_processing.py index 266a9da2e..ef3684b1f 100644 --- a/ROSCO/ROSCO_toolbox/ofTools/fast_io/output_processing.py +++ b/ROSCO/ROSCO_toolbox/ofTools/fast_io/output_processing.py @@ -15,6 +15,7 @@ from matplotlib import transforms from itertools import takewhile import struct +import multiprocessing as mp from ROSCO_toolbox.ofTools.util import spectral @@ -39,7 +40,7 @@ def __init__(self, filenames=[], cases=None, tmin=None, tmax=None, verbose=False if len(filenames) > 0: self.load_fast_out(filenames, tmin=tmin, tmax=tmax, verbose=verbose) - def load_fast_out(self, filenames, tmin=None, tmax=None, verbose=False): + def load_fast_out(self, filenames, tmin=None, tmax=None, verbose=False, max_cores=4): """Load a FAST binary or ascii output file Parameters @@ -52,6 +53,8 @@ def load_fast_out(self, filenames, tmin=None, tmax=None, verbose=False): final data to trim output data to verbose : bool, optional Print updates + max_cores: int, optional + Maximum number of cores to use for loading outputs in parallel Returns ------- @@ -60,30 +63,30 @@ def load_fast_out(self, filenames, tmin=None, tmax=None, verbose=False): """ if type(filenames) is str: filenames = [filenames] + + cores = min(len(filenames), max_cores) - # data = [] - # info = [] try: self.fastout except AttributeError: self.fastout = [] - for i, filename in enumerate(filenames): - assert os.path.isfile(filename), "File, %s, does not exists" % filename - with open(filename, 'r') as f: - if verbose: - print('Loading data from {}'.format(filename)) - try: - f.readline() - except UnicodeDecodeError: - data, info = load_binary_output(filename) - else: - data, info = load_ascii_output(filename) - - # Build dictionary - fast_data = dict(zip(info['channels'],data.T)) - fast_data['meta'] = info - fast_data['meta']['filename'] = filename - self.fastout.append(fast_data) + + inputs = [] + for filename in filenames: + inp = {} + inp['filename'] = filename + inp['verbose'] = verbose + inputs.append(inp) + + if cores > 1: + pool = mp.Pool(cores) + self.fastout = pool.map(self._load_fast_data, inputs) + pool.close() + pool.join() + else: + for inp in inputs: + fast_data = self._load_fast_data(inp) + self.fastout.append(fast_data) # Trim outputs if (tmin) or (tmax): @@ -91,6 +94,28 @@ def load_fast_out(self, filenames, tmin=None, tmax=None, verbose=False): # return fastout return self.fastout + + def _load_fast_data(self,input): + # Unpack + filename = input['filename'] + verbose = input['verbose'] + + assert os.path.isfile(filename), "File, %s, does not exists" % filename + with open(filename, 'r') as f: + if verbose: + print('Loading data from {}'.format(filename)) + try: + f.readline() + except UnicodeDecodeError: + data, info = load_binary_output(filename) + else: + data, info = load_ascii_output(filename) + + # Build dictionary + fast_data = dict(zip(info['channels'],data.T)) + fast_data['meta'] = info + fast_data['meta']['filename'] = filename + return fast_data def plot_fast_out(self, fastout=None, cases=None, showplot=True, fignum=None, xlim=None): ''' @@ -581,3 +606,53 @@ def trim_output(fast_data, tmin=None, tmax=None, verbose=False): return fast_data + + +if __name__ == "__main__": + outfiles = [ + '/Users/dzalkind/Tools/ROSCO3/outputs/IPC_tune_1/NREL2p8/turb_bts/sweep_ipc_gains/NREL2p8_0.out', + '/Users/dzalkind/Tools/ROSCO3/outputs/IPC_tune_1/NREL2p8/turb_bts/sweep_ipc_gains/NREL2p8_1.out', + '/Users/dzalkind/Tools/ROSCO3/outputs/IPC_tune_1/NREL2p8/turb_bts/sweep_ipc_gains/NREL2p8_2.out', + '/Users/dzalkind/Tools/ROSCO3/outputs/IPC_tune_1/NREL2p8/turb_bts/sweep_ipc_gains/NREL2p8_3.out' + ] + + plt.rcParams["figure.figsize"] = [9,12] + + ROSCO = False + ROSCO2 = False + + # Define Plot cases + cases = {} + cases['Gen. Speed Sigs.'] = ['Wind1VelX','BldPitch1', 'GenTq', 'GenSpeed','TwrBsMyt','GenPwr','RootMyb1']#,'PtfmPitch','PtfmYaw','NacYaw'] + + op = output_processing() + op_RO = output_processing() + op_RO2 = output_processing() + + fast_out = [] + fast_out = op.load_fast_out(outfiles, tmin=0) + if ROSCO: + # Rosco outfiles + r_outfiles = [out.split('.out')[0] + '.RO.dbg' for out in outfiles] + rosco_out = op_RO.load_fast_out(r_outfiles, tmin=0) + + if ROSCO2: + r_outfiles = [out.split('.out')[0] + '.RO.dbg2' for out in outfiles] + rosco_out2 = op_RO2.load_fast_out(r_outfiles, tmin=0) + + # Combine outputs + if ROSCO: + comb_out = [None] * len(fast_out) + for i, (r_out, f_out) in enumerate(zip(rosco_out,fast_out)): + r_out.update(f_out) + comb_out[i] = r_out + if ROSCO2: + for i, (r_out2, f_out) in enumerate(zip(rosco_out2,comb_out)): + r_out2.update(f_out) + comb_out[i] = r_out2 + else: + comb_out = fast_out + + + # Plot + fig, ax = op.plot_fast_out(comb_out,cases, showplot=True) diff --git a/ROSCO/ROSCO_toolbox/ofTools/fast_io/plot_FAST.ipynb b/ROSCO/ROSCO_toolbox/ofTools/fast_io/plot_FAST.ipynb index 4e64a191e..52fe840cb 100644 --- a/ROSCO/ROSCO_toolbox/ofTools/fast_io/plot_FAST.ipynb +++ b/ROSCO/ROSCO_toolbox/ofTools/fast_io/plot_FAST.ipynb @@ -9,7 +9,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -50,27 +50,15 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "outfiles = [\n", - "# '/Users/dzalkind/Tools/WEIS-1/outputs/iea15mw/iea15mw_00.outb',\n", - "# '/Users/dzalkind/Tools/WEIS-1/outputs/iea15mw/iea15mw_01.outb',\n", - "# '/Users/dzalkind/Tools/WEIS-1/outputs/iea15mw/iea15mw_02.outb',\n", - "# '/Users/dzalkind/Tools/WEIS-1/outputs/iea15mw/iea15mw_08.outb',\n", - "# '/Users/dzalkind/Tools/ROSCO_toolbox/Examples/examples_out/13_Simulink_Test/OL_Test_1.SFunc.outb',\n", - " '/Users/dzalkind/Projects/FOCAL/IEA15MW_FOCAL/power_curve/base/IEA15MW_FOCAL_07.outb',\n", - "# '/Users/dzalkind/Tools/WEIS-3/results/UMaine-Semi/DISCON/IB_NTM_Raft/iea15mw_1.outb',\n", - "# '/Users/dzalkind/Tools/WEIS-3/results/UMaine-Semi/DISCON/IB_NTM_Raft/iea15mw_2.outb',\n", - "# '/Users/dzalkind/Tools/WEIS-3/results/CT-semi/ntm_long/DISCON-CT-semi/iea15mw_13.outb',\n", - "# '/Users/dzalkind/Tools/WEIS-4/optimizations/both_debug_nowrapper/NREL5MW_OC3_spar_IEC_0.outb',\n", - "# '/Users/dzalkind/Tools/WEIS-4/optimizations/outputs_opt_both_debug/NREL5MW_OC3_spar_IEC_0.outb',\n", - "# '/Users/dzalkind/Tools/WEIS-4/optimizations/outputs_opt_both_debug2/NREL5MW_OC3_spar_IEC_0.outb',\n", - "# '/Users/dzalkind/Tools/WEIS-4/optimizations/outputs_opt_both_debug3/NREL5MW_OC3_spar_IEC_0.outb',\n", - "# '/Users/dzalkind/Tools/WEIS-4/optimizations/outputs_opt_both_debug4/NREL5MW_OC3_spar_IEC_0.outb',\n", - "# '/Users/dzalkind/Tools/WEIS-3/sowfa_debug/rotor_sweep/c_001_sp6_h150_D240_oR2_yaw_base/IEA-15-240-RWT-Monopile.2.T2.out',\n", - "# '/Users/dzalkind/Tools/WEIS-3/results/CT-barge/DISCON-CT-barge_hiBW/simp/step_1.outb',\n", + " # '/Users/dzalkind/Tools/ROSCO3/Examples/examples_out/12_ipc_sim/NREL2p8/ramp/base/NREL2p8_0.out',\n", + " # '/Users/dzalkind/Tools/ROSCO3/Examples/examples_out/12_ipc_sim/NREL2p8/ramp/base/NREL2p8_1.out',\n", + " # '/Users/dzalkind/Tools/ROSCO3/Examples/examples_out/12_ipc_sim/NREL2p8/ramp/base/NREL2p8_2.out',\n", + " '/Users/dzalkind/Tools/ROSCO3/Examples/examples_out/12_ipc_sim/NREL2p8/ramp/base/NREL2p8_3.out',\n", "]\n", "\n", "# outfiles" @@ -78,76 +66,14 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 25, "metadata": {}, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Wind1VelX is not available as an output channel.\n", - "BldPitch1 is not available as an output channel.\n", - "GenTq is not available as an output channel.\n", - "TwrBsMyt is not available as an output channel.\n", - "GenPwr is not available as an output channel.\n", - "RotThrust is not available as an output channel.\n", - "Fl_Pitcom is not available as an output channel.\n", - "PC_MinPit is not available as an output channel.\n", - "WE_Vw is not available as an output channel.\n", - "RtVAvgxh is not available as an output channel.\n", - "BldPitch1 is not available as an output channel.\n", - "PtfmSurge is not available as an output channel.\n", - "PtfmSway is not available as an output channel.\n", - "PtfmHeave is not available as an output channel.\n", - "PtfmPitch is not available as an output channel.\n", - "PtfmRoll is not available as an output channel.\n", - "PtfmYaw is not available as an output channel.\n", - "RtVAvgxh is not available as an output channel.\n", - "BldPitch1 is not available as an output channel.\n", - "RotThrust is not available as an output channel.\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ - "
" + "
" ] }, "metadata": { @@ -158,27 +84,45 @@ ], "source": [ "output_ext = '.out'\n", - "plt.rcParams[\"figure.figsize\"] = [9,7]\n", + "plt.rcParams[\"figure.figsize\"] = [9,12]\n", "\n", "ROSCO = True\n", + "ROSCO2 = True\n", "\n", "# Define Plot cases \n", "cases = {}\n", - "cases['Gen. Speed Sigs.'] = ['Wind1VelX', 'BldPitch1', 'GenTq', 'GenSpeed','TwrBsMyt','GenPwr','RotThrust']#,'PtfmPitch','PtfmYaw','NacYaw']\n", - "# cases['Debug'] = ['IPDefl1','OoPDefl1','Azimuth','RotTorq']#,'PtfmPitch','PtfmYaw','NacYaw']\n", - "cases['Plt. Control Sigs.'] = ['RtVAvgxh', 'BldPitch1', 'Fl_Pitcom', 'PC_MinPit','WE_Vw']\n", - "cases['Platform Motion'] = ['PtfmSurge', 'PtfmSway', 'PtfmHeave', 'PtfmPitch','PtfmRoll','PtfmYaw']\n", - "cases['Rot Thrust'] = ['RtVAvgxh','BldPitch1','RotThrust']\n", + "# cases['Gen. Speed Sigs.'] = ['Wind1VelX', 'BldPitch1', 'GenTq', 'GenSpeed','TwrBsMyt','GenPwr','RootMyb1']#,'PtfmPitch','PtfmYaw','NacYaw']\n", + "cases['Gen. Speed Sigs.'] = ['Wind1VelX','BldPitch1', 'GenTq', 'GenSpeed','TwrBsMyt','GenPwr','RootMyb1']#,'PtfmPitch','PtfmYaw','NacYaw']\n", + "# # cases['Debug'] = ['IPDefl1','OoPDefl1','Azimuth','RotTorq']#,'PtfmPitch','PtfmYaw','NacYaw']\n", + "# cases['Plt. Control Sigs.'] = ['Fl_PitCom', 'PC_MinPit']\n", + "# cases['Platform Motion'] = ['PtfmSurge', 'PtfmSway', 'PtfmHeave', 'PtfmPitch','PtfmRoll','PtfmYaw']\n", + "# # cases['Tower Loads'] = ['TwrBsFxt','TwrBsFyt', 'TwrBsFzt', 'TwrBsMxt', 'TwrBsMyt','TwrBsMzt']\n", + "# # cases['Rot Thrust'] = ['RtVAvgxh','BldPitch1','RotThrust']\n", + "# cases['IPC'] = ['PitCom','PitComAct']\n", + "# # cases['IPC'] = ['PtfmYaw','YawBrMzp','YawBrMyp']\n", + "\n", + "# cases['Gen. Speed Sigs.'] = ['Wind1VelX', 'GenPwr', 'RotSpeed', 'GenSpeed', 'GenTq', 'BldPitch1','B1RootMyr'] #, 'PtfmPitch','PtfmYaw'] #,'PtfmPitch','PtfmYaw','NacYaw']\n", + "# cases['Rot. Pos'] = ['RotSpeed',('BldPitch1','BldPitch2','BldPitch3'),'GenTq','Azimuth']\n", + "# cases['Rotor Position'] = ['AzError','GenTqAz','Azimuth','AzUnwrapped','OL_Azimuth']\n", + "# cases['Aero'] = [\"B1N3Alpha\",\"B1N3Cd\",\"B1N3Cl\"]\n", + "\n", "\n", "op = output_processing.output_processing()\n", + "op_RO = output_processing.output_processing()\n", + "op_RO2 = output_processing.output_processing()\n", + "\n", "\n", - "# Rosco outfiles\n", - "r_outfiles = [out.split('.out')[0] + '.RO.dbg' for out in outfiles]\n", "\n", "fast_out = []\n", "fast_out = op.load_fast_out(outfiles, tmin=0)\n", "if ROSCO:\n", - " rosco_out = op.load_fast_out(r_outfiles, tmin=0)\n", + " # Rosco outfiles\n", + " r_outfiles = [out.split('.out')[0] + '.RO.dbg' for out in outfiles]\n", + " rosco_out = op_RO.load_fast_out(r_outfiles, tmin=0)\n", + " \n", + " if ROSCO2:\n", + " r_outfiles = [out.split('.out')[0] + '.RO.dbg2' for out in outfiles]\n", + " rosco_out2 = op_RO2.load_fast_out(r_outfiles, tmin=0)\n", " \n", "# Combine outputs\n", "if ROSCO:\n", @@ -186,6 +130,10 @@ " for i, (r_out, f_out) in enumerate(zip(rosco_out,fast_out)):\n", " r_out.update(f_out)\n", " comb_out[i] = r_out\n", + " if ROSCO2:\n", + " for i, (r_out2, f_out) in enumerate(zip(rosco_out2,comb_out)):\n", + " r_out2.update(f_out)\n", + " comb_out[i] = r_out2\n", "else:\n", " comb_out = fast_out\n", "\n", @@ -202,7 +150,97 @@ " save_fig_dir = '/Users/dzalkind/Projects/CarbonTrust/Deliverables'\n", " for f in fig:\n", " f.savefig(os.path.join(save_fig_dir,'ts'+str(i_fig)))\n", - " i_fig += 1" + " i_fig += 1\n", + "\n", + "output_ext = '.out'\n", + "plt.rcParams[\"figure.figsize\"] = [9,7]\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([14.97, 15. , 15.02, ..., 90. , 90. , 90. ])" + ] + }, + "execution_count": 70, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fast_out[1]['PtfmHeave'].mean()\n", + "\n", + "fast_out[0]['BldPitch1']" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "ind = comb_out[0]['Time'] > 120\n", + "a = np.array([co['RootMyb1'][ind].std() for co in comb_out])\n", + "b = np.array([co['BldPitch1'][ind].std() for co in comb_out])\n", + "\n", + "fig, axs = plt.subplots(2,1)\n", + "axs[0].plot(a)\n", + "axs[1].plot(b)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "360" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "18*20\n" ] }, { @@ -433,93 +471,6 @@ "df" ] }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'Time': array([0.00000e+00, 1.30000e-02, 2.50000e-02, ..., 7.99975e+02,\n", - " 7.99987e+02, 8.00000e+02]),\n", - " 'FA_AccF': array([ 0.000e+00, 1.264e-23, -8.574e-23, ..., -9.656e-17, -9.670e-17,\n", - " -9.684e-17]),\n", - " 'FA_AccR': array([-0.000e+00, 7.226e-18, -7.774e-17, ..., -3.648e-17, 2.417e-17,\n", - " 2.873e-17]),\n", - " 'RotSpeed': array([0.6132, 0.6131, 0.613 , ..., 0.5879, 0.5878, 0.5878]),\n", - " 'RotSpeedF': array([0.6132, 0.6132, 0.6132, ..., 0.5932, 0.5932, 0.5931]),\n", - " 'GenSpeed': array([0.6132, 0.6131, 0.613 , ..., 0.5879, 0.5878, 0.5878]),\n", - " 'GenSpeedF': array([0.6132, 0.6132, 0.6132, ..., 0.5932, 0.5932, 0.5931]),\n", - " 'FA_Acc': array([0., 0., 0., ..., 0., 0., 0.]),\n", - " 'Fl_Pitcom': array([-0.000e+00, 1.481e-24, -8.567e-24, ..., 4.151e-13, 4.151e-13,\n", - " 4.151e-13]),\n", - " 'PC_MinPit': array([0., 0., 0., ..., 0., 0., 0.]),\n", - " 'SS_dOmF': array([-0.0007917, -0.0007917, -0.0007901, ..., -0.0004443, -0.0004443,\n", - " -0.0004444]),\n", - " 'WE_Vw': array([8.963, 8.963, 8.963, ..., 7.916, 7.916, 7.916]),\n", - " 'WE_b': array([0.000e+00, 0.000e+00, 2.101e-28, ..., 2.392e-11, 2.392e-11,\n", - " 2.392e-11]),\n", - " 'WE_t': array([13140000., 13140000., 13140000., ..., 11480000., 11470000.,\n", - " 11470000.]),\n", - " 'WE_w': array([0.6132, 0.6132, 0.6132, ..., 0.5932, 0.5932, 0.5931]),\n", - " 'WE_Vm': array([8.963, 8.963, 8.963, ..., 7.981, 7.98 , 7.98 ]),\n", - " 'WE_Vt': array([ 0.000e+00, -2.132e-13, -8.994e-09, ..., -6.438e-02, -6.455e-02,\n", - " -6.472e-02]),\n", - " 'WE_lambda': array([8.21 , 8.209, 8.208, ..., 8.911, 8.911, 8.91 ]),\n", - " 'WE_Cp': array([0.25 , 0.4574, 0.4574, ..., 0.4622, 0.4622, 0.4622]),\n", - " 'meta': {'name': 'iea15mw_0.RO',\n", - " 'description': [' Generated on 22-Jun-2021 at 17:43:27 using ROSCO-v2.1.1-43-g22b65089\\n'],\n", - " 'channels': ['Time',\n", - " 'FA_AccF',\n", - " 'FA_AccR',\n", - " 'RotSpeed',\n", - " 'RotSpeedF',\n", - " 'GenSpeed',\n", - " 'GenSpeedF',\n", - " 'FA_Acc',\n", - " 'Fl_Pitcom',\n", - " 'PC_MinPit',\n", - " 'SS_dOmF',\n", - " 'WE_Vw',\n", - " 'WE_b',\n", - " 'WE_t',\n", - " 'WE_w',\n", - " 'WE_Vm',\n", - " 'WE_Vt',\n", - " 'WE_lambda',\n", - " 'WE_Cp'],\n", - " 'attribute_units': ['sec',\n", - " 'm/s',\n", - " 'rad/s^2',\n", - " 'rad/s',\n", - " 'rad/s',\n", - " 'rad/s',\n", - " 'rad/s',\n", - " 'm/s^2',\n", - " 'rad',\n", - " 'rad',\n", - " 'rad/s',\n", - " 'rad',\n", - " 'deg',\n", - " 'Nm',\n", - " 'rad/s',\n", - " 'm/s',\n", - " 'm/s',\n", - " 'rad/s',\n", - " '-'],\n", - " 'filename': '/Users/dzalkind/Tools/WEIS-3/results/UMaine-Semi/DISCON/IB_NTM_Raft/iea15mw_0.RO.dbg'}}" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fast_out[3]" - ] - }, { "cell_type": "code", "execution_count": 11, @@ -561,148 +512,6 @@ "\n", "# op" ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [], - "source": [ - "# ret" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "94.73684210526316" - ] - }, - "execution_count": 49, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "1/2e-3\n", - "\n", - "3600/38\n" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1.9752718440907233" - ] - }, - "execution_count": 50, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "yaw_fast = fast_out[0]['PtfmYaw']\n", - "amp = np.std(yaw_fast) * np.sqrt(2)\n", - "\n", - "\n", - "per = 3600/38\n", - "\n", - "tt = fast_out[0]['Time']\n", - "\n", - "yaw_sowfa = amp * np.sin(2 * np.pi / per * tt)\n", - "\n", - "\n", - "plt.plot(tt,yaw_fast,tt,yaw_sowfa)\n", - "\n", - "np.min(yaw_fast)\n", - "\n", - "amp" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'/Users/dzalkind/Tools/WEIS-3/pCrunch/HPC_tools/eagle2local_sim_inp.sh /Users/dzalkind/Tools/WEIS-3/results/CT-semi/ntm_long/DISCON-CT-semi/ iea15mw_07'" - ] - }, - "execution_count": 51, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# pull from eagle if necessary\n", - "pull_script = '/Users/dzalkind/Tools/WEIS-3/pCrunch/HPC_tools/eagle2local_sim_inp.sh'\n", - "\n", - "\n", - "basedir = outfiles[0].split('/')[1]\n", - "# if basedir == 'scratch':\n", - " \n", - "temp = outfiles[0].split('/')\n", - "filedir = '/'.join(temp[:-1]) + '/'\n", - "\n", - "namebase = temp[-1].split('.')[0]\n", - "search_str = namebase + '*'\n", - "\n", - "shell_cmd = pull_script + ' ' + filedir + ' ' + namebase\n", - "\n", - "shell_cmd\n", - "# ret = subprocess.call(pull_script,shell=True)\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -721,7 +530,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.6" + "version": "3.8.13" } }, "nbformat": 4, diff --git a/ROSCO/ROSCO_toolbox/ofTools/fast_io/read_fast_input.py b/ROSCO/ROSCO_toolbox/ofTools/fast_io/read_fast_input.py deleted file mode 100644 index c8b76313a..000000000 --- a/ROSCO/ROSCO_toolbox/ofTools/fast_io/read_fast_input.py +++ /dev/null @@ -1,1202 +0,0 @@ -''' -Reads OpenFAST input files. - -Most of this script is copied from: -https://github.com/OpenFAST/python-toolbox/blob/dev/pyFAST/input_output/fast_input_file.py -on 11/05/2020 - -''' - -from __future__ import division -from __future__ import unicode_literals -from __future__ import print_function -from __future__ import absolute_import -from io import open -from builtins import range -from builtins import str -from future import standard_library -standard_library.install_aliases() -from .file import File, WrongFormatError, BrokenFormatError -import os -import numpy as np -import re -import pandas as pd - -from ROSCO_toolbox.utilities import read_DISCON - -__all__ = ['FASTInputFile'] - -TABTYPE_NOT_A_TAB = 0 -TABTYPE_NUM_WITH_HEADER = 1 -TABTYPE_NUM_WITH_HEADERCOM = 2 -TABTYPE_NUM_NO_HEADER = 4 -TABTYPE_NUM_BEAMDYN = 5 -TABTYPE_MIX_WITH_HEADER = 6 -TABTYPE_FIL = 3 -TABTYPE_FMT = 9999 # TODO - -# --------------------------------------------------------------------------------} -# --- INPUT FILE -# --------------------------------------------------------------------------------{ -class FASTInputDeck(): - ''' - Read/write an OpenFAST input file deck. Behaves like a dictionary - ''' - def __init__(self, fst_file): - self.Fst = FASTInputFile(fst_file) - self.path = os.path.dirname(os.path.abspath(fst_file)) - - def load(self): - fst_dict = {} - try: - fst_dict['ElastoDyn'] = self.load_ElastoDyn() - except: - "Error loading {}".format(self.Fst['EDFile'].strip('\'').strip('\"')) - - try: - fst_dict['BDBldFile(1)'] = self.load_BDBldFile1() - except: - "Error loading {}".format(self.Fst['BDBldFile(1)'].strip('\'').strip('\"')) - - try: - fst_dict['BDBldFile(2)'] = self.load_BDBldFile2() - except: - "Error loading {}".format(self.Fst['BDBldFile(2)'].strip('\'').strip('\"')) - - try: - fst_dict['BDBldFile(3)'] = self.load_BDBldFile3() - except: - "Error loading {}".format(self.Fst['BDBldFile(3)'].strip('\'').strip('\"')) - - try: - fst_dict['InflowWind'] = self.load_InflowWind() - except: - "Error loading {}".format(self.Fst['InflowFile'].strip('\'').strip('\"')) - - try: - fst_dict['AeroDyn'] = self.load_AeroDyn() - except: - "Error loading {}".format(self.Fst['AeroFile'].strip('\'').strip('\"')) - - try: - fst_dict['ServoDyn'] = self.load_ServoDyn() - try: - fst_dict['DISCON_in'] = self.load_DISCON() - except: - "Error loading {}".format(self.ServoDyn['DLL_InFile'].strip('\'').strip('\"')) - - except: - "Error loading {}".format(self.Fst['ServoFile'].strip('\'').strip('\"')) - - try: - fst_dict['HydroDyn'] = self.load_HydroDyn() - except: - "Error loading {}".format(self.Fst['HydroFile'].strip('\'').strip('\"')) - - try: - fst_dict['SubDyn'] = self.load_SubDyn() - except: - "Error loading {}".format(self.Fst['SubFile'].strip('\'').strip('\"')) - - try: - fst_dict['MoorDyn'] = self.load_MoorDyn() - except: - "Error loading {}".format(self.Fst['MooringFile'].strip('\'').strip('\"')) - - try: - fst_dict['IceDyn'] = self.load_IceDyn() - except: - "Error loading {}".format(self.Fst['IceFile'].strip('\'').strip('\"')) - - - return fst_dict - - def load_ElastoDyn(self): - ED_fullfile = os.path.join(self.path, self.Fst['EDFile'].strip('\'').strip('\"')) - self.ElastoDyn = FASTInputFile(ED_fullfile) - return self.ElastoDyn - - def load_BDBldFile1(self): - BD1_fullfile = os.path.join(self.path, self.Fst['BDBldFile(1)'].strip('\'').strip('\"')) - self.BD1_fullfile = FASTInputFile(BD1_fullfile) - return self.load_BDBldFile1 - - def load_BDBldFile2(self): - BD2_fullfile = os.path.join(self.path, self.Fst['BDBldFile(2)'].strip('\'').strip('\"')) - self.BD2_fullfile = FASTInputFile(BD2_fullfile) - return self.load_BDBldFile2 - - def load_BDBldFile3(self): - BD3_fullfile = os.path.join(self.path, self.Fst['BDBldFile(3)'].strip('\'').strip('\"')) - self.BD3_fullfile = FASTInputFile(BD3_fullfile) - return self.load_BDBldFile3 - - def load_InflowWind(self): - IF_fullfile = os.path.join(self.path, self.Fst['InflowFile'].strip('\'').strip('\"')) - self.InflowWind = FASTInputFile(IF_fullfile) - return self.InflowWind - - def load_AeroDyn(self): - AF_fullfile = os.path.join(self.path, self.Fst['AeroFile'].strip('\'').strip('\"')) - self.AeroDyn = FASTInputFile(AF_fullfile) - return self.AeroDyn - - def load_ServoDyn(self): - SF_fullfile = os.path.join(self.path, self.Fst['ServoFile'].strip('\'').strip('\"')) - self.ServoDyn = FASTInputFile(SF_fullfile) - return self.ServoDyn - - def load_HydroDyn(self): - HF_fullfile = os.path.join(self.path, self.Fst['HydroFile'].strip('\'').strip('\"')) - self.HydroDyn = FASTInputFile(HF_fullfile) - return self.HydroDyn - - def load_SubDyn(self): - SUBF_fullfile = os.path.join(self.path, self.Fst['SubFile'].strip('\'').strip('\"')) - self.SubDyn = FASTInputFile(SUBF_fullfile) - return self.SubDyn - - def load_MoorDyn(self): - MF_fullfile = os.path.join(self.path, self.Fst['MooringFile'].strip('\'').strip('\"')) - self.MoorDyn = FASTInputFile(MF_fullfile) - return self.MoorDyn - - def load_IceDyn(self): - IceF_fullfile = os.path.join(self.path, self.Fst['IceFile'].strip('\'').strip('\"')) - self.IceDyn = FASTInputFile(IceF_fullfile) - return self.IceDyn - - def load_DISCON(self): # (TODO - Move this out of the ROSCO toolbox and into ofTools) - DISCON_fullfile = os.path.join(self.path, self.ServoDyn['DLL_InFile'].strip('\'').strip('\"')) - self.DISCON_in = read_DISCON(DISCON_fullfile) - return self.DISCON_in - -# --------------------------------------------------------------------------------} -# --- INPUT FILE -# --------------------------------------------------------------------------------{ -class FASTInputFile(File): - """ - Read/write an OpenFAST input file. The object behaves like a dictionary. - - Main methods - ------------ - - read, write, toDataFrame, keys - - Main keys - --------- - The keys correspond to the keys used in the file. For instance for a .fst file: 'DT','TMax' - - Examples - -------- - - filename = 'AeroDyn.dat' - f = FASTInputFile(filename) - f['TwrAero'] = True - f['AirDens'] = 1.225 - f.write('AeroDyn_Changed.dat') - - """ - - @staticmethod - def defaultExtensions(): - return ['.dat','.fst','.txt','.fstf'] - - @staticmethod - def formatName(): - return 'FAST input file' - - def __init__(self, filename=None, **kwargs): - super(FASTInputFile, self).__init__(filename=filename,**kwargs) - - def keys(self): - self.labels = [ d['label'] for d in self.data if not d['isComment'] ] - return self.labels - - def getID(self,label): - i=self.getIDSafe(label) - if i<0: - raise KeyError('Variable `'+ label+'` not found in FAST file:'+self.filename) - else: - return i - def getIDs(self,label): - I=[] - # brute force search - for i in range(len(self.data)): - d = self.data[i] - if d['label'].lower()==label.lower(): - I.append(i) - if len(I)<0: - raise KeyError('Variable `'+ label+'` not found in FAST file:'+self.filename) - else: - return I - - def getIDSafe(self,label): - # brute force search - for i in range(len(self.data)): - d = self.data[i] - if d['label'].lower()==label.lower(): - return i - return -1 - - # Making object an iterator - def __iter__(self): - self.iCurrent=-1 - self.iMax=len(self.data)-1 - return self - - def __next__(self): # Python 2: def next(self) - if self.iCurrent > self.iMax: - raise StopIteration - else: - self.iCurrent += 1 - return self.data[self.iCurrent] - - # Making it behave like a dictionary - def __setitem__(self,key,item): - I = self.getIDs(key) - for i in I: - self.data[i]['value'] = item - - def __getitem__(self,key): - i = self.getID(key) - return self.data[i]['value'] - - def __repr__(self): - s ='Fast input file: {}\n'.format(self.filename) - return s+'\n'.join(['{:15s}: {}'.format(d['label'],d['value']) for i,d in enumerate(self.data)]) - - def addKeyVal(self,key,val,descr=None): - d=getDict() - d['label']=key - d['value']=val - if descr is not None: - d['descr']=descr - self.data.append(d) - - def _read(self): - - # TODO members for BeamDyn with mutliple key point ####### TODO PropSetID is Duplicate SubDyn and used in HydroDyn - NUMTAB_FROM_VAL_DETECT = ['HtFract' , 'TwrElev' , 'BlFract' , 'Genspd_TLU' , 'BlSpn' , 'WndSpeed' , 'HvCoefID' , 'AxCoefID' , 'JointID' , 'Dpth' , 'FillNumM' , 'MGDpth' , 'SimplCd' , 'RNodes' , 'kp_xr' , 'mu1' , 'TwrHtFr' , 'TwrRe' , 'RJointID' , 'IJointID' , 'COSMID' , 'CMJointID' , 'WT_X'] - NUMTAB_FROM_VAL_DIM_VAR = ['NTwInpSt' , 'NumTwrNds' , 'NBlInpSt' , 'DLL_NumTrq' , 'NumBlNds' , 'NumCases' , 'NHvCoef' , 'NAxCoef' , 'NJoints' , 'NCoefDpth' , 'NFillGroups' , 'NMGDepths' , 1 , 'BldNodes' , 'kp_total' , 1 , 'NTwrHt' , 'NTwrRe' , 'NReact' , 'NInterf' , 'NCOSMs' , 'NCmass' , 'NumTurbines'] - NUMTAB_FROM_VAL_VARNAME = ['TowProp' , 'TowProp' , 'BldProp' , 'DLLProp' , 'BldAeroNodes' , 'Cases' , 'HvCoefs' , 'AxCoefs' , 'Joints' , 'DpthProp' , 'FillGroups' , 'MGProp' , 'SmplProp' , 'BldAeroNodes' , 'MemberGeom' , 'DampingCoeffs' , 'TowerProp' , 'TowerRe' , 'BaseReactJoints' , 'InterfaceJoints' , 'MemberCosineMatrix' , 'ConcentratedMasses','WindTurbines'] - NUMTAB_FROM_VAL_NHEADER = [2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 1 , 2 , 2 , 1 , 1 , 2 , 2 , 2 , 2 ,2] - NUMTAB_FROM_VAL_TYPE = ['num' , 'num' , 'num' , 'num' , 'num' , 'num' , 'num' , 'num' , 'num' , 'num' , 'num' , 'num' , 'num' , 'mix' , 'num' , 'num' , 'num' , 'num' , 'mix' , 'num' , 'num' , 'num' ,'mix'] - NUMTAB_FROM_VAL_DETECT_L = [s.lower() for s in NUMTAB_FROM_VAL_DETECT] - - # NOTE: MJointID1, used by SubDyn and HydroDyn - NUMTAB_FROM_LAB_DETECT = ['NumAlf' , 'F_X' , 'MemberCd1' , 'MJointID1' , 'NOutLoc' , 'NOutCnt' , 'PropD' , 'YoungE' , 'YoungE' ] - NUMTAB_FROM_LAB_DIM_VAR = ['NumAlf' , 'NKInpSt' , 'NCoefMembers' , 'NMembers' , 'NMOutputs' , 'NMOutputs' , 'NPropSets' , 'NPropSets' , 'NXPropSets' ] - NUMTAB_FROM_LAB_VARNAME = ['AFCoeff' , 'TMDspProp' , 'MemberProp' , 'Members' , 'MemberOuts' , 'MemberOuts' , 'MemberSectionProp' , 'MemberSectionProp' , 'MemberSectionProp2' ] - NUMTAB_FROM_LAB_TYPE = ['num' , 'num' , 'num' , 'mix' , 'num' , 'num' , 'num' , 'num' , 'num' ] - NUMTAB_FROM_LAB_DETECT_L = [s.lower() for s in NUMTAB_FROM_LAB_DETECT] - - FILTAB_FROM_LAB_DETECT = ['FoilNm' ,'AFNames'] - FILTAB_FROM_LAB_DIM_VAR = ['NumFoil','NumAFfiles'] - FILTAB_FROM_LAB_VARNAME = ['FoilNm' ,'AFNames'] - FILTAB_FROM_LAB_DETECT_L = [s.lower() for s in FILTAB_FROM_LAB_DETECT] - - self.data = [] - self.module = None - #with open(self.filename, 'r', errors="surrogateescape") as f: - with open(self.filename, 'r', errors="surrogateescape") as f: - lines=f.read().splitlines() - # IF NEEDED> DO THE FOLLOWING FORMATTING: - #lines = [str(l).encode('utf-8').decode('ascii','ignore') for l in f.read().splitlines()] - - # Fast files start with ! or - - #if lines[0][0]!='!' and lines[0][0]!='-': - # raise Exception('Fast file do not start with ! or -, is it the right format?') - - # Special filetypes - if self.detectAndReadExtPtfmSE(lines): - return - if self.detectAndReadAirfoil(lines): - return - - # Parsing line by line, storing each line into a dictionary - i=0 - nComments = 0 - nWrongLabels = 0 - allowSpaceSeparatedList=False - while i0 \ - or line.upper().find('MESH-BASED OUTPUTS')>0 \ - or line.upper().find('OUTPUT CHANNELS' )>0: - # TODO, lazy implementation so far, MAKE SUB FUNCTION - parts = re.match(r'^\W*\w+', line) - if parts: - firstword = parts.group(0).strip() - else: - raise NotImplementedError - remainer = re.sub(r'^\W*\w+\W*', '', line) - # Parsing outlist, and then we continue at a new "i" (to read END etc.) - OutList,i = parseFASTOutList(lines,i+1) - d = getDict() - d['label'] = firstword - d['descr'] = remainer - d['tabType'] = TABTYPE_FIL # TODO - d['value'] = ['']+OutList - self.data.append(d) - if i>=len(lines): - break - - # --- Here we cheat and force an exit of the input file - # The reason for this is that some files have a lot of things after the END, which will result in the file being intepreted as a wrong format due to too many comments - if i+20: - print('>>>Bld Nodal outputs present') - else: - self.data.append(parseFASTInputLine('END of input file (the word "END" must appear in the first 3 columns of this last OutList line)',i+1)) - self.data.append(parseFASTInputLine('---------------------------------------------------------------------------------------',i+2)) - break - elif line.upper().find('SSOUTLIST' )>0: - # SUBDYN Outlist doesn not follow regular format - self.data.append(parseFASTInputLine(line,i)) - # OUTLIST Exception for BeamDyn - OutList,i = parseFASTOutList(lines,i+1) - # TODO - for o in OutList: - d = getDict() - d['isComment'] = True - d['value']=o - self.data.append(d) - # --- Here we cheat and force an exit of the input file - self.data.append(parseFASTInputLine('END of input file (the word "END" must appear in the first 3 columns of this last OutList line)',i+1)) - self.data.append(parseFASTInputLine('---------------------------------------------------------------------------------------',i+2)) - break - - elif line.upper().find('ADDITIONAL STIFFNESS')>0: - # TODO, lazy implementation so far, MAKE SUB FUNCTION - self.data.append(parseFASTInputLine(line,i)) - i +=1 - KDAdd = [] - for _ in range(19): - KDAdd.append(lines[i]) - i +=1 - d = getDict() - d['label'] = 'KDAdd' # TODO - d['tabType'] = TABTYPE_FIL # TODO - d['value'] = KDAdd - self.data.append(d) - if i>=len(lines): - break - elif line.upper().find('DISTRIBUTED PROPERTIES')>0: - self.data.append(parseFASTInputLine(line,i)); - i+=1; - self.readBeamDynProps(lines,i) - return - - # --- Parsing of standard lines: value(s) key comment - line = lines[i] - d = parseFASTInputLine(line,i,allowSpaceSeparatedList) - - # --- Handling of special files - if d['label'].lower()=='kp_total': - # BeamDyn has weird space speparated list around keypoint definition - allowSpaceSeparatedList=True - elif d['label'].lower()=='numcoords': - # TODO, lazy implementation so far, MAKE SUB FUNCTION - if isStr(d['value']): - if d['value'][0]=='@': - # it's a ref to the airfoil coord file - pass - else: - if not strIsInt(d['value']): - raise WrongFormatError('Wrong value of NumCoords') - if int(d['value'])<=0: - pass - else: - self.data.append(d); i+=1; - # 3 comment lines - self.data.append(parseFASTInputLine(lines[i],i)); i+=1; - self.data.append(parseFASTInputLine(lines[i],i)); i+=1; - self.data.append(parseFASTInputLine(lines[i],i)); i+=1; - splits=cleanAfterChar(cleanLine(lines[i]),'!').split() - # Airfoil ref point - try: - pos=[float(splits[0]), float(splits[1])] - except: - raise WrongFormatError('Wrong format while reading coordinates of airfoil reference') - i+=1 - d = getDict() - d['label'] = 'AirfoilRefPoint' - d['value'] = pos - self.data.append(d) - # 2 comment lines - self.data.append(parseFASTInputLine(lines[i],i)); i+=1; - self.data.append(parseFASTInputLine(lines[i],i)); i+=1; - # Table of coordinats itself - d = getDict() - d['label'] = 'AirfoilCoord' - d['tabDimVar'] = 'NumCoords' - d['tabType'] = TABTYPE_NUM_WITH_HEADERCOM - nTabLines = self[d['tabDimVar']]-1 # SOMEHOW ONE DATA POINT LESS - d['value'], d['tabColumnNames'],_ = parseFASTNumTable(self.filename,lines[i:i+nTabLines+1],nTabLines,i,1) - d['tabUnits'] = ['(-)','(-)'] - self.data.append(d) - break - - - - #print('label>',d['label'],'<',type(d['label'])); - #print('value>',d['value'],'<',type(d['value'])); - #print(isStr(d['value'])) - #if isStr(d['value']): - # print(d['value'].lower() in NUMTAB_FROM_VAL_DETECT_L) - - - # --- Handling of tables - if isStr(d['value']) and d['value'].lower() in NUMTAB_FROM_VAL_DETECT_L: - # Table with numerical values, - ii = NUMTAB_FROM_VAL_DETECT_L.index(d['value'].lower()) - tab_type = NUMTAB_FROM_VAL_TYPE[ii] - if tab_type=='num': - d['tabType'] = TABTYPE_NUM_WITH_HEADER - else: - d['tabType'] = TABTYPE_MIX_WITH_HEADER - d['label'] = NUMTAB_FROM_VAL_VARNAME[ii] - d['tabDimVar'] = NUMTAB_FROM_VAL_DIM_VAR[ii] - nHeaders = NUMTAB_FROM_VAL_NHEADER[ii] - nTabLines=0 - if isinstance(d['tabDimVar'],int): - nTabLines = d['tabDimVar'] - else: - nTabLines = self[d['tabDimVar']] - #print('Reading table {} Dimension {} (based on {})'.format(d['label'],nTabLines,d['tabDimVar'])); - d['value'], d['tabColumnNames'], d['tabUnits'] = parseFASTNumTable(self.filename,lines[i:i+nTabLines+nHeaders],nTabLines,i,nHeaders,tableType=tab_type) - i += nTabLines+nHeaders-1 - - # --- Temporary hack for e.g. SubDyn, that has duplicate table, impossible to detect in the current way... - # So we remove the element form the list one read - del NUMTAB_FROM_VAL_DETECT[ii] - del NUMTAB_FROM_VAL_DIM_VAR[ii] - del NUMTAB_FROM_VAL_VARNAME[ii] - del NUMTAB_FROM_VAL_NHEADER[ii] - del NUMTAB_FROM_VAL_TYPE [ii] - del NUMTAB_FROM_VAL_DETECT_L[ii] - - elif isStr(d['label']) and d['label'].lower() in NUMTAB_FROM_LAB_DETECT_L: - ii = NUMTAB_FROM_LAB_DETECT_L.index(d['label'].lower()) - tab_type = NUMTAB_FROM_LAB_TYPE[ii] - # Special case for airfoil data, the table follows NumAlf, so we add d first - if d['label'].lower()=='numalf': - d['tabType']=TABTYPE_NOT_A_TAB - self.data.append(d) - # Creating a new dictionary for the table - d = {'value':None, 'label':'NumAlf', 'isComment':False, 'descr':'', 'tabType':None} - i += 1 - d['label'] = NUMTAB_FROM_LAB_VARNAME[ii] - d['tabDimVar'] = NUMTAB_FROM_LAB_DIM_VAR[ii] - if d['label'].lower()=='afcoeff' : - d['tabType'] = TABTYPE_NUM_WITH_HEADERCOM - else: - if tab_type=='num': - d['tabType'] = TABTYPE_NUM_WITH_HEADER - else: - d['tabType'] = TABTYPE_MIX_WITH_HEADER - nTabLines = self[d['tabDimVar']] - #print('Reading table {} Dimension {} (based on {})'.format(d['label'],nTabLines,d['tabDimVar'])); - d['value'], d['tabColumnNames'], d['tabUnits'] = parseFASTNumTable(self.filename,lines[i:i+nTabLines+2],nTabLines,i,2,tableType=tab_type) - i += nTabLines+1 - - # --- Temporary hack for e.g. SubDyn, that has duplicate table, impossible to detect in the current way... - # So we remove the element form the list one read - del NUMTAB_FROM_LAB_DETECT[ii] - del NUMTAB_FROM_LAB_DIM_VAR[ii] - del NUMTAB_FROM_LAB_VARNAME[ii] - del NUMTAB_FROM_LAB_TYPE [ii] - del NUMTAB_FROM_LAB_DETECT_L[ii] - - elif isStr(d['label']) and d['label'].lower() in FILTAB_FROM_LAB_DETECT_L: - ii = FILTAB_FROM_LAB_DETECT_L.index(d['label'].lower()) - d['label'] = FILTAB_FROM_LAB_VARNAME[ii] - d['tabDimVar'] = FILTAB_FROM_LAB_DIM_VAR[ii] - d['tabType'] = TABTYPE_FIL - nTabLines = self[d['tabDimVar']] - #print('Reading table {} Dimension {} (based on {})'.format(d['label'],nTabLines,d['tabDimVar'])); - d['value'] = parseFASTFilTable(lines[i:i+nTabLines],nTabLines,i) - i += nTabLines-1 - - - - self.data.append(d) - i += 1 - # --- Safety checks - if d['isComment']: - #print(line) - nComments +=1 - else: - if hasSpecialChars(d['label']): - nWrongLabels +=1 - #print('label>',d['label'],'<',type(d['label']),line); - if i>3: # first few lines may be comments, we allow it - #print('Line',i,'Label:',d['label']) - raise WrongFormatError('Special Character found in Label: `{}`'.format(d['label'])) - if len(d['label'])==0: - nWrongLabels +=1 - if nComments>len(lines)*0.35: - #print('Comment fail',nComments,len(lines),self.filename) - raise WrongFormatError('Most lines were read as comments, probably not a FAST Input File') - if nWrongLabels>len(lines)*0.10: - #print('Label fail',nWrongLabels,len(lines),self.filename) - raise WrongFormatError('Too many lines with wrong labels, probably not a FAST Input File') - - # --- PostReading checks - labels = self.keys() - duplicates = set([x for x in labels if labels.count(x) > 1]) - if len(duplicates)>0: - print('[WARN] Duplicate labels found in file: '+self.filename) - print(' Duplicates: '+', '.join(duplicates)) - print(' It\'s strongly recommended to make them unique! ') -# except WrongFormatError as e: -# raise WrongFormatError('Fast File {}: '.format(self.filename)+'\n'+e.args[0]) -# except Exception as e: -# raise e -# # print(e) -# raise Exception('Fast File {}: '.format(self.filename)+'\n'+e.args[0]) - - - def toString(self): - s='' - # Special file formats, TODO subclass - if self.module=='ExtPtfm': - s+='!Comment\n' - s+='!Comment Flex 5 Format\n' - s+='!Dimension: {}\n'.format(self['nDOF']) - s+='!Time increment in simulation: {}\n'.format(self['dt']) - s+='!Total simulation time in file: {}\n'.format(self['T']) - - s+='\n!Mass Matrix\n' - s+='!Dimension: {}\n'.format(self['nDOF']) - s+='\n'.join(''.join('{:16.8e}'.format(x) for x in y) for y in self['MassMatrix']) - - s+='\n\n!Stiffness Matrix\n' - s+='!Dimension: {}\n'.format(self['nDOF']) - s+='\n'.join(''.join('{:16.8e}'.format(x) for x in y) for y in self['StiffnessMatrix']) - - s+='\n\n!Damping Matrix\n' - s+='!Dimension: {}\n'.format(self['nDOF']) - s+='\n'.join(''.join('{:16.8e}'.format(x) for x in y) for y in self['DampingMatrix']) - - s+='\n\n!Loading and Wave Elevation\n' - s+='!Dimension: 1 time column - {} force columns\n'.format(self['nDOF']) - s+='\n'.join(''.join('{:16.8e}'.format(x) for x in y) for y in self['Loading']) - return s - - def toStringVLD(val,lab,descr): - val='{}'.format(val) - lab='{}'.format(lab) - if len(val)<13: - val='{:13s}'.format(val) - if len(lab)<13: - lab='{:13s}'.format(lab) - return val+' '+lab+' - '+descr.strip().strip('-').strip()+'\n' - - for i in range(len(self.data)): - d=self.data[i] - if d['isComment']: - s+='{}'.format(d['value']) - elif d['tabType']==TABTYPE_NOT_A_TAB: - if isinstance(d['value'], list): - sList=', '.join([str(x) for x in d['value']]) - s+='{} {} {}'.format(sList,d['label'],d['descr']) - else: - s+=toStringVLD(d['value'],d['label'],d['descr']).strip() - elif d['tabType']==TABTYPE_NUM_WITH_HEADER: - s+='{}'.format(' '.join(['{:15s}'.format(s) for s in d['tabColumnNames']])) - #s+=d['descr'] # Not ready for that - if d['tabUnits'] is not None: - s+='\n' - s+='{}'.format(' '.join(['{:15s}'.format(s) for s in d['tabUnits']])) - if np.size(d['value'],0) > 0 : - s+='\n' - s+='\n'.join('\t'.join( ('{:15.0f}'.format(x) if int(x)==x else '{:15.8e}'.format(x) ) for x in y) for y in d['value']) - elif d['tabType']==TABTYPE_MIX_WITH_HEADER: - s+='{}'.format(' '.join(['{:15s}'.format(s) for s in d['tabColumnNames']])) - if d['tabUnits'] is not None: - s+='\n' - s+='{}'.format(' '.join(['{:15s}'.format(s) for s in d['tabUnits']])) - if np.size(d['value'],0) > 0 : - s+='\n' - s+='\n'.join('\t'.join('{}'.format(x) for x in y) for y in d['value']) - elif d['tabType']==TABTYPE_NUM_WITH_HEADERCOM: - s+='! {}\n'.format(' '.join(['{:15s}'.format(s) for s in d['tabColumnNames']])) - s+='! {}\n'.format(' '.join(['{:15s}'.format(s) for s in d['tabUnits']])) - s+='\n'.join('\t'.join('{:15.8e}'.format(x) for x in y) for y in d['value']) - elif d['tabType']==TABTYPE_FIL: - #f.write('{} {} {}\n'.format(d['value'][0],d['tabDetect'],d['descr'])) - s+='{} {} {}\n'.format(d['value'][0],d['label'],d['descr']) # TODO? - s+='\n'.join(fil for fil in d['value'][1:]) - else: - raise Exception('Unknown table type for variable {}',d) - if i0: - # Hack for blade files, we add the modes - x=Val[:,0] - Modes=np.zeros((x.shape[0],3)) - Modes[:,0] = x**2 * self['BldFl1Sh(2)'] \ - + x**3 * self['BldFl1Sh(3)'] \ - + x**4 * self['BldFl1Sh(4)'] \ - + x**5 * self['BldFl1Sh(5)'] \ - + x**6 * self['BldFl1Sh(6)'] - Modes[:,1] = x**2 * self['BldFl2Sh(2)'] \ - + x**3 * self['BldFl2Sh(3)'] \ - + x**4 * self['BldFl2Sh(4)'] \ - + x**5 * self['BldFl2Sh(5)'] \ - + x**6 * self['BldFl2Sh(6)'] - Modes[:,2] = x**2 * self['BldEdgSh(2)'] \ - + x**3 * self['BldEdgSh(3)'] \ - + x**4 * self['BldEdgSh(4)'] \ - + x**5 * self['BldEdgSh(5)'] \ - + x**6 * self['BldEdgSh(6)'] - Val = np.hstack((Val,Modes)) - Cols = Cols + ['ShapeFlap1_[-]','ShapeFlap2_[-]','ShapeEdge1_[-]'] - - elif self.getIDSafe('TwFAM1Sh(2)')>0: - # Hack for tower files, we add the modes - x=Val[:,0] - Modes=np.zeros((x.shape[0],4)) - Modes[:,0] = x**2 * self['TwFAM1Sh(2)'] \ - + x**3 * self['TwFAM1Sh(3)'] \ - + x**4 * self['TwFAM1Sh(4)'] \ - + x**5 * self['TwFAM1Sh(5)'] \ - + x**6 * self['TwFAM1Sh(6)'] - Modes[:,1] = x**2 * self['TwFAM2Sh(2)'] \ - + x**3 * self['TwFAM2Sh(3)'] \ - + x**4 * self['TwFAM2Sh(4)'] \ - + x**5 * self['TwFAM2Sh(5)'] \ - + x**6 * self['TwFAM2Sh(6)'] - Modes[:,2] = x**2 * self['TwSSM1Sh(2)'] \ - + x**3 * self['TwSSM1Sh(3)'] \ - + x**4 * self['TwSSM1Sh(4)'] \ - + x**5 * self['TwSSM1Sh(5)'] \ - + x**6 * self['TwSSM1Sh(6)'] - Modes[:,3] = x**2 * self['TwSSM2Sh(2)'] \ - + x**3 * self['TwSSM2Sh(3)'] \ - + x**4 * self['TwSSM2Sh(4)'] \ - + x**5 * self['TwSSM2Sh(5)'] \ - + x**6 * self['TwSSM2Sh(6)'] - Val = np.hstack((Val,Modes)) - Cols = Cols + ['ShapeForeAft1_[-]','ShapeForeAft2_[-]','ShapeSideSide1_[-]','ShapeSideSide2_[-]'] - - name=d['label'] - dfs[name]=pd.DataFrame(data=Val,columns=Cols) - elif d['tabType'] in [TABTYPE_NUM_BEAMDYN]: - data = d['value'] - Cols =['Span'] - Cols+=['K{}{}'.format(i+1,j+1) for i in range(6) for j in range(6)] - Cols+=['M{}{}'.format(i+1,j+1) for i in range(6) for j in range(6)] - # Putting the main terms first - IAll = range(1+36+36) - IMain= [0] + [i*6+i+1 for i in range(6)] + [i*6+i+37 for i in range(6)] - IOrg = IMain + [i for i in range(1+36+36) if i not in IMain] - Cols = [Cols[i] for i in IOrg] - data = data[:,IOrg] - name=d['label'] - dfs[name]=pd.DataFrame(data=data,columns=Cols) - if len(dfs)==1: - dfs=dfs[list(dfs.keys())[0]] - return dfs - -# --------------------------------------------------------------------------------} -# --- SubReaders /detectors -# --------------------------------------------------------------------------------{ - def detectAndReadExtPtfmSE(self,lines): - def readmat(n,m,lines,iStart): - M=np.zeros((n,m)) - for j in np.arange(n): - i=iStart+j - M[j,:]=np.array(lines[i].split()).astype(float) - return M - if len(lines)<10: - return False - if not (lines[0][0]=='!' and lines[1][0]=='!'): - return False - if lines[1].lower().find('flex')<0: - return - if lines[2].lower().find('!dimension')<0: - return - # --- At this stage we assume it's in the proper format - self.module='ExtPtfm' - nDOFCommon = -1 - i=2; - try: - while i0: - if l[0]=='!': - if l.find('!dimension')==0: - self.addKeyVal('nDOF',int(l.split(':')[1])) - nDOFCommon=self['nDOF'] - elif l.find('!time increment')==0: - self.addKeyVal('dt',np.float_(l.split(':')[1])) - elif l.find('!total simulation time')==0: - self.addKeyVal('T',np.float_(l.split(':')[1])) - else: - raise BrokenFormatError('Unexcepted content found on line {}'.format(i)) - i+=1 - except BrokenFormatError as e: - raise e - except: - raise - - - return True - - - - def detectAndReadAirfoil(self,lines): - if len(lines)<14: - return False - # Reading number of tables - L3 = lines[2].strip().split() - if len(L3)<=0: - return False - if not strIsInt(L3[0]): - return False - nTables=int(L3[0]) - # Reading table ID - L4 = lines[3].strip().split() - if len(L4)<=nTables: - return False - TableID=L4[:nTables] - if nTables==1: - TableID=[''] - # Keywords for file format - KW1=lines[12].strip().split() - KW2=lines[13].strip().split() - if len(KW1)>nTables and len(KW2)>nTables: - if KW1[nTables].lower()=='angle' and KW2[nTables].lower()=='minimum': - d = getDict(); d['isComment'] = True; d['value'] = lines[0]; self.data.append(d); - d = getDict(); d['isComment'] = True; d['value'] = lines[1]; self.data.append(d); - for i in range(2,14): - splits = lines[i].split() - #print(splits) - d = getDict() - d['label'] = ' '.join(splits[1:]) # TODO - d['descr'] = ' '.join(splits[1:]) # TODO - d['value'] = float(splits[0]) - self.data.append(d) - #pass - #for i in range(2,14): - nTabLines=0 - while 14+nTabLines0 : - nTabLines +=1 - #data = np.array([lines[i].strip().split() for i in range(14,len(lines)) if len(lines[i])>0]).astype(np.float_) - #data = np.array([lines[i].strip().split() for i in takewhile(lambda x: len(lines[i].strip())>0, range(14,len(lines)-1))]).astype(np.float_) - data = np.array([lines[i].strip().split() for i in range(14,nTabLines+14)]).astype(np.float_) - #print(data) - d = getDict() - d['label'] = 'Polar' - d['tabDimVar'] = nTabLines - d['tabType'] = TABTYPE_NUM_NO_HEADER - d['value'] = data - if np.size(data,1)==1+nTables*3: - d['tabColumnNames'] = ['Alpha']+[n+l for l in TableID for n in ['Cl','Cd','Cm']] - d['tabUnits'] = ['(deg)']+['(-)' , '(-)' , '(-)']*nTables - elif np.size(data,1)==1+nTables*2: - d['tabColumnNames'] = ['Alpha']+[n+l for l in TableID for n in ['Cl','Cd']] - d['tabUnits'] = ['(deg)']+['(-)' , '(-)']*nTables - else: - d['tabColumnNames'] = ['col{}'.format(j) for j in range(np.size(data,1))] - self.data.append(d) - return True - - def readBeamDynProps(self,lines,iStart): - nStations=self['station_total'] - M=np.zeros((nStations,1+36+36)) - i=iStart; - try: - for j in range(nStations): - M[j,0]=float(lines[i]); i+=1; - LL = lines[i:i+6] - M[j,1:37]=np.array((' '.join(lines[i:i+6])).split()).astype(np.float_) - i+=7 - M[j,37:]=np.array((' '.join(lines[i:i+6])).split()).astype(np.float_) - i+=7 - except: - raise WrongFormatError('An error occured while reading section {}/{}'.format(j+1,nStations)) - d = getDict() - d['label'] = 'BeamProperties' - d['descr'] = '' - d['tabType'] = TABTYPE_NUM_BEAMDYN - d['value'] = M - self.data.append(d) - - -# --------------------------------------------------------------------------------} -# --- Helper functions -# --------------------------------------------------------------------------------{ -def isStr(s): - # Python 2 and 3 compatible - # Two options below - # NOTE: all this avoided since we import str from builtins - # --- Version 2 - # isString = False; - # if(isinstance(s, str)): - # isString = True; - # try: - # if(isinstance(s, basestring)): # todo unicode as well - # isString = True; - # except NameError: - # pass; - # return isString - # --- Version 1 - # try: - # basestring # python 2 - # return isinstance(s, basestring) or isinstance(s,unicode) - # except NameError: - # basestring=str #python 3 - # return isinstance(s, str) - return isinstance(s, str) - -def strIsFloat(s): - #return s.replace('.',',1').isdigit() - try: - float(s) - return True - except: - return False - -def strIsBool(s): - return (s.lower() == 'true') or (s.lower() == 'false') - -def strIsInt(s): - s = str(s) - if s[0] in ('-', '+'): - return s[1:].isdigit() - return s.isdigit() - -def hasSpecialChars(s): - # fast allows for parenthesis - # For now we allow for - but that's because of BeamDyn geometry members - return not re.match("^[\"\'a-zA-Z0-9_()-]*$", s) - -def cleanLine(l): - # makes a string single space separated - l = l.replace('\t',' ') - l = ' '.join(l.split()) - l = l.strip() - return l - -def cleanAfterChar(l,c): - # remove whats after a character - n = l.find(c); - if n>0: - return l[:n] - else: - return l - -def getDict(): - return {'value':None, 'label':'', 'isComment':False, 'descr':'', 'tabType':TABTYPE_NOT_A_TAB} - - -def parseFASTInputLine(line_raw,i,allowSpaceSeparatedList=False): - d = getDict() - #print(line_raw) - try: - # preliminary cleaning (Note: loss of formatting) - line = cleanLine(line_raw) - # Comment - if any(line.startswith(c) for c in ['#','!','--','==']) or len(line)==0: - d['isComment']=True - d['value']=line_raw - return d - - # Detecting lists - List=[]; - iComma=line.find(',') - if iComma>0 and iComma<30: - fakeline=line.replace(' ',',') - fakeline=re.sub(',+',',',fakeline) - csplits=fakeline.split(',') - # Splitting based on comma and looping while it's numbers of booleans - ii=0 - s=csplits[ii] - #print(csplits) - while strIsFloat(s) or strIsBool(s) and ii=len(csplits): - raise WrongFormatError('Wrong number of list values') - s = csplits[ii] - #print('[INFO] Line {}: Found list: '.format(i),List) - # Defining value and remaining splits - if len(List)>=2: - d['value']=List - line_remaining=line - # eating line, removing each values - for iii in range(ii): - sValue=csplits[iii] - ipos=line_remaining.find(sValue) - line_remaining = line_remaining[ipos+len(sValue):] - splits=line_remaining.split() - iNext=0 - else: - # It's not a list, we just use space as separators - splits=line.split(' ') - s=splits[0] - - if strIsInt(s): - d['value']=int(s) - if allowSpaceSeparatedList and len(splits)>1: - if strIsInt(splits[1]): - d['value']=splits[0]+ ' '+splits[1] - elif strIsFloat(s): - d['value']=float(s) - elif strIsBool(s): - d['value']=bool(s) - else: - d['value']=s - iNext=1 - #import pdb ; pdb.set_trace(); - - # Extracting label (TODO, for now only second split) - bOK=False - while (not bOK) and iNext comment assumed'.format(i+1)) - d['isComment']=True - d['value']=line_raw - iNext = len(splits)+1 - - # Recombining description - if len(splits)>=iNext+1: - d['descr']=' '.join(splits[iNext:]) - except WrongFormatError as e: - raise WrongFormatError('Line {}: '.format(i+1)+e.args[0]) - except Exception as e: - raise Exception('Line {}: '.format(i+1)+e.args[0]) - - return d - -def parseFASTOutList(lines,iStart): - OutList=[] - i = iStart - MAX=200 - while iMAX : - raise Exception('More that 200 lines found in outlist') - if i>=len(lines): - print('[WARN] End of file reached while reading Outlist') - #i=min(i+1,len(lines)) - return OutList,iStart+len(OutList) - - -def extractWithinParenthesis(s): - mo = re.search(r'\((.*)\)', s) - if mo: - return mo.group(1) - return '' - -def extractWithinBrackets(s): - mo = re.search(r'\((.*)\)', s) - if mo: - return mo.group(1) - return '' - -def detectUnits(s,nRef): - nPOpen=s.count('(') - nPClos=s.count(')') - nBOpen=s.count('[') - nBClos=s.count(']') - - sep='!#@#!' - if (nPOpen == nPClos) and (nPOpen>=nRef): - #that's pretty good - Units=s.replace('(','').replace(')',sep).split(sep)[:-1] - elif (nBOpen == nBClos) and (nBOpen>=nRef): - Units=s.replace('[','').replace(']',sep).split(sep)[:-1] - else: - Units=s.split() - return Units - - -def parseFASTNumTable(filename,lines,n,iStart,nHeaders=2,tableType='num'): - Tab = None - ColNames = None - Units = None - - if len(lines)!=n+nHeaders: - raise BrokenFormatError('Not enough lines in table: {} lines instead of {}\nFile:{}'.format(len(lines)-nHeaders,n,filename)) - - if nHeaders<1: - raise NotImplementedError('Reading FAST tables with no headers not implemented yet') - - try: - if nHeaders>=1: - # Extract column names - i = 0 - sTmp = cleanLine(lines[i]) - sTmp = cleanAfterChar(sTmp,'[') - if sTmp.startswith('!'): - sTmp=sTmp[1:].strip() - ColNames=sTmp.split() - if nHeaders>=2: - # Extract units - i = 1 - sTmp = cleanLine(lines[i]) - if sTmp.startswith('!'): - sTmp=sTmp[1:].strip() - - Units = detectUnits(sTmp,len(ColNames)) - Units = ['({})'.format(u.strip()) for u in Units] - # Forcing user to match number of units and column names - if len(ColNames) != len(Units): - print(ColNames) - print(Units) - raise Exception('Number of column names different from number of units in table') - - nCols=len(ColNames) - - if tableType=='num': - Tab = np.zeros((n, nCols)) - for i in range(nHeaders,n+nHeaders): - l = lines[i].lower() - v = l.split() - if len(v) > nCols: - print('[WARN] {}: Line {}: number of data different from number of column names'.format(filename, iStart+i+1)) - if len(v) < nCols: - raise Exception('Number of data is lower than number of column names') - # Accounting for TRUE FALSE and converting to float - v = [s.replace('true','1').replace('false','0').replace('noprint','0').replace('print','1') for s in v] - v = [float(s) for s in v[0:nCols]] - if len(v) < nCols: - raise Exception('Number of data is lower than number of column names') - Tab[i-nHeaders,:] = v - elif tableType=='mix': - # a mix table contains a mixed of strings and floats - # For now, we are being a bit more relaxed about the number of columns - Tab = np.zeros((n, nCols)).astype(object) - for i in range(nHeaders,n+nHeaders): - l = lines[i] - v = l.split() - if len(v) != nCols: - print('[WARN] {}: Line {}: Number of data is different than number of column names'.format(filename,iStart+1+i)) - v=v[0:min(len(v),nCols)] - Tab[i-nHeaders,0:len(v)] = v - else: - raise Exception('Unknown table type') - - except Exception as e: - raise BrokenFormatError('Line {}: {}'.format(iStart+i+1,e.args[0])) - return Tab, ColNames, Units - - -def parseFASTFilTable(lines,n,iStart): - Tab = [] - try: - i=0 - if len(lines)!=n: - raise WrongFormatError('Not enough lines in table: {} lines instead of {}'.format(len(lines),n)) - for i in range(n): - l = lines[i].split() - #print(l[0].strip()) - Tab.append(l[0].strip()) - - except Exception as e: - raise Exception('Line {}: '.format(iStart+i+1)+e.args[0]) - return Tab - - -if __name__ == "__main__": - B=FASTInFile('BeamDyn_Blade.dat') - - - diff --git a/ROSCO/ROSCO_toolbox/ofTools/fast_io/update_discons.py b/ROSCO/ROSCO_toolbox/ofTools/fast_io/update_discons.py index 901a953ae..6c8b62717 100644 --- a/ROSCO/ROSCO_toolbox/ofTools/fast_io/update_discons.py +++ b/ROSCO/ROSCO_toolbox/ofTools/fast_io/update_discons.py @@ -1,37 +1,15 @@ import os # ROSCO toolbox modules -from ROSCO_toolbox import controller as ROSCO_controller -from ROSCO_toolbox import turbine as ROSCO_turbine + from ROSCO_toolbox.utilities import write_DISCON -from ROSCO_toolbox.inputs.validation import load_rosco_yaml +from ROSCO_toolbox.tune import yaml_to_objs def update_discons(tune_to_test_map): # Update a set of discon files # Input is a dict: each key is the tuning yaml and each value is the discon or list of discons for tuning_yaml in tune_to_test_map: - # Load yaml file - inps = load_rosco_yaml(tuning_yaml) - path_params = inps['path_params'] - turbine_params = inps['turbine_params'] - controller_params = inps['controller_params'] - - # Instantiate turbine, controller, and file processing classes - turbine = ROSCO_turbine.Turbine(turbine_params) - controller = ROSCO_controller.Controller(controller_params) - - # Load turbine data from OpenFAST and rotor performance text file - yaml_dir = os.path.dirname(tuning_yaml) # files relative to tuning yaml - turbine.load_from_fast( - path_params['FAST_InputFile'], - os.path.join(yaml_dir,path_params['FAST_directory']), - dev_branch=True, - rot_source='txt', - txt_filename=os.path.join(yaml_dir,path_params['FAST_directory'],path_params['rotor_performance_filename']) - ) - - # Tune controller - controller.tune_controller(turbine) + controller, turbine, path_params = yaml_to_objs(tuning_yaml) # Write parameter input file if not isinstance(tune_to_test_map[tuning_yaml],list): diff --git a/ROSCO/ROSCO_toolbox/sim.py b/ROSCO/ROSCO_toolbox/sim.py index 54e3df62d..39ab71f66 100644 --- a/ROSCO/ROSCO_toolbox/sim.py +++ b/ROSCO/ROSCO_toolbox/sim.py @@ -140,7 +140,7 @@ def sim_ws_series(self, t_array, ws_array, rotor_rpm_init=10, init_pitch=0.0, gen_torque[i], bld_pitch[i], nac_yawrate[i] = self.controller_int.call_controller(turbine_state) # Calculate the power - gen_power[i] = gen_speed[i] * gen_torque[i] + gen_power[i] = gen_speed[i] * gen_torque[i] * self.turbine.GenEff / 100 # Calculate the nacelle position nac_yaw[i] = nac_yaw[i-1] + nac_yawrate[i] * dt @@ -181,7 +181,7 @@ def sim_ws_series(self, t_array, ws_array, rotor_rpm_init=10, init_pitch=0.0, ax.grid() ax = axarr[3] ax.plot(self.t_array, self.gen_power/1000) - ax.set_ylabel('Gen Power (W)') + ax.set_ylabel('Gen Power (kW)') ax.grid() ax = axarr[4] ax.plot(self.t_array, self.bld_pitch*rad2deg) @@ -304,6 +304,7 @@ def sim_ws_wd_series(self, t_array, ws_array, wd_array, # Calculate the power gen_power[i] = gen_speed[i] * gen_torque[i] + gen_power[i] = gen_speed[i] * gen_torque[i] * self.turbine.GenEff / 100 # Update the nacelle position nac_yaw[i] = nac_yaw[i-1] + nac_yawrate[i]*rad2deg*dt diff --git a/ROSCO/ROSCO_toolbox/tune.py b/ROSCO/ROSCO_toolbox/tune.py new file mode 100644 index 000000000..e4d5392cf --- /dev/null +++ b/ROSCO/ROSCO_toolbox/tune.py @@ -0,0 +1,87 @@ +# Copyright 2019 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. + +import os +from ROSCO_toolbox import controller as ROSCO_controller +from ROSCO_toolbox import turbine as ROSCO_turbine +from ROSCO_toolbox.inputs.validation import load_rosco_yaml +from ROSCO_toolbox.utilities import read_DISCON, write_DISCON, DISCON_dict + + +def yaml_to_objs(tuning_yaml): + # Load yaml and return controller, turbine objects + # Basically, tune a whole controller! + + # Load yaml file + inps = load_rosco_yaml(tuning_yaml) + path_params = inps['path_params'] + turbine_params = inps['turbine_params'] + controller_params = inps['controller_params'] + + # Instantiate turbine, controller, and file processing classes + turbine = ROSCO_turbine.Turbine(turbine_params) + controller = ROSCO_controller.Controller(controller_params) + + # Load turbine data from OpenFAST and rotor performance text file + yaml_dir = os.path.dirname(tuning_yaml) # files relative to tuning yaml + turbine.load_from_fast( + path_params['FAST_InputFile'], + os.path.join(yaml_dir,path_params['FAST_directory']), + rot_source='txt', + txt_filename=os.path.join(yaml_dir,path_params['FAST_directory'],path_params['rotor_performance_filename']) + ) + + # Tune controller + controller.tune_controller(turbine) + + return controller, turbine, path_params + +def update_discon_version(file,tuning_yaml,new_discon_filename): + ''''''''' + This function will take a DISCON input from a previous version of ROSCO and conver it to this version + It will not be 100%, requires a check, but still saves time + + ''' + + # Use new defaults for these inputs for various reasons + exclude_list = [ + 'Y_ErrThresh', # translated from float to list of floats in v2.6 + 'WE_CP', + ] + + # Read original DISCON + discon_vt = read_DISCON(file) + + # Tune dummy controller to get objects + controller, turbine, _ = yaml_to_objs(tuning_yaml) + + # Load default inputs + discon_defaults = DISCON_dict(turbine,controller) + + # A simple update doesn't handle type changes + new_discon = {} + for param in discon_defaults: + # If the value is in the original DISCON and not excluded, use the original + if (param in discon_vt) and (param not in exclude_list): + new_discon[param] = discon_vt[param] + + # Otherwise, use the new default + else: + new_discon[param] = discon_defaults[param] + + # Make the DISCON + write_DISCON( + turbine, + controller, + new_discon_filename, + rosco_vt = new_discon, + ) + diff --git a/ROSCO/ROSCO_toolbox/turbine.py b/ROSCO/ROSCO_toolbox/turbine.py index e97d72036..9aa619326 100644 --- a/ROSCO/ROSCO_toolbox/turbine.py +++ b/ROSCO/ROSCO_toolbox/turbine.py @@ -130,7 +130,13 @@ def load(filename): return turbine # Load data from fast input deck - def load_from_fast(self, FAST_InputFile,FAST_directory, FAST_ver='OpenFAST',dev_branch=True,rot_source=None, txt_filename=None): + def load_from_fast( + self, + FAST_InputFile, + FAST_directory, + rot_source=None, + txt_filename=None + ): """ Load the parameter files directly from a FAST input deck @@ -140,10 +146,6 @@ def load_from_fast(self, FAST_InputFile,FAST_directory, FAST_ver='OpenFAST',dev_ Primary fast model input file (*.fst) FAST_directory: str Directory for primary fast model input file - FAST_ver: string, optional - fast version, usually OpenFAST - dev_branch: bool, optional - dev_branch input to InputReader_OpenFAST, probably True rot_source: str, optional desired source for rotor to get Cp, Ct, Cq tables. Default is to run cc-blade. options: cc-blade - run cc-blade @@ -163,7 +165,28 @@ def load_from_fast(self, FAST_InputFile,FAST_directory, FAST_ver='OpenFAST',dev_ fast = self.fast = InputReader_OpenFAST() fast.FAST_InputFile = FAST_InputFile fast.FAST_directory = FAST_directory - fast.execute() + + fast.read_MainInput() + + # file + ed_file = os.path.join(fast.FAST_directory, fast.fst_vt['Fst']['EDFile']) + + fast.read_ElastoDyn(ed_file) + ed_blade_file = os.path.join(os.path.dirname(ed_file), fast.fst_vt['ElastoDyn']['BldFile1']) + fast.read_ElastoDynBlade(ed_blade_file) + + fast.read_AeroDyn15() + + fast.read_ServoDyn() + fast.read_DISCON_in() + + + if fast.fst_vt['Fst']['CompHydro'] == 1: # SubDyn not yet implimented + hd_file = os.path.normpath(os.path.join(fast.FAST_directory, fast.fst_vt['Fst']['HydroFile'])) + fast.read_HydroDyn(hd_file) + + # fast.read_AeroDyn15() + # fast.execute() # Use Performance tables if defined, otherwise use defaults if txt_filename: @@ -419,7 +442,7 @@ def generate_rotperf_fast(self, openfast_path, FAST_runDirectory=None, run_BeamD "GenPwr", "GenTq", # AeroDyn15 "RtArea", "RtVAvgxh", "B1N3Clrnc", "B2N3Clrnc", "B3N3Clrnc", - "RtAeroCp", 'RtAeroCq', 'RtAeroCt', 'RtTSR', # NECESSARY + "RtFldCp", 'RtFldCq', 'RtFldCt', 'RtTSR', # NECESSARY # InflowWind "Wind1VelX", ] diff --git a/ROSCO/ROSCO_toolbox/utilities.py b/ROSCO/ROSCO_toolbox/utilities.py index b68dd3a90..cf7f3218f 100644 --- a/ROSCO/ROSCO_toolbox/utilities.py +++ b/ROSCO/ROSCO_toolbox/utilities.py @@ -27,6 +27,9 @@ import numpy as np import subprocess import ROSCO_toolbox +from wisdem.inputs import load_yaml + +from wisdem.inputs import load_yaml # Some useful constants now = datetime.datetime.now() @@ -56,6 +59,27 @@ def write_DISCON(turbine, controller, param_file='DISCON.IN', txt_filename='Cp_C if not rosco_vt: rosco_vt = DISCON_dict(turbine, controller, txt_filename) + # Get input descriptions from input schema + fname_schema = os.path.join(os.path.dirname(__file__),'inputs/toolbox_schema.yaml') + sch = load_yaml(fname_schema) + + # mode descriptions in main controller_params, might not be needed + mode_descriptions = {} + for input, props in sch['properties']['controller_params']['properties'].items(): + if 'description' in props: + mode_descriptions[input] = props['description'] + + input_descriptions = {} + for input, props in sch['properties']['controller_params']['properties']['DISCON']['properties'].items(): + if 'description' in props: + input_descriptions[input] = props['description'] + + # Tidy inputs, if needed + if not hasattr(rosco_vt['CC_GroupIndex'],'__len__'): + rosco_vt['CC_GroupIndex'] = [rosco_vt['CC_GroupIndex']] # make an array + if not hasattr(rosco_vt['StC_GroupIndex'],'__len__'): + rosco_vt['StC_GroupIndex'] = [rosco_vt['StC_GroupIndex']] + print('Writing new controller parameter file parameter file: %s.' % param_file) # Should be obvious what's going on here... file = open(param_file,'w') @@ -63,10 +87,11 @@ def write_DISCON(turbine, controller, param_file='DISCON.IN', txt_filename='Cp_C file.write('! - File written using ROSCO version {} controller tuning logic on {}\n'.format(ROSCO_toolbox.__version__, now.strftime('%m/%d/%y'))) file.write('\n') file.write('!------- DEBUG ------------------------------------------------------------\n') - file.write('{0:<12d} ! LoggingLevel - {{0: write no debug files, 1: write standard output .dbg-file, 2: LoggingLevel 1 + ROSCO LocalVars (.dbg2) 3: LoggingLevel 2 + complete avrSWAP-array (.dbg3)}}\n'.format(int(rosco_vt['LoggingLevel']))) + file.write('{0:<12d} ! LoggingLevel - (0: write no debug files, 1: write standard output .dbg-file, 2: LoggingLevel 1 + ROSCO LocalVars (.dbg2) 3: LoggingLevel 2 + complete avrSWAP-array (.dbg3))\n'.format(int(rosco_vt['LoggingLevel']))) + file.write('{:<11d} ! Echo - ({})\n'.format(int(rosco_vt['Echo']), input_descriptions['Echo'])) file.write('\n') file.write('!------- CONTROLLER FLAGS -------------------------------------------------\n') - file.write('{0:<12d} ! F_LPFType - {{1: first-order low-pass filter, 2: second-order low-pass filter}}, [rad/s] (currently filters generator speed and pitch control signals\n'.format(int(rosco_vt['F_LPFType']))) + file.write('{0:<12d} ! F_LPFType - (1: first-order low-pass filter, 2: second-order low-pass filter), [rad/s] (currently filters generator speed and pitch control signals\n'.format(int(rosco_vt['F_LPFType']))) file.write('{0:<12d} ! F_NotchType - Notch on the measured generator speed and/or tower fore-aft motion (for floating) {{0: disable, 1: generator speed, 2: tower-top fore-aft motion, 3: generator speed and tower-top fore-aft motion}}\n'.format(int(rosco_vt['F_NotchType']))) file.write('{0:<12d} ! IPC_ControlMode - Turn Individual Pitch Control (IPC) for fatigue load reductions (pitch contribution) {{0: off, 1: 1P reductions, 2: 1P+2P reductions}}\n'.format(int(rosco_vt['IPC_ControlMode']))) file.write('{0:<12d} ! VS_ControlMode - Generator torque control mode in above rated conditions {{0: constant torque, 1: constant power, 2: TSR tracking PI control with constant torque, 3: TSR tracking PI control with constant power}}\n'.format(int(rosco_vt['VS_ControlMode']))) @@ -81,8 +106,12 @@ def write_DISCON(turbine, controller, param_file='DISCON.IN', txt_filename='Cp_C file.write('{0:<12d} ! Flp_Mode - Flap control mode {{0: no flap control, 1: steady state flap angle, 2: Proportional flap control, 2: Cyclic (1P) flap control}}\n'.format(int(rosco_vt['Flp_Mode']))) file.write('{0:<12d} ! OL_Mode - Open loop control mode {{0: no open loop control, 1: open loop control vs. time}}\n'.format(int(rosco_vt['OL_Mode']))) file.write('{0:<12d} ! PA_Mode - Pitch actuator mode {{0 - not used, 1 - first order filter, 2 - second order filter}}\n'.format(int(rosco_vt['PA_Mode']))) + file.write('{0:<12d} ! PF_Mode - Pitch fault mode {{0 - not used, 1 - constant offset on one or more blades}}\n'.format(int(rosco_vt['PF_Mode']))) + file.write('{0:<12d} ! AWC_Mode - Active wake control {{0 - not used, 1 - complex number method, 2 - Coleman transform method}}\n'.format(int(rosco_vt['AWC_Mode']))) file.write('{0:<12d} ! Ext_Mode - External control mode {{0 - not used, 1 - call external dynamic library}}\n'.format(int(rosco_vt['Ext_Mode']))) - file.write('{0:<12d} ! ZMQ_Mode - Fuse ZeroMQ interaface {{0: unused, 1: Yaw Control}}\n'.format(int(rosco_vt['ZMQ_Mode']))) + file.write('{0:<12d} ! ZMQ_Mode - Fuse ZeroMQ interface {{0: unused, 1: Yaw Control}}\n'.format(int(rosco_vt['ZMQ_Mode']))) + file.write('{:<12d} ! CC_Mode - {}\n'.format(int(rosco_vt['CC_Mode']),mode_descriptions['CC_Mode'])) + file.write('{:<12d} ! StC_Mode - {}\n'.format(int(rosco_vt['StC_Mode']),mode_descriptions['StC_Mode'])) file.write('\n') file.write('!------- FILTERS ----------------------------------------------------------\n') @@ -115,7 +144,8 @@ def write_DISCON(turbine, controller, param_file='DISCON.IN', txt_filename='Cp_C file.write('\n') file.write('!------- INDIVIDUAL PITCH CONTROL -----------------------------------------\n') file.write('{}! IPC_Vramp - Start and end wind speeds for cut-in ramp function. First entry: IPC inactive, second entry: IPC fully active. [m/s]\n'.format(''.join('{:<4.6f} '.format(rosco_vt['IPC_Vramp'][i]) for i in range(len(rosco_vt['IPC_Vramp']))))) - file.write('{:<13.1f} ! IPC_IntSat - Integrator saturation (maximum signal amplitude contribution to pitch from IPC), [rad]\n'.format(rosco_vt['IPC_IntSat'])) # Hardcode to 5 degrees + file.write('{:<11d} ! IPC_SatMode - IPC Saturation method (0 - no saturation (except by PC_MinPit), 1 - saturate by PS_BldPitchMin, 2 - saturate sotfly (full IPC cycle) by PC_MinPit, 3 - saturate softly by PS_BldPitchMin)\n'.format(int(rosco_vt['IPC_SatMode']))) # Hardcode to 5 degrees + file.write('{:<13.1f} ! IPC_IntSat - Integrator saturation (maximum signal amplitude contribution to pitch from IPC), [rad]\n'.format(rosco_vt['IPC_IntSat'])) file.write('{}! IPC_KP - Proportional gain for the individual pitch controller: first parameter for 1P reductions, second for 2P reductions, [-]\n'.format(''.join('{:<4.3e} '.format(rosco_vt['IPC_KP'][i]) for i in range(len(rosco_vt['IPC_KP']))))) file.write('{}! IPC_KI - Integral gain for the individual pitch controller: first parameter for 1P reductions, second for 2P reductions, [-]\n'.format(''.join('{:<4.3e} '.format(rosco_vt['IPC_KI'][i]) for i in range(len(rosco_vt['IPC_KI']))))) file.write('{}! IPC_aziOffset - Phase offset added to the azimuth angle for the individual pitch controller, [rad]. \n'.format(''.join('{:<4.6f} '.format(rosco_vt['IPC_aziOffset'][i]) for i in range(len(rosco_vt['IPC_aziOffset']))))) @@ -156,8 +186,8 @@ def write_DISCON(turbine, controller, param_file='DISCON.IN', txt_filename='Cp_C file.write('{} ! WE_FOPoles - First order system poles [1/s]\n'.format(''.join('{:<10.8f} '.format(rosco_vt['WE_FOPoles'][i]) for i in range(len(rosco_vt['WE_FOPoles']))))) file.write('\n') file.write('!------- YAW CONTROL ------------------------------------------------------\n') - file.write('{:<13.5f} ! Y_uSwitch - Wind speed to switch between Y_ErrThresh. If zero, only the first value of Y_ErrThresh is used [m/s]\n'.format(rosco_vt['Y_uSwitch'])) - file.write('{}! Y_ErrThresh - Yaw error threshold/deadband. Turbine begins to yaw when it passes this. If Y_uSwitch is zero, only the first value is used. [deg].\n'.format(''.join('{:<4.6f} '.format(rosco_vt['Y_ErrThresh'][i]) for i in range(len(rosco_vt['F_FlCornerFreq']))))) + file.write('{:<13.5f} ! Y_uSwitch - Wind speed to switch between Y_ErrThresh. If zero, only the second value of Y_ErrThresh is used [m/s]\n'.format(rosco_vt['Y_uSwitch'])) + file.write('{}! Y_ErrThresh - Yaw error threshold/deadbands. Turbine begins to yaw when it passes this. If Y_uSwitch is zero, only the second value is used. [deg].\n'.format(''.join('{:<4.6f} '.format(rosco_vt['Y_ErrThresh'][i]) for i in range(len(rosco_vt['F_FlCornerFreq']))))) file.write('{:<13.5f} ! Y_Rate - Yaw rate [rad/s]\n'.format(rosco_vt['Y_Rate'])) file.write('{:<13.5f} ! Y_MErrSet - Integrator saturation (maximum signal amplitude contribution to pitch from yaw-by-IPC), [rad]\n'.format(rosco_vt['Y_MErrSet'])) file.write('{:<13.5f} ! Y_IPC_IntSat - Integrator saturation (maximum signal amplitude contribution to pitch from yaw-by-IPC), [rad]\n'.format(rosco_vt['Y_IPC_IntSat'])) @@ -196,12 +226,25 @@ def write_DISCON(turbine, controller, param_file='DISCON.IN', txt_filename='Cp_C file.write('{0:<12d} ! Ind_Breakpoint - The column in OL_Filename that contains the breakpoint (time if OL_Mode = 1)\n'.format(int(rosco_vt['Ind_Breakpoint']))) file.write('{0:<12d} ! Ind_BldPitch - The column in OL_Filename that contains the blade pitch input in rad\n'.format(int(rosco_vt['Ind_BldPitch']))) file.write('{0:<12d} ! Ind_GenTq - The column in OL_Filename that contains the generator torque in Nm\n'.format(int(rosco_vt['Ind_GenTq']))) - file.write('{0:<12d} ! Ind_YawRate - The column in OL_Filename that contains the generator torque in Nm\n'.format(int(rosco_vt['Ind_YawRate']))) + file.write('{0:<12d} ! Ind_YawRate - The column in OL_Filename that contains the nacelle yaw rate rad/s\n'.format(int(rosco_vt['Ind_YawRate']))) + file.write('{} ! Ind_CableControl - The column(s) in OL_Filename that contains the cable control inputs in m [Used with CC_Mode = 2, must be the same size as CC_Group_N]\n'.format(write_array(rosco_vt['Ind_CableControl'],'<4d'))) + file.write('{} ! Ind_StructControl - The column(s) in OL_Filename that contains the structural control inputs [Used with StC_Mode = 2, must be the same size as StC_Group_N]\n'.format(write_array(rosco_vt['Ind_StructControl'],'<4d'))) file.write('\n') file.write('!------- Pitch Actuator Model -----------------------------------------------------\n') file.write('{:<014.5f} ! PA_CornerFreq - Pitch actuator bandwidth/cut-off frequency [rad/s]\n'.format(rosco_vt['PA_CornerFreq'])) file.write('{:<014.5f} ! PA_Damping - Pitch actuator damping ratio [-, unused if PA_Mode = 1]\n'.format(rosco_vt['PA_Damping'])) file.write('\n') + file.write('!------- Pitch Actuator Faults -----------------------------------------------------\n') + file.write('{} ! PF_Offsets - Constant blade pitch offsets for blades 1-3 [rad]\n'.format(''.join('{:<10.8f} '.format(rosco_vt['PF_Offsets'][i]) for i in range(3)))) + file.write('\n') + file.write('!------- Active Wake Control -----------------------------------------------------\n') + file.write('{0:<12d} ! AWC_NumModes - Number of user-defined AWC forcing modes \n'.format(int(rosco_vt['AWC_NumModes']))) + file.write('{} ! AWC_n - Azimuthal mode number(s) (i.e., the number and direction of the lobes of the wake structure)\n'.format(write_array(rosco_vt['AWC_n'],'<4d'))) + file.write('{} ! AWC_harmonic - Harmonic(s) to apply in the AWC Inverse Coleman Transformation (only used when AWC_Mode = 2)\n'.format(write_array(rosco_vt['AWC_harmonic'],'<4d'))) + file.write('{} ! AWC_freq - Frequency(s) of forcing mode(s) [Hz]\n'.format(write_array(rosco_vt['AWC_freq'],'<6.4f'))) + file.write('{} ! AWC_amp - Pitch amplitude(s) of individual forcing mode(s) [deg]\n'.format(write_array(rosco_vt['AWC_amp'],'<6.4f'))) + file.write('{} ! AWC_clockangle - Initial angle(s) of forcing mode(s) [deg]\n'.format(write_array(rosco_vt['AWC_clockangle'],'<6.4f'))) + file.write('\n') file.write('!------- External Controller Interface -----------------------------------------------------\n') file.write('"{}" ! DLL_FileName - Name/location of the dynamic library in the Bladed-DLL format\n'.format(rosco_vt['DLL_FileName'])) file.write('"{}" ! DLL_InFile - Name of input file sent to the DLL (-)\n'.format(rosco_vt['DLL_InFile'])) @@ -210,6 +253,16 @@ def write_DISCON(turbine, controller, param_file='DISCON.IN', txt_filename='Cp_C file.write('!------- ZeroMQ Interface ---------------------------------------------------------\n') file.write('"{}" ! ZMQ_CommAddress - Communication address for ZMQ server, (e.g. "tcp://localhost:5555") \n'.format(rosco_vt['ZMQ_CommAddress'])) file.write('{:<11d} ! ZMQ_UpdatePeriod - Call ZeroMQ every [x] seconds, [s]\n'.format(int(rosco_vt['ZMQ_UpdatePeriod']))) + file.write('\n') + file.write('!------- Cable Control ---------------------------------------------------------\n') + file.write('{:<11d} ! CC_Group_N - {}\n'.format(len(rosco_vt['CC_GroupIndex']), input_descriptions['CC_Group_N'])) + file.write('{:^11s} ! CC_GroupIndex - {}\n'.format(write_array(rosco_vt['CC_GroupIndex'],'<6d'), input_descriptions['CC_GroupIndex'])) + file.write('{:<11f} ! CC_ActTau - {}\n'.format(rosco_vt['CC_ActTau'], input_descriptions['CC_ActTau'] )) + file.write('\n') + file.write('!------- Structural Controllers ---------------------------------------------------------\n') + file.write('{:<11d} ! StC_Group_N - {}\n'.format(len(rosco_vt['StC_GroupIndex']), input_descriptions['StC_Group_N'])) + file.write('{:^11s} ! StC_GroupIndex - {}\n'.format(write_array(rosco_vt['StC_GroupIndex'],'<6d'), input_descriptions['StC_GroupIndex'])) + file.close() # Write Open loop input @@ -376,6 +429,14 @@ def DISCON_dict(turbine, controller, txt_filename=None): Name of rotor performance filename ''' DISCON_dict = {} + + # Populate with available defaults + input_schema = load_yaml(os.path.join(os.path.dirname(__file__),'inputs/toolbox_schema.yaml')) + discon_props = input_schema['properties']['controller_params']['properties']['DISCON']['properties'] + for prop in discon_props: + if 'default' in discon_props[prop]: + DISCON_dict[prop] = discon_props[prop]['default'] + # ------- DEBUG ------- DISCON_dict['LoggingLevel'] = int(controller.LoggingLevel) # ------- CONTROLLER FLAGS ------- @@ -393,9 +454,13 @@ def DISCON_dict(turbine, controller, txt_filename=None): DISCON_dict['TD_Mode'] = int(controller.TD_Mode) DISCON_dict['Flp_Mode'] = int(controller.Flp_Mode) DISCON_dict['OL_Mode'] = int(controller.OL_Mode) + DISCON_dict['PF_Mode'] = int(controller.PF_Mode) DISCON_dict['PA_Mode'] = int(controller.PA_Mode) + DISCON_dict['AWC_Mode'] = int(controller.AWC_Mode) DISCON_dict['Ext_Mode'] = int(controller.Ext_Mode) DISCON_dict['ZMQ_Mode'] = int(controller.ZMQ_Mode) + DISCON_dict['CC_Mode'] = int(controller.CC_Mode) + DISCON_dict['StC_Mode'] = int(controller.StC_Mode) # ------- FILTERS ------- DISCON_dict['F_LPFCornerFreq'] = turbine.bld_edgewise_freq * 1/4 DISCON_dict['F_LPFDamping'] = controller.F_LPFDamping @@ -432,6 +497,7 @@ def DISCON_dict(turbine, controller, txt_filename=None): # ------- INDIVIDUAL PITCH CONTROL ------- DISCON_dict['IPC_Vramp'] = controller.IPC_Vramp DISCON_dict['IPC_IntSat'] = 0.2618 + DISCON_dict['IPC_SatMode'] = 2 DISCON_dict['IPC_KP'] = [controller.Kp_ipc1p, controller.Kp_ipc2p] DISCON_dict['IPC_KI'] = [controller.Ki_ipc1p, controller.Ki_ipc2p] DISCON_dict['IPC_aziOffset'] = [0.0, 0.0] @@ -499,13 +565,18 @@ def DISCON_dict(turbine, controller, txt_filename=None): DISCON_dict['Ind_BldPitch'] = controller.OL_Ind_BldPitch DISCON_dict['Ind_GenTq'] = controller.OL_Ind_GenTq DISCON_dict['Ind_YawRate'] = controller.OL_Ind_YawRate + DISCON_dict['Ind_CableControl'] = controller.OL_Ind_CableControl + DISCON_dict['Ind_StructControl'] = controller.OL_Ind_StructControl # ------- Pitch Actuator ------- DISCON_dict['PA_Mode'] = controller.PA_Mode DISCON_dict['PA_CornerFreq'] = controller.PA_CornerFreq DISCON_dict['PA_Damping'] = controller.PA_Damping + # ------- Pitch Actuator Fault ------- + DISCON_dict['PF_Offsets'] = [0.,0.,0.] # ------- Zero-MQ ------- DISCON_dict['ZMQ_CommAddress'] = "tcp://localhost:5555" DISCON_dict['ZMQ_UpdatePeriod'] = 2 + # Add pass through here for param, value in controller.controller_params['DISCON'].items(): DISCON_dict[param] = value @@ -591,3 +662,14 @@ def list_check(x, return_bool=True): return is_list else: return y + +def write_array(array,format='<.4f'): + + if not hasattr(array,'__len__'): #not an array + array = [array] + + # force int if not + if 'd' in format and type(array[0]) != int: + array = [int(a) for a in array] + + return ''.join(['{:{}} '.format(item,format) for item in array]) diff --git a/ROSCO/Test_Cases/BAR_10/BAR_10_AeroDyn15.dat b/ROSCO/Test_Cases/BAR_10/BAR_10_AeroDyn15.dat index 201d9e6d8..9f32b6050 100644 --- a/ROSCO/Test_Cases/BAR_10/BAR_10_AeroDyn15.dat +++ b/ROSCO/Test_Cases/BAR_10/BAR_10_AeroDyn15.dat @@ -10,6 +10,7 @@ False Echo - Echo the input to ".AD.ech"? (fl True TwrAero - Calculate tower aerodynamic loads? (flag) False FrozenWake - Assume frozen wake during linearization? (flag) [used only when WakeMod=1 and when linearizing] False CavitCheck - Perform cavitation check? (flag) TRUE will turn off unsteady aerodynamics +False Buoyancy - Include buoyancy effects? (flag) False CompAA Flag to compute AeroAcoustics calculation [only used when WakeMod=1 or 2] "AeroAcousticsInput.dat" AA_InputFile - Aeroacoustics input file ====== Environmental Conditions =================================================================== @@ -34,10 +35,8 @@ True TIDrag - Include the drag term in the tangential-ind ====== OLAF -- cOnvecting LAgrangian Filaments (Free Vortex Wake) Theory Options ================== [used only when WakeMod=3] "unused" OLAFInputFileName - Input file for OLAF [used only when WakeMod=3] ====== Beddoes-Leishman Unsteady Airfoil Aerodynamics Options ===================================== [used only when AFAeroMod=2] -3 UAMod Unsteady Aero Model Switch (switch) {1=Baseline model (Original), 2=Gonzalez's variant (changes in Cn,Cc,Cm), 3=Minemma/Pierce variant (changes in Cc and Cm)} [used only when AFAeroMod=2] -True FLookup Flag to indicate whether a lookup for f' will be calculated (TRUE) or whether best-fit exponential equations will be used (FALSE); if FALSE S1-S4 must be provided in airfoil input files (flag) [used only when AFAeroMod=2] -0.0 UAStartRad - Starting radius for dynamic stall (fraction of rotor radius) [used only when AFAeroMod=2] -1.0 UAEndRad - Ending radius for dynamic stall (fraction of rotor radius) [used only when AFAeroMod=2] +3 UAMod - Unsteady Aero Model Switch (switch) {1=Baseline model (Original), 2=Gonzalez's variant (changes in Cn,Cc,Cm), 3=Minnema/Pierce variant (changes in Cc and Cm)} [used only when AFAeroMod=2] +True FLookup - Flag to indicate whether a lookup for f' will be calculated (TRUE) or whether best-fit exponential equations will be used (FALSE); if FALSE S1-S4 must be provided in airfoil input files (flag) [used only when AFAeroMod=2] ====== Airfoil Information ========================================================================= 3 AFTabMod - Interpolation method for multiple airfoil tables {1=1D interpolation on AoA (first table only); 2=2D interpolation on AoA and Re; 3=2D interpolation on AoA and UserProp} (-) 1 InCol_Alfa - The column in the airfoil tables that contains the angle of attack (-) @@ -81,19 +80,28 @@ True UseBlCm - Include aerodynamic pitching moment in calc "BAR_10_AeroDyn15_blade.dat" ADBlFile(1) - Name of file containing distributed aerodynamic properties for Blade #1 (-) "BAR_10_AeroDyn15_blade.dat" ADBlFile(2) - Name of file containing distributed aerodynamic properties for Blade #2 (-) [unused if NumBl < 2] "BAR_10_AeroDyn15_blade.dat" ADBlFile(3) - Name of file containing distributed aerodynamic properties for Blade #3 (-) [unused if NumBl < 3] +====== Hub Properties ============================================================================== [used only when Buoyancy=True] +0.0 VolHub - Hub volume (m^3) +0.0 HubCenBx - Hub center of buoyancy x direction offset (m) +====== Nacelle Properties ========================================================================== [used only when Buoyancy=True] +0.0 VolNac - Nacelle volume (m^3) +0,0,0 NacCenB - Position of nacelle center of buoyancy from yaw bearing in nacelle coordinates (m) +====== Tail fin Aerodynamics ======================================================================== +False TFinAero - Calculate tail fin aerodynamics model (flag) +"unused" TFinFile - Input file for tail fin aerodynamics [used only when TFinAero=True] ====== Tower Influence and Aerodynamics ============================================================= [used only when TwrPotent/=0, TwrShadow=True, or TwrAero=True] 9 NumTwrNds - Number of tower nodes used in the analysis (-) [used only when TwrPotent/=0, TwrShadow=True, or TwrAero=True] -TwrElev TwrDiam TwrCd TwrTI (used only with TwrShadow=2) -(m) (m) (-) (-) - 2.740000000000000e+01 6.000000000000000e+00 1.000000000000000e+00 1.0e-1 - 4.110000000000000e+01 6.000000000000000e+00 1.000000000000000e+00 1.0e-1 - 5.480000000000000e+01 6.000000000000000e+00 1.000000000000000e+00 1.0e-1 - 6.850000000000000e+01 6.000000000000000e+00 1.000000000000000e+00 1.0e-1 - 8.220000000000000e+01 6.000000000000000e+00 1.000000000000000e+00 1.0e-1 - 9.590000000000001e+01 6.000000000000000e+00 1.000000000000000e+00 1.0e-1 - 1.096000000000000e+02 6.000000000000000e+00 1.000000000000000e+00 1.0e-1 - 1.233000000000000e+02 5.890792130000000e+00 1.000000000000000e+00 1.0e-1 - 1.370000000000000e+02 5.530325920000000e+00 1.000000000000000e+00 1.0e-1 +TwrElev TwrDiam TwrCd TwrTI TwrCb !TwrTI used only with TwrShadow=2, TwrCb used only with Buoyancy=True +(m) (m) (-) (-) (-) + 2.740e+01 6.00000e+00 1.0e+00 1.0e-1 0.0 + 4.110e+01 6.00000e+00 1.0e+00 1.0e-1 0.0 + 5.480e+01 6.00000e+00 1.0e+00 1.0e-1 0.0 + 6.850e+01 6.00000e+00 1.0e+00 1.0e-1 0.0 + 8.220e+01 6.00000e+00 1.0e+00 1.0e-1 0.0 + 9.590e+01 6.00000e+00 1.0e+00 1.0e-1 0.0 + 1.096e+02 6.00000e+00 1.0e+00 1.0e-1 0.0 + 1.233e+02 5.89079e+00 1.0e+00 1.0e-1 0.0 + 1.370e+02 5.53032e+00 1.0e+00 1.0e-1 0.0 ====== Tower Influence and Aerodynamics ============================================================= [used only when TwrPotent/=0, TwrShadow=True, or TwrAero=True] True SumPrint - Generate a summary file listing input options and interpolated properties to ".AD.sum"? (flag) 9 NBlOuts - Number of blade node outputs [0 - 9] (-) @@ -101,18 +109,16 @@ True SumPrint - Generate a summary file listing input optio 0 NTwOuts - Number of tower node outputs [0 - 9] (-) 1, 2, 6 TwOutNd - Tower nodes whose values will be output (-) OutList - The next line(s) contains a list of output parameters. See OutListParameters.xlsx for a listing of available output channels, (-) -"RtAeroCp" -"RtAeroCq" -"RtAeroCt" -"RtAeroFxh" -"RtAeroFyh" -"RtAeroFzh" -"RtAeroMxh" -"RtAeroMyh" -"RtAeroMzh" -"RtAeroPwr" +"RtFldFxh" +"RtFldFyh" +"RtFldFzh" +"RtFldMxh" +"RtFldMyh" +"RtFldMzh" +"RtVAvgxh" +"RtFldCp" +"RtFldCt" "RtArea" -"RtSkew" "RtSpeed" "RtTSR" "RtVAvgxh" diff --git a/ROSCO/Test_Cases/BAR_10/BAR_10_DISCON.IN b/ROSCO/Test_Cases/BAR_10/BAR_10_DISCON.IN index a2d09fa10..f750015dc 100644 --- a/ROSCO/Test_Cases/BAR_10/BAR_10_DISCON.IN +++ b/ROSCO/Test_Cases/BAR_10/BAR_10_DISCON.IN @@ -1,11 +1,12 @@ ! Controller parameter input file for the BAR_10 wind turbine -! - File written using ROSCO version 2.5.0 controller tuning logic on 07/22/22 +! - File written using ROSCO version 2.8.0 controller tuning logic on 04/10/23 !------- DEBUG ------------------------------------------------------------ -1 ! LoggingLevel - {0: write no debug files, 1: write standard output .dbg-file, 2: LoggingLevel 1 + ROSCO LocalVars (.dbg2) 3: LoggingLevel 2 + complete avrSWAP-array (.dbg3)} +1 ! LoggingLevel - (0: write no debug files, 1: write standard output .dbg-file, 2: LoggingLevel 1 + ROSCO LocalVars (.dbg2) 3: LoggingLevel 2 + complete avrSWAP-array (.dbg3)) +0 ! Echo - (0 - no Echo, 1 - Echo input data to .echo) !------- CONTROLLER FLAGS ------------------------------------------------- -2 ! F_LPFType - {1: first-order low-pass filter, 2: second-order low-pass filter}, [rad/s] (currently filters generator speed and pitch control signals +2 ! F_LPFType - (1: first-order low-pass filter, 2: second-order low-pass filter), [rad/s] (currently filters generator speed and pitch control signals 0 ! F_NotchType - Notch on the measured generator speed and/or tower fore-aft motion (for floating) {0: disable, 1: generator speed, 2: tower-top fore-aft motion, 3: generator speed and tower-top fore-aft motion} 0 ! IPC_ControlMode - Turn Individual Pitch Control (IPC) for fatigue load reductions (pitch contribution) {0: off, 1: 1P reductions, 2: 1P+2P reductions} 2 ! VS_ControlMode - Generator torque control mode in above rated conditions {0: constant torque, 1: constant power, 2: TSR tracking PI control with constant torque, 3: TSR tracking PI control with constant power} @@ -20,8 +21,12 @@ 2 ! Flp_Mode - Flap control mode {0: no flap control, 1: steady state flap angle, 2: Proportional flap control, 2: Cyclic (1P) flap control} 0 ! OL_Mode - Open loop control mode {0: no open loop control, 1: open loop control vs. time} 0 ! PA_Mode - Pitch actuator mode {0 - not used, 1 - first order filter, 2 - second order filter} +0 ! PF_Mode - Pitch fault mode {0 - not used, 1 - constant offset on one or more blades} +0 ! AWC_Mode - Active wake control {0 - not used, 1 - complex number method, 2 - Coleman transform method} 0 ! Ext_Mode - External control mode {0 - not used, 1 - call external dynamic library} -0 ! ZMQ_Mode - Fuse ZeroMQ interaface {0: unused, 1: Yaw Control} +0 ! ZMQ_Mode - Fuse ZeroMQ interface {0: unused, 1: Yaw Control} +0 ! CC_Mode - Cable control mode [0- unused, 1- User defined, 2- Open loop control] +0 ! StC_Mode - Structural control mode [0- unused, 1- User defined, 2- Open loop control] !------- FILTERS ---------------------------------------------------------- 0.81771 ! F_LPFCornerFreq - Corner frequency (-3dB point) in the low-pass filters, [rad/s] @@ -52,6 +57,7 @@ !------- INDIVIDUAL PITCH CONTROL ----------------------------------------- 6.618848 8.273560 ! IPC_Vramp - Start and end wind speeds for cut-in ramp function. First entry: IPC inactive, second entry: IPC fully active. [m/s] +2 ! IPC_SatMode - IPC Saturation method (0 - no saturation (except by PC_MinPit), 1 - saturate by PS_BldPitchMin, 2 - saturate sotfly (full IPC cycle) by PC_MinPit, 3 - saturate softly by PS_BldPitchMin) 0.3 ! IPC_IntSat - Integrator saturation (maximum signal amplitude contribution to pitch from IPC), [rad] 2.050e-08 0.000e+00 ! IPC_KP - Proportional gain for the individual pitch controller: first parameter for 1P reductions, second for 2P reductions, [-] 1.450e-09 0.000e+00 ! IPC_KI - Integral gain for the individual pitch controller: first parameter for 1P reductions, second for 2P reductions, [-] @@ -93,8 +99,8 @@ -0.00972164 -0.01031092 -0.01090020 -0.01148948 -0.01207877 -0.01266805 -0.01325733 -0.01384662 -0.01443590 -0.01502518 -0.01561447 -0.01620375 -0.01679303 -0.01738232 -0.01797160 -0.01856088 -0.01915016 -0.01973945 -0.02032873 -0.02091801 -0.02150730 -0.02209658 -0.02268586 -0.02327515 -0.02386443 -0.02445371 -0.02504300 -0.02563228 -0.02622156 -0.02378670 -0.02062296 -0.02541485 -0.03159105 -0.03849962 -0.04595997 -0.05389417 -0.06225884 -0.07101431 -0.08016995 -0.08970426 -0.09955610 -0.10976762 -0.12028100 -0.13120419 -0.14238799 -0.15383228 -0.16572504 -0.17783697 -0.19011487 -0.20289651 -0.21593424 -0.22919262 -0.24255457 -0.25635133 -0.27049546 -0.28482651 -0.29923376 -0.31380076 -0.32862514 -0.34372726 ! WE_FOPoles - First order system poles [1/s] !------- YAW CONTROL ------------------------------------------------------ -0.00000 ! Y_uSwitch - Wind speed to switch between Y_ErrThresh. If zero, only the first value of Y_ErrThresh is used [m/s] -4.000000 8.000000 ! Y_ErrThresh - Yaw error threshold. Turbine begins to yaw when it passes this. If Y_uSwitch is zero, only the first value is used. [deg]. +0.00000 ! Y_uSwitch - Wind speed to switch between Y_ErrThresh. If zero, only the second value of Y_ErrThresh is used [m/s] +4.000000 8.000000 ! Y_ErrThresh - Yaw error threshold/deadbands. Turbine begins to yaw when it passes this. If Y_uSwitch is zero, only the second value is used. [deg]. 0.00870 ! Y_Rate - Yaw rate [rad/s] 0.00000 ! Y_MErrSet - Integrator saturation (maximum signal amplitude contribution to pitch from yaw-by-IPC), [rad] 0.00000 ! Y_IPC_IntSat - Integrator saturation (maximum signal amplitude contribution to pitch from yaw-by-IPC), [rad] @@ -129,12 +135,25 @@ 0 ! Ind_Breakpoint - The column in OL_Filename that contains the breakpoint (time if OL_Mode = 1) 0 ! Ind_BldPitch - The column in OL_Filename that contains the blade pitch input in rad 0 ! Ind_GenTq - The column in OL_Filename that contains the generator torque in Nm -0 ! Ind_YawRate - The column in OL_Filename that contains the generator torque in Nm +0 ! Ind_YawRate - The column in OL_Filename that contains the nacelle yaw rate rad/s +0 ! Ind_CableControl - The column(s) in OL_Filename that contains the cable control inputs in m [Used with CC_Mode = 2, must be the same size as CC_Group_N] +0 ! Ind_StructControl - The column(s) in OL_Filename that contains the structural control inputs [Used with StC_Mode = 2, must be the same size as StC_Group_N] !------- Pitch Actuator Model ----------------------------------------------------- 3.140000000000 ! PA_CornerFreq - Pitch actuator bandwidth/cut-off frequency [rad/s] 0.707000000000 ! PA_Damping - Pitch actuator damping ratio [-, unused if PA_Mode = 1] +!------- Pitch Actuator Faults ----------------------------------------------------- +0.00000000 0.00000000 0.00000000 ! PF_Offsets - Constant blade pitch offsets for blades 1-3 [rad] + +!------- Active Wake Control ----------------------------------------------------- +1 ! AWC_NumModes - Number of user-defined AWC forcing modes +1 ! AWC_n - Azimuthal mode number(s) (i.e., the number and direction of the lobes of the wake structure) +1 ! AWC_harmonic - Harmonic(s) to apply in the AWC Inverse Coleman Transformation (only used when AWC_Mode = 2) +0.0500 ! AWC_freq - Frequency(s) of forcing mode(s) [Hz] +1.0000 ! AWC_amp - Pitch amplitude(s) of individual forcing mode(s) [deg] +0.0000 ! AWC_clockangle - Initial angle(s) of forcing mode(s) [deg] + !------- External Controller Interface ----------------------------------------------------- "unused" ! DLL_FileName - Name/location of the dynamic library in the Bladed-DLL format "unused" ! DLL_InFile - Name of input file sent to the DLL (-) @@ -143,3 +162,12 @@ !------- ZeroMQ Interface --------------------------------------------------------- "tcp://localhost:5555" ! ZMQ_CommAddress - Communication address for ZMQ server, (e.g. "tcp://localhost:5555") 2 ! ZMQ_UpdatePeriod - Call ZeroMQ every [x] seconds, [s] + +!------- Cable Control --------------------------------------------------------- +1 ! CC_Group_N - Number of cable control groups + 0 ! CC_GroupIndex - First index for cable control group, should correspond to deltaL +20.000000 ! CC_ActTau - Time constant for line actuator [s] + +!------- Structural Controllers --------------------------------------------------------- +1 ! StC_Group_N - Number of cable control groups + 0 ! StC_GroupIndex - First index for structural control group, options specified in ServoDyn summary output diff --git a/ROSCO/Test_Cases/IEA-15-240-RWT-UMaineSemi/DISCON-UMaineSemi.IN b/ROSCO/Test_Cases/IEA-15-240-RWT-UMaineSemi/DISCON-UMaineSemi.IN index 3745fee9e..17c96a1ea 100644 --- a/ROSCO/Test_Cases/IEA-15-240-RWT-UMaineSemi/DISCON-UMaineSemi.IN +++ b/ROSCO/Test_Cases/IEA-15-240-RWT-UMaineSemi/DISCON-UMaineSemi.IN @@ -1,11 +1,12 @@ ! Controller parameter input file for the IEA-15-240-RWT-UMaineSemi wind turbine -! - File written using ROSCO version 2.5.0 controller tuning logic on 07/22/22 +! - File written using ROSCO version 2.8.0 controller tuning logic on 04/10/23 !------- DEBUG ------------------------------------------------------------ -2 ! LoggingLevel - {0: write no debug files, 1: write standard output .dbg-file, 2: LoggingLevel 1 + ROSCO LocalVars (.dbg2) 3: LoggingLevel 2 + complete avrSWAP-array (.dbg3)} +2 ! LoggingLevel - (0: write no debug files, 1: write standard output .dbg-file, 2: LoggingLevel 1 + ROSCO LocalVars (.dbg2) 3: LoggingLevel 2 + complete avrSWAP-array (.dbg3)) +0 ! Echo - (0 - no Echo, 1 - Echo input data to .echo) !------- CONTROLLER FLAGS ------------------------------------------------- -2 ! F_LPFType - {1: first-order low-pass filter, 2: second-order low-pass filter}, [rad/s] (currently filters generator speed and pitch control signals +2 ! F_LPFType - (1: first-order low-pass filter, 2: second-order low-pass filter), [rad/s] (currently filters generator speed and pitch control signals 2 ! F_NotchType - Notch on the measured generator speed and/or tower fore-aft motion (for floating) {0: disable, 1: generator speed, 2: tower-top fore-aft motion, 3: generator speed and tower-top fore-aft motion} 0 ! IPC_ControlMode - Turn Individual Pitch Control (IPC) for fatigue load reductions (pitch contribution) {0: off, 1: 1P reductions, 2: 1P+2P reductions} 2 ! VS_ControlMode - Generator torque control mode in above rated conditions {0: constant torque, 1: constant power, 2: TSR tracking PI control with constant torque, 3: TSR tracking PI control with constant power} @@ -20,8 +21,12 @@ 0 ! Flp_Mode - Flap control mode {0: no flap control, 1: steady state flap angle, 2: Proportional flap control, 2: Cyclic (1P) flap control} 0 ! OL_Mode - Open loop control mode {0: no open loop control, 1: open loop control vs. time} 2 ! PA_Mode - Pitch actuator mode {0 - not used, 1 - first order filter, 2 - second order filter} +0 ! PF_Mode - Pitch fault mode {0 - not used, 1 - constant offset on one or more blades} +0 ! AWC_Mode - Active wake control {0 - not used, 1 - complex number method, 2 - Coleman transform method} 0 ! Ext_Mode - External control mode {0 - not used, 1 - call external dynamic library} -0 ! ZMQ_Mode - Fuse ZeroMQ interaface {0: unused, 1: Yaw Control} +0 ! ZMQ_Mode - Fuse ZeroMQ interface {0: unused, 1: Yaw Control} +0 ! CC_Mode - Cable control mode [0- unused, 1- User defined, 2- Open loop control] +0 ! StC_Mode - Structural control mode [0- unused, 1- User defined, 2- Open loop control] !------- FILTERS ---------------------------------------------------------- 1.00810 ! F_LPFCornerFreq - Corner frequency (-3dB point) in the low-pass filters, [rad/s] @@ -52,6 +57,7 @@ !------- INDIVIDUAL PITCH CONTROL ----------------------------------------- 8.592000 10.740000 ! IPC_Vramp - Start and end wind speeds for cut-in ramp function. First entry: IPC inactive, second entry: IPC fully active. [m/s] +2 ! IPC_SatMode - IPC Saturation method (0 - no saturation (except by PC_MinPit), 1 - saturate by PS_BldPitchMin, 2 - saturate sotfly (full IPC cycle) by PC_MinPit, 3 - saturate softly by PS_BldPitchMin) 0.3 ! IPC_IntSat - Integrator saturation (maximum signal amplitude contribution to pitch from IPC), [rad] 0.000e+00 0.000e+00 ! IPC_KP - Proportional gain for the individual pitch controller: first parameter for 1P reductions, second for 2P reductions, [-] 0.000e+00 0.000e+00 ! IPC_KI - Integral gain for the individual pitch controller: first parameter for 1P reductions, second for 2P reductions, [-] @@ -93,8 +99,8 @@ -0.02438353 -0.02655283 -0.02872212 -0.03089141 -0.03306071 -0.03523000 -0.03739930 -0.03956859 -0.04173788 -0.04390718 -0.04607647 -0.04824576 -0.05041506 -0.05258435 -0.05475365 -0.05692294 -0.05909223 -0.06126153 -0.06343082 -0.06560011 -0.06776941 -0.06993870 -0.07210800 -0.07427729 -0.07644658 -0.07861588 -0.08078517 -0.08295446 -0.08512376 -0.08490640 -0.05739531 -0.05967534 -0.06643664 -0.07537721 -0.08537869 -0.09664144 -0.10851650 -0.12137925 -0.13453168 -0.14834459 -0.16280188 -0.17753158 -0.19283401 -0.20862160 -0.22461456 -0.24120058 -0.25817445 -0.27538476 -0.29299882 -0.31103587 -0.32941546 -0.34807902 -0.36693717 -0.38625237 -0.40583167 -0.42579305 -0.44596365 -0.46626113 -0.48675074 -0.50756940 ! WE_FOPoles - First order system poles [1/s] !------- YAW CONTROL ------------------------------------------------------ -0.00000 ! Y_uSwitch - Wind speed to switch between Y_ErrThresh. If zero, only the first value of Y_ErrThresh is used [m/s] -4.000000 8.000000 ! Y_ErrThresh - Yaw error threshold. Turbine begins to yaw when it passes this. If Y_uSwitch is zero, only the first value is used. [deg]. +0.00000 ! Y_uSwitch - Wind speed to switch between Y_ErrThresh. If zero, only the second value of Y_ErrThresh is used [m/s] +4.000000 8.000000 ! Y_ErrThresh - Yaw error threshold/deadbands. Turbine begins to yaw when it passes this. If Y_uSwitch is zero, only the second value is used. [deg]. 0.00870 ! Y_Rate - Yaw rate [rad/s] 0.00000 ! Y_MErrSet - Integrator saturation (maximum signal amplitude contribution to pitch from yaw-by-IPC), [rad] 0.00000 ! Y_IPC_IntSat - Integrator saturation (maximum signal amplitude contribution to pitch from yaw-by-IPC), [rad] @@ -129,12 +135,25 @@ 0 ! Ind_Breakpoint - The column in OL_Filename that contains the breakpoint (time if OL_Mode = 1) 0 ! Ind_BldPitch - The column in OL_Filename that contains the blade pitch input in rad 0 ! Ind_GenTq - The column in OL_Filename that contains the generator torque in Nm -0 ! Ind_YawRate - The column in OL_Filename that contains the generator torque in Nm +0 ! Ind_YawRate - The column in OL_Filename that contains the nacelle yaw rate rad/s +0 ! Ind_CableControl - The column(s) in OL_Filename that contains the cable control inputs in m [Used with CC_Mode = 2, must be the same size as CC_Group_N] +0 ! Ind_StructControl - The column(s) in OL_Filename that contains the structural control inputs [Used with StC_Mode = 2, must be the same size as StC_Group_N] !------- Pitch Actuator Model ----------------------------------------------------- 1.570800000000 ! PA_CornerFreq - Pitch actuator bandwidth/cut-off frequency [rad/s] 0.707000000000 ! PA_Damping - Pitch actuator damping ratio [-, unused if PA_Mode = 1] +!------- Pitch Actuator Faults ----------------------------------------------------- +0.00000000 0.00000000 0.00000000 ! PF_Offsets - Constant blade pitch offsets for blades 1-3 [rad] + +!------- Active Wake Control ----------------------------------------------------- +1 ! AWC_NumModes - Number of user-defined AWC forcing modes +1 ! AWC_n - Azimuthal mode number(s) (i.e., the number and direction of the lobes of the wake structure) +1 ! AWC_harmonic - Harmonic(s) to apply in the AWC Inverse Coleman Transformation (only used when AWC_Mode = 2) +0.0500 ! AWC_freq - Frequency(s) of forcing mode(s) [Hz] +1.0000 ! AWC_amp - Pitch amplitude(s) of individual forcing mode(s) [deg] +0.0000 ! AWC_clockangle - Initial angle(s) of forcing mode(s) [deg] + !------- External Controller Interface ----------------------------------------------------- "unused" ! DLL_FileName - Name/location of the dynamic library in the Bladed-DLL format "unused" ! DLL_InFile - Name of input file sent to the DLL (-) @@ -143,3 +162,12 @@ !------- ZeroMQ Interface --------------------------------------------------------- "tcp://localhost:5555" ! ZMQ_CommAddress - Communication address for ZMQ server, (e.g. "tcp://localhost:5555") 2 ! ZMQ_UpdatePeriod - Call ZeroMQ every [x] seconds, [s] + +!------- Cable Control --------------------------------------------------------- +1 ! CC_Group_N - Number of cable control groups + 0 ! CC_GroupIndex - First index for cable control group, should correspond to deltaL +20.000000 ! CC_ActTau - Time constant for line actuator [s] + +!------- Structural Controllers --------------------------------------------------------- +1 ! StC_Group_N - Number of cable control groups + 0 ! StC_GroupIndex - First index for structural control group, options specified in ServoDyn summary output diff --git a/ROSCO/Test_Cases/IEA-15-240-RWT-UMaineSemi/IEA-15-240-RWT-UMaineSemi_ElastoDyn.dat b/ROSCO/Test_Cases/IEA-15-240-RWT-UMaineSemi/IEA-15-240-RWT-UMaineSemi_ElastoDyn.dat index 07ca94c06..c0f6fbe79 100644 --- a/ROSCO/Test_Cases/IEA-15-240-RWT-UMaineSemi/IEA-15-240-RWT-UMaineSemi_ElastoDyn.dat +++ b/ROSCO/Test_Cases/IEA-15-240-RWT-UMaineSemi/IEA-15-240-RWT-UMaineSemi_ElastoDyn.dat @@ -120,6 +120,8 @@ True TabDelim - Use tab delimiters in text tabular output file? (fla OutList - The next line(s) contains a list of output parameters. See OutListParameters.xlsx for a listing of available output channels, (-) "Azimuth" "BldPitch1" +"BldPitch2" +"BldPitch3" "GenSpeed" "IPDefl1" "LSSGagMya" diff --git a/ROSCO/Test_Cases/IEA-15-240-RWT-UMaineSemi/IEA-15-240-RWT-UMaineSemi_MoorDyn.dat b/ROSCO/Test_Cases/IEA-15-240-RWT-UMaineSemi/IEA-15-240-RWT-UMaineSemi_MoorDyn.dat index 9032a2d8f..ecb74bd91 100644 --- a/ROSCO/Test_Cases/IEA-15-240-RWT-UMaineSemi/IEA-15-240-RWT-UMaineSemi_MoorDyn.dat +++ b/ROSCO/Test_Cases/IEA-15-240-RWT-UMaineSemi/IEA-15-240-RWT-UMaineSemi_MoorDyn.dat @@ -1,28 +1,25 @@ ---------------------- MoorDyn Input File ------------------------------------ +--------------------- MoorDyn Input File ------------------------------------ IEA 15 MW offshore reference model on UMaine VolturnUS-S semi-submersible floating platform mooring model- C. Allen UMaine FALSE Echo - echo the input file data (flag) ----------------------- LINE TYPES ------------------------------------------ -1 NTypes - number of LineTypes -Name Diam MassDen EA BA/-zeta Can Cat Cdn Cdt -(-) (m) (kg/m) (N) (N-s/-) (-) (-) (-) (-) -main 0.333 685.00 3.27E+09 -1 0.82 0.27 1.11 0.20 ----------------------- CONNECTION PROPERTIES -------------------------------- -6 NConnects - number of connections including anchors and fairleads -Node Type X Y Z M V FX FY FZ CdA CA -(-) (-) (m) (m) (m) (kg) (m^3) (kN) (kN) (kN) (m^2) (-) -1 Vessel -58.000 0.000 -14.000 0 0 0 0 0 0 0 -2 Fixed -837.600 0.000 -200.000 0 0 0 0 0 0 0 -3 Vessel 29.000 50.229 -14.000 0 0 0 0 0 0 0 -4 Fixed 418.800 725.383 -200.000 0 0 0 0 0 0 0 -5 Vessel 29.000 -50.229 -14.000 0 0 0 0 0 0 0 -6 Fixed 418.800 -725.383 -200.000 0 0 0 0 0 0 0 ----------------------- LINE PROPERTIES -------------------------------------- -3 NLines - number of line objects -Line LineType UnstrLen NumSegs NodeAnch NodeFair Flags/Outputs Control -(-) (-) (m) (-) (-) (-) (-) (-) -1 main 850.00 50 2 1 - 0 -2 main 850.00 50 4 3 - 0 -3 main 850.00 50 6 5 - 0 +Name Diam MassDen EA BA/-zeta EI Cd Ca CdAx CaAx +(-) (m) (kg/m) (N) (N-s/-) (-) (-) (-) (-) (-) +main 0.333 685.00 3.27E+09 -1 0 1.11 0.82 0.2 0.27 +---------------------- POINTS -------------------------------- +ID Type X Y Z M V CdA CA +(-) (-) (m) (m) (m) (kg) (m^3) (m^2) (-) +1 Vessel -58.000 0.000 -14.000 0 0 0 0 +2 Fixed -837.600 0.000 -200.000 0 0 0 0 +3 Vessel 29.000 50.229 -14.000 0 0 0 0 +4 Fixed 418.800 725.383 -200.000 0 0 0 0 +5 Vessel 29.000 -50.229 -14.000 0 0 0 0 +6 Fixed 418.800 -725.383 -200.000 0 0 0 0 +---------------------- LINES -------------------------------------- +ID LineType AttachA AttachB UnstrLen NumSegs Outputs +(-) (-) (-) (-) (m) (-) (-) +1 main 2 1 850.00 50 - +2 main 4 3 850.00 50 - +3 main 6 5 850.00 50 - ---------------------- SOLVER OPTIONS --------------------------------------- 0.001 dtM - time step to use in mooring integration (s) 3.0e6 kbot - bottom stiffness (Pa/m) @@ -31,7 +28,7 @@ Line LineType UnstrLen NumSegs NodeAnch NodeFair Flags/Outputs Control 60.0 TmaxIC - max time for ic gen (s) 4.0 CdScaleIC - factor by which to scale drag coefficients during dynamic relaxation (-) 0.001 threshIC - threshold for IC convergence (-) ------------------------- OUTPUTS -------------------------------------------- +------------------------ OUTPUTS -------------------------------------------- FairTen1 FairTen2 FairTen3 @@ -60,5 +57,4 @@ fx fy fz END -------------------------- need this line -------------------------------------- - +------------------------- need this line -------------------------------------- \ No newline at end of file diff --git a/ROSCO/Test_Cases/IEA-15-240-RWT-UMaineSemi/IEA-15-240-RWT-UMaineSemi_ServoDyn.dat b/ROSCO/Test_Cases/IEA-15-240-RWT-UMaineSemi/IEA-15-240-RWT-UMaineSemi_ServoDyn.dat index f402ab4be..51a09d4e8 100644 --- a/ROSCO/Test_Cases/IEA-15-240-RWT-UMaineSemi/IEA-15-240-RWT-UMaineSemi_ServoDyn.dat +++ b/ROSCO/Test_Cases/IEA-15-240-RWT-UMaineSemi/IEA-15-240-RWT-UMaineSemi_ServoDyn.dat @@ -81,7 +81,7 @@ True GenTiStp - Method to stop the generator {T: timed usin False DLL_Ramp - Whether a linear ramp should be used between DLL_DT time steps [introduces time shift when true] (flag) [used only with Bladed Interface] 9999.9 BPCutoff - Cuttoff frequency for low-pass filter on blade pitch from DLL (Hz) [used only with Bladed Interface] 0.0 NacYaw_North - Reference yaw angle of the nacelle when the upwind end points due North (deg) [used only with Bladed Interface] -0 Ptch_Cntrl - Record 28: Use individual pitch control {0: collective pitch; 1: individual pitch control} (switch) [used only with Bladed Interface] +1 Ptch_Cntrl - Record 28: Use individual pitch control {0: collective pitch; 1: individual pitch control} (switch) [used only with Bladed Interface] 0.0 Ptch_SetPnt - Record 5: Below-rated pitch angle set-point (deg) [used only with Bladed Interface] 0.0 Ptch_Min - Record 6: Minimum pitch angle (deg) [used only with Bladed Interface] 0.0 Ptch_Max - Record 7: Maximum pitch angle (deg) [used only with Bladed Interface] diff --git a/ROSCO/Test_Cases/IEA-15-240-RWT-UMaineSemi/IEA-15-240-RWT_AeroDyn15.dat b/ROSCO/Test_Cases/IEA-15-240-RWT-UMaineSemi/IEA-15-240-RWT_AeroDyn15.dat index 585bd715c..c2602a6f9 100644 --- a/ROSCO/Test_Cases/IEA-15-240-RWT-UMaineSemi/IEA-15-240-RWT_AeroDyn15.dat +++ b/ROSCO/Test_Cases/IEA-15-240-RWT-UMaineSemi/IEA-15-240-RWT_AeroDyn15.dat @@ -1,16 +1,17 @@ ------- AERODYN v15.03.* INPUT FILE ------------------------------------------------ IEA 15 MW Offshore Reference Turbine ====== General Options ============================================================================ -False Echo - Echo the input to ".AD.ech"? (flag) -"default" DTAero - Time interval for aerodynamic calculations {or "default"} (s) -1 WakeMod - Type of wake/induction model (switch) {0=none, 1=BEMT, 2=DBEMT, 3=OLAF} [WakeMod cannot be 2 or 3 when linearizing] -2 AFAeroMod - Type of blade airfoil aerodynamics model (switch) {1=steady model, 2=Beddoes-Leishman unsteady model} [AFAeroMod must be 1 when linearizing] -1 TwrPotent - Type tower influence on wind based on potential flow around the tower (switch) {0=none, 1=baseline potential flow, 2=potential flow with Bak correction} -0 TwrShadow - Calculate tower influence on wind based on downstream tower shadow (switch) {0=none, 1=Powles model, 2=Eames model} -True TwrAero - Calculate tower aerodynamic loads? (flag) -False FrozenWake - Assume frozen wake during linearization? (flag) [used only when WakeMod=1 and when linearizing] -False CavitCheck - Perform cavitation check? (flag) [AFAeroMod must be 1 when CavitCheck=true] -False CompAA - Flag to compute AeroAcoustics calculation [used only when WakeMod = 1 or 2] +False Echo - Echo the input to ".AD.ech"? (flag) +"default" DTAero - Time interval for aerodynamic calculations {or "default"} (s) +1 WakeMod - Type of wake/induction model (switch) {0=none, 1=BEMT, 2=DBEMT, 3=OLAF} [WakeMod cannot be 2 or 3 when linearizing] +2 AFAeroMod - Type of blade airfoil aerodynamics model (switch) {1=steady model, 2=Beddoes-Leishman unsteady model} [AFAeroMod must be 1 when linearizing] +1 TwrPotent - Type tower influence on wind based on potential flow around the tower (switch) {0=none, 1=baseline potential flow, 2=potential flow with Bak correction} +1 TwrShadow - Calculate tower influence on wind based on downstream tower shadow (switch) {0=none, 1=Powles model, 2=Eames model} +True TwrAero - Calculate tower aerodynamic loads? (flag) +False FrozenWake - Assume frozen wake during linearization? (flag) [used only when WakeMod=1 and when linearizing] +False CavitCheck - Perform cavitation check? (flag) [AFAeroMod must be 1 when CavitCheck=true] +False Buoyancy - Include buoyancy effects? (flag) +False CompAA - Flag to compute AeroAcoustics calculation [used only when WakeMod = 1 or 2] "AeroAcousticsInput.dat" AA_InputFile - AeroAcoustics input file [used only when CompAA=true] ====== Environmental Conditions =================================================================== "default" AirDens - Air density (kg/m^3) @@ -36,8 +37,6 @@ True TIDrag - Include the drag term in the tangential-ind ====== Beddoes-Leishman Unsteady Airfoil Aerodynamics Options ===================================== [used only when AFAeroMod=2] 3 UAMod - Unsteady Aero Model Switch (switch) {1=Baseline model (Original), 2=Gonzalez's variant (changes in Cn,Cc,Cm), 3=Minnema/Pierce variant (changes in Cc and Cm)} [used only when AFAeroMod=2] True FLookup - Flag to indicate whether a lookup for f' will be calculated (TRUE) or whether best-fit exponential equations will be used (FALSE); if FALSE S1-S4 must be provided in airfoil input files (flag) [used only when AFAeroMod=2] -0.0 UAStartRad - Starting radius for dynamic stall (fraction of rotor radius) [used only when AFAeroMod=2] -1.0 UAEndRad - Ending radius for dynamic stall (fraction of rotor radius) [used only when AFAeroMod=2] ====== Airfoil Information ========================================================================= 1 AFTabMod - Interpolation method for multiple airfoil tables {1=1D interpolation on AoA (first table only); 2=2D interpolation on AoA and Re; 3=2D interpolation on AoA and UserProp} (-) 1 InCol_Alfa - The column in the airfoil tables that contains the angle of attack (-) @@ -101,21 +100,30 @@ True UseBlCm - Include aerodynamic pitching moment in calc "IEA-15-240-RWT_AeroDyn15_blade.dat" ADBlFile(1) - Name of file containing distributed aerodynamic properties for Blade #1 (-) "IEA-15-240-RWT_AeroDyn15_blade.dat" ADBlFile(2) - Name of file containing distributed aerodynamic properties for Blade #2 (-) [unused if NumBl < 2] "IEA-15-240-RWT_AeroDyn15_blade.dat" ADBlFile(3) - Name of file containing distributed aerodynamic properties for Blade #3 (-) [unused if NumBl < 3] -====== Tower Influence and Aerodynamics ============================================================= [used only when TwrPotent/=0, TwrShadow/=0, or TwrAero=True] -11 NumTwrNds - Number of tower nodes used in the analysis (-) [used only when TwrPotent/=0, TwrShadow/=0, or TwrAero=True] -TwrElev TwrDiam TwrCd TwrTI (used only with TwrShadow=2) -(m) (m) (-) (-) - 15. 10. 0.5 0.1 - 28. 10. 0.5 0.1 - 41. 9.926 0.5 0.1 - 54. 9.443 0.5 0.1 - 67. 8.833 0.5 0.1 - 80. 8.151 0.5 0.1 - 93. 7.39 0.5 0.1 - 106. 6.909 0.5 0.1 - 119. 6.748 0.5 0.1 - 132. 6.572 0.5 0.1 - 144.386 6.5 0.5 0.1 +====== Hub Properties ============================================================================== [used only when Buoyancy=True] +0.0 VolHub - Hub volume (m^3) +0.0 HubCenBx - Hub center of buoyancy x direction offset (m) +====== Nacelle Properties ========================================================================== [used only when Buoyancy=True] +0.0 VolNac - Nacelle volume (m^3) +0,0,0 NacCenB - Position of nacelle center of buoyancy from yaw bearing in nacelle coordinates (m) +====== Tail fin Aerodynamics ======================================================================== +False TFinAero - Calculate tail fin aerodynamics model (flag) +"unused" TFinFile - Input file for tail fin aerodynamics [used only when TFinAero=True] +====== Tower Influence and Aerodynamics ============================================================ [used only when TwrPotent/=0, TwrShadow/=0, TwrAero=True, or Buoyancy=True] + 11 NumTwrNds - Number of tower nodes used in the analysis (-) [used only when TwrPotent/=0, TwrShadow/=0, TwrAero=True, or Buoyancy=True] +TwrElev TwrDiam TwrCd TwrTI TwrCb !TwrTI used only with TwrShadow=2, TwrCb used only with Buoyancy=True +(m) (m) (-) (-) (-) + 15. 10. 0.5 0.1 0.0 + 28. 10. 0.5 0.1 0.0 + 41. 9.926 0.5 0.1 0.0 + 54. 9.443 0.5 0.1 0.0 + 67. 8.833 0.5 0.1 0.0 + 80. 8.151 0.5 0.1 0.0 + 93. 7.39 0.5 0.1 0.0 + 106. 6.909 0.5 0.1 0.0 + 119. 6.748 0.5 0.1 0.0 + 132. 6.572 0.5 0.1 0.0 + 144.386 6.5 0.5 0.1 0.0 ====== Outputs ==================================================================================== True SumPrint - Generate a summary file listing input options and interpolated properties to ".AD.sum"? (flag) 9 NBlOuts - Number of blade node outputs [0 - 9] (-) @@ -123,15 +131,15 @@ True SumPrint - Generate a summary file listing input optio 0 NTwOuts - Number of tower node outputs [0 - 9] (-) 1, 2, 3, 4, 5 TwOutNd - Tower nodes whose values will be output (-) OutList - The next line(s) contains a list of output parameters. See OutListParameters.xlsx for a listing of available output channels, (-) -"RtAeroFxh" -"RtAeroFyh" -"RtAeroFzh" -"RtAeroMxh" -"RtAeroMyh" -"RtAeroMzh" +"RtFldFxh" +"RtFldFyh" +"RtFldFzh" +"RtFldMxh" +"RtFldMyh" +"RtFldMzh" "RtVAvgxh" -"RtAeroCp" -"RtAeroCt" +"RtFldCp" +"RtFldCt" "RtArea" "RtSpeed" "RtTSR" diff --git a/ROSCO/Test_Cases/IEA-15-240-RWT-UMaineSemi/StC-Force-Col1.dat b/ROSCO/Test_Cases/IEA-15-240-RWT-UMaineSemi/StC-Force-Col1.dat new file mode 100644 index 000000000..5709eb5fb --- /dev/null +++ b/ROSCO/Test_Cases/IEA-15-240-RWT-UMaineSemi/StC-Force-Col1.dat @@ -0,0 +1,95 @@ +------- STRUCTURAL CONTROL (StC) INPUT FILE ---------------------------- +Input file for tuned mass damper, module by Matt Lackner, Meghan Glade, and Semyung Park (UMass) +---------------------- SIMULATION CONTROL -------------------------------------- +True Echo - Echo input data to .ech (flag) +---------------------- StC DEGREES OF FREEDOM ---------------------------------- + 5 StC_DOF_MODE - DOF mode (switch) {0: No StC or TLCD DOF; 1: StC_X_DOF, StC_Y_DOF, and/or StC_Z_DOF (three independent StC DOFs); 2: StC_XY_DOF (Omni-Directional StC); 3: TLCD; 4: Prescribed force/moment time series} +false StC_X_DOF - DOF on or off for StC X (flag) [Used only when StC_DOF_MODE=1] +false StC_Y_DOF - DOF on or off for StC Y (flag) [Used only when StC_DOF_MODE=1] +false StC_Z_DOF - DOF on or off for StC Z (flag) [Used only when StC_DOF_MODE=1] +---------------------- StC LOCATION ------------------------------------------- [relative to the reference origin of component attached to] + -51.75 StC_P_X - At rest X position of StC (m) + 0 StC_P_Y - At rest Y position of StC (m) + -10 StC_P_Z - At rest Z position of StC (m) +---------------------- StC INITIAL CONDITIONS --------------------------------- [used only when StC_DOF_MODE=1 or 2] + 0 StC_X_DSP - StC X initial displacement (m) [relative to at rest position] + 0 StC_Y_DSP - StC Y initial displacement (m) [relative to at rest position] + 0 StC_Z_DSP - StC Z initial displacement (m) [relative to at rest position; used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] +"none" StC_Z_PreLd - StC Z pre-load (N) {"gravity" to offset for gravity load; "none" or 0 to turn off} [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] +---------------------- StC CONFIGURATION -------------------------------------- [used only when StC_DOF_MODE=1 or 2] + 0 StC_X_PSP - Positive stop position (maximum X mass displacement) (m) + 0 StC_X_NSP - Negative stop position (minimum X mass displacement) (m) + 0 StC_Y_PSP - Positive stop position (maximum Y mass displacement) (m) + 0 StC_Y_NSP - Negative stop position (minimum Y mass displacement) (m) + 0 StC_Z_PSP - Positive stop position (maximum Z mass displacement) (m) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] + 0 StC_Z_NSP - Negative stop position (minimum Z mass displacement) (m) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] +---------------------- StC MASS, STIFFNESS, & DAMPING ------------------------- [used only when StC_DOF_MODE=1 or 2] + 0 StC_X_M - StC X mass (kg) [must equal StC_Y_M for StC_DOF_MODE = 2] + 1 StC_Y_M - StC Y mass (kg) [must equal StC_X_M for StC_DOF_MODE = 2] + 0 StC_Z_M - StC Z mass (kg) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] + 0 StC_XY_M - StC XY mass (kg) [used only when StC_DOF_MODE=2] + 0 StC_X_K - StC X stiffness (N/m) + 0 StC_Y_K - StC Y stiffness (N/m) + 1e8 StC_Z_K - StC Z stiffness (N/m) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] + 0 StC_X_C - StC X damping (N/(m/s)) + 0 StC_Y_C - StC Y damping (N/(m/s)) + 100 StC_Z_C - StC Z damping (N/(m/s)) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] + 0 StC_X_KS - Stop spring X stiffness (N/m) + 0 StC_Y_KS - Stop spring Y stiffness (N/m) + 0 StC_Z_KS - Stop spring Z stiffness (N/m) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] + 0 StC_X_CS - Stop spring X damping (N/(m/s)) + 0 StC_Y_CS - Stop spring Y damping (N/(m/s)) + 0 StC_Z_CS - Stop spring Z damping (N/(m/s)) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] +---------------------- StC USER-DEFINED SPRING FORCES ------------------------- [used only when StC_DOF_MODE=1 or 2] +False Use_F_TBL - Use spring force from user-defined table (flag) + 17 NKInpSt - Number of spring force input stations +---------------------- StC SPRING FORCES TABLE -------------------------------- [used only when StC_DOF_MODE=1 or 2] + X F_X Y F_Y Z F_Z + (m) (N) (m) (N) (m) (N) +-6.0000000E+00 -4.8000000E+06 -6.0000000E+00 -4.8000000E+06 -6.0000000E+00 -4.8000000E+06 +-5.0000000E+00 -2.4000000E+06 -5.0000000E+00 -2.4000000E+06 -5.0000000E+00 -2.4000000E+06 +-4.5000000E+00 -1.2000000E+06 -4.5000000E+00 -1.2000000E+06 -4.5000000E+00 -1.2000000E+06 +-4.0000000E+00 -6.0000000E+05 -4.0000000E+00 -6.0000000E+05 -4.0000000E+00 -6.0000000E+05 +-3.5000000E+00 -3.0000000E+05 -3.5000000E+00 -3.0000000E+05 -3.5000000E+00 -3.0000000E+05 +-3.0000000E+00 -1.5000000E+05 -3.0000000E+00 -1.5000000E+05 -3.0000000E+00 -1.5000000E+05 +-2.5000000E+00 -1.0000000E+05 -2.5000000E+00 -1.0000000E+05 -2.5000000E+00 -1.0000000E+05 +-2.0000000E+00 -6.5000000E+04 -2.0000000E+00 -6.5000000E+04 -2.0000000E+00 -6.5000000E+04 + 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00 + 2.0000000E+00 6.5000000E+04 2.0000000E+00 6.5000000E+04 2.0000000E+00 6.5000000E+04 + 2.5000000E+00 1.0000000E+05 2.5000000E+00 1.0000000E+05 2.5000000E+00 1.0000000E+05 + 3.0000000E+00 1.5000000E+05 3.0000000E+00 1.5000000E+05 3.0000000E+00 1.5000000E+05 + 3.5000000E+00 3.0000000E+05 3.5000000E+00 3.0000000E+05 3.5000000E+00 3.0000000E+05 + 4.0000000E+00 6.0000000E+05 4.0000000E+00 6.0000000E+05 4.0000000E+00 6.0000000E+05 + 4.5000000E+00 1.2000000E+06 4.5000000E+00 1.2000000E+06 4.5000000E+00 1.2000000E+06 + 5.0000000E+00 2.4000000E+06 5.0000000E+00 2.4000000E+06 5.0000000E+00 2.4000000E+06 + 6.0000000E+00 4.8000000E+06 6.0000000E+00 4.8000000E+06 6.0000000E+00 4.8000000E+06 +---------------------- StructCtrl CONTROL -------------------------------------------- [used only when StC_DOF_MODE=1 or 2] + 5 StC_CMODE - Control mode (switch) {0:none; 1: Semi-Active Control Mode; 4: Active Control Mode through Simulink (not available); 5: Active Control Mode through Bladed interface} + 1 StC_CChan - Control channel group (1:10) for stiffness and damping (StC_[XYZ]_K, StC_[XYZ]_C, and StC_[XYZ]_Brake) (specify additional channels for blade instances of StC active control -- one channel per blade) [used only when StC_DOF_MODE=1 or 2, and StC_CMODE=4 or 5] + 1 StC_SA_MODE - Semi-Active control mode {1: velocity-based ground hook control; 2: Inverse velocity-based ground hook control; 3: displacement-based ground hook control 4: Phase difference Algorithm with Friction Force 5: Phase difference Algorithm with Damping Force} (-) + 0 StC_X_C_HIGH - StC X high damping for ground hook control + 0 StC_X_C_LOW - StC X low damping for ground hook control + 0 StC_Y_C_HIGH - StC Y high damping for ground hook control + 0 StC_Y_C_LOW - StC Y low damping for ground hook control + 0 StC_Z_C_HIGH - StC Z high damping for ground hook control [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] + 0 StC_Z_C_LOW - StC Z low damping for ground hook control [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] + 0 StC_X_C_BRAKE - StC X high damping for braking the StC (Don't use it now. should be zero) + 0 StC_Y_C_BRAKE - StC Y high damping for braking the StC (Don't use it now. should be zero) + 0 StC_Z_C_BRAKE - StC Z high damping for braking the StC (Don't use it now. should be zero) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] +---------------------- TLCD --------------------------------------------------- [used only when StC_DOF_MODE=3] + 7.9325 L_X - X TLCD total length (m) + 6.5929 B_X - X TLCD horizontal length (m) + 2.0217 area_X - X TLCD cross-sectional area of vertical column (m^2) + 0.913 area_ratio_X - X TLCD cross-sectional area ratio (vertical column area divided by horizontal column area) (-) + 2.5265 headLossCoeff_X - X TLCD head loss coeff (-) + 1000 rho_X - X TLCD liquid density (kg/m^3) + 3.5767 L_Y - Y TLCD total length (m) + 2.1788 B_Y - Y TLCD horizontal length (m) + 1.2252 area_Y - Y TLCD cross-sectional area of vertical column (m^2) + 2.7232 area_ratio_Y - Y TLCD cross-sectional area ratio (vertical column area divided by horizontal column area) (-) + 0.6433 headLossCoeff_Y - Y TLCD head loss coeff (-) + 1000 rho_Y - Y TLCD liquid density (kg/m^3) +---------------------- PRESCRIBED TIME SERIES --------------------------------- [used only when StC_DOF_MODE=4] + 1 PrescribedForcesCoord- Prescribed forces are in global or local coordinates (switch) {1: global; 2: local} +"Bld-TimeForceSeries.dat" PrescribedForcesFile - Time series force and moment (7 columns of time, FX, FY, FZ, MX, MY, MZ) +------------------------------------------------------------------------------- \ No newline at end of file diff --git a/ROSCO/Test_Cases/IEA-15-240-RWT-UMaineSemi/StC-Force-Col2.dat b/ROSCO/Test_Cases/IEA-15-240-RWT-UMaineSemi/StC-Force-Col2.dat new file mode 100644 index 000000000..83e86cf8d --- /dev/null +++ b/ROSCO/Test_Cases/IEA-15-240-RWT-UMaineSemi/StC-Force-Col2.dat @@ -0,0 +1,95 @@ +------- STRUCTURAL CONTROL (StC) INPUT FILE ---------------------------- +Input file for tuned mass damper, module by Matt Lackner, Meghan Glade, and Semyung Park (UMass) +---------------------- SIMULATION CONTROL -------------------------------------- +True Echo - Echo input data to .ech (flag) +---------------------- StC DEGREES OF FREEDOM ---------------------------------- + 5 StC_DOF_MODE - DOF mode (switch) {0: No StC or TLCD DOF; 1: StC_X_DOF, StC_Y_DOF, and/or StC_Z_DOF (three independent StC DOFs); 2: StC_XY_DOF (Omni-Directional StC); 3: TLCD; 4: Prescribed force/moment time series} +false StC_X_DOF - DOF on or off for StC X (flag) [Used only when StC_DOF_MODE=1] +false StC_Y_DOF - DOF on or off for StC Y (flag) [Used only when StC_DOF_MODE=1] +false StC_Z_DOF - DOF on or off for StC Z (flag) [Used only when StC_DOF_MODE=1] +---------------------- StC LOCATION ------------------------------------------- [relative to the reference origin of component attached to] +25.874997 StC_P_X - At rest X position of StC (m) +44.816815 StC_P_Y - At rest Y position of StC (m) + -10 StC_P_Z - At rest Z position of StC (m) +---------------------- StC INITIAL CONDITIONS --------------------------------- [used only when StC_DOF_MODE=1 or 2] + 0 StC_X_DSP - StC X initial displacement (m) [relative to at rest position] + 0 StC_Y_DSP - StC Y initial displacement (m) [relative to at rest position] + 0 StC_Z_DSP - StC Z initial displacement (m) [relative to at rest position; used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] +"none" StC_Z_PreLd - StC Z pre-load (N) {"gravity" to offset for gravity load; "none" or 0 to turn off} [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] +---------------------- StC CONFIGURATION -------------------------------------- [used only when StC_DOF_MODE=1 or 2] + 0 StC_X_PSP - Positive stop position (maximum X mass displacement) (m) + 0 StC_X_NSP - Negative stop position (minimum X mass displacement) (m) + 0 StC_Y_PSP - Positive stop position (maximum Y mass displacement) (m) + 0 StC_Y_NSP - Negative stop position (minimum Y mass displacement) (m) + 0 StC_Z_PSP - Positive stop position (maximum Z mass displacement) (m) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] + 0 StC_Z_NSP - Negative stop position (minimum Z mass displacement) (m) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] +---------------------- StC MASS, STIFFNESS, & DAMPING ------------------------- [used only when StC_DOF_MODE=1 or 2] + 0 StC_X_M - StC X mass (kg) [must equal StC_Y_M for StC_DOF_MODE = 2] + 1 StC_Y_M - StC Y mass (kg) [must equal StC_X_M for StC_DOF_MODE = 2] + 0 StC_Z_M - StC Z mass (kg) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] + 0 StC_XY_M - StC XY mass (kg) [used only when StC_DOF_MODE=2] + 0 StC_X_K - StC X stiffness (N/m) + 0 StC_Y_K - StC Y stiffness (N/m) + 1e8 StC_Z_K - StC Z stiffness (N/m) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] + 0 StC_X_C - StC X damping (N/(m/s)) + 0 StC_Y_C - StC Y damping (N/(m/s)) + 100 StC_Z_C - StC Z damping (N/(m/s)) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] + 0 StC_X_KS - Stop spring X stiffness (N/m) + 0 StC_Y_KS - Stop spring Y stiffness (N/m) + 0 StC_Z_KS - Stop spring Z stiffness (N/m) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] + 0 StC_X_CS - Stop spring X damping (N/(m/s)) + 0 StC_Y_CS - Stop spring Y damping (N/(m/s)) + 0 StC_Z_CS - Stop spring Z damping (N/(m/s)) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] +---------------------- StC USER-DEFINED SPRING FORCES ------------------------- [used only when StC_DOF_MODE=1 or 2] +False Use_F_TBL - Use spring force from user-defined table (flag) + 17 NKInpSt - Number of spring force input stations +---------------------- StC SPRING FORCES TABLE -------------------------------- [used only when StC_DOF_MODE=1 or 2] + X F_X Y F_Y Z F_Z + (m) (N) (m) (N) (m) (N) +-6.0000000E+00 -4.8000000E+06 -6.0000000E+00 -4.8000000E+06 -6.0000000E+00 -4.8000000E+06 +-5.0000000E+00 -2.4000000E+06 -5.0000000E+00 -2.4000000E+06 -5.0000000E+00 -2.4000000E+06 +-4.5000000E+00 -1.2000000E+06 -4.5000000E+00 -1.2000000E+06 -4.5000000E+00 -1.2000000E+06 +-4.0000000E+00 -6.0000000E+05 -4.0000000E+00 -6.0000000E+05 -4.0000000E+00 -6.0000000E+05 +-3.5000000E+00 -3.0000000E+05 -3.5000000E+00 -3.0000000E+05 -3.5000000E+00 -3.0000000E+05 +-3.0000000E+00 -1.5000000E+05 -3.0000000E+00 -1.5000000E+05 -3.0000000E+00 -1.5000000E+05 +-2.5000000E+00 -1.0000000E+05 -2.5000000E+00 -1.0000000E+05 -2.5000000E+00 -1.0000000E+05 +-2.0000000E+00 -6.5000000E+04 -2.0000000E+00 -6.5000000E+04 -2.0000000E+00 -6.5000000E+04 + 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00 + 2.0000000E+00 6.5000000E+04 2.0000000E+00 6.5000000E+04 2.0000000E+00 6.5000000E+04 + 2.5000000E+00 1.0000000E+05 2.5000000E+00 1.0000000E+05 2.5000000E+00 1.0000000E+05 + 3.0000000E+00 1.5000000E+05 3.0000000E+00 1.5000000E+05 3.0000000E+00 1.5000000E+05 + 3.5000000E+00 3.0000000E+05 3.5000000E+00 3.0000000E+05 3.5000000E+00 3.0000000E+05 + 4.0000000E+00 6.0000000E+05 4.0000000E+00 6.0000000E+05 4.0000000E+00 6.0000000E+05 + 4.5000000E+00 1.2000000E+06 4.5000000E+00 1.2000000E+06 4.5000000E+00 1.2000000E+06 + 5.0000000E+00 2.4000000E+06 5.0000000E+00 2.4000000E+06 5.0000000E+00 2.4000000E+06 + 6.0000000E+00 4.8000000E+06 6.0000000E+00 4.8000000E+06 6.0000000E+00 4.8000000E+06 +---------------------- StructCtrl CONTROL -------------------------------------------- [used only when StC_DOF_MODE=1 or 2] + 5 StC_CMODE - Control mode (switch) {0:none; 1: Semi-Active Control Mode; 4: Active Control Mode through Simulink (not available); 5: Active Control Mode through Bladed interface} + 2 StC_CChan - Control channel group (1:10) for stiffness and damping (StC_[XYZ]_K, StC_[XYZ]_C, and StC_[XYZ]_Brake) (specify additional channels for blade instances of StC active control -- one channel per blade) [used only when StC_DOF_MODE=1 or 2, and StC_CMODE=4 or 5] + 1 StC_SA_MODE - Semi-Active control mode {1: velocity-based ground hook control; 2: Inverse velocity-based ground hook control; 3: displacement-based ground hook control 4: Phase difference Algorithm with Friction Force 5: Phase difference Algorithm with Damping Force} (-) + 0 StC_X_C_HIGH - StC X high damping for ground hook control + 0 StC_X_C_LOW - StC X low damping for ground hook control + 0 StC_Y_C_HIGH - StC Y high damping for ground hook control + 0 StC_Y_C_LOW - StC Y low damping for ground hook control + 0 StC_Z_C_HIGH - StC Z high damping for ground hook control [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] + 0 StC_Z_C_LOW - StC Z low damping for ground hook control [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] + 0 StC_X_C_BRAKE - StC X high damping for braking the StC (Don't use it now. should be zero) + 0 StC_Y_C_BRAKE - StC Y high damping for braking the StC (Don't use it now. should be zero) + 0 StC_Z_C_BRAKE - StC Z high damping for braking the StC (Don't use it now. should be zero) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] +---------------------- TLCD --------------------------------------------------- [used only when StC_DOF_MODE=3] + 7.9325 L_X - X TLCD total length (m) + 6.5929 B_X - X TLCD horizontal length (m) + 2.0217 area_X - X TLCD cross-sectional area of vertical column (m^2) + 0.913 area_ratio_X - X TLCD cross-sectional area ratio (vertical column area divided by horizontal column area) (-) + 2.5265 headLossCoeff_X - X TLCD head loss coeff (-) + 1000 rho_X - X TLCD liquid density (kg/m^3) + 3.5767 L_Y - Y TLCD total length (m) + 2.1788 B_Y - Y TLCD horizontal length (m) + 1.2252 area_Y - Y TLCD cross-sectional area of vertical column (m^2) + 2.7232 area_ratio_Y - Y TLCD cross-sectional area ratio (vertical column area divided by horizontal column area) (-) + 0.6433 headLossCoeff_Y - Y TLCD head loss coeff (-) + 1000 rho_Y - Y TLCD liquid density (kg/m^3) +---------------------- PRESCRIBED TIME SERIES --------------------------------- [used only when StC_DOF_MODE=4] + 1 PrescribedForcesCoord- Prescribed forces are in global or local coordinates (switch) {1: global; 2: local} +"Bld-TimeForceSeries.dat" PrescribedForcesFile - Time series force and moment (7 columns of time, FX, FY, FZ, MX, MY, MZ) +------------------------------------------------------------------------------- \ No newline at end of file diff --git a/ROSCO/Test_Cases/IEA-15-240-RWT-UMaineSemi/StC-Force-Col3.dat b/ROSCO/Test_Cases/IEA-15-240-RWT-UMaineSemi/StC-Force-Col3.dat new file mode 100644 index 000000000..0488dc801 --- /dev/null +++ b/ROSCO/Test_Cases/IEA-15-240-RWT-UMaineSemi/StC-Force-Col3.dat @@ -0,0 +1,95 @@ +------- STRUCTURAL CONTROL (StC) INPUT FILE ---------------------------- +Input file for tuned mass damper, module by Matt Lackner, Meghan Glade, and Semyung Park (UMass) +---------------------- SIMULATION CONTROL -------------------------------------- +True Echo - Echo input data to .ech (flag) +---------------------- StC DEGREES OF FREEDOM ---------------------------------- + 5 StC_DOF_MODE - DOF mode (switch) {0: No StC or TLCD DOF; 1: StC_X_DOF, StC_Y_DOF, and/or StC_Z_DOF (three independent StC DOFs); 2: StC_XY_DOF (Omni-Directional StC); 3: TLCD; 4: Prescribed force/moment time series} +false StC_X_DOF - DOF on or off for StC X (flag) [Used only when StC_DOF_MODE=1] +false StC_Y_DOF - DOF on or off for StC Y (flag) [Used only when StC_DOF_MODE=1] +false StC_Z_DOF - DOF on or off for StC Z (flag) [Used only when StC_DOF_MODE=1] +---------------------- StC LOCATION ------------------------------------------- [relative to the reference origin of component attached to] +25.874997 StC_P_X - At rest X position of StC (m) +-44.816815 StC_P_Y - At rest Y position of StC (m) + -10 StC_P_Z - At rest Z position of StC (m) +---------------------- StC INITIAL CONDITIONS --------------------------------- [used only when StC_DOF_MODE=1 or 2] + 0 StC_X_DSP - StC X initial displacement (m) [relative to at rest position] + 0 StC_Y_DSP - StC Y initial displacement (m) [relative to at rest position] + 0 StC_Z_DSP - StC Z initial displacement (m) [relative to at rest position; used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] +"none" StC_Z_PreLd - StC Z pre-load (N) {"gravity" to offset for gravity load; "none" or 0 to turn off} [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] +---------------------- StC CONFIGURATION -------------------------------------- [used only when StC_DOF_MODE=1 or 2] + 0 StC_X_PSP - Positive stop position (maximum X mass displacement) (m) + 0 StC_X_NSP - Negative stop position (minimum X mass displacement) (m) + 0 StC_Y_PSP - Positive stop position (maximum Y mass displacement) (m) + 0 StC_Y_NSP - Negative stop position (minimum Y mass displacement) (m) + 0 StC_Z_PSP - Positive stop position (maximum Z mass displacement) (m) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] + 0 StC_Z_NSP - Negative stop position (minimum Z mass displacement) (m) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] +---------------------- StC MASS, STIFFNESS, & DAMPING ------------------------- [used only when StC_DOF_MODE=1 or 2] + 0 StC_X_M - StC X mass (kg) [must equal StC_Y_M for StC_DOF_MODE = 2] + 1 StC_Y_M - StC Y mass (kg) [must equal StC_X_M for StC_DOF_MODE = 2] + 0 StC_Z_M - StC Z mass (kg) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] + 0 StC_XY_M - StC XY mass (kg) [used only when StC_DOF_MODE=2] + 0 StC_X_K - StC X stiffness (N/m) + 0 StC_Y_K - StC Y stiffness (N/m) + 1e8 StC_Z_K - StC Z stiffness (N/m) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] + 0 StC_X_C - StC X damping (N/(m/s)) + 0 StC_Y_C - StC Y damping (N/(m/s)) + 100 StC_Z_C - StC Z damping (N/(m/s)) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] + 0 StC_X_KS - Stop spring X stiffness (N/m) + 0 StC_Y_KS - Stop spring Y stiffness (N/m) + 0 StC_Z_KS - Stop spring Z stiffness (N/m) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] + 0 StC_X_CS - Stop spring X damping (N/(m/s)) + 0 StC_Y_CS - Stop spring Y damping (N/(m/s)) + 0 StC_Z_CS - Stop spring Z damping (N/(m/s)) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] +---------------------- StC USER-DEFINED SPRING FORCES ------------------------- [used only when StC_DOF_MODE=1 or 2] +False Use_F_TBL - Use spring force from user-defined table (flag) + 17 NKInpSt - Number of spring force input stations +---------------------- StC SPRING FORCES TABLE -------------------------------- [used only when StC_DOF_MODE=1 or 2] + X F_X Y F_Y Z F_Z + (m) (N) (m) (N) (m) (N) +-6.0000000E+00 -4.8000000E+06 -6.0000000E+00 -4.8000000E+06 -6.0000000E+00 -4.8000000E+06 +-5.0000000E+00 -2.4000000E+06 -5.0000000E+00 -2.4000000E+06 -5.0000000E+00 -2.4000000E+06 +-4.5000000E+00 -1.2000000E+06 -4.5000000E+00 -1.2000000E+06 -4.5000000E+00 -1.2000000E+06 +-4.0000000E+00 -6.0000000E+05 -4.0000000E+00 -6.0000000E+05 -4.0000000E+00 -6.0000000E+05 +-3.5000000E+00 -3.0000000E+05 -3.5000000E+00 -3.0000000E+05 -3.5000000E+00 -3.0000000E+05 +-3.0000000E+00 -1.5000000E+05 -3.0000000E+00 -1.5000000E+05 -3.0000000E+00 -1.5000000E+05 +-2.5000000E+00 -1.0000000E+05 -2.5000000E+00 -1.0000000E+05 -2.5000000E+00 -1.0000000E+05 +-2.0000000E+00 -6.5000000E+04 -2.0000000E+00 -6.5000000E+04 -2.0000000E+00 -6.5000000E+04 + 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00 + 2.0000000E+00 6.5000000E+04 2.0000000E+00 6.5000000E+04 2.0000000E+00 6.5000000E+04 + 2.5000000E+00 1.0000000E+05 2.5000000E+00 1.0000000E+05 2.5000000E+00 1.0000000E+05 + 3.0000000E+00 1.5000000E+05 3.0000000E+00 1.5000000E+05 3.0000000E+00 1.5000000E+05 + 3.5000000E+00 3.0000000E+05 3.5000000E+00 3.0000000E+05 3.5000000E+00 3.0000000E+05 + 4.0000000E+00 6.0000000E+05 4.0000000E+00 6.0000000E+05 4.0000000E+00 6.0000000E+05 + 4.5000000E+00 1.2000000E+06 4.5000000E+00 1.2000000E+06 4.5000000E+00 1.2000000E+06 + 5.0000000E+00 2.4000000E+06 5.0000000E+00 2.4000000E+06 5.0000000E+00 2.4000000E+06 + 6.0000000E+00 4.8000000E+06 6.0000000E+00 4.8000000E+06 6.0000000E+00 4.8000000E+06 +---------------------- StructCtrl CONTROL -------------------------------------------- [used only when StC_DOF_MODE=1 or 2] + 5 StC_CMODE - Control mode (switch) {0:none; 1: Semi-Active Control Mode; 4: Active Control Mode through Simulink (not available); 5: Active Control Mode through Bladed interface} + 3 StC_CChan - Control channel group (1:10) for stiffness and damping (StC_[XYZ]_K, StC_[XYZ]_C, and StC_[XYZ]_Brake) (specify additional channels for blade instances of StC active control -- one channel per blade) [used only when StC_DOF_MODE=1 or 2, and StC_CMODE=4 or 5] + 1 StC_SA_MODE - Semi-Active control mode {1: velocity-based ground hook control; 2: Inverse velocity-based ground hook control; 3: displacement-based ground hook control 4: Phase difference Algorithm with Friction Force 5: Phase difference Algorithm with Damping Force} (-) + 0 StC_X_C_HIGH - StC X high damping for ground hook control + 0 StC_X_C_LOW - StC X low damping for ground hook control + 0 StC_Y_C_HIGH - StC Y high damping for ground hook control + 0 StC_Y_C_LOW - StC Y low damping for ground hook control + 0 StC_Z_C_HIGH - StC Z high damping for ground hook control [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] + 0 StC_Z_C_LOW - StC Z low damping for ground hook control [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] + 0 StC_X_C_BRAKE - StC X high damping for braking the StC (Don't use it now. should be zero) + 0 StC_Y_C_BRAKE - StC Y high damping for braking the StC (Don't use it now. should be zero) + 0 StC_Z_C_BRAKE - StC Z high damping for braking the StC (Don't use it now. should be zero) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] +---------------------- TLCD --------------------------------------------------- [used only when StC_DOF_MODE=3] + 7.9325 L_X - X TLCD total length (m) + 6.5929 B_X - X TLCD horizontal length (m) + 2.0217 area_X - X TLCD cross-sectional area of vertical column (m^2) + 0.913 area_ratio_X - X TLCD cross-sectional area ratio (vertical column area divided by horizontal column area) (-) + 2.5265 headLossCoeff_X - X TLCD head loss coeff (-) + 1000 rho_X - X TLCD liquid density (kg/m^3) + 3.5767 L_Y - Y TLCD total length (m) + 2.1788 B_Y - Y TLCD horizontal length (m) + 1.2252 area_Y - Y TLCD cross-sectional area of vertical column (m^2) + 2.7232 area_ratio_Y - Y TLCD cross-sectional area ratio (vertical column area divided by horizontal column area) (-) + 0.6433 headLossCoeff_Y - Y TLCD head loss coeff (-) + 1000 rho_Y - Y TLCD liquid density (kg/m^3) +---------------------- PRESCRIBED TIME SERIES --------------------------------- [used only when StC_DOF_MODE=4] + 1 PrescribedForcesCoord- Prescribed forces are in global or local coordinates (switch) {1: global; 2: local} +"Bld-TimeForceSeries.dat" PrescribedForcesFile - Time series force and moment (7 columns of time, FX, FY, FZ, MX, MY, MZ) +------------------------------------------------------------------------------- \ No newline at end of file diff --git a/ROSCO/Test_Cases/NREL-5MW/DISCON.IN b/ROSCO/Test_Cases/NREL-5MW/DISCON.IN index b5a353aea..0ddb6aa4f 100644 --- a/ROSCO/Test_Cases/NREL-5MW/DISCON.IN +++ b/ROSCO/Test_Cases/NREL-5MW/DISCON.IN @@ -1,11 +1,12 @@ ! Controller parameter input file for the NREL-5MW wind turbine -! - File written using ROSCO version 2.5.0 controller tuning logic on 07/22/22 +! - File written using ROSCO version 2.8.0 controller tuning logic on 04/10/23 !------- DEBUG ------------------------------------------------------------ -1 ! LoggingLevel - {0: write no debug files, 1: write standard output .dbg-file, 2: LoggingLevel 1 + ROSCO LocalVars (.dbg2) 3: LoggingLevel 2 + complete avrSWAP-array (.dbg3)} +1 ! LoggingLevel - (0: write no debug files, 1: write standard output .dbg-file, 2: LoggingLevel 1 + ROSCO LocalVars (.dbg2) 3: LoggingLevel 2 + complete avrSWAP-array (.dbg3)) +0 ! Echo - (0 - no Echo, 1 - Echo input data to .echo) !------- CONTROLLER FLAGS ------------------------------------------------- -1 ! F_LPFType - {1: first-order low-pass filter, 2: second-order low-pass filter}, [rad/s] (currently filters generator speed and pitch control signals +1 ! F_LPFType - (1: first-order low-pass filter, 2: second-order low-pass filter), [rad/s] (currently filters generator speed and pitch control signals 0 ! F_NotchType - Notch on the measured generator speed and/or tower fore-aft motion (for floating) {0: disable, 1: generator speed, 2: tower-top fore-aft motion, 3: generator speed and tower-top fore-aft motion} 0 ! IPC_ControlMode - Turn Individual Pitch Control (IPC) for fatigue load reductions (pitch contribution) {0: off, 1: 1P reductions, 2: 1P+2P reductions} 3 ! VS_ControlMode - Generator torque control mode in above rated conditions {0: constant torque, 1: constant power, 2: TSR tracking PI control with constant torque, 3: TSR tracking PI control with constant power} @@ -20,8 +21,12 @@ 0 ! Flp_Mode - Flap control mode {0: no flap control, 1: steady state flap angle, 2: Proportional flap control, 2: Cyclic (1P) flap control} 0 ! OL_Mode - Open loop control mode {0: no open loop control, 1: open loop control vs. time} 0 ! PA_Mode - Pitch actuator mode {0 - not used, 1 - first order filter, 2 - second order filter} +0 ! PF_Mode - Pitch fault mode {0 - not used, 1 - constant offset on one or more blades} +0 ! AWC_Mode - Active wake control {0 - not used, 1 - complex number method, 2 - Coleman transform method} 0 ! Ext_Mode - External control mode {0 - not used, 1 - call external dynamic library} -0 ! ZMQ_Mode - Fuse ZeroMQ interaface {0: unused, 1: Yaw Control} +0 ! ZMQ_Mode - Fuse ZeroMQ interface {0: unused, 1: Yaw Control} +0 ! CC_Mode - Cable control mode [0- unused, 1- User defined, 2- Open loop control] +0 ! StC_Mode - Structural control mode [0- unused, 1- User defined, 2- Open loop control] !------- FILTERS ---------------------------------------------------------- 1.57080 ! F_LPFCornerFreq - Corner frequency (-3dB point) in the low-pass filters, [rad/s] @@ -52,6 +57,7 @@ !------- INDIVIDUAL PITCH CONTROL ----------------------------------------- 9.120000 11.400000 ! IPC_Vramp - Start and end wind speeds for cut-in ramp function. First entry: IPC inactive, second entry: IPC fully active. [m/s] +2 ! IPC_SatMode - IPC Saturation method (0 - no saturation (except by PC_MinPit), 1 - saturate by PS_BldPitchMin, 2 - saturate sotfly (full IPC cycle) by PC_MinPit, 3 - saturate softly by PS_BldPitchMin) 0.3 ! IPC_IntSat - Integrator saturation (maximum signal amplitude contribution to pitch from IPC), [rad] 0.000e+00 0.000e+00 ! IPC_KP - Proportional gain for the individual pitch controller: first parameter for 1P reductions, second for 2P reductions, [-] 0.000e+00 0.000e+00 ! IPC_KI - Integral gain for the individual pitch controller: first parameter for 1P reductions, second for 2P reductions, [-] @@ -93,8 +99,8 @@ -0.01638154 -0.01796321 -0.01954487 -0.02112654 -0.02270820 -0.02428987 -0.02587154 -0.02745320 -0.02903487 -0.03061653 -0.03219820 -0.03377987 -0.03536153 -0.03694320 -0.03852486 -0.04010653 -0.04168820 -0.04326986 -0.04485153 -0.04643319 -0.04801486 -0.04959652 -0.05117819 -0.05275986 -0.05434152 -0.05592319 -0.05758373 -0.05882656 -0.06845507 -0.05992890 0.02094683 0.01327182 0.00285485 -0.00935731 -0.02210773 -0.03573037 -0.04990222 -0.06404904 -0.07899629 -0.09463190 -0.10954192 -0.12525205 -0.14168652 -0.15843395 -0.17415061 -0.19052486 -0.20780146 -0.22581018 -0.24373777 -0.26010871 -0.27706767 -0.29551708 -0.31430599 -0.33428552 -0.35420853 -0.37183729 -0.38936451 -0.40828911 -0.42758878 -0.44818175 ! WE_FOPoles - First order system poles [1/s] !------- YAW CONTROL ------------------------------------------------------ -0.00000 ! Y_uSwitch - Wind speed to switch between Y_ErrThresh. If zero, only the first value of Y_ErrThresh is used [m/s] -4.000000 8.000000 ! Y_ErrThresh - Yaw error threshold. Turbine begins to yaw when it passes this. If Y_uSwitch is zero, only the first value is used. [deg]. +0.00000 ! Y_uSwitch - Wind speed to switch between Y_ErrThresh. If zero, only the second value of Y_ErrThresh is used [m/s] +4.000000 8.000000 ! Y_ErrThresh - Yaw error threshold/deadbands. Turbine begins to yaw when it passes this. If Y_uSwitch is zero, only the second value is used. [deg]. 0.00870 ! Y_Rate - Yaw rate [rad/s] 0.00000 ! Y_MErrSet - Integrator saturation (maximum signal amplitude contribution to pitch from yaw-by-IPC), [rad] 0.00000 ! Y_IPC_IntSat - Integrator saturation (maximum signal amplitude contribution to pitch from yaw-by-IPC), [rad] @@ -129,12 +135,25 @@ 0 ! Ind_Breakpoint - The column in OL_Filename that contains the breakpoint (time if OL_Mode = 1) 0 ! Ind_BldPitch - The column in OL_Filename that contains the blade pitch input in rad 0 ! Ind_GenTq - The column in OL_Filename that contains the generator torque in Nm -0 ! Ind_YawRate - The column in OL_Filename that contains the generator torque in Nm +0 ! Ind_YawRate - The column in OL_Filename that contains the nacelle yaw rate rad/s +0 ! Ind_CableControl - The column(s) in OL_Filename that contains the cable control inputs in m [Used with CC_Mode = 2, must be the same size as CC_Group_N] +0 ! Ind_StructControl - The column(s) in OL_Filename that contains the structural control inputs [Used with StC_Mode = 2, must be the same size as StC_Group_N] !------- Pitch Actuator Model ----------------------------------------------------- 3.140000000000 ! PA_CornerFreq - Pitch actuator bandwidth/cut-off frequency [rad/s] 0.707000000000 ! PA_Damping - Pitch actuator damping ratio [-, unused if PA_Mode = 1] +!------- Pitch Actuator Faults ----------------------------------------------------- +0.00000000 0.00000000 0.00000000 ! PF_Offsets - Constant blade pitch offsets for blades 1-3 [rad] + +!------- Active Wake Control ----------------------------------------------------- +1 ! AWC_NumModes - Number of user-defined AWC forcing modes +1 ! AWC_n - Azimuthal mode number(s) (i.e., the number and direction of the lobes of the wake structure) +1 ! AWC_harmonic - Harmonic(s) to apply in the AWC Inverse Coleman Transformation (only used when AWC_Mode = 2) +0.0500 ! AWC_freq - Frequency(s) of forcing mode(s) [Hz] +1.0000 ! AWC_amp - Pitch amplitude(s) of individual forcing mode(s) [deg] +0.0000 ! AWC_clockangle - Initial angle(s) of forcing mode(s) [deg] + !------- External Controller Interface ----------------------------------------------------- "unused" ! DLL_FileName - Name/location of the dynamic library in the Bladed-DLL format "unused" ! DLL_InFile - Name of input file sent to the DLL (-) @@ -143,3 +162,12 @@ !------- ZeroMQ Interface --------------------------------------------------------- "tcp://localhost:5555" ! ZMQ_CommAddress - Communication address for ZMQ server, (e.g. "tcp://localhost:5555") 2 ! ZMQ_UpdatePeriod - Call ZeroMQ every [x] seconds, [s] + +!------- Cable Control --------------------------------------------------------- +1 ! CC_Group_N - Number of cable control groups + 0 ! CC_GroupIndex - First index for cable control group, should correspond to deltaL +20.000000 ! CC_ActTau - Time constant for line actuator [s] + +!------- Structural Controllers --------------------------------------------------------- +1 ! StC_Group_N - Number of cable control groups + 0 ! StC_GroupIndex - First index for structural control group, options specified in ServoDyn summary output diff --git a/ROSCO/Test_Cases/NREL-5MW/NRELOffshrBsline5MW_Onshore_AeroDyn15.dat b/ROSCO/Test_Cases/NREL-5MW/NRELOffshrBsline5MW_Onshore_AeroDyn15.dat index 0983cb2d3..b3660b01a 100644 --- a/ROSCO/Test_Cases/NREL-5MW/NRELOffshrBsline5MW_Onshore_AeroDyn15.dat +++ b/ROSCO/Test_Cases/NREL-5MW/NRELOffshrBsline5MW_Onshore_AeroDyn15.dat @@ -10,6 +10,7 @@ False Echo - Echo the input to ".AD.ech"? (flag True TwrAero - Calculate tower aerodynamic loads? (flag) False FrozenWake - Assume frozen wake during linearization? (flag) [used only when WakeMod=1 and when linearizing] False CavitCheck - Perform cavitation check? (flag) [AFAeroMod must be 1 when CavitCheck=true] +False Buoyancy - Include buoyancy effects? (flag) False CompAA - Flag to compute AeroAcoustics calculation [only used when WakeMod=1 or 2] "unused" AA_InputFile - Aeroacoustics input file ====== Environmental Conditions =================================================================== @@ -34,10 +35,8 @@ False TIDrag - Include the drag term in the tangential-induc ====== OLAF -- cOnvecting LAgrangian Filaments (Free Vortex Wake) Theory Options ================== [used only when WakeMod=3] "unused" OLAFInputFileName - Input file for OLAF [used only when WakeMod=3] ====== Beddoes-Leishman Unsteady Airfoil Aerodynamics Options ===================================== [used only when AFAeroMod=2] - 3 UAMod - Unsteady Aero Model Switch (switch) {1=Baseline model (Original), 2=Gonzalez's variant (changes in Cn,Cc,Cm), 3=Minnema/Pierce variant (changes in Cc and Cm)} [used only when AFAeroMod=2] -True FLookup - Flag to indicate whether a lookup for f' will be calculated (TRUE) or whether best-fit exponential equations will be used (FALSE); if FALSE S1-S4 must be provided in airfoil input files (flag) [used only when AFAeroMod=2] -0.0 UAStartRad - Starting radius for dynamic stall (fraction of rotor radius) [used only when AFAeroMod=2] -1.0 UAEndRad - Ending radius for dynamic stall (fraction of rotor radius) [used only when AFAeroMod=2] +3 UAMod - Unsteady Aero Model Switch (switch) {1=Baseline model (Original), 2=Gonzalez's variant (changes in Cn,Cc,Cm), 3=Minnema/Pierce variant (changes in Cc and Cm)} [used only when AFAeroMod=2] +True FLookup - Flag to indicate whether a lookup for f' will be calculated (TRUE) or whether best-fit exponential equations will be used (FALSE); if FALSE S1-S4 must be provided in airfoil input files (flag) [used only when AFAeroMod=2] ====== Airfoil Information ========================================================================= 1 AFTabMod - Interpolation method for multiple airfoil tables {1=1D interpolation on AoA (first table only); 2=2D interpolation on AoA and Re; 3=2D interpolation on AoA and UserProp} (-) 1 InCol_Alfa - The column in the airfoil tables that contains the angle of attack (-) @@ -59,22 +58,31 @@ True UseBlCm - Include aerodynamic pitching moment in calcul "NRELOffshrBsline5MW_AeroDyn_blade.dat" ADBlFile(1) - Name of file containing distributed aerodynamic properties for Blade #1 (-) "NRELOffshrBsline5MW_AeroDyn_blade.dat" ADBlFile(2) - Name of file containing distributed aerodynamic properties for Blade #2 (-) [unused if NumBl < 2] "NRELOffshrBsline5MW_AeroDyn_blade.dat" ADBlFile(3) - Name of file containing distributed aerodynamic properties for Blade #3 (-) [unused if NumBl < 3] +====== Hub Properties ============================================================================== [used only when Buoyancy=True] +0.0 VolHub - Hub volume (m^3) +0.0 HubCenBx - Hub center of buoyancy x direction offset (m) +====== Nacelle Properties ========================================================================== [used only when Buoyancy=True] +0.0 VolNac - Nacelle volume (m^3) +0,0,0 NacCenB - Position of nacelle center of buoyancy from yaw bearing in nacelle coordinates (m) +====== Tail fin Aerodynamics ======================================================================== +False TFinAero - Calculate tail fin aerodynamics model (flag) +"unused" TFinFile - Input file for tail fin aerodynamics [used only when TFinAero=True] ====== Tower Influence and Aerodynamics ============================================================= [used only when TwrPotent/=0, TwrShadow=True, or TwrAero=True] 12 NumTwrNds - Number of tower nodes used in the analysis (-) [used only when TwrPotent/=0, TwrShadow=True, or TwrAero=True] -TwrElev TwrDiam TwrCd TwrTI (used only with TwrShadow=2) -(m) (m) (-) (-) -0.0000000E+00 6.0000000E+00 1.0000000E+00 1.000000E-01 -8.5261000E+00 5.7870000E+00 1.0000000E+00 1.000000E-01 -1.7053000E+01 5.5740000E+00 1.0000000E+00 1.000000E-01 -2.5579000E+01 5.3610000E+00 1.0000000E+00 1.000000E-01 -3.4105000E+01 5.1480000E+00 1.0000000E+00 1.000000E-01 -4.2633000E+01 4.9350000E+00 1.0000000E+00 1.000000E-01 -5.1158000E+01 4.7220000E+00 1.0000000E+00 1.000000E-01 -5.9685000E+01 4.5090000E+00 1.0000000E+00 1.000000E-01 -6.8211000E+01 4.2960000E+00 1.0000000E+00 1.000000E-01 -7.6738000E+01 4.0830000E+00 1.0000000E+00 1.000000E-01 -8.5268000E+01 3.8700000E+00 1.0000000E+00 1.000000E-01 -8.7600000E+01 3.8700000E+00 1.0000000E+00 1.000000E-01 +TwrElev TwrDiam TwrCd TwrTI TwrCb !TwrTI used only with TwrShadow=2, TwrCb used only with Buoyancy=True +(m) (m) (-) (-) (-) +0.0000000E+00 6.0000000E+00 1.0000000E+00 1.000000E-01 0.0 +8.5261000E+00 5.7870000E+00 1.0000000E+00 1.000000E-01 0.0 +1.7053000E+01 5.5740000E+00 1.0000000E+00 1.000000E-01 0.0 +2.5579000E+01 5.3610000E+00 1.0000000E+00 1.000000E-01 0.0 +3.4105000E+01 5.1480000E+00 1.0000000E+00 1.000000E-01 0.0 +4.2633000E+01 4.9350000E+00 1.0000000E+00 1.000000E-01 0.0 +5.1158000E+01 4.7220000E+00 1.0000000E+00 1.000000E-01 0.0 +5.9685000E+01 4.5090000E+00 1.0000000E+00 1.000000E-01 0.0 +6.8211000E+01 4.2960000E+00 1.0000000E+00 1.000000E-01 0.0 +7.6738000E+01 4.0830000E+00 1.0000000E+00 1.000000E-01 0.0 +8.5268000E+01 3.8700000E+00 1.0000000E+00 1.000000E-01 0.0 +8.7600000E+01 3.8700000E+00 1.0000000E+00 1.000000E-01 0.0 ====== Outputs ==================================================================================== True SumPrint - Generate a summary file listing input options and interpolated properties to ".AD.sum"? (flag) 0 NBlOuts - Number of blade node outputs [0 - 9] (-) @@ -82,5 +90,17 @@ True SumPrint - Generate a summary file listing input option 0 NTwOuts - Number of tower node outputs [0 - 9] (-) 1, 2, 6 TwOutNd - Tower nodes whose values will be output (-) OutList - The next line(s) contains a list of output parameters. See OutListParameters.xlsx for a listing of available output channels, (-) +"RtFldFxh" +"RtFldFyh" +"RtFldFzh" +"RtFldMxh" +"RtFldMyh" +"RtFldMzh" +"RtVAvgxh" +"RtFldCp" +"RtFldCt" +"RtArea" +"RtSpeed" +"RtTSR" END of input file (the word "END" must appear in the first 3 columns of this last OutList line) --------------------------------------------------------------------------------------- diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF00_Coords.txt b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF00_Coords.txt new file mode 100644 index 000000000..e9309e03a --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF00_Coords.txt @@ -0,0 +1,208 @@ + 201 NumCoords ! The number of coordinates in the airfoil shape file (including an extra coordinate for airfoil reference). Set to zero if coordinates not included. +! ......... x-y coordinates are next if NumCoords > 0 ............. +! x-y coordinate of airfoil reference +! x/c y/c + 0.500000 0 +! coordinates of airfoil shape +! interpolation to 200 points +! x/c y/c + 1.00000000000000e+00 1.39471767468535e-15 + 9.99492456366675e-01 -2.24148318097192e-02 + 9.97998442938042e-01 -4.47793322876220e-02 + 9.95467925285309e-01 -6.70365581798988e-02 + 9.91981297584349e-01 -8.91473650534134e-02 + 9.87535715129057e-01 -1.11060278052329e-01 + 9.82077318711035e-01 -1.32710580192188e-01 + 9.75645752125599e-01 -1.54053421230182e-01 + 9.68327814997901e-01 -1.75062933826036e-01 + 9.60169311985103e-01 -1.95709072524484e-01 + 9.51019761347344e-01 -2.15876183412258e-01 + 9.41032965384679e-01 -2.35574562290692e-01 + 9.30228135178293e-01 -2.54760790502087e-01 + 9.18600973249388e-01 -2.73373623585437e-01 + 9.06286773024904e-01 -2.91445285668231e-01 + 8.93185468322794e-01 -3.08852284793353e-01 + 8.79429131687551e-01 -3.25629671028512e-01 + 8.65020010482894e-01 -3.41723774803256e-01 + 8.50001183978561e-01 -3.57112177867390e-01 + 8.34409947013148e-01 -3.71770913166281e-01 + 8.18263641617925e-01 -3.85648552858056e-01 + 8.01628456968450e-01 -3.98748400170390e-01 + 7.84595497003635e-01 -4.11125308634395e-01 + 7.67122879759481e-01 -4.22652791316593e-01 + 7.49310431319132e-01 -4.33396610986265e-01 + 7.31192318835036e-01 -4.43343955969101e-01 + 7.12809122212147e-01 -4.52489087671710e-01 + 6.94192882766294e-01 -4.60805480273623e-01 + 6.75356426213553e-01 -4.68221413716844e-01 + 6.56401839622218e-01 -4.74887730613940e-01 + 6.37339053739694e-01 -4.80732155257960e-01 + 6.18216799132259e-01 -4.85797045327747e-01 + 5.99072127289441e-01 -4.90092245328121e-01 + 5.79920098443495e-01 -4.93529601024917e-01 + 5.60830239179689e-01 -4.96308798320980e-01 + 5.41809841204068e-01 -4.98254021026852e-01 + 5.22902255947823e-01 -4.99468302412137e-01 + 5.04138617740840e-01 -4.99969461095629e-01 + 4.85547896236042e-01 -4.99782528766859e-01 + 4.67157180742230e-01 -4.98932207272937e-01 + 4.48992436485026e-01 -4.97429938215178e-01 + 4.31090922803529e-01 -4.95199601187320e-01 + 4.13451809735344e-01 -4.92443613818918e-01 + 3.96103805194879e-01 -4.89121761104649e-01 + 3.79096627499341e-01 -4.85124024486578e-01 + 3.62407327470865e-01 -4.80659331665282e-01 + 3.46066636516655e-01 -4.75685087833417e-01 + 3.30096115507155e-01 -4.70203747355840e-01 + 3.14480352866339e-01 -4.64314583285520e-01 + 2.99254081643518e-01 -4.57980939909463e-01 + 2.84450426976392e-01 -4.51177575409728e-01 + 2.70052866033160e-01 -4.43988939168408e-01 + 2.56066550501318e-01 -4.36445000343028e-01 + 2.42483923277781e-01 -4.28590357469827e-01 + 2.29353790045290e-01 -4.20376016737305e-01 + 2.16603264062538e-01 -4.11943400950387e-01 + 2.04317853658681e-01 -4.03192627249739e-01 + 1.92459446608375e-01 -3.94201135001427e-01 + 1.81000889336564e-01 -3.85028191464174e-01 + 1.69975424985927e-01 -3.75644842886581e-01 + 1.59391096347033e-01 -3.66066250246720e-01 + 1.49207465402409e-01 -3.56350787229031e-01 + 1.39487797355366e-01 -3.46454046169616e-01 + 1.30120240319336e-01 -3.36494792306467e-01 + 1.21215059211584e-01 -3.26386152642893e-01 + 1.12658598266997e-01 -3.16237746353461e-01 + 1.04576031217800e-01 -3.05961432628231e-01 + 9.68117255237024e-02 -2.95688054408038e-01 + 8.94183192669232e-02 -2.85386126810182e-01 + 8.24692613312736e-02 -2.75012912186705e-01 + 7.58031535914957e-02 -2.64686382950272e-01 + 6.95265332165359e-02 -2.54344021225804e-01 + 6.36014773641337e-02 -2.44016481364265e-01 + 5.79875426758039e-02 -2.33733614688635e-01 + 5.27214572831349e-02 -2.23480055785704e-01 + 4.77407756799443e-02 -2.13293199734344e-01 + 4.30911198450984e-02 -2.03156079856565e-01 + 3.87383767680824e-02 -1.93089031734237e-01 + 3.47120078049050e-02 -1.83082592300236e-01 + 3.09831915833964e-02 -1.73156756176345e-01 + 2.73972939643108e-02 -1.63368018994347e-01 + 2.42148186237083e-02 -1.53628642008223e-01 + 2.11591799216729e-02 -1.44034525093811e-01 + 1.84468268040835e-02 -1.34516182856983e-01 + 1.59138335980001e-02 -1.25130288878497e-01 + 1.36131610235361e-02 -1.15857640369663e-01 + 1.14838295959446e-02 -1.06718459753818e-01 + 9.63946848246122e-03 -9.76879552179587e-02 + 7.95426403181202e-03 -8.87933378901162e-02 + 6.48712578142165e-03 -8.00260463587484e-02 + 5.16242415846458e-03 -7.13984274261874e-02 + 3.96141128417998e-03 -6.29131069298763e-02 + 2.94206395570219e-03 -5.45622661453796e-02 + 2.13806552335743e-03 -4.63439971542207e-02 + 1.44971764281537e-03 -3.82678090225701e-02 + 9.19962693446690e-04 -3.03318166757594e-02 + 5.13539051739693e-04 -2.25365794204782e-02 + 2.28620066730956e-04 -1.48836875697269e-02 + 7.90911911777832e-05 -7.37097402213213e-03 + 0.00000000000000e+00 0.00000000000000e+00 + 7.90677652262213e-05 7.36950623430851e-03 + 2.28464565111448e-04 1.48777524287952e-02 + 5.12873373489222e-04 2.25230881526787e-02 + 9.18597455380868e-04 3.03075781606325e-02 + 1.44666023734530e-03 3.82295855300727e-02 + 2.13316604432083e-03 4.62883932406539e-02 + 2.93360033162344e-03 5.44859437589187e-02 + 3.94803817877652e-03 6.28126278437423e-02 + 5.14351598889891e-03 7.12701576675508e-02 + 6.46190285472730e-03 7.98662577301812e-02 + 7.91902151822289e-03 8.85987369572577e-02 + 9.59444803793060e-03 9.74544221488751e-02 + 1.14235102541198e-02 1.06442996258128e-01 + 1.35337735871235e-02 1.15536956454720e-01 + 1.58224157496375e-02 1.24758221029162e-01 + 1.83235379987219e-02 1.34093489066500e-01 + 2.10204849111940e-02 1.43552196795823e-01 + 2.40367775427033e-02 1.53088940216613e-01 + 2.71877316554608e-02 1.62764372071491e-01 + 3.07399015207509e-02 1.72484170230167e-01 + 3.44190712967375e-02 1.82342411230462e-01 + 3.84042462872392e-02 1.92272935169736e-01 + 4.26949602499204e-02 2.02267606430067e-01 + 4.72829519098945e-02 2.12327253752788e-01 + 5.21982679528133e-02 2.22432953038477e-01 + 5.73926065743804e-02 2.32603305860823e-01 + 6.29241217245761e-02 2.42803072101294e-01 + 6.87643637125652e-02 2.53043124634065e-01 + 7.49396649714102e-02 2.63302631639567e-01 + 8.15067225995126e-02 2.73538864194590e-01 + 8.83465340790937e-02 2.83822725719936e-01 + 9.56069618941523e-02 2.94046380437990e-01 + 1.03242517429104e-01 3.04232736766140e-01 + 1.11181349110592e-01 3.14429033366110e-01 + 1.19600191231908e-01 3.24484491634080e-01 + 1.28332959831487e-01 3.34525491878455e-01 + 1.37529624980321e-01 3.44409800526354e-01 + 1.47054393871766e-01 3.54250702832129e-01 + 1.57068458906247e-01 3.63878030450328e-01 + 1.67434000189824e-01 3.73414748310375e-01 + 1.78267900010996e-01 3.82720355055487e-01 + 1.89470766243389e-01 3.91888095042532e-01 + 2.01116356758227e-01 4.00815766784955e-01 + 2.13142982412971e-01 4.09560128320329e-01 + 2.25647591527817e-01 4.17962490202192e-01 + 2.38508303803600e-01 4.26178518900819e-01 + 2.51815542326035e-01 4.34041451446706e-01 + 2.65513873471791e-01 4.41613730534841e-01 + 2.79625890849574e-01 4.48822548308045e-01 + 2.94122344676086e-01 4.55688297738170e-01 + 3.09025395595222e-01 4.62123018507889e-01 + 3.24322980248437e-01 4.68104987140686e-01 + 3.39961508551486e-01 4.73721797521014e-01 + 3.55970212497486e-01 4.78842188217134e-01 + 3.72330405840910e-01 4.83451204703119e-01 + 3.89018592148974e-01 4.87553971207526e-01 + 4.06028086432003e-01 4.91073750593815e-01 + 4.23330061515063e-01 4.94038626508448e-01 + 4.40892507832343e-01 4.96523552581426e-01 + 4.58722088973087e-01 4.98299627767656e-01 + 4.76781800214759e-01 4.99452452619975e-01 + 4.95047752165150e-01 4.99958293491181e-01 + 5.13494417346180e-01 4.99806115294212e-01 + 5.32095125341593e-01 4.98977641113232e-01 + 5.50821128028667e-01 4.97448239777686e-01 + 5.69628317431665e-01 4.95095914136444e-01 + 5.88509798330163e-01 4.92097041935332e-01 + 6.07423091269127e-01 4.88360764967307e-01 + 6.26315879676062e-01 4.83792644100844e-01 + 6.45179027618201e-01 4.78506342917923e-01 + 6.63949992276556e-01 4.72397468589394e-01 + 6.82596771397553e-01 4.65480454296126e-01 + 7.01105667898352e-01 4.57821533331759e-01 + 7.19390458980571e-01 4.49306560335264e-01 + 7.37449386734799e-01 4.40021763716986e-01 + 7.55233287450602e-01 4.29949280199755e-01 + 7.72675183085231e-01 4.19055842892285e-01 + 7.89810876588208e-01 4.07465502995371e-01 + 8.06484809364324e-01 3.95019026978122e-01 + 8.22749466427636e-01 3.81863671783111e-01 + 8.38549437843995e-01 3.67985948498897e-01 + 8.53822843141276e-01 3.53376712171519e-01 + 8.68482698282576e-01 3.38013117891467e-01 + 8.82527277768971e-01 3.21961416297325e-01 + 8.95954036277289e-01 3.05275366473099e-01 + 9.08757285533517e-01 2.87998251390473e-01 + 9.20757624348661e-01 2.70058949061020e-01 + 9.32077214908394e-01 2.51596702608668e-01 + 9.42611287438903e-01 2.32595879244925e-01 + 9.52349414910574e-01 2.13103474747613e-01 + 9.61237529561560e-01 1.93147648123409e-01 + 9.69168871294468e-01 1.72736199342553e-01 + 9.76326703713309e-01 1.51992962994221e-01 + 9.82585730197106e-01 1.30917869381533e-01 + 9.87884002029843e-01 1.09544033639734e-01 + 9.92202667894419e-01 8.79209963846691e-02 + 9.95599172262122e-01 6.61100082160239e-02 + 9.98052102758341e-01 4.41573284776160e-02 + 9.99507690675012e-01 2.21028728366928e-02 + 1.00000000000000e+00 1.39471767468535e-15 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF01_Coords.txt b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF01_Coords.txt new file mode 100644 index 000000000..c0c8ddad7 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF01_Coords.txt @@ -0,0 +1,208 @@ + 201 NumCoords ! The number of coordinates in the airfoil shape file (including an extra coordinate for airfoil reference). Set to zero if coordinates not included. +! ......... x-y coordinates are next if NumCoords > 0 ............. +! x-y coordinate of airfoil reference +! x/c y/c + 0.489474 0 +! coordinates of airfoil shape +! interpolation to 200 points +! x/c y/c + 1.00000000000000e+00 -3.16421772612390e-03 + 9.99110945270443e-01 -2.47105920697162e-02 + 9.97576994375339e-01 -4.67993845022092e-02 + 9.95459944687624e-01 -6.84337167356077e-02 + 9.91976392334682e-01 -9.00657715770117e-02 + 9.87532357694084e-01 -1.11371691742356e-01 + 9.82073007117098e-01 -1.32004290598503e-01 + 9.75632495177376e-01 -1.51997295578341e-01 + 9.68304625227921e-01 -1.71396793768580e-01 + 9.60134319308372e-01 -1.90350472287492e-01 + 9.50973174570070e-01 -2.10503605813256e-01 + 9.40976075096518e-01 -2.30186416006723e-01 + 9.30161994799789e-01 -2.49354345164969e-01 + 9.18526548050635e-01 -2.67946053746076e-01 + 9.06204685559811e-01 -2.85993589913206e-01 + 8.93096814131007e-01 -3.03374276912405e-01 + 8.79335004439212e-01 -3.20123403157046e-01 + 8.64921830314282e-01 -3.36188237142695e-01 + 8.49900429191050e-01 -3.51546887620593e-01 + 8.34308004668356e-01 -3.66174875302933e-01 + 8.18161715887287e-01 -3.80020141794273e-01 + 8.01527591100297e-01 -3.93086268689914e-01 + 7.84496904773810e-01 -4.04786375894643e-01 + 7.67028251214628e-01 -4.15444728414506e-01 + 7.49221098481114e-01 -4.25443666639427e-01 + 7.31109312546861e-01 -4.34681496122239e-01 + 7.12733221739921e-01 -4.43095560497414e-01 + 6.94124804992610e-01 -4.50716083967267e-01 + 6.75296861217813e-01 -4.57507733373021e-01 + 6.56351220288612e-01 -4.63629797162085e-01 + 6.37297642282493e-01 -4.69021650406962e-01 + 6.18184579076336e-01 -4.73661711191075e-01 + 5.99048824748551e-01 -4.77500682555689e-01 + 5.79905140141725e-01 -4.80476298777868e-01 + 5.60822552266790e-01 -4.82821100897016e-01 + 5.41807779672030e-01 -4.84393609336454e-01 + 5.23137860195204e-01 -4.85340334737817e-01 + 5.04895615780131e-01 -4.85677059437076e-01 + 4.86822413494681e-01 -4.85372268979213e-01 + 4.68943246111643e-01 -4.84434587337354e-01 + 4.51281215228627e-01 -4.82849729526095e-01 + 4.33869791962394e-01 -4.80550261086293e-01 + 4.16708291601139e-01 -4.77756903947675e-01 + 3.99821942290793e-01 -4.74438844863898e-01 + 3.83021226581361e-01 -4.70501187606855e-01 + 3.66510028690683e-01 -4.66117838259083e-01 + 3.50339822528374e-01 -4.61229488062895e-01 + 3.34529434920323e-01 -4.55868065561778e-01 + 3.19060580350289e-01 -4.50137865005078e-01 + 3.03961951611492e-01 -4.44019094016567e-01 + 2.89263477671933e-01 -4.37498086693495e-01 + 2.74954691526094e-01 -4.30627011410182e-01 + 2.61045693322669e-01 -4.23408038064864e-01 + 2.47531081353258e-01 -4.15862808513859e-01 + 2.34454873671549e-01 -4.07946420300901e-01 + 2.21749536060482e-01 -3.99796724707317e-01 + 2.09495761009538e-01 -3.91329723402531e-01 + 1.97654805990354e-01 -3.82623286493885e-01 + 1.86194798835722e-01 -3.73767309376824e-01 + 1.75143832165431e-01 -3.64767492631537e-01 + 1.64510931825440e-01 -3.55619768853155e-01 + 1.54264662143747e-01 -3.46336240294808e-01 + 1.44469444171873e-01 -3.36855727877300e-01 + 1.35016546824907e-01 -3.27295058357275e-01 + 1.26007074796798e-01 -3.17588898325485e-01 + 1.17335095261661e-01 -3.07850346569760e-01 + 1.09122191907664e-01 -2.97988397774553e-01 + 1.01228904610188e-01 -2.88095133738336e-01 + 9.37005857644255e-02 -2.78149751233394e-01 + 8.65952060326960e-02 -2.68149983931702e-01 + 7.97470493709899e-02 -2.58245516255184e-01 + 7.32564041991407e-02 -2.48375945846845e-01 + 6.71103398619902e-02 -2.38520800068324e-01 + 6.12956358739206e-02 -2.28273089593854e-01 + 5.58512861647731e-02 -2.18035625337734e-01 + 5.06986492562267e-02 -2.07863675578317e-01 + 4.58459063482147e-02 -1.97741417265822e-01 + 4.12374651654770e-02 -1.87689118226564e-01 + 3.69363886388660e-02 -1.77695953267912e-01 + 3.29623755477581e-02 -1.67780856055308e-01 + 2.91933599630294e-02 -1.58000033452927e-01 + 2.58326584607911e-02 -1.48266339522027e-01 + 2.25688351721396e-02 -1.39011630549253e-01 + 1.95732992520596e-02 -1.30105462233865e-01 + 1.67610738246130e-02 -1.21314096800611e-01 + 1.42583321073789e-02 -1.12582415338248e-01 + 1.19908166431120e-02 -1.03925933593292e-01 + 9.99928542511028e-03 -9.53469054771868e-02 + 8.12764378342123e-03 -8.68845733614765e-02 + 6.50553857600199e-03 -7.85191937270735e-02 + 5.17572423597908e-03 -7.02483867655549e-02 + 3.97140784027181e-03 -6.20650797672678e-02 + 2.94862431147953e-03 -5.39399963412825e-02 + 2.14055966565164e-03 -4.58470093224122e-02 + 1.45003537340197e-03 -3.78838208911683e-02 + 9.20097460438803e-04 -3.00188642323400e-02 + 5.13569518013506e-04 -2.22872670431334e-02 + 2.24854144698289e-04 -1.47090799938054e-02 + 7.16420419797124e-05 -7.28122005805669e-03 + 0.00000000000000e+00 0.00000000000000e+00 + 8.30667337145912e-05 7.28493907761252e-03 + 2.40621206193159e-04 1.47085612205429e-02 + 5.29850643501296e-04 2.22690666161207e-02 + 9.37552646642290e-04 2.99680567436069e-02 + 1.46364423687516e-03 3.78031462162717e-02 + 2.13415396408500e-03 4.57718293152885e-02 + 2.98505302314019e-03 5.38762991811228e-02 + 4.08049090961046e-03 6.21031222356185e-02 + 5.32348409326103e-03 7.04621026477038e-02 + 6.68540525770168e-03 7.89717384981979e-02 + 8.16349050305524e-03 8.76289039370964e-02 + 9.84115364385886e-03 9.63974146736541e-02 + 1.17664515759166e-02 1.05263924316241e-01 + 1.40318228128144e-02 1.14211150659918e-01 + 1.64404096111178e-02 1.23297936682812e-01 + 1.90063994463009e-02 1.32535275404535e-01 + 2.17243347773833e-02 1.41923218754833e-01 + 2.47531082013638e-02 1.51382020977074e-01 + 2.79876147869340e-02 1.60929925146753e-01 + 3.16880968401645e-02 1.70478068315566e-01 + 3.55350251674146e-02 1.80153130476464e-01 + 3.96263775536540e-02 1.89947425730580e-01 + 4.39456143792258e-02 1.99882812309296e-01 + 4.85239794021445e-02 2.09908181416265e-01 + 5.34534137951630e-02 2.19944265641675e-01 + 5.87462885442388e-02 2.29964197658055e-01 + 6.44270496014028e-02 2.39969754830107e-01 + 7.04097222861749e-02 2.50025763168648e-01 + 7.66631835969947e-02 2.60165429986364e-01 + 8.32549959691082e-02 2.70336561512274e-01 + 9.01101313435420e-02 2.80563309640775e-01 + 9.74049202740261e-02 2.90697579494236e-01 + 1.05114698051431e-01 3.00743368754403e-01 + 1.13145220439572e-01 3.10785648613665e-01 + 1.21630315794086e-01 3.20725544551961e-01 + 1.30390853479517e-01 3.30702112547975e-01 + 1.39590645856004e-01 3.40558753101048e-01 + 1.49124870362037e-01 3.50362123732590e-01 + 1.59154982855993e-01 3.59921913101712e-01 + 1.69544432069570e-01 3.69399060590938e-01 + 1.80386709779081e-01 3.78695988921857e-01 + 1.91579763428791e-01 3.87884300501059e-01 + 2.03215759235826e-01 3.96833543919666e-01 + 2.15253430564785e-01 4.05547214951462e-01 + 2.27772014189445e-01 4.13882927583771e-01 + 2.40642603224139e-01 4.22086896802528e-01 + 2.53939036577503e-01 4.30033802762336e-01 + 2.67609972467099e-01 4.37691285847929e-01 + 2.81557875539761e-01 4.44965913565754e-01 + 2.95881178190567e-01 4.51813642422346e-01 + 3.10595953223466e-01 4.58226822092898e-01 + 3.25692615194284e-01 4.64358752082265e-01 + 3.41122510103875e-01 4.70166093755745e-01 + 3.56906920161226e-01 4.75457819601108e-01 + 3.73028060365530e-01 4.80296533840550e-01 + 3.89466547847528e-01 4.84640854961732e-01 + 4.06216915276230e-01 4.88245022885247e-01 + 4.23329613709593e-01 4.91316221321931e-01 + 4.40890014276592e-01 4.94066031076244e-01 + 4.58716932230117e-01 4.96120177384477e-01 + 4.76773550105776e-01 4.97493108926328e-01 + 4.95036075072470e-01 4.98220076856676e-01 + 5.13479009238266e-01 4.98328313435672e-01 + 5.32075794301084e-01 4.97686119534454e-01 + 5.50797707737235e-01 4.96272617324986e-01 + 5.69600641150388e-01 4.94015215318247e-01 + 5.88477721457098e-01 4.91029243067188e-01 + 6.07386635657425e-01 4.87295372664773e-01 + 6.26275242831597e-01 4.82792184672487e-01 + 6.45134391494005e-01 4.77579799714536e-01 + 6.63901695169446e-01 4.71560607238906e-01 + 6.82545269979229e-01 4.64770350611842e-01 + 7.01051428389662e-01 4.57262911241947e-01 + 7.19334097084216e-01 4.48930414817246e-01 + 7.37391465413848e-01 4.39841141799307e-01 + 7.55174481191430e-01 4.29986432588973e-01 + 7.72616437803403e-01 4.19381365239015e-01 + 7.89753200934423e-01 4.08201692944460e-01 + 8.06429273866882e-01 3.96269530921693e-01 + 8.22696674409171e-01 3.83630606068877e-01 + 8.38499958578817e-01 3.70228814924312e-01 + 8.53777444028247e-01 3.56113546193772e-01 + 8.68442280245945e-01 3.41287951489090e-01 + 8.82492540270293e-01 3.25786277344664e-01 + 8.95925498965556e-01 3.09679894523524e-01 + 9.08735247378820e-01 2.93027554712345e-01 + 9.20742332422719e-01 2.75162884784513e-01 + 9.32068464518384e-01 2.56731572981429e-01 + 9.42608539274729e-01 2.37762434632290e-01 + 9.52774207875208e-01 2.18302108340019e-01 + 9.62859775973639e-01 1.98379401591706e-01 + 9.70800878118612e-01 1.77985574843893e-01 + 9.77526560026023e-01 1.57228723263127e-01 + 9.83348702581913e-01 1.35262496314977e-01 + 9.88287866680976e-01 1.12048580600310e-01 + 9.92312239757846e-01 8.89420954512888e-02 + 9.95598399807970e-01 6.64089965678724e-02 + 9.97884993829918e-01 4.40785443080142e-02 + 9.99371468236542e-01 2.18636293439463e-02 + 1.00000000000000e+00 -1.46513661216579e-04 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF02_Coords.txt b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF02_Coords.txt new file mode 100644 index 000000000..3d277f487 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF02_Coords.txt @@ -0,0 +1,208 @@ + 201 NumCoords ! The number of coordinates in the airfoil shape file (including an extra coordinate for airfoil reference). Set to zero if coordinates not included. +! ......... x-y coordinates are next if NumCoords > 0 ............. +! x-y coordinate of airfoil reference +! x/c y/c + 0.405419 0 +! coordinates of airfoil shape +! interpolation to 200 points +! x/c y/c + 1.00000000000000e+00 -1.94964271094086e-02 + 9.96919760277077e-01 -3.64826077995756e-02 + 9.94667087130123e-01 -5.60719522447348e-02 + 9.94761079761680e-01 -7.41287339133444e-02 + 9.91487644632361e-01 -9.30111065602699e-02 + 9.87177265536021e-01 -1.10830801551200e-01 + 9.81618438289038e-01 -1.25618285586318e-01 + 9.74359531938626e-01 -1.37858592038257e-01 + 9.66196197839873e-01 -1.48011073720888e-01 + 9.57084778530041e-01 -1.57244213613537e-01 + 9.47030628319075e-01 -1.76163809587731e-01 + 9.36255994779871e-01 -1.94451554089259e-01 + 9.24755229326704e-01 -2.12084822033116e-01 + 9.12514414231155e-01 -2.28979937705261e-01 + 8.99641900735580e-01 -2.45152777431143e-01 + 8.86071424135137e-01 -2.60541847813049e-01 + 8.71933069994702e-01 -2.75199084385032e-01 + 8.57249287582935e-01 -2.89132205047948e-01 + 8.42064402212172e-01 -3.02348165923965e-01 + 8.26409062460493e-01 -3.14787448920772e-01 + 8.10288808146397e-01 -3.26359904138149e-01 + 7.93758629967803e-01 -3.37091676397995e-01 + 7.76918356342850e-01 -3.44291222218988e-01 + 7.59756850873003e-01 -3.49997131324565e-01 + 7.42348874985586e-01 -3.55640730349542e-01 + 7.24708863089766e-01 -3.60706166782752e-01 + 7.06860528348044e-01 -3.64855413158321e-01 + 6.88831517526942e-01 -3.68409151382566e-01 + 6.70633473983476e-01 -3.71524443372096e-01 + 6.52350564072767e-01 -3.74401784953206e-01 + 6.33982188894777e-01 -3.77065482741049e-01 + 6.15559054509071e-01 -3.79168407766431e-01 + 5.97101918875316e-01 -3.80350473776001e-01 + 5.78607712056559e-01 -3.80687774167715e-01 + 5.60114269360246e-01 -3.80570858605504e-01 + 5.41594988940669e-01 -3.80067548433720e-01 + 5.24491038376215e-01 -3.79537588218947e-01 + 5.09243386421893e-01 -3.78981564014641e-01 + 4.94142523233296e-01 -3.78083193106923e-01 + 4.79201400260462e-01 -3.76755219694438e-01 + 4.64426672033553e-01 -3.74840429494636e-01 + 4.49830052252528e-01 -3.72341501685922e-01 + 4.35411690443212e-01 -3.69564589340833e-01 + 4.21176828920086e-01 -3.66527761938651e-01 + 4.06104752722998e-01 -3.63217644680091e-01 + 3.91187261313758e-01 -3.59606140139742e-01 + 3.76543272121399e-01 -3.55540172858436e-01 + 3.62174951181275e-01 -3.51199859300841e-01 + 3.48051575371203e-01 -3.46733492501332e-01 + 3.34166838440425e-01 -3.42236418543471e-01 + 3.20531094536529e-01 -3.37752409778483e-01 + 3.07166374335585e-01 -3.33138685551140e-01 + 2.94106366929472e-01 -3.28233453302116e-01 + 2.81356553687748e-01 -3.22927037164433e-01 + 2.68929414080849e-01 -3.17210399237509e-01 + 2.56792257622504e-01 -3.11199667576809e-01 + 2.44988366773819e-01 -3.04908147192347e-01 + 2.33487068586780e-01 -2.98398015474454e-01 + 2.22244174627754e-01 -2.91908544458142e-01 + 2.11259238518723e-01 -2.85624154835144e-01 + 2.00540109534862e-01 -2.79445232131323e-01 + 1.90099108400639e-01 -2.73144271821139e-01 + 1.79974500726159e-01 -2.66577875347765e-01 + 1.69915683501289e-01 -2.59834415460592e-01 + 1.60172080930679e-01 -2.52962962830656e-01 + 1.50692746390245e-01 -2.46077778027207e-01 + 1.41572171628772e-01 -2.39083657564268e-01 + 1.32782528972732e-01 -2.31868964518358e-01 + 1.24316300642292e-01 -2.24479019688654e-01 + 1.16125227242430e-01 -2.17115852851904e-01 + 1.08022185325659e-01 -2.10062937367560e-01 + 1.00068510946488e-01 -2.03253136991591e-01 + 9.24181923986685e-02 -1.96403291468797e-01 + 8.52292314707568e-02 -1.87525621188063e-01 + 7.85442356694309e-02 -1.78452955788562e-01 + 7.21826484759061e-02 -1.69371289606163e-01 + 6.59224769279808e-02 -1.60339488949538e-01 + 5.95888908522178e-02 -1.51375335195636e-01 + 5.34570839330547e-02 -1.42381729136260e-01 + 4.78323253460157e-02 -1.33307333331388e-01 + 4.27773110897719e-02 -1.24183705410093e-01 + 3.81406060607182e-02 -1.14969947782298e-01 + 3.34394858942616e-02 -1.07833476412008e-01 + 2.85905771976062e-02 -1.02443290523446e-01 + 2.39758840800528e-02 -9.70665624082339e-02 + 2.00924464828600e-02 -9.14418911635026e-02 + 1.67774266077405e-02 -8.55577600333846e-02 + 1.37085226488790e-02 -7.95717583471716e-02 + 1.06047400652709e-02 -7.35922291670351e-02 + 7.90398428387208e-03 -6.75352052422909e-02 + 6.19892209075347e-03 -6.13137254015921e-02 + 4.74163822479280e-03 -5.48650139398457e-02 + 3.46348797721600e-03 -4.81553931473352e-02 + 2.35439809271567e-03 -4.11318098186878e-02 + 1.48284350464362e-03 -3.41609786643930e-02 + 9.33668904559450e-04 -2.70825630260840e-02 + 5.16784288069033e-04 -2.00607976197347e-02 + 2.03224808289276e-04 -1.32008980839843e-02 + 2.88583219323030e-05 -6.51695336105137e-03 + 0.00000000000000e+00 0.00000000000000e+00 + 1.06034557788935e-04 6.54242344402049e-03 + 3.10442109886626e-04 1.32200621240131e-02 + 6.27358526355077e-04 2.00270586046359e-02 + 1.04642059582819e-03 2.69584070704927e-02 + 1.56119077029123e-03 3.40044020355773e-02 + 2.20965204677518e-03 4.11549554928511e-02 + 3.41098060660727e-03 4.84144618046186e-02 + 5.03360788709283e-03 5.57589214681263e-02 + 6.61245394229265e-03 6.32348735880216e-02 + 8.28994979066480e-03 7.08911179309667e-02 + 9.96034393771960e-03 7.87021820009504e-02 + 1.17636547160994e-02 8.65345063094756e-02 + 1.43612220190213e-02 9.42922806414463e-02 + 1.76430317064128e-02 1.02026805686471e-01 + 2.08737235707927e-02 1.09949354414078e-01 + 2.39097774660482e-02 1.18163715137690e-01 + 2.68277855724522e-02 1.26610148817642e-01 + 3.00184157320084e-02 1.35071752122783e-01 + 3.38529447168762e-02 1.43382634408088e-01 + 3.85374178015213e-02 1.51512804458775e-01 + 4.35193302635381e-02 1.59709865654183e-01 + 4.83524785822808e-02 1.68285035077358e-01 + 5.28925514814938e-02 1.77785241588636e-01 + 5.74509623742945e-02 1.87519752029641e-01 + 6.25207280441538e-02 1.96995257755178e-01 + 6.84864459272233e-02 2.05895125589205e-01 + 7.51749747555155e-02 2.14483369522917e-01 + 8.21424789239981e-02 2.23186204375288e-01 + 8.89480736036874e-02 2.32391482476344e-01 + 9.57168879662020e-02 2.41977056322773e-01 + 1.02682866347355e-01 2.51651269226778e-01 + 1.10220820704945e-01 2.61011250036727e-01 + 1.18407958380338e-01 2.69947451121491e-01 + 1.26881602570982e-01 2.78784626441245e-01 + 1.35660947758076e-01 2.87754998986677e-01 + 1.44539262453658e-01 2.97066755412224e-01 + 1.53710627262191e-01 3.06476813639894e-01 + 1.63224044690801e-01 3.15759213512801e-01 + 1.73217608842146e-01 3.24616725514123e-01 + 1.83592362834056e-01 3.33425258716891e-01 + 1.94325962262670e-01 3.42337881360872e-01 + 2.05324011045863e-01 3.51288753587316e-01 + 2.16730097076787e-01 3.60001663577674e-01 + 2.28586578632938e-01 3.68187843125944e-01 + 2.40883113525511e-01 3.75812546015869e-01 + 2.53496856322201e-01 3.83600826529355e-01 + 2.66426205569999e-01 3.91650072271809e-01 + 2.79648785252606e-01 3.99396772979447e-01 + 2.92654108132638e-01 4.06655149783746e-01 + 3.05982927892807e-01 4.13055764549372e-01 + 3.19616352211114e-01 4.19007565475870e-01 + 3.33559027388770e-01 4.25557700509835e-01 + 3.47790649521039e-01 4.31983019768178e-01 + 3.62286841731615e-01 4.37810261240227e-01 + 3.77034995262049e-01 4.43528144955168e-01 + 3.92039353236568e-01 4.48820541528545e-01 + 4.07301441870269e-01 4.52540541894158e-01 + 4.23279474819674e-01 4.55820048720622e-01 + 4.40634468309514e-01 4.59564402113604e-01 + 4.58216729640812e-01 4.62715547857050e-01 + 4.76002112543622e-01 4.64915551067932e-01 + 4.93972301744354e-01 4.66495076484244e-01 + 5.12102601808104e-01 4.67675381916421e-01 + 5.30374260454303e-01 4.67718175971608e-01 + 5.48760443148615e-01 4.66664714353419e-01 + 5.67217438731546e-01 4.64745135086648e-01 + 5.85739737161608e-01 4.61729462619936e-01 + 6.04297036727046e-01 4.57963754355715e-01 + 6.22849821404431e-01 4.53804771006538e-01 + 6.41387754588488e-01 4.49034662925732e-01 + 6.59860243895401e-01 4.43612634661173e-01 + 6.78243902722125e-01 4.37681519215445e-01 + 6.96525620003880e-01 4.31223433182484e-01 + 7.14630615751572e-01 4.24172943475969e-01 + 7.32553281453510e-01 4.16497772874745e-01 + 7.50252988657587e-01 4.08237425290133e-01 + 7.67683365695193e-01 3.99660004830094e-01 + 7.84884705771043e-01 3.91177827246511e-01 + 8.01707686882478e-01 3.82511987837697e-01 + 8.18171045140217e-01 3.73184018737277e-01 + 8.34218184325793e-01 3.62939454140551e-01 + 8.49803537682218e-01 3.52119100925938e-01 + 8.64853102337230e-01 3.40870213182952e-01 + 8.79352542615986e-01 3.29069212973395e-01 + 8.93288312520579e-01 3.16847374518213e-01 + 9.06641281797077e-01 3.04310322344821e-01 + 9.19235341950085e-01 2.88747970901776e-01 + 9.31163314413939e-01 2.72527797669352e-01 + 9.42304292794809e-01 2.55835364954767e-01 + 9.55213979558356e-01 2.38692901385650e-01 + 9.72177046241266e-01 2.21180379624901e-01 + 9.80174206699236e-01 2.02148008484942e-01 + 9.84417859316093e-01 1.80623200933622e-01 + 9.87730786501502e-01 1.53965422157644e-01 + 9.90607437911417e-01 1.22548669883815e-01 + 9.92941558866010e-01 9.10997252988497e-02 + 9.95524996439665e-01 6.60081316645982e-02 + 9.96925214206640e-01 4.30168042831882e-02 + 9.98589083226293e-01 2.09101531114029e-02 + 1.00000000000000e+00 -1.10918874127508e-04 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF03_Coords.txt b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF03_Coords.txt new file mode 100644 index 000000000..3574f2615 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF03_Coords.txt @@ -0,0 +1,208 @@ + 201 NumCoords ! The number of coordinates in the airfoil shape file (including an extra coordinate for airfoil reference). Set to zero if coordinates not included. +! ......... x-y coordinates are next if NumCoords > 0 ............. +! x-y coordinate of airfoil reference +! x/c y/c + 0.300072 0 +! coordinates of airfoil shape +! interpolation to 200 points +! x/c y/c + 1.00000000000000e+00 -2.35717905236513e-02 + 9.95894264742224e-01 -3.92526822859504e-02 + 9.92356907783760e-01 -5.58972397758731e-02 + 9.91832649399724e-01 -7.22796935620756e-02 + 9.89065767280758e-01 -8.98751886421859e-02 + 9.85303518885023e-01 -1.06063296906901e-01 + 9.79227294864432e-01 -1.18115211299191e-01 + 9.68317731645526e-01 -1.26727180688080e-01 + 9.56870605029902e-01 -1.32551970200501e-01 + 9.44399782765251e-01 -1.37235805042327e-01 + 9.31376191661979e-01 -1.49921669278151e-01 + 9.18131472990873e-01 -1.62163429513691e-01 + 9.04532462534647e-01 -1.73794296481196e-01 + 8.90513850343901e-01 -1.84548505419301e-01 + 8.76094083221940e-01 -1.94369351614981e-01 + 8.61295443643247e-01 -2.03387259424766e-01 + 8.46228194041534e-01 -2.11697233177751e-01 + 8.30943028446170e-01 -2.19423235960492e-01 + 8.15464579238373e-01 -2.26583810092412e-01 + 7.99805091304501e-01 -2.33034629864386e-01 + 7.83949186991882e-01 -2.38634111936675e-01 + 7.67924901075415e-01 -2.43491491542901e-01 + 7.51827610435101e-01 -2.46922502098554e-01 + 7.35700766231654e-01 -2.49967384402370e-01 + 7.19557581083962e-01 -2.53049973028183e-01 + 7.03374920806515e-01 -2.55675693783315e-01 + 6.87141084317211e-01 -2.57511647636345e-01 + 6.70872708173025e-01 -2.58916159150435e-01 + 6.54584120557027e-01 -2.60070409267096e-01 + 6.38316166451763e-01 -2.61147805145693e-01 + 6.22053812145135e-01 -2.62242468065543e-01 + 6.05795467035195e-01 -2.62984971699304e-01 + 5.89535785963171e-01 -2.62980782780771e-01 + 5.73249959911008e-01 -2.62338277960480e-01 + 5.56924435273058e-01 -2.61412073870956e-01 + 5.40499557828918e-01 -2.60380178738677e-01 + 5.25124338707629e-01 -2.59541047800324e-01 + 5.11278184667223e-01 -2.58859241415762e-01 + 4.97568404605392e-01 -2.58048556490882e-01 + 4.84002314517955e-01 -2.56975419244797e-01 + 4.70578871550198e-01 -2.55452441773426e-01 + 4.57299606722912e-01 -2.53575365177959e-01 + 4.44165059993117e-01 -2.51608626178359e-01 + 4.31171120115011e-01 -2.49565341878899e-01 + 4.17960046660827e-01 -2.47435089625259e-01 + 4.04894573177154e-01 -2.45125131039407e-01 + 3.92025010140446e-01 -2.42462612691433e-01 + 3.79343869682045e-01 -2.39595692647852e-01 + 3.66822492601097e-01 -2.36738334901165e-01 + 3.54437597401984e-01 -2.34084096374542e-01 + 3.42188016976202e-01 -2.31663337492797e-01 + 3.30106565812339e-01 -2.29245864019644e-01 + 3.18228608318416e-01 -2.26607512965020e-01 + 3.06561819529862e-01 -2.23599397180190e-01 + 2.95096087112862e-01 -2.20264450363764e-01 + 2.83822976873035e-01 -2.16705858133672e-01 + 2.72749367112427e-01 -2.12987917599575e-01 + 2.61871015332779e-01 -2.09105223071590e-01 + 2.51166620646972e-01 -2.05257087666955e-01 + 2.40624400846784e-01 -2.01625484971293e-01 + 2.30238432660905e-01 -1.98140713780569e-01 + 2.20026112530791e-01 -1.94584499409339e-01 + 2.09976055390476e-01 -1.90827834894363e-01 + 1.99702136630218e-01 -1.86888650453711e-01 + 1.89635587559752e-01 -1.82831573590219e-01 + 1.79772976644460e-01 -1.78716242047549e-01 + 1.70166626869497e-01 -1.74489311956110e-01 + 1.60857736786573e-01 -1.70006317401921e-01 + 1.51803109355095e-01 -1.65351581130296e-01 + 1.42904673719036e-01 -1.60741881001108e-01 + 1.34016689385335e-01 -1.56400925252111e-01 + 1.25172927433342e-01 -1.52235477594800e-01 + 1.16585145327233e-01 -1.47936269496174e-01 + 1.08455437817872e-01 -1.42606858442656e-01 + 1.00797932241528e-01 -1.36869866343013e-01 + 9.34220406155034e-02 -1.30998286551843e-01 + 8.60634069002927e-02 -1.25203141666258e-01 + 7.85543380199848e-02 -1.19513567026171e-01 + 7.12090438710948e-02 -1.13679449812632e-01 + 6.43781714721257e-02 -1.07497988597386e-01 + 5.81748969271094e-02 -1.00901485941624e-01 + 5.23111625072034e-02 -9.40070595698379e-02 + 4.63848694510659e-02 -8.87274392056592e-02 + 4.02274234777820e-02 -8.49827667220595e-02 + 3.43402499368400e-02 -8.12041215315654e-02 + 2.92122911092120e-02 -7.70335607862094e-02 + 2.46619896023326e-02 -7.24469162604508e-02 + 2.03998728457045e-02 -6.76744757448659e-02 + 1.62083083553108e-02 -6.28569220857654e-02 + 1.24122747710821e-02 -5.78802307117992e-02 + 9.59261999542548e-03 -5.26178555647791e-02 + 7.30477546051285e-03 -4.69809514049654e-02 + 5.24424677887566e-03 -4.11640833368231e-02 + 3.22154066429621e-03 -3.53189852766165e-02 + 1.65180206365193e-03 -2.94779767104117e-02 + 1.00171614777338e-03 -2.35012775997985e-02 + 5.33709082287082e-04 -1.74789869612144e-02 + 1.93102071972421e-04 -1.15157513977575e-02 + 8.83513173800652e-06 -5.67716919165800e-03 + 0.00000000000000e+00 0.00000000000000e+00 + 1.16783719135356e-04 5.69723987547027e-03 + 3.43118960628982e-04 1.15219848562656e-02 + 6.72993148161244e-04 1.74602777849096e-02 + 1.09737183733306e-03 2.34963725200926e-02 + 1.60684348093023e-03 2.96112825450017e-02 + 2.45643493250886e-03 3.57965862211899e-02 + 3.99538452491140e-03 4.20591838228941e-02 + 5.93173609093872e-03 4.83922212075131e-02 + 7.78831860532396e-03 5.48405525131736e-02 + 9.77944638510934e-03 6.14059674486418e-02 + 1.18236157695499e-02 6.80196332226401e-02 + 1.41090606785859e-02 7.45698337168348e-02 + 1.73056541184598e-02 8.10186811443194e-02 + 2.11847229777394e-02 8.74687230723911e-02 + 2.49676864074981e-02 9.40869839667322e-02 + 2.84682042956027e-02 1.00930111245539e-01 + 3.18331846418495e-02 1.07898963211733e-01 + 3.54793253397875e-02 1.14828880543840e-01 + 3.98821847361107e-02 1.21582993745491e-01 + 4.51314595122883e-02 1.28212190706429e-01 + 5.07378731779770e-02 1.34892120261391e-01 + 5.60731260647946e-02 1.41960877640708e-01 + 6.09722950181842e-02 1.50342170540091e-01 + 6.58438293017437e-02 1.58942245558348e-01 + 7.12537393230430e-02 1.67161944148746e-01 + 7.76600623439659e-02 1.74624850622013e-01 + 8.48496220471092e-02 1.81687450473830e-01 + 9.23057704681641e-02 1.88867715176475e-01 + 9.94459240673263e-02 1.96648864845365e-01 + 1.06388932256554e-01 2.04900423667625e-01 + 1.13500915840888e-01 2.13208533649742e-01 + 1.21190173762834e-01 2.21120456132424e-01 + 1.29552662653441e-01 2.28502274929156e-01 + 1.38071878683882e-01 2.35719905821540e-01 + 1.46821747467612e-01 2.43114116431733e-01 + 1.55674346023180e-01 2.50880294859766e-01 + 1.64742508530083e-01 2.58798876919177e-01 + 1.74100620712751e-01 2.66555316753591e-01 + 1.83827637281412e-01 2.73887896215538e-01 + 1.93900930930976e-01 2.81137679364482e-01 + 2.04279807701489e-01 2.88489630315669e-01 + 2.14917904141514e-01 2.95836142276111e-01 + 2.25877633648094e-01 3.02970528418131e-01 + 2.37175240693611e-01 3.09614749723245e-01 + 2.48781997761441e-01 3.15783316315385e-01 + 2.60667851543173e-01 3.22097199193517e-01 + 2.72834283839390e-01 3.28652682218705e-01 + 2.85283064783479e-01 3.34865419367518e-01 + 2.97847251117894e-01 3.40624356479022e-01 + 3.10710643373344e-01 3.45634518095723e-01 + 3.23837985214461e-01 3.50222642863971e-01 + 3.37240583535417e-01 3.55267130987121e-01 + 3.50911402546816e-01 3.60167827153803e-01 + 3.64804696483725e-01 3.64587389850643e-01 + 3.78910279118625e-01 3.69073483105304e-01 + 3.93243450766671e-01 3.73200860402215e-01 + 4.07809010689417e-01 3.75729715812861e-01 + 4.23000375070936e-01 3.77751754255469e-01 + 4.39328786730662e-01 3.80141190316103e-01 + 4.55813610039226e-01 3.82101412277872e-01 + 4.72460251929427e-01 3.83235896264865e-01 + 4.89254536599454e-01 3.83843952964464e-01 + 5.06163834453059e-01 3.84146352307061e-01 + 5.23189394372787e-01 3.83285841342889e-01 + 5.40310058634680e-01 3.81443701603978e-01 + 5.57486522435475e-01 3.79033596004446e-01 + 5.74715352025665e-01 3.75685474236072e-01 + 5.92000372484674e-01 3.71765261705014e-01 + 6.09337554036771e-01 3.67670925407177e-01 + 6.26712711199081e-01 3.63152537787024e-01 + 6.44112689354547e-01 3.58249400169114e-01 + 6.61537902878510e-01 3.53105856660785e-01 + 6.78976015503225e-01 3.47670000178051e-01 + 6.96388219208155e-01 3.41916005228908e-01 + 7.13758174635815e-01 3.35774011869113e-01 + 7.31072071555730e-01 3.29291743909179e-01 + 7.48347054469357e-01 3.22782481179152e-01 + 7.65635234168385e-01 3.16597107059741e-01 + 7.82817938077837e-01 3.10445909406222e-01 + 7.99822649562144e-01 3.03782942002751e-01 + 8.16599499725996e-01 2.96387728717845e-01 + 8.33162654038272e-01 2.88615543528075e-01 + 8.49499238755804e-01 2.80681153424459e-01 + 8.65575980032653e-01 2.72460131547320e-01 + 8.81365101325771e-01 2.64006588773166e-01 + 8.96830625839868e-01 2.55349206752237e-01 + 9.11860293545010e-01 2.45521741551255e-01 + 9.26493285460369e-01 2.35422284498711e-01 + 9.40627758148684e-01 2.25124409413752e-01 + 9.56355816041677e-01 2.14591442921710e-01 + 9.76537617843118e-01 2.04082237971755e-01 + 9.84561014127750e-01 1.89606914519805e-01 + 9.87643053296840e-01 1.67544521992612e-01 + 9.89781643689051e-01 1.41487907300533e-01 + 9.91693019433194e-01 1.13998602352113e-01 + 9.93236086227859e-01 8.40282639292492e-02 + 9.95181038506289e-01 6.17158184066358e-02 + 9.96476028162972e-01 4.13392188133469e-02 + 9.98222919558243e-01 2.12790182529935e-02 + 1.00000000000000e+00 1.60547379486788e-03 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF04_Coords.txt b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF04_Coords.txt new file mode 100644 index 000000000..7c0a13b7c --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF04_Coords.txt @@ -0,0 +1,208 @@ + 201 NumCoords ! The number of coordinates in the airfoil shape file (including an extra coordinate for airfoil reference). Set to zero if coordinates not included. +! ......... x-y coordinates are next if NumCoords > 0 ............. +! x-y coordinate of airfoil reference +! x/c y/c + 0.250000 0 +! coordinates of airfoil shape +! interpolation to 200 points +! x/c y/c + 1.00000000000000e+00 -2.27521504445117e-02 + 9.95825558916260e-01 -3.85996552852628e-02 + 9.91908351102147e-01 -5.44969196641126e-02 + 9.88416628115054e-01 -7.07599158572808e-02 + 9.85866922904108e-01 -8.82610141031158e-02 + 9.82725730996461e-01 -1.04331474026742e-01 + 9.75943584414250e-01 -1.16192160119479e-01 + 9.60562898886437e-01 -1.24553806205324e-01 + 9.45502094163868e-01 -1.30081821439202e-01 + 9.29689968161834e-01 -1.34454116305964e-01 + 9.13964300425632e-01 -1.38792987259912e-01 + 8.98614488822684e-01 -1.43791084896220e-01 + 8.83335037065323e-01 -1.48845719057247e-01 + 8.67989583131007e-01 -1.53392395893884e-01 + 8.52512977524852e-01 -1.57285196860484e-01 + 8.36980556973450e-01 -1.60814946557067e-01 + 8.21468173261859e-01 -1.64100703909415e-01 + 8.06005351604761e-01 -1.67267075710542e-01 + 7.90569523846495e-01 -1.70238657955313e-01 + 7.75160420278176e-01 -1.72833393586880e-01 + 7.59765591487754e-01 -1.74956177670212e-01 + 7.44400605416898e-01 -1.76801895913143e-01 + 7.29116033776629e-01 -1.78610693133524e-01 + 7.13947989837457e-01 -1.80610582068115e-01 + 6.98879169529179e-01 -1.82683486229382e-01 + 6.83885725014230e-01 -1.84453890742002e-01 + 6.68948266000129e-01 -1.85692240974458e-01 + 6.54077597403275e-01 -1.86675765092582e-01 + 6.39298560836104e-01 -1.87505908577295e-01 + 6.24631617962163e-01 -1.88281679546669e-01 + 6.10073346044509e-01 -1.89102453976540e-01 + 5.95625793495472e-01 -1.89726467074718e-01 + 5.81293508075112e-01 -1.89890541527727e-01 + 5.67078321487802e-01 -1.89672724652735e-01 + 5.52984605219614e-01 -1.89300253242408e-01 + 5.39018740189456e-01 -1.88942147239663e-01 + 5.25163688284825e-01 -1.88679571252767e-01 + 5.11413609207518e-01 -1.88425702489593e-01 + 4.97799177395975e-01 -1.88101973722528e-01 + 4.84327325660904e-01 -1.87580974813977e-01 + 4.70996488304439e-01 -1.86734079403737e-01 + 4.57807499457728e-01 -1.85719999075378e-01 + 4.44760927152842e-01 -1.84696486770858e-01 + 4.31852022455883e-01 -1.83635353168758e-01 + 4.19090901616490e-01 -1.82470445502636e-01 + 4.06491363898788e-01 -1.81170983464115e-01 + 3.94068316367388e-01 -1.79605967544454e-01 + 3.81813043724431e-01 -1.77780857103527e-01 + 3.69699449630328e-01 -1.75956382315867e-01 + 3.57702913407548e-01 -1.74362578401297e-01 + 3.45820758127239e-01 -1.72975266565004e-01 + 3.34085173594801e-01 -1.71599837205798e-01 + 3.22528762317999e-01 -1.70053358838540e-01 + 3.11158458585437e-01 -1.68229483638464e-01 + 2.99960205902575e-01 -1.66205813724721e-01 + 2.88929664556996e-01 -1.64083038925404e-01 + 2.78065429500551e-01 -1.61919157747390e-01 + 2.67372016639914e-01 -1.59640340608867e-01 + 2.56838483482072e-01 -1.57303663087410e-01 + 2.46452895340118e-01 -1.54979944998565e-01 + 2.36204329661831e-01 -1.52707294515853e-01 + 2.26105799104062e-01 -1.50433273332383e-01 + 2.16178334826531e-01 -1.48092285325409e-01 + 2.06440462240654e-01 -1.45637282290730e-01 + 1.96869285515018e-01 -1.43086175320475e-01 + 1.87473435872977e-01 -1.40444127091679e-01 + 1.78262653731453e-01 -1.37710428849814e-01 + 1.69252630220208e-01 -1.34804420084564e-01 + 1.60413244437104e-01 -1.31813387053438e-01 + 1.51703588066681e-01 -1.28882641840022e-01 + 1.43077619868567e-01 -1.26142317505189e-01 + 1.34558223959049e-01 -1.23515015039303e-01 + 1.26236077097364e-01 -1.20786093116937e-01 + 1.18187874855922e-01 -1.17753964310198e-01 + 1.10394900564033e-01 -1.14389083257162e-01 + 1.02776771116232e-01 -1.10926463752281e-01 + 9.52576323187684e-02 -1.07596450900910e-01 + 8.77890248291223e-02 -1.04462641719461e-01 + 8.04931796353551e-02 -1.01301294317992e-01 + 7.35128190911369e-02 -9.78736275580912e-02 + 6.68963895240495e-02 -9.40003856565595e-02 + 6.05009896751561e-02 -8.99475473560910e-02 + 5.41691079982236e-02 -8.60337352895419e-02 + 4.77847233189376e-02 -8.24016920600191e-02 + 4.16000737650022e-02 -7.87323954691971e-02 + 3.58929498807395e-02 -7.46615383996122e-02 + 3.05718156448606e-02 -7.01640817880520e-02 + 2.55841457444921e-02 -6.54750339821926e-02 + 2.08026533112682e-02 -6.07371500023589e-02 + 1.63439586202605e-02 -5.58344930848473e-02 + 1.26739780200523e-02 -5.06379447657982e-02 + 9.64255085974439e-03 -4.50568616338899e-02 + 6.95205676239145e-03 -3.93718854579150e-02 + 4.20584482318000e-03 -3.38153278580581e-02 + 1.88154483510298e-03 -2.82556740113477e-02 + 1.09259224757715e-03 -2.25793808835637e-02 + 5.57027370894427e-04 -1.68301482885243e-02 + 1.92532044605606e-04 -1.11001611628179e-02 + 7.52083255272135e-06 -5.47188430262417e-03 + 0.00000000000000e+00 0.00000000000000e+00 + 1.17486562914811e-04 5.48679985210707e-03 + 3.45293358213107e-04 1.10987098718478e-02 + 6.76028572561267e-04 1.68193159983466e-02 + 1.10074682910982e-03 2.26297904761801e-02 + 1.60992601121548e-03 2.85087154571350e-02 + 2.67599544106549e-03 3.44493853796572e-02 + 4.39289337028668e-03 4.04593247588465e-02 + 6.27509694854768e-03 4.65396355123101e-02 + 8.18501856800657e-03 5.27292560994769e-02 + 1.03189035753580e-02 5.90079710526583e-02 + 1.27370291299606e-02 6.52938850681379e-02 + 1.55557604269686e-02 7.14974882867604e-02 + 1.89758697009180e-02 7.76144942393735e-02 + 2.27125265955629e-02 8.37568225375172e-02 + 2.64205973892604e-02 9.00529677985623e-02 + 3.01282733583995e-02 9.65285394067050e-02 + 3.39926189539913e-02 1.03078210289796e-01 + 3.81573198488582e-02 1.09576659446866e-01 + 4.27861195062449e-02 1.15924379625249e-01 + 4.78311663375292e-02 1.22194138387785e-01 + 5.30764574325103e-02 1.28517196960692e-01 + 5.83111363244493e-02 1.35033938551462e-01 + 6.35760553124462e-02 1.41734309721268e-01 + 6.90274085645503e-02 1.48474163992816e-01 + 7.48336167040122e-02 1.55069663963807e-01 + 8.11611766171277e-02 1.61401120064374e-01 + 8.79191588167710e-02 1.67593332097610e-01 + 9.48826093561019e-02 1.73826214118695e-01 + 1.01844855099363e-01 1.80284855885651e-01 + 1.08870960569728e-01 1.86945163887416e-01 + 1.16112032555569e-01 1.93604681567356e-01 + 1.23730351466839e-01 2.00035948444507e-01 + 1.31824094660795e-01 2.06181698317671e-01 + 1.40296730825128e-01 2.12179485190627e-01 + 1.48993250461499e-01 2.18163657713048e-01 + 1.57819272344995e-01 2.24246096031123e-01 + 1.66852794875010e-01 2.30358166418523e-01 + 1.76155620082319e-01 2.36368608053698e-01 + 1.85787867463952e-01 2.42168413364266e-01 + 1.95750148009566e-01 2.47820613232954e-01 + 2.06011532032752e-01 2.53317180198825e-01 + 2.16542581694721e-01 2.58641479671493e-01 + 2.27367855996913e-01 2.63825228256786e-01 + 2.38481776223131e-01 2.68855474330982e-01 + 2.49861589948929e-01 2.73698630151439e-01 + 2.61511196031386e-01 2.78418546610769e-01 + 2.73444081521194e-01 2.82942196705218e-01 + 2.85666898746156e-01 2.87119018069479e-01 + 2.98200734062047e-01 2.91001132958173e-01 + 3.11032065305424e-01 2.94621877568295e-01 + 3.24124539258925e-01 2.97872294592512e-01 + 3.37489921714358e-01 3.00767227942365e-01 + 3.51122091139916e-01 3.03395484009736e-01 + 3.64973840498426e-01 3.05782280483364e-01 + 3.79035138325125e-01 3.08249753379266e-01 + 3.93322041497236e-01 3.10433221242496e-01 + 4.07839547608925e-01 3.11538517913751e-01 + 4.22602719706730e-01 3.12017813468019e-01 + 4.37571388858179e-01 3.12308843703191e-01 + 4.52705694129202e-01 3.12333639153740e-01 + 4.68022386434649e-01 3.11853160827979e-01 + 4.83493649847560e-01 3.10957551960417e-01 + 4.99066517917555e-01 3.09764580509872e-01 + 5.14753065556197e-01 3.07600736594501e-01 + 5.30536608928272e-01 3.04749547523736e-01 + 5.46385724990049e-01 3.01659366948820e-01 + 5.62295818718890e-01 2.97977515095747e-01 + 5.78294553201899e-01 2.93910589456047e-01 + 5.94402144736603e-01 2.89716319978192e-01 + 6.10601043028817e-01 2.85246570693586e-01 + 6.26909980423233e-01 2.80596756484263e-01 + 6.43345516347184e-01 2.75862073462143e-01 + 6.59894609560225e-01 2.70990265506853e-01 + 6.76549242992279e-01 2.65977472599385e-01 + 6.93285667658481e-01 2.60762532727095e-01 + 7.10113002149428e-01 2.55379870427853e-01 + 7.27101101620968e-01 2.50077155704390e-01 + 7.44309174064674e-01 2.45048240418275e-01 + 7.61658961677203e-01 2.40058424294836e-01 + 7.79018980351826e-01 2.34727092866611e-01 + 7.96358584077290e-01 2.28942034208237e-01 + 8.13753854561790e-01 2.22958342564097e-01 + 8.31270319341910e-01 2.17014377218330e-01 + 8.48885104644356e-01 2.11048726086036e-01 + 8.66584330124259e-01 2.05031932644156e-01 + 8.84350172928721e-01 1.98925268297828e-01 + 9.02193707353903e-01 1.92773917580206e-01 + 9.20157773678337e-01 1.86723259912781e-01 + 9.38246381637406e-01 1.80792430732304e-01 + 9.56399217082597e-01 1.74918496768106e-01 + 9.76798363881330e-01 1.69533670492790e-01 + 9.84828566855567e-01 1.59247090588959e-01 + 9.87839059292136e-01 1.39199540261784e-01 + 9.89905373069722e-01 1.17616603808733e-01 + 9.91757893422502e-01 9.85412138534034e-02 + 9.93252480473954e-01 7.94410871228046e-02 + 9.94743975611726e-01 6.01627278016894e-02 + 9.96445705560557e-01 4.08626126297221e-02 + 9.98198658774545e-01 2.15548416438615e-02 + 1.00000000000000e+00 2.24462872737125e-03 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF05_Coords.txt b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF05_Coords.txt new file mode 100644 index 000000000..e390be984 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF05_Coords.txt @@ -0,0 +1,208 @@ + 201 NumCoords ! The number of coordinates in the airfoil shape file (including an extra coordinate for airfoil reference). Set to zero if coordinates not included. +! ......... x-y coordinates are next if NumCoords > 0 ............. +! x-y coordinate of airfoil reference +! x/c y/c + 0.250000 0 +! coordinates of airfoil shape +! interpolation to 200 points +! x/c y/c + 1.00000000000000e+00 -1.79613835013314e-02 + 9.96961558343373e-01 -3.53902489488287e-02 + 9.92023630619313e-01 -4.91929101534255e-02 + 9.84379446083511e-01 -6.00348210114478e-02 + 9.75468141678190e-01 -7.09859658723328e-02 + 9.66631278884337e-01 -8.10763642717688e-02 + 9.55798039282918e-01 -8.89193213483636e-02 + 9.40573198850503e-01 -9.51466796435252e-02 + 9.25558881802059e-01 -9.98612000663832e-02 + 9.10156047961303e-01 -1.03818167988873e-01 + 8.94845249828711e-01 -1.07053770498790e-01 + 8.79788764043181e-01 -1.10793970812780e-01 + 8.64816289515449e-01 -1.14657288651007e-01 + 8.49854909867423e-01 -1.18332319693786e-01 + 8.34868122131193e-01 -1.21755694040649e-01 + 8.19932031659274e-01 -1.25185347068945e-01 + 8.05100969303777e-01 -1.28769954116135e-01 + 7.90321333537330e-01 -1.32315399189505e-01 + 7.75523132904363e-01 -1.35552178535652e-01 + 7.60741767498039e-01 -1.38522987025004e-01 + 7.46023130239504e-01 -1.41378450540013e-01 + 7.31401419294347e-01 -1.44351973608261e-01 + 7.16841539978852e-01 -1.47259170049408e-01 + 7.02302981796658e-01 -1.49894404232336e-01 + 6.87793305289350e-01 -1.52332219473336e-01 + 6.73332858807799e-01 -1.54446440090132e-01 + 6.58925185976507e-01 -1.56177321792256e-01 + 6.44572195057741e-01 -1.57666344545681e-01 + 6.30298458454963e-01 -1.58910640661020e-01 + 6.16114416580374e-01 -1.59951057500702e-01 + 6.02026953030919e-01 -1.60900948878695e-01 + 5.88050398086629e-01 -1.61711857451049e-01 + 5.74189109055960e-01 -1.62294350346538e-01 + 5.60448390812326e-01 -1.62664500132555e-01 + 5.46836999554392e-01 -1.62937231340188e-01 + 5.33367864981090e-01 -1.63248884154172e-01 + 5.19932409233419e-01 -1.63449902911388e-01 + 5.06477442605548e-01 -1.63417485627504e-01 + 4.93144035884787e-01 -1.63328228686621e-01 + 4.79941368474168e-01 -1.63060331436217e-01 + 4.66871737010151e-01 -1.62569827406711e-01 + 4.53934990999079e-01 -1.62070487200764e-01 + 4.41133168558923e-01 -1.61632173585030e-01 + 4.28463654391992e-01 -1.61187532275481e-01 + 4.15933178526276e-01 -1.60548880877149e-01 + 4.03555052687744e-01 -1.59798188531010e-01 + 3.91342756149186e-01 -1.58846604242981e-01 + 3.79289683322135e-01 -1.57540790079054e-01 + 3.67375264219574e-01 -1.56189884356924e-01 + 3.55580233434555e-01 -1.55081224503574e-01 + 3.43903993529589e-01 -1.54105712386970e-01 + 3.32371689603571e-01 -1.53109720354745e-01 + 3.21008399939002e-01 -1.51964778739524e-01 + 3.09818365007830e-01 -1.50611104402699e-01 + 2.98789403182843e-01 -1.49154888767305e-01 + 2.87915260467706e-01 -1.47707797499490e-01 + 2.77192797094198e-01 -1.46295028972452e-01 + 2.66634642137323e-01 -1.44782680901920e-01 + 2.56243230473741e-01 -1.43092118304113e-01 + 2.46011513861498e-01 -1.41179312266907e-01 + 2.35923227561334e-01 -1.39187527359477e-01 + 2.25978716650481e-01 -1.37235092846332e-01 + 2.16205677937271e-01 -1.35310903535781e-01 + 2.06778722942050e-01 -1.33322871209808e-01 + 1.97516042359716e-01 -1.31227497717662e-01 + 1.88427440008692e-01 -1.28991125900883e-01 + 1.79502980110518e-01 -1.26649399614310e-01 + 1.70733325816940e-01 -1.24213566866553e-01 + 1.62098170428490e-01 -1.21762260683871e-01 + 1.53596861253099e-01 -1.19338023194216e-01 + 1.45242024458811e-01 -1.16964714586022e-01 + 1.37059827832412e-01 -1.14553161865558e-01 + 1.29058111671005e-01 -1.12011104818429e-01 + 1.21217330976586e-01 -1.09333580954571e-01 + 1.13490793020045e-01 -1.06582482287198e-01 + 1.05872478787586e-01 -1.03835726838741e-01 + 9.84312049808396e-02 -1.01090373016527e-01 + 9.12178971287871e-02 -9.82756005290104e-02 + 8.42187577306301e-02 -9.53136441369315e-02 + 7.73955759457572e-02 -9.22209615041234e-02 + 7.07054294736601e-02 -8.89789985808886e-02 + 6.41548755011769e-02 -8.56689842703127e-02 + 5.77914057011829e-02 -8.22370633159429e-02 + 5.16081911372133e-02 -7.87250303745277e-02 + 4.56080027670407e-02 -7.51373524837015e-02 + 3.97932691904809e-02 -7.13640514386860e-02 + 3.41289275285710e-02 -6.73803370811387e-02 + 2.88546712589916e-02 -6.31532691299288e-02 + 2.39831240698773e-02 -5.86665495096452e-02 + 1.94527821619992e-02 -5.39591200958821e-02 + 1.53491720497801e-02 -4.90523270599134e-02 + 1.16943357256612e-02 -4.38406284119954e-02 + 8.65365253109135e-03 -3.84459455205228e-02 + 5.92370160379059e-03 -3.30114750896427e-02 + 3.46212829965803e-03 -2.75812253497000e-02 + 1.58454458640205e-03 -2.21027074392882e-02 + 7.35715040582169e-04 -1.65321192119310e-02 + 2.97907005116705e-04 -1.09279875504530e-02 + 5.30676565098627e-05 -5.39101103138609e-03 + 0.00000000000000e+00 0.00000000000000e+00 + 9.16249484271071e-05 5.39472463076042e-03 + 2.97114014867658e-04 1.09125341734703e-02 + 6.07765485359921e-04 1.65347368419011e-02 + 1.01319685944283e-03 2.22398721797630e-02 + 1.57860720361388e-03 2.80048570638302e-02 + 2.85770205402702e-03 3.38268128923488e-02 + 4.60485640943450e-03 3.97136792782237e-02 + 6.36963363495096e-03 4.56791798263678e-02 + 8.27460103313730e-03 5.17469828248211e-02 + 1.04559502964479e-02 5.78621045555090e-02 + 1.30787206403767e-02 6.39307928915866e-02 + 1.62476019915294e-02 6.99136016610049e-02 + 1.97064472281925e-02 7.58656576746356e-02 + 2.32055551437451e-02 8.18956044570781e-02 + 2.67780264071069e-02 8.80520763606948e-02 + 3.05536180174887e-02 9.43034458705317e-02 + 3.46895645314508e-02 1.00552628487572e-01 + 3.91594998227274e-02 1.06753941085293e-01 + 4.38513894815309e-02 1.12886816803394e-01 + 4.86469345513260e-02 1.19031991526595e-01 + 5.35662818491533e-02 1.25246183971636e-01 + 5.86765310389434e-02 1.31515765400035e-01 + 6.41158119407387e-02 1.37430772030919e-01 + 6.98941360883445e-02 1.43254800103538e-01 + 7.59170877123488e-02 1.49053754727573e-01 + 8.21227682881698e-02 1.54888203928039e-01 + 8.85359454387846e-02 1.60747975413262e-01 + 9.51513059583106e-02 1.66598125672197e-01 + 1.01977161405040e-01 1.72421724747484e-01 + 1.09029076244286e-01 1.78602175887026e-01 + 1.16324626112349e-01 1.84952513492490e-01 + 1.23886862179539e-01 1.91028384041450e-01 + 1.31793661272858e-01 1.96904454248269e-01 + 1.40137015144785e-01 2.02603209487098e-01 + 1.48722392856665e-01 2.08131821762515e-01 + 1.57498055037009e-01 2.13566417662387e-01 + 1.66499738307440e-01 2.18924804988545e-01 + 1.75746807567001e-01 2.24209223798866e-01 + 1.85282812844636e-01 2.29419693016131e-01 + 1.95126003842738e-01 2.34424150993428e-01 + 2.05278382458868e-01 2.39064246909332e-01 + 2.15728458898676e-01 2.43395275762812e-01 + 2.26448399402852e-01 2.47609942869563e-01 + 2.37390616140716e-01 2.51915193162418e-01 + 2.48555223136142e-01 2.56240468008173e-01 + 2.59983581489374e-01 2.60218095713622e-01 + 2.71719323509248e-01 2.63616598352372e-01 + 2.83748575426622e-01 2.66632889055311e-01 + 2.96041798832288e-01 2.69453390481384e-01 + 3.08575060192042e-01 2.72409404922417e-01 + 3.21340186072523e-01 2.75012415222477e-01 + 3.34353685398402e-01 2.76492953153595e-01 + 3.47617985877095e-01 2.77530644029356e-01 + 3.61086047806733e-01 2.78478291157024e-01 + 3.74735967198890e-01 2.79421812258223e-01 + 3.88584839416611e-01 2.80075134954841e-01 + 4.02610569745306e-01 2.80158921396025e-01 + 4.16769966222890e-01 2.79426952940989e-01 + 4.31000767416746e-01 2.77780180205803e-01 + 4.45367430099069e-01 2.75892299873811e-01 + 4.59886426162136e-01 2.73764712702610e-01 + 4.74522704612306e-01 2.71235104254327e-01 + 4.89216780464507e-01 2.68272718312492e-01 + 5.03966776199603e-01 2.64447118696879e-01 + 5.18806020666685e-01 2.60200052632834e-01 + 5.33757172542646e-01 2.56033656152525e-01 + 5.48800417061940e-01 2.51670207782890e-01 + 5.63928433117745e-01 2.47052734150705e-01 + 5.79139293361131e-01 2.42196437539003e-01 + 5.94438582209324e-01 2.37156310638374e-01 + 6.09857099330908e-01 2.32081069158076e-01 + 6.25400870520805e-01 2.26991368536271e-01 + 6.41058606965589e-01 2.21852557624183e-01 + 6.56827119257239e-01 2.16670545580237e-01 + 6.72692401163725e-01 2.11435826592181e-01 + 6.88658261530256e-01 2.06153724323127e-01 + 7.04768588597026e-01 2.00939949019601e-01 + 7.21023238876672e-01 1.95698405223399e-01 + 7.37357768356274e-01 1.90224737500501e-01 + 7.53717588941763e-01 1.84447648187462e-01 + 7.70112763502082e-01 1.78479680783297e-01 + 7.86578143910845e-01 1.72394810225689e-01 + 8.03184229023836e-01 1.66738239461448e-01 + 8.19942143394421e-01 1.61342896059017e-01 + 8.36804795974800e-01 1.55942560425342e-01 + 8.53725343344330e-01 1.50402193026770e-01 + 8.70748946763591e-01 1.44842377351049e-01 + 8.87946529574867e-01 1.39474077514211e-01 + 9.05306293149628e-01 1.34235143291426e-01 + 9.22545067587843e-01 1.28920314434417e-01 + 9.40600734347715e-01 1.23754776734464e-01 + 9.53048939484955e-01 1.16864623799960e-01 + 9.63077773676104e-01 1.06395431570647e-01 + 9.72474093255454e-01 9.57868792253965e-02 + 9.81179655916868e-01 8.60931773916215e-02 + 9.88539472463695e-01 7.50338503152747e-02 + 9.93965264664499e-01 5.85418242094117e-02 + 9.96759513501900e-01 4.07113376276323e-02 + 9.98822819206952e-01 2.22334005961241e-02 + 1.00000000000000e+00 3.03882619127306e-03 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF06_Coords.txt b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF06_Coords.txt new file mode 100644 index 000000000..9931444ec --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF06_Coords.txt @@ -0,0 +1,208 @@ + 201 NumCoords ! The number of coordinates in the airfoil shape file (including an extra coordinate for airfoil reference). Set to zero if coordinates not included. +! ......... x-y coordinates are next if NumCoords > 0 ............. +! x-y coordinate of airfoil reference +! x/c y/c + 0.250000 0 +! coordinates of airfoil shape +! interpolation to 200 points +! x/c y/c + 1.00000000000000e+00 -1.13904183263968e-02 + 9.97616112402170e-01 -3.02925242439361e-02 + 9.92090053782966e-01 -4.09226344496437e-02 + 9.78779505574386e-01 -4.46317953566502e-02 + 9.62630848882990e-01 -4.78657079982365e-02 + 9.48002016685502e-01 -5.14602797602320e-02 + 9.33316247673508e-01 -5.51593031128816e-02 + 9.18496232612161e-01 -5.92254605712216e-02 + 9.03703201804367e-01 -6.31663589833213e-02 + 8.88853928485311e-01 -6.68255900117923e-02 + 8.74049386501296e-01 -7.05161511584427e-02 + 8.59334016743915e-01 -7.43874436875609e-02 + 8.44688974778042e-01 -7.83626507822871e-02 + 8.30107202160351e-01 -8.23961121367229e-02 + 8.15594575089335e-01 -8.65047449737667e-02 + 8.01218061118175e-01 -9.08578559827087e-02 + 7.87017154459310e-01 -9.56014747506557e-02 + 7.72867465331189e-01 -1.00310586221221e-01 + 7.58658127516040e-01 -1.04602689055293e-01 + 7.44454533959962e-01 -1.08689082390743e-01 + 7.30359770774575e-01 -1.12881924651599e-01 + 7.16430384005105e-01 -1.17399987158617e-01 + 7.02548411333571e-01 -1.21769749655608e-01 + 6.88587907939929e-01 -1.25508162707915e-01 + 6.74579309967017e-01 -1.28831256546796e-01 + 6.60588643228054e-01 -1.31814109374650e-01 + 6.46644883677572e-01 -1.34518684272535e-01 + 6.32738136446085e-01 -1.36970560657454e-01 + 6.18888539380060e-01 -1.39099781158483e-01 + 6.05094599842353e-01 -1.40925423892468e-01 + 5.91370497948358e-01 -1.42548078837611e-01 + 5.77742681423787e-01 -1.44039268742623e-01 + 5.64210789942644e-01 -1.45418710112677e-01 + 5.50776369602557e-01 -1.46660362777981e-01 + 5.37444968071300e-01 -1.47785036756530e-01 + 5.24218800582908e-01 -1.48883649416298e-01 + 5.11096793180140e-01 -1.49725747746255e-01 + 4.98077600261809e-01 -1.50190862529385e-01 + 4.85165286248710e-01 -1.50548451423256e-01 + 4.72371838173648e-01 -1.50709025323563e-01 + 4.59704855658886e-01 -1.50660182339889e-01 + 4.47162353937939e-01 -1.50610036032676e-01 + 4.34748236821129e-01 -1.50574316591260e-01 + 4.22462962227877e-01 -1.50466331413989e-01 + 4.10307413565604e-01 -1.50120854962051e-01 + 3.98293549815832e-01 -1.49646376138536e-01 + 3.86431947049557e-01 -1.48985011501092e-01 + 3.74719035040848e-01 -1.47937284203969e-01 + 3.63143253860895e-01 -1.46805960127425e-01 + 3.51694487399415e-01 -1.45836094033469e-01 + 3.40375820106151e-01 -1.44917425523182e-01 + 3.29200242436979e-01 -1.43946965381053e-01 + 3.18179373560524e-01 -1.42835461865229e-01 + 3.07312147043483e-01 -1.41563685586535e-01 + 2.96589198655950e-01 -1.40239218363699e-01 + 2.86000302805324e-01 -1.38971039533067e-01 + 2.75538569884689e-01 -1.37776349074027e-01 + 2.65231088919120e-01 -1.36509074431539e-01 + 2.55105124935306e-01 -1.35017464348563e-01 + 2.45163330716385e-01 -1.33182240433968e-01 + 2.35380065561362e-01 -1.31184297306223e-01 + 2.25731797335499e-01 -1.29236565554543e-01 + 2.16212918345480e-01 -1.27375368900912e-01 + 2.06869737828596e-01 -1.25493378403087e-01 + 1.97692792848475e-01 -1.23508013308052e-01 + 1.88692178275185e-01 -1.21356126184016e-01 + 1.79852140135191e-01 -1.19094041300472e-01 + 1.71155287788632e-01 -1.16810198318667e-01 + 1.62583572203815e-01 -1.14572084308225e-01 + 1.54148627233356e-01 -1.12333771605582e-01 + 1.45882282736195e-01 -1.10017484528559e-01 + 1.37813705509852e-01 -1.07521934723333e-01 + 1.29924389454779e-01 -1.04868618458173e-01 + 1.22160459722846e-01 -1.02232244909791e-01 + 1.14462997638161e-01 -9.97769981877239e-02 + 1.06850950889400e-01 -9.74418050455991e-02 + 9.94456540823707e-02 -9.49708378396853e-02 + 9.23374027952569e-02 -9.21230511653797e-02 + 8.54657300321368e-02 -8.89658600035733e-02 + 7.87212757634630e-02 -8.58036899472230e-02 + 7.20187471524862e-02 -8.28315669774048e-02 + 6.54246409525636e-02 -7.99018939763046e-02 + 5.90704249471530e-02 -7.68099610722217e-02 + 5.30035679474469e-02 -7.34323254403719e-02 + 4.71239339609886e-02 -6.99340905790686e-02 + 4.13031360007540e-02 -6.65329912958667e-02 + 3.55234699482794e-02 -6.32184019501613e-02 + 3.01619829327107e-02 -5.96139288290971e-02 + 2.53031775785438e-02 -5.54778043544704e-02 + 2.08048174587776e-02 -5.10511978893060e-02 + 1.65388584263945e-02 -4.65627010925328e-02 + 1.26090766129194e-02 -4.18918267420981e-02 + 9.43378362085923e-03 -3.69337921085883e-02 + 6.78961770854852e-03 -3.16963231219606e-02 + 4.34237637716249e-03 -2.64747404683854e-02 + 1.85598728281019e-03 -2.13060647449452e-02 + 8.70334950751159e-04 -1.60204557614650e-02 + 3.78614157542381e-04 -1.06258278582999e-02 + 8.34360366869797e-05 -5.24793360453415e-03 + 0.00000000000000e+00 0.00000000000000e+00 + 7.67236867486678e-05 5.23517737179421e-03 + 2.69353450923468e-04 1.05899507024689e-02 + 5.68432823980679e-04 1.60424452959359e-02 + 9.62751245980932e-04 2.15677746016270e-02 + 1.56056154959061e-03 2.71408610938964e-02 + 2.93760353810514e-03 3.27643997804523e-02 + 4.68388731306286e-03 3.84466954603457e-02 + 6.39829873698727e-03 4.42192833035362e-02 + 8.30088094239591e-03 5.00830587126182e-02 + 1.04968991067837e-02 5.59331418219662e-02 + 1.31905356506929e-02 6.16590402853706e-02 + 1.64944927228985e-02 6.72926557763616e-02 + 1.99584847680105e-02 7.29780548965268e-02 + 2.33603947254173e-02 7.88193742129969e-02 + 2.68842534255446e-02 8.47441200649158e-02 + 3.06808954672960e-02 9.06322348821772e-02 + 3.49084527320684e-02 9.63920127695594e-02 + 3.94874921561364e-02 1.02093915910307e-01 + 4.41979239135200e-02 1.07851341351126e-01 + 4.88991643814045e-02 1.13771751479133e-01 + 5.37085410028852e-02 1.19785527662613e-01 + 5.87799300044820e-02 1.25738707322743e-01 + 6.42723709032797e-02 1.31439519919589e-01 + 7.01563729259333e-02 1.37001677458821e-01 + 7.62522111785621e-02 1.42563767678454e-01 + 8.24142000324228e-02 1.48247461470601e-01 + 8.87141756594531e-02 1.54005995560218e-01 + 9.52252089668619e-02 1.59738341000206e-01 + 1.02012827165119e-01 1.65362107222581e-01 + 1.09071839770933e-01 1.71005609066199e-01 + 1.16382532480666e-01 1.76625410480436e-01 + 1.23929157304783e-01 1.82119310647882e-01 + 1.31734456855347e-01 1.87537907766897e-01 + 1.39830632988419e-01 1.92818237288258e-01 + 1.48208290383940e-01 1.97881178099860e-01 + 1.56890640982985e-01 2.02754105050709e-01 + 1.65833248340983e-01 2.07492675263682e-01 + 1.74977872658223e-01 2.12167028768671e-01 + 1.84339215056554e-01 2.16828518735710e-01 + 1.93969002461360e-01 2.21262214470146e-01 + 2.03927738995053e-01 2.25232399682506e-01 + 2.14233998923319e-01 2.28819156679255e-01 + 2.24768775871601e-01 2.32298339432912e-01 + 2.35414724132119e-01 2.35983917716678e-01 + 2.46214765126001e-01 2.39788864290029e-01 + 2.57273968847626e-01 2.43131931500378e-01 + 2.68683262153020e-01 2.45701077047944e-01 + 2.80394161446840e-01 2.47884449864113e-01 + 2.92298014116652e-01 2.49928845873406e-01 + 3.04358015522582e-01 2.52310200009780e-01 + 3.16612004841116e-01 2.54366837382113e-01 + 3.29084707645504e-01 2.54944026733475e-01 + 3.41791574758934e-01 2.55013657780952e-01 + 3.54686633087091e-01 2.55077224740846e-01 + 3.67732287456134e-01 2.55080989890258e-01 + 3.80947927549799e-01 2.54809270763009e-01 + 3.94277125966556e-01 2.54299155434133e-01 + 4.07679990408069e-01 2.52964484309584e-01 + 4.21176069905831e-01 2.50460618119005e-01 + 4.34780235148961e-01 2.47779904156950e-01 + 4.48508915785030e-01 2.45032787159418e-01 + 4.62324554197701e-01 2.41951247240081e-01 + 4.76168679634616e-01 2.38443526187009e-01 + 4.90026518395832e-01 2.34310030235241e-01 + 5.03986607097025e-01 2.29965169629546e-01 + 5.18124607276385e-01 2.25794521855877e-01 + 5.32402710892978e-01 2.21622952392128e-01 + 5.46773333755108e-01 2.17288635068298e-01 + 5.61209497775237e-01 2.12697198172799e-01 + 5.75739948251087e-01 2.07963361115272e-01 + 5.90401181915651e-01 2.03229629742975e-01 + 6.05186266686445e-01 1.98479319175866e-01 + 6.20086166342671e-01 1.93692356863453e-01 + 6.35097907187523e-01 1.88871403344983e-01 + 6.50216806205491e-01 1.84017547463539e-01 + 6.65438113197408e-01 1.79123980133843e-01 + 6.80773250934036e-01 1.74228906733020e-01 + 6.96172960729631e-01 1.69180559493466e-01 + 7.11585661998256e-01 1.63830547989403e-01 + 7.27034942498605e-01 1.58268579741071e-01 + 7.42558721683669e-01 1.52649157462292e-01 + 7.58144383438193e-01 1.46939483520203e-01 + 7.73847783484881e-01 1.41394650866481e-01 + 7.89701647082685e-01 1.36067884587493e-01 + 8.05635711733308e-01 1.30738018396962e-01 + 8.21581445293506e-01 1.25220232868624e-01 + 8.37586124515025e-01 1.19666988037264e-01 + 8.53726898147738e-01 1.14318888381174e-01 + 8.69963585585765e-01 1.09065119635605e-01 + 8.86190226070913e-01 1.03619764994052e-01 + 9.02483979686875e-01 9.80682052774082e-02 + 9.18558853276680e-01 9.26538040770285e-02 + 9.34548045768020e-01 8.73262649268327e-02 + 9.50649300724702e-01 8.23994229326946e-02 + 9.66427399966504e-01 7.70749674918775e-02 + 9.80999886673880e-01 6.90076199367232e-02 + 9.92612066213372e-01 5.56165891750792e-02 + 9.96940327203726e-01 4.00048120288691e-02 + 9.99182455606956e-01 2.29517217456512e-02 + 1.00000000000000e+00 4.20817591936930e-03 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF07_Coords.txt b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF07_Coords.txt new file mode 100644 index 000000000..ce777e0da --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF07_Coords.txt @@ -0,0 +1,208 @@ + 201 NumCoords ! The number of coordinates in the airfoil shape file (including an extra coordinate for airfoil reference). Set to zero if coordinates not included. +! ......... x-y coordinates are next if NumCoords > 0 ............. +! x-y coordinate of airfoil reference +! x/c y/c + 0.250000 0 +! coordinates of airfoil shape +! interpolation to 200 points +! x/c y/c + 1.00000000000000e+00 -7.22169847721207e-03 + 9.93657635607014e-01 -9.80951552444892e-03 + 9.85015925953616e-01 -1.30850106016452e-02 + 9.68838039545111e-01 -1.84611077131393e-02 + 9.50612974422184e-01 -2.33823451641766e-02 + 9.34054843802496e-01 -2.68598144161353e-02 + 9.17904876813281e-01 -2.92032016919475e-02 + 9.02410145568755e-01 -3.25195649501926e-02 + 8.86984531818462e-01 -3.63341125283542e-02 + 8.71653146034245e-01 -4.02779399999799e-02 + 8.56421678685942e-01 -4.44297430955853e-02 + 8.41297341579872e-01 -4.88277542480629e-02 + 8.26299922405764e-01 -5.34725994663518e-02 + 8.11418218122957e-01 -5.83063399795375e-02 + 7.96668059771363e-01 -6.33518858746505e-02 + 7.82093073102221e-01 -6.86691608646314e-02 + 7.67715947269790e-01 -7.43397495082482e-02 + 7.53432129505621e-01 -8.00400824090274e-02 + 7.39140921507287e-01 -8.54783114096485e-02 + 7.24887781938029e-01 -9.07927090242104e-02 + 7.10763647733484e-01 -9.62089130617438e-02 + 6.96813846978418e-01 -1.01849003923843e-01 + 6.82926720247006e-01 -1.07345616986875e-01 + 6.68987494011958e-01 -1.12341932591132e-01 + 6.55015055372256e-01 -1.16974857778111e-01 + 6.41069653036586e-01 -1.21324695308618e-01 + 6.27178381576740e-01 -1.25441039708115e-01 + 6.13325927341839e-01 -1.29300851927610e-01 + 5.99526121249635e-01 -1.32836295356277e-01 + 5.85782516774879e-01 -1.36082768510397e-01 + 5.72099418530029e-01 -1.39062285229702e-01 + 5.58500671454668e-01 -1.41826434136283e-01 + 5.44989585070756e-01 -1.44410477552523e-01 + 5.31572041625452e-01 -1.46801987807261e-01 + 5.18249443006677e-01 -1.48965339749430e-01 + 5.05024114284701e-01 -1.51306014609625e-01 + 4.91903544204855e-01 -1.53396356865900e-01 + 4.78886537168064e-01 -1.55029927452596e-01 + 4.65973152938946e-01 -1.56361009079535e-01 + 4.53179119201583e-01 -1.57373248363793e-01 + 4.40511641089995e-01 -1.58032071375895e-01 + 4.27973254627328e-01 -1.58511320266496e-01 + 4.15569568070292e-01 -1.58830392050982e-01 + 4.03305571015855e-01 -1.58908632350926e-01 + 3.91181433267754e-01 -1.58751137788738e-01 + 3.79208355061609e-01 -1.58402513518675e-01 + 3.67395164279636e-01 -1.57823599361342e-01 + 3.55740722338427e-01 -1.56880132251604e-01 + 3.44238533276691e-01 -1.55825370105009e-01 + 3.32890410142460e-01 -1.54776742866931e-01 + 3.21695626476537e-01 -1.53702620246411e-01 + 3.10660511859208e-01 -1.52547932345675e-01 + 2.99792418198384e-01 -1.51236406478805e-01 + 2.89088689354766e-01 -1.49773471325457e-01 + 2.78543651775726e-01 -1.48236644042898e-01 + 2.68149273917489e-01 -1.46704827592144e-01 + 2.57896406226205e-01 -1.45208435280521e-01 + 2.47810593764685e-01 -1.43640086484094e-01 + 2.37924398764870e-01 -1.41871396589496e-01 + 2.28243375505465e-01 -1.39800943847393e-01 + 2.18746002754731e-01 -1.37561331679565e-01 + 2.09407739643021e-01 -1.35323082679671e-01 + 2.00204632082914e-01 -1.33142628436607e-01 + 1.91097767708039e-01 -1.30937919464830e-01 + 1.82170786872752e-01 -1.28640807136328e-01 + 1.73438864168049e-01 -1.26185420973317e-01 + 1.64887367765774e-01 -1.23622391399294e-01 + 1.56497023195920e-01 -1.21049752796620e-01 + 1.48258982483410e-01 -1.18508626502639e-01 + 1.40184001337527e-01 -1.15939910025142e-01 + 1.32310114080237e-01 -1.13239907331215e-01 + 1.24637510518848e-01 -1.10361154607051e-01 + 1.17138359086711e-01 -1.07372231954189e-01 + 1.09808401127193e-01 -1.04399442414758e-01 + 1.02594618944679e-01 -1.01600341650075e-01 + 9.54864171319728e-02 -9.89295946584694e-02 + 8.85996519559139e-02 -9.61035248577797e-02 + 8.20051916775647e-02 -9.28926032526868e-02 + 7.56369542864789e-02 -8.94141742247751e-02 + 6.94224285943848e-02 -8.59586167133803e-02 + 6.33063696107793e-02 -8.27169512241728e-02 + 5.73252083536456e-02 -7.95397742824449e-02 + 5.15865051316583e-02 -7.61848830062020e-02 + 4.61300367417238e-02 -7.25118010504582e-02 + 4.08738115912319e-02 -6.87276051345213e-02 + 3.57389328883182e-02 -6.50758836466640e-02 + 3.07040311089050e-02 -6.15616444241208e-02 + 2.60327010981162e-02 -5.78249541857669e-02 + 2.18044848917305e-02 -5.36151169153552e-02 + 1.79125721708463e-02 -4.91694235722464e-02 + 1.42640650272980e-02 -4.47148049333326e-02 + 1.09301665102860e-02 -4.01661895085117e-02 + 8.21488787888461e-03 -3.53822053138899e-02 + 5.97345205176603e-03 -3.03209729737249e-02 + 3.91406699176672e-03 -2.52857837799812e-02 + 1.81775566819190e-03 -2.03309654023002e-02 + 9.12160954949108e-04 -1.52977122324043e-02 + 4.02582765125064e-04 -1.01721928519313e-02 + 8.81962189848521e-05 -5.04398886153351e-03 + 0.00000000000000e+00 0.00000000000000e+00 + 7.88481242318804e-05 4.71135299425895e-03 + 2.80754052876520e-04 9.46261288508707e-03 + 6.13006828585368e-04 1.43031715472917e-02 + 1.05300322116593e-03 1.92164339057439e-02 + 1.65902417833529e-03 2.41858280981452e-02 + 2.88604628288041e-03 2.92144066457047e-02 + 4.45666746110958e-03 3.43052576770996e-02 + 6.03753907265340e-03 3.94795983867471e-02 + 7.82960449484624e-03 4.47233966620429e-02 + 9.91655407404961e-03 4.99442035624549e-02 + 1.24284772687387e-02 5.50687705625851e-02 + 1.54763292167825e-02 6.01250554953811e-02 + 1.86843960997679e-02 6.52596352562490e-02 + 2.18962093706069e-02 7.05324271196803e-02 + 2.52784929759404e-02 7.58378592538172e-02 + 2.89300636094216e-02 8.10694276026404e-02 + 3.29484021469950e-02 8.61824529289475e-02 + 3.72852782429899e-02 9.12501336825606e-02 + 4.17870700061248e-02 9.63840447729288e-02 + 4.63496453037568e-02 1.01661284055219e-01 + 5.10435239639925e-02 1.07009882208275e-01 + 5.59875070986280e-02 1.12277397844824e-01 + 6.13148588789216e-02 1.17455631946297e-01 + 6.70010356595760e-02 1.22519800002061e-01 + 7.29051769183183e-02 1.27568059236526e-01 + 7.89112995425554e-02 1.32686684152645e-01 + 8.50741136975359e-02 1.37843119031058e-01 + 9.14578688138890e-02 1.42951013415473e-01 + 9.81151304128743e-02 1.47950651124437e-01 + 1.05022936124011e-01 1.52865251715801e-01 + 1.12182877397443e-01 1.57757291795771e-01 + 1.19585877721620e-01 1.62614046073641e-01 + 1.27214720177563e-01 1.67446356419965e-01 + 1.35051758382265e-01 1.72165225608851e-01 + 1.43176044526092e-01 1.76678814786360e-01 + 1.51634312233503e-01 1.80984672889066e-01 + 1.60356678124586e-01 1.85147263518180e-01 + 1.69269127559869e-01 1.89234816532284e-01 + 1.78381320346887e-01 1.93269420198442e-01 + 1.87736592934877e-01 1.97097647600736e-01 + 1.97403400646351e-01 2.00521431354757e-01 + 2.07414560220724e-01 2.03579949812533e-01 + 2.17637947930063e-01 2.06524316560926e-01 + 2.27957250958957e-01 2.09606621172829e-01 + 2.38424311306026e-01 2.12738917135585e-01 + 2.49140241428875e-01 2.15458447992728e-01 + 2.60193207505178e-01 2.17511148705191e-01 + 2.71533533873424e-01 2.19224005878087e-01 + 2.83047744346193e-01 2.20787015818953e-01 + 2.94701890510800e-01 2.22583472274857e-01 + 3.06540852849821e-01 2.24096763539104e-01 + 3.18587112400968e-01 2.24415002618965e-01 + 3.30855654708830e-01 2.24301491408268e-01 + 3.43310579183658e-01 2.24139847149895e-01 + 3.55916656194316e-01 2.23898337931694e-01 + 3.68688998774519e-01 2.23408427293927e-01 + 3.81572695782548e-01 2.22730323737716e-01 + 3.94527023625166e-01 2.21420378888789e-01 + 4.07577420363382e-01 2.19229578580146e-01 + 4.20747484227582e-01 2.16905927479625e-01 + 4.34048855640024e-01 2.14517519518509e-01 + 4.47450165980170e-01 2.11864556981160e-01 + 4.60905424804169e-01 2.08876051783214e-01 + 4.74402418451617e-01 2.05501088301643e-01 + 4.88022240093813e-01 2.01966908762110e-01 + 5.01834194639075e-01 1.98470477662966e-01 + 5.15805558738129e-01 1.94947715634616e-01 + 5.29888183465374e-01 1.91277769157688e-01 + 5.44052932281682e-01 1.87389757043223e-01 + 5.58325058597065e-01 1.83339503703845e-01 + 5.72736421684721e-01 1.79233707897876e-01 + 5.87278008452787e-01 1.75063217405684e-01 + 6.01942226550589e-01 1.70800025984236e-01 + 6.16726346705862e-01 1.66455074142313e-01 + 6.31625058034417e-01 1.61970282233741e-01 + 6.46632291278635e-01 1.57504594571016e-01 + 6.61751041325077e-01 1.53059152834824e-01 + 6.76936236795835e-01 1.48499192638019e-01 + 6.92147476339639e-01 1.43724258513413e-01 + 7.07422281167433e-01 1.38823871106520e-01 + 7.22793007484622e-01 1.33869944353296e-01 + 7.38235455101973e-01 1.28814615957645e-01 + 7.53788409699974e-01 1.23522467900944e-01 + 7.69480657356214e-01 1.18283395144514e-01 + 7.85257633409310e-01 1.13044577909845e-01 + 8.01060519005720e-01 1.07644700685774e-01 + 8.16924009082326e-01 1.02213067786408e-01 + 8.32899942925333e-01 9.69408719881597e-02 + 8.48952317457811e-01 9.17358463767536e-02 + 8.65002071649512e-01 8.63711864178634e-02 + 8.80969831955332e-01 8.09281767032574e-02 + 8.97584200496906e-01 7.56224024173498e-02 + 9.14568727916341e-01 7.04186437860226e-02 + 9.31904847981603e-01 6.55248665698794e-02 + 9.49305251019172e-01 6.03216786607366e-02 + 9.66164153664091e-01 4.90247665870267e-02 + 9.80884725394935e-01 3.29696041722759e-02 + 9.88910360671404e-01 2.19933114134784e-02 + 9.94960172555627e-01 1.27529106155588e-02 + 1.00000000000000e+00 4.45165609285943e-03 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF08_Coords.txt b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF08_Coords.txt new file mode 100644 index 000000000..478fc66c6 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF08_Coords.txt @@ -0,0 +1,208 @@ + 201 NumCoords ! The number of coordinates in the airfoil shape file (including an extra coordinate for airfoil reference). Set to zero if coordinates not included. +! ......... x-y coordinates are next if NumCoords > 0 ............. +! x-y coordinate of airfoil reference +! x/c y/c + 0.250000 0 +! coordinates of airfoil shape +! interpolation to 200 points +! x/c y/c + 1.00000000000000e+00 -5.11794789304784e-03 + 9.87005763971439e-01 -5.16840068225131e-03 + 9.73038425383534e-01 -5.32849535777342e-03 + 9.56081318146453e-01 -5.65516774424684e-03 + 9.38258725113225e-01 -6.13509187042994e-03 + 9.21098802615238e-01 -7.37719929228484e-03 + 9.04171761208617e-01 -9.67764145296581e-03 + 8.87610187611954e-01 -1.28830910336964e-02 + 8.71194318647985e-01 -1.68426370240972e-02 + 8.54930444958429e-01 -2.12840484397517e-02 + 8.38825194115695e-01 -2.61486444777100e-02 + 8.22890453894495e-01 -3.14203814417820e-02 + 8.07149028562320e-01 -3.70963167232995e-02 + 7.91559160728296e-01 -4.30129343317612e-02 + 7.76134809703913e-01 -4.91784530431020e-02 + 7.60882930217529e-01 -5.55441031998046e-02 + 7.45808391148759e-01 -6.21129397508765e-02 + 7.30872703797860e-01 -6.87753213244312e-02 + 7.16019391262118e-01 -7.53975930760553e-02 + 7.01249601839577e-01 -8.19653842497797e-02 + 6.86602027371248e-01 -8.85381279067066e-02 + 6.72088450727254e-01 -9.51198902776138e-02 + 6.57658826413606e-01 -1.01580704997215e-01 + 6.43273510875851e-01 -1.07825082904111e-01 + 6.28922441703606e-01 -1.13838136909654e-01 + 6.14629543830024e-01 -1.19633865914327e-01 + 6.00402302207097e-01 -1.25204051915514e-01 + 5.86224990574980e-01 -1.30504150242841e-01 + 5.72102688198421e-01 -1.35489694904769e-01 + 5.58056462396552e-01 -1.40219795793820e-01 + 5.44068657963509e-01 -1.44621519921740e-01 + 5.30149292300862e-01 -1.48688195730507e-01 + 5.16309904342871e-01 -1.52448246865224e-01 + 5.02564054060932e-01 -1.55921626814940e-01 + 4.88906214250242e-01 -1.59037421835638e-01 + 4.75341042823127e-01 -1.62423955617231e-01 + 4.61888620093194e-01 -1.65573917902269e-01 + 4.48549276031540e-01 -1.68227765214179e-01 + 4.35323450667154e-01 -1.70397650719714e-01 + 4.22231621477117e-01 -1.72138327387660e-01 + 4.09276701428819e-01 -1.73387571753102e-01 + 3.96470584896236e-01 -1.74281084442316e-01 + 3.83820866691607e-01 -1.74849339228191e-01 + 3.71337084681443e-01 -1.75019751577656e-01 + 3.59023523674681e-01 -1.74968047652900e-01 + 3.46890000105156e-01 -1.74665880146742e-01 + 3.34945069696063e-01 -1.74085229376070e-01 + 3.23189763794252e-01 -1.73173272026349e-01 + 3.11618801432831e-01 -1.72128336356160e-01 + 3.00245771337945e-01 -1.70930259894987e-01 + 2.89061607633421e-01 -1.69632705367369e-01 + 2.78070348777523e-01 -1.68223429598176e-01 + 2.67282084006707e-01 -1.66631651581257e-01 + 2.56695506216341e-01 -1.64880753133419e-01 + 2.46309210866574e-01 -1.63007736992023e-01 + 2.36121268527904e-01 -1.61049692711949e-01 + 2.26122324781829e-01 -1.59049566833247e-01 + 2.16324437766268e-01 -1.56951849123834e-01 + 2.06745907176088e-01 -1.54690861611926e-01 + 1.97389066205685e-01 -1.52226909705892e-01 + 1.88247721921604e-01 -1.49614702715995e-01 + 1.79314005605731e-01 -1.46926220464477e-01 + 1.70566694081349e-01 -1.44223107768427e-01 + 1.61987928073239e-01 -1.41464913845606e-01 + 1.53613637192824e-01 -1.38621916691031e-01 + 1.45465791115612e-01 -1.35641236981406e-01 + 1.37531633873771e-01 -1.32555619747964e-01 + 1.29789500501668e-01 -1.29438714378930e-01 + 1.22244457727610e-01 -1.26295657217261e-01 + 1.14904434138070e-01 -1.23092443693640e-01 + 1.07815146473205e-01 -1.19743795226088e-01 + 1.00932689591638e-01 -1.16291158229989e-01 + 9.42157410411242e-02 -1.12813381113546e-01 + 8.77349155613034e-02 -1.09269854169755e-01 + 8.14482559337302e-02 -1.05747275959770e-01 + 7.53019277572595e-02 -1.02291481938668e-01 + 6.93966080685775e-02 -9.87222833516028e-02 + 6.37676017649456e-02 -9.49332169892506e-02 + 5.83449527155066e-02 -9.10314379469155e-02 + 5.31177088421891e-02 -8.71178387550273e-02 + 4.80761779909361e-02 -8.32564851010753e-02 + 4.32072188935750e-02 -7.94169605594471e-02 + 3.85782245145711e-02 -7.54792072837812e-02 + 3.42154217216861e-02 -7.13768818016279e-02 + 3.00688981057734e-02 -6.72145109220034e-02 + 2.61374641397527e-02 -6.30734442017404e-02 + 2.23928752768931e-02 -5.89691912908124e-02 + 1.89178199388277e-02 -5.47792526393842e-02 + 1.57782895775260e-02 -5.03896663818205e-02 + 1.29264432287037e-02 -4.59030547514804e-02 + 1.03316751650313e-02 -4.14081472593511e-02 + 8.01095482796203e-03 -3.68823744341440e-02 + 6.08150946456878e-03 -3.22776443558319e-02 + 4.52036674400099e-03 -2.75690188527804e-02 + 3.11828349938427e-03 -2.29033385892524e-02 + 1.72653564695298e-03 -1.83027858589327e-02 + 9.36354454312048e-04 -1.37093359958523e-02 + 4.16310542075031e-04 -9.11214382596928e-03 + 9.05200308349797e-05 -4.53311172713394e-03 + 0.00000000000000e+00 0.00000000000000e+00 + 8.23110428241997e-05 3.97993478406906e-03 + 2.98468273940176e-04 7.93603235163689e-03 + 6.81113520909810e-04 1.19732402957132e-02 + 1.19041733235376e-03 1.60895922280325e-02 + 1.80832364157979e-03 2.02825181518579e-02 + 2.76834570722558e-03 2.45519466760042e-02 + 3.99985774071954e-03 2.88929320741292e-02 + 5.33098003226254e-03 3.32996052893721e-02 + 6.90917800997795e-03 3.77505431103084e-02 + 8.77992723995089e-03 4.22046062180702e-02 + 1.09457919494102e-02 4.66556914052094e-02 + 1.35126204924888e-02 5.10795304396620e-02 + 1.62412425116766e-02 5.55670056227592e-02 + 1.90868246244520e-02 6.01139718284135e-02 + 2.21802651667868e-02 6.46464708799812e-02 + 2.55327767469641e-02 6.91387827146383e-02 + 2.91390326059276e-02 7.36166345104199e-02 + 3.30039777104017e-02 7.80809269502797e-02 + 3.70896196513728e-02 8.25444208474574e-02 + 4.13563599588328e-02 8.70143468541920e-02 + 4.57942488220187e-02 9.15057079185578e-02 + 5.04601677621719e-02 9.59562675686702e-02 + 5.54400970779884e-02 1.00346688860753e-01 + 6.07171145906721e-02 1.04660979867235e-01 + 6.62216553378991e-02 1.08935080787161e-01 + 7.18940181674464e-02 1.13200789970514e-01 + 7.77574457722054e-02 1.17447559516479e-01 + 8.38582528706480e-02 1.21612209930337e-01 + 9.02250315657730e-02 1.25670302033989e-01 + 9.68042562433391e-02 1.29880982393018e-01 + 1.03635628099521e-01 1.34244912721725e-01 + 1.10722912321640e-01 1.38498319800975e-01 + 1.18029172437582e-01 1.42690766816319e-01 + 1.25557277062529e-01 1.46757468146931e-01 + 1.33346382566007e-01 1.50646937087769e-01 + 1.41422111706339e-01 1.54348524617411e-01 + 1.49738752822182e-01 1.57926503716025e-01 + 1.58261307252747e-01 1.61412895932014e-01 + 1.67014562834699e-01 1.64759052986503e-01 + 1.75997148265051e-01 1.67949166953076e-01 + 1.85241674734378e-01 1.70882184716457e-01 + 1.94781635865444e-01 1.73518364853247e-01 + 2.04539228304846e-01 1.76027713882885e-01 + 2.14458567307343e-01 1.78522958537949e-01 + 2.24570098428163e-01 1.80925955576210e-01 + 2.34913847146583e-01 1.83050172483361e-01 + 2.45534451193117e-01 1.84760209750302e-01 + 2.56409639618004e-01 1.86197622355102e-01 + 2.67481214281869e-01 1.87445374261523e-01 + 2.78729550445907e-01 1.88701260713293e-01 + 2.90174585689315e-01 1.89727304194648e-01 + 3.01827744802688e-01 1.90098148646786e-01 + 3.13693266853199e-01 1.90148247690122e-01 + 3.25752387770815e-01 1.90049748389473e-01 + 3.37985999295062e-01 1.89850482601187e-01 + 3.50399511022203e-01 1.89420380078704e-01 + 3.62964646417233e-01 1.88761112183883e-01 + 3.75659599317119e-01 1.87699877039682e-01 + 3.88493946311551e-01 1.86138748269845e-01 + 4.01479623369996e-01 1.84435211491590e-01 + 4.14618975626936e-01 1.82594846533824e-01 + 4.27893504473755e-01 1.80517499301112e-01 + 4.41277817165844e-01 1.78160355503343e-01 + 4.54769684184117e-01 1.75569963848603e-01 + 4.68402276532037e-01 1.72797452588699e-01 + 4.82204018250152e-01 1.69896570381480e-01 + 4.96163589481294e-01 1.66904476133250e-01 + 5.10254815759577e-01 1.63749683743645e-01 + 5.24457636672397e-01 1.60385631582868e-01 + 5.38778999812109e-01 1.56819010856189e-01 + 5.53239404956048e-01 1.53135112253065e-01 + 5.67833029385625e-01 1.49336436080728e-01 + 5.82554003323792e-01 1.45391901778675e-01 + 5.97398824215910e-01 1.41321960812472e-01 + 6.12357976569945e-01 1.37030889241381e-01 + 6.27427066223596e-01 1.32799780757966e-01 + 6.42609031829815e-01 1.28608187585689e-01 + 6.57884967455200e-01 1.24319134244053e-01 + 6.73222159445380e-01 1.19854473146893e-01 + 6.88646887911997e-01 1.15297096039949e-01 + 7.04172277874646e-01 1.10673352001207e-01 + 7.19774747820223e-01 1.05929035833374e-01 + 7.35472858003156e-01 1.00901982607120e-01 + 7.51283076871008e-01 9.58585566601091e-02 + 7.67180686513965e-01 9.08137757626553e-02 + 7.83126081044713e-01 8.56561702301634e-02 + 7.99132991302778e-01 8.04660870681737e-02 + 8.15219075008360e-01 7.53413348195255e-02 + 8.31361072829366e-01 7.02307546393778e-02 + 8.47517852331182e-01 6.50201985415269e-02 + 8.63656467507866e-01 5.97821549429307e-02 + 8.80097857298869e-01 5.46370739285706e-02 + 8.96698968133781e-01 4.95450131245877e-02 + 9.13428903265378e-01 4.45899999689061e-02 + 9.30165973653682e-01 3.95022753998810e-02 + 9.46677106385649e-01 3.35856041834030e-02 + 9.62366570300102e-01 2.64891184968628e-02 + 9.75524413777782e-01 1.96392571440591e-02 + 9.87942439431026e-01 1.23546891949117e-02 + 1.00000000000000e+00 4.46208092342662e-03 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF09_Coords.txt b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF09_Coords.txt new file mode 100644 index 000000000..ad8befd32 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF09_Coords.txt @@ -0,0 +1,208 @@ + 201 NumCoords ! The number of coordinates in the airfoil shape file (including an extra coordinate for airfoil reference). Set to zero if coordinates not included. +! ......... x-y coordinates are next if NumCoords > 0 ............. +! x-y coordinate of airfoil reference +! x/c y/c + 0.250000 0 +! coordinates of airfoil shape +! interpolation to 200 points +! x/c y/c + 1.00000000000000e+00 -4.48290689425684e-03 + 9.82685147820042e-01 -8.53514315789639e-04 + 9.65074173125769e-01 1.52396515243919e-03 + 9.47131369847641e-01 2.38186310542476e-03 + 9.29079738392991e-01 1.98605407767317e-03 + 9.11136932686656e-01 5.84573053769325e-04 + 8.93331110552002e-01 -1.81559310542060e-03 + 8.75696926836349e-01 -5.03012545181162e-03 + 8.58278441614373e-01 -9.07756072898963e-03 + 8.41065780811555e-01 -1.37558503877734e-02 + 8.24066502389336e-01 -1.89558446797954e-02 + 8.07294332368906e-01 -2.46418157238813e-02 + 7.90771378093859e-01 -3.08020117323259e-02 + 7.74436098064809e-01 -3.72183726376832e-02 + 7.58302300968262e-01 -4.38908526083423e-02 + 7.42347203951615e-01 -5.07231917195430e-02 + 7.26567046543587e-01 -5.76828350641104e-02 + 7.10965565373373e-01 -6.47638335469136e-02 + 6.95519902088750e-01 -7.19078088118299e-02 + 6.80200852515995e-01 -7.90264679400814e-02 + 6.65009538158461e-01 -8.60993846853897e-02 + 6.49932728810378e-01 -9.30770840488921e-02 + 6.34965245124027e-01 -9.99452370375686e-02 + 6.20121473822035e-01 -1.06734816345267e-01 + 6.05369724148523e-01 -1.13358005108072e-01 + 5.90709203181047e-01 -1.19793368271858e-01 + 5.76132232588897e-01 -1.26003318443933e-01 + 5.61623485073142e-01 -1.31936337860336e-01 + 5.47180334826478e-01 -1.37560084850570e-01 + 5.32836011294100e-01 -1.42944693135479e-01 + 5.18557682393933e-01 -1.47974227654401e-01 + 5.04345019178191e-01 -1.52613115006628e-01 + 4.90215407430556e-01 -1.56884809310840e-01 + 4.76188015830545e-01 -1.60825115471635e-01 + 4.62253033665051e-01 -1.64349593909143e-01 + 4.48417515713528e-01 -1.67663331883973e-01 + 4.34710843069829e-01 -1.70667352837079e-01 + 4.21135345763282e-01 -1.73250013095204e-01 + 4.07692539196562e-01 -1.75369441774164e-01 + 3.94406397743186e-01 -1.77099957202116e-01 + 3.81276986557577e-01 -1.78362483813652e-01 + 3.68322783092766e-01 -1.79242115776658e-01 + 3.55553206107463e-01 -1.79749612515479e-01 + 3.42979242027837e-01 -1.79808674233742e-01 + 3.30609148150643e-01 -1.79674534400684e-01 + 3.18449580230503e-01 -1.79275909211052e-01 + 3.06509322655533e-01 -1.78584001099644e-01 + 2.94791175146716e-01 -1.77599602041753e-01 + 2.83289821555050e-01 -1.76476773548797e-01 + 2.72024535692418e-01 -1.75094998486103e-01 + 2.60982410030143e-01 -1.73562091072792e-01 + 2.50165091041909e-01 -1.71897518205597e-01 + 2.39583243413264e-01 -1.70036954342752e-01 + 2.29235853918176e-01 -1.68016721779713e-01 + 2.19124464871966e-01 -1.65842406240233e-01 + 2.09249588884711e-01 -1.63520913043737e-01 + 1.99602392919692e-01 -1.61103792507202e-01 + 1.90186989829693e-01 -1.58574244986568e-01 + 1.81007010664238e-01 -1.55917942725202e-01 + 1.72062553557725e-01 -1.53140009241234e-01 + 1.63359202368110e-01 -1.50235559165085e-01 + 1.54898392347029e-01 -1.47206088517032e-01 + 1.46661235477579e-01 -1.44116632162527e-01 + 1.38647675436818e-01 -1.40957746936569e-01 + 1.30857477642150e-01 -1.37727894684008e-01 + 1.23314150088703e-01 -1.34386012966235e-01 + 1.16005990278055e-01 -1.30951821112718e-01 + 1.08910846474458e-01 -1.27479847786535e-01 + 1.02040340343061e-01 -1.23952846372826e-01 + 9.53986311193279e-02 -1.20357474728516e-01 + 8.90323993394245e-02 -1.16626303852397e-01 + 8.28767305111376e-02 -1.12854160647330e-01 + 7.68844182301344e-02 -1.09120085561990e-01 + 7.11597965516513e-02 -1.05283382260545e-01 + 6.56696750940585e-02 -1.01384532327587e-01 + 6.03433734169027e-02 -9.75228716647275e-02 + 5.52631810751249e-02 -9.35945518645845e-02 + 5.04374628719753e-02 -8.95752445382964e-02 + 4.58017138657216e-02 -8.55532445604049e-02 + 4.13825063739979e-02 -8.15090777857146e-02 + 3.71903771573731e-02 -7.74330944997390e-02 + 3.31831498539127e-02 -7.33695626942466e-02 + 2.94044512619656e-02 -6.92770916723935e-02 + 2.58722600796746e-02 -6.51347604857932e-02 + 2.25572604740764e-02 -6.09795630283635e-02 + 1.94959660050299e-02 -5.67979807916763e-02 + 1.66549185470222e-02 -5.26131319251651e-02 + 1.40190892255552e-02 -4.84378076871468e-02 + 1.16391072588897e-02 -4.42393355742390e-02 + 9.50228788811488e-03 -4.00394598279192e-02 + 7.61750558427819e-03 -3.58461293746517e-02 + 5.96961734277674e-03 -3.16700112648946e-02 + 4.57051426408954e-03 -2.75182493553630e-02 + 3.46220550430262e-03 -2.33803588641517e-02 + 2.49916702260785e-03 -1.93106678103887e-02 + 1.63033961162431e-03 -1.53141667384712e-02 + 9.45407884520976e-04 -1.13883102313619e-02 + 4.21430261701436e-04 -7.52929844595465e-03 + 9.13381590902419e-05 -3.73175381667205e-03 + 0.00000000000000e+00 0.00000000000000e+00 + 8.39329452090013e-05 3.54374461053228e-03 + 3.06764956816802e-04 7.13454764013681e-03 + 7.13012164714768e-04 1.08029006119544e-02 + 1.25477699565490e-03 1.45538137640591e-02 + 1.87824996211846e-03 1.83913428617193e-02 + 2.64208856620242e-03 2.23137326727634e-02 + 3.57895258939452e-03 2.63122664551712e-02 + 4.70335330309463e-03 3.03676984106315e-02 + 6.09496820298392e-03 3.44560592490469e-02 + 7.77012954132717e-03 3.85621978759486e-02 + 9.64425945479125e-03 4.27121086824562e-02 + 1.18165673299811e-02 4.68542778685051e-02 + 1.41500458554206e-02 5.10499179457540e-02 + 1.66757939188311e-02 5.52650509642601e-02 + 1.94944358078314e-02 5.94454470327604e-02 + 2.25601750791306e-02 6.36068555875123e-02 + 2.57991449009508e-02 6.78079383217997e-02 + 2.92507958725958e-02 7.20111307917660e-02 + 3.29560547332662e-02 7.61771155635355e-02 + 3.69223016317185e-02 8.02789497263063e-02 + 4.10868701381863e-02 8.43778345265497e-02 + 4.54636094053712e-02 8.84590735779314e-02 + 5.01015073543740e-02 9.24805126256261e-02 + 5.49864471213822e-02 9.64435890880417e-02 + 6.01030437388835e-02 1.00355103021560e-01 + 6.54365794824045e-02 1.04221338170475e-01 + 7.09866408760679e-02 1.08042054278353e-01 + 7.67848489938729e-02 1.11764924267835e-01 + 8.28419567185367e-02 1.15382031398279e-01 + 8.90827233315631e-02 1.19090347853174e-01 + 9.55745973139600e-02 1.22782565847220e-01 + 1.02331435541202e-01 1.26329878276425e-01 + 1.09301721897512e-01 1.29816008658284e-01 + 1.16503807036038e-01 1.33194917983426e-01 + 1.23946109720764e-01 1.36448961986286e-01 + 1.31637302974835e-01 1.39553652375047e-01 + 1.39550632997968e-01 1.42570826391307e-01 + 1.47682542702398e-01 1.45498302111650e-01 + 1.56069518605229e-01 1.48227377016446e-01 + 1.64675258837698e-01 1.50862919805664e-01 + 1.73503763301154e-01 1.53381044924379e-01 + 1.82588549258338e-01 1.55672292390839e-01 + 1.91896032540898e-01 1.57837375775528e-01 + 2.01419018649528e-01 1.59879697369963e-01 + 2.11170879173786e-01 1.61737676480272e-01 + 2.21142920533604e-01 1.63440457557596e-01 + 2.31344785241530e-01 1.64936734040921e-01 + 2.41776812876277e-01 1.66222595255920e-01 + 2.52425332490408e-01 1.67302947561355e-01 + 2.63282507223669e-01 1.68244340945048e-01 + 2.74348610121382e-01 1.69012303782361e-01 + 2.85626365865730e-01 1.69515492111364e-01 + 2.97112155171042e-01 1.69781263535723e-01 + 3.08800622317762e-01 1.69842332018192e-01 + 3.20686150985499e-01 1.69794894735041e-01 + 3.32766911432096e-01 1.69536965688287e-01 + 3.45035577717233e-01 1.69036525986778e-01 + 3.57485836149525e-01 1.68290434604480e-01 + 3.70115165868763e-01 1.67285953978053e-01 + 3.82926121840238e-01 1.66129716711123e-01 + 3.95913836963527e-01 1.64788643586246e-01 + 4.09070495847257e-01 1.63222025400885e-01 + 4.22386727818900e-01 1.61413466981118e-01 + 4.35868199635534e-01 1.59446587441237e-01 + 4.49510425897221e-01 1.57282538740608e-01 + 4.63310011853810e-01 1.54890791219506e-01 + 4.77272395344154e-01 1.52355017486446e-01 + 4.91388930511577e-01 1.49650569804520e-01 + 5.05646917362174e-01 1.46740875171855e-01 + 5.20039269071302e-01 1.43601845074114e-01 + 5.34577578408399e-01 1.40310816694090e-01 + 5.49258664193118e-01 1.36874027194232e-01 + 5.64078723855862e-01 1.33285076105752e-01 + 5.79033365779676e-01 1.29550827646836e-01 + 5.94111062600388e-01 1.25620789009221e-01 + 6.09309105749297e-01 1.21600186027117e-01 + 6.24630556848364e-01 1.17501437763810e-01 + 6.40076803181406e-01 1.13310521064511e-01 + 6.55621511472488e-01 1.08956689246299e-01 + 6.71282434069662e-01 1.04519499702055e-01 + 6.87058502926135e-01 1.00008908785847e-01 + 7.02927846961763e-01 9.53686490689770e-02 + 7.18895804076489e-01 9.05798419248120e-02 + 7.34971135576913e-01 8.57455415670096e-02 + 7.51152054267092e-01 8.08966931334801e-02 + 7.67413928372726e-01 7.59701046314968e-02 + 7.83757964100345e-01 7.09983525490587e-02 + 8.00181412903085e-01 6.60019195388936e-02 + 8.16674324716874e-01 6.09715410793434e-02 + 8.33223797983461e-01 5.58863227273931e-02 + 8.49836681673719e-01 5.08054192889429e-02 + 8.66528789392319e-01 4.57720870242744e-02 + 8.83272682730090e-01 4.07491338740728e-02 + 9.00052750797641e-01 3.57316517957309e-02 + 9.16852440088815e-01 3.07020031399376e-02 + 9.33648056912371e-01 2.56007231641426e-02 + 9.50397160534152e-01 2.04803293247181e-02 + 9.66974356849030e-01 1.53946239244196e-02 + 9.83503121344171e-01 1.03013893225374e-02 + 1.00000000000000e+00 5.19104209295961e-03 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF10_Coords.txt b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF10_Coords.txt new file mode 100644 index 000000000..2306aabbd --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF10_Coords.txt @@ -0,0 +1,208 @@ + 201 NumCoords ! The number of coordinates in the airfoil shape file (including an extra coordinate for airfoil reference). Set to zero if coordinates not included. +! ......... x-y coordinates are next if NumCoords > 0 ............. +! x-y coordinate of airfoil reference +! x/c y/c + 0.250000 0 +! coordinates of airfoil shape +! interpolation to 200 points +! x/c y/c + 1.00000000000000e+00 -4.86297327722780e-03 + 9.80511984509124e-01 -9.31133134220648e-04 + 9.60815932067473e-01 1.58783899675626e-03 + 9.41263727013327e-01 2.45977643583330e-03 + 9.21908373952958e-01 2.02318714366812e-03 + 9.02633195879556e-01 5.53907693277352e-04 + 8.83548952910911e-01 -1.92622687280061e-03 + 8.64676068654257e-01 -5.23592974327322e-03 + 8.46074367845829e-01 -9.38251493217475e-03 + 8.27741297597062e-01 -1.41772631793085e-02 + 8.09672007216587e-01 -1.94973257087956e-02 + 7.91873336657596e-01 -2.52977908683563e-02 + 7.74367735549103e-01 -3.15620058422089e-02 + 7.57090038050940e-01 -3.80736794610610e-02 + 7.40059721602248e-01 -4.48406933947372e-02 + 7.23230579889469e-01 -5.17449963666943e-02 + 7.06605015919964e-01 -5.87716939723825e-02 + 6.90194826941935e-01 -6.59021942385170e-02 + 6.73996889494706e-01 -7.30893135249750e-02 + 6.57970960213318e-01 -8.02435270068158e-02 + 6.42102769339429e-01 -8.73411845286708e-02 + 6.26367045194948e-01 -9.43282695074803e-02 + 6.10778899846100e-01 -1.01198731702759e-01 + 5.95374122609830e-01 -1.07986550525514e-01 + 5.80108917172105e-01 -1.14593528787722e-01 + 5.64977322759140e-01 -1.21007184170168e-01 + 5.49963599827458e-01 -1.27184493648524e-01 + 5.35054509500322e-01 -1.33078736790999e-01 + 5.20240239002187e-01 -1.38649489081145e-01 + 5.05557788087488e-01 -1.43964284458764e-01 + 4.90970256041941e-01 -1.48911007050803e-01 + 4.76472728677462e-01 -1.53449856278318e-01 + 4.62084942212174e-01 -1.57602665694934e-01 + 4.47828765294808e-01 -1.61403714230558e-01 + 4.33694515609551e-01 -1.64768180098576e-01 + 4.19692014900672e-01 -1.67312421586961e-01 + 4.05855041232298e-01 -1.69438167354179e-01 + 3.92188826102844e-01 -1.71236764964869e-01 + 3.78696783687713e-01 -1.72680366966462e-01 + 3.65404165992181e-01 -1.73828350111621e-01 + 3.52309960259442e-01 -1.74603832845386e-01 + 3.39434352269169e-01 -1.75046402850823e-01 + 3.26788044378576e-01 -1.75133825786606e-01 + 3.14377288520538e-01 -1.74796806544884e-01 + 3.02214001378326e-01 -1.74281937784550e-01 + 2.90296958909308e-01 -1.73520780939566e-01 + 2.78635485836657e-01 -1.72477429763394e-01 + 2.67233529810193e-01 -1.71175577799686e-01 + 2.56083711507059e-01 -1.69740287783202e-01 + 2.45202102031515e-01 -1.68009517278914e-01 + 2.34579105150908e-01 -1.66103858628628e-01 + 2.24212170859206e-01 -1.64059794305773e-01 + 2.14107895836219e-01 -1.61831060401740e-01 + 2.04263429104938e-01 -1.59459845656682e-01 + 1.94681903392709e-01 -1.56932790054656e-01 + 1.85360827376149e-01 -1.54246702766653e-01 + 1.76292980865286e-01 -1.51449979369351e-01 + 1.67482564557179e-01 -1.48544746675442e-01 + 1.58917391100164e-01 -1.45558949901677e-01 + 1.50597215806486e-01 -1.42512007742927e-01 + 1.42535487762553e-01 -1.39364415484843e-01 + 1.34732399664726e-01 -1.36087431797309e-01 + 1.27168245136680e-01 -1.32747266345250e-01 + 1.19842841419690e-01 -1.29351677052803e-01 + 1.12750494865106e-01 -1.25924352574772e-01 + 1.05909796567034e-01 -1.22436413682471e-01 + 9.93094805058807e-02 -1.18882766273095e-01 + 9.29294502220848e-02 -1.15306400616325e-01 + 8.67798712020860e-02 -1.11683261666515e-01 + 8.08601043456327e-02 -1.08010634641524e-01 + 7.52105971387069e-02 -1.04233041725997e-01 + 6.97707736814900e-02 -1.00453870449379e-01 + 6.44954666632857e-02 -9.67461879884846e-02 + 5.94792621751988e-02 -9.29557913115884e-02 + 5.46968806556035e-02 -8.91053349016699e-02 + 5.00889983595891e-02 -8.52955052036599e-02 + 4.57150288715163e-02 -8.14584893545538e-02 + 4.15643801762247e-02 -7.76015601232226e-02 + 3.75882055097653e-02 -7.37928505464360e-02 + 3.38275455149990e-02 -6.99786331700560e-02 + 3.02887595308436e-02 -6.61394551074094e-02 + 2.69209980985916e-02 -6.23365636550792e-02 + 2.37600762514079e-02 -5.85464923862813e-02 + 2.08209273086278e-02 -5.47566143699477e-02 + 1.80843181668748e-02 -5.09866904767273e-02 + 1.55871667540216e-02 -4.72112704231235e-02 + 1.32930091997276e-02 -4.34579786243884e-02 + 1.11671609158122e-02 -3.97587139427468e-02 + 9.24302286361386e-03 -3.60973970879580e-02 + 7.52099695998262e-03 -3.24775010120743e-02 + 6.02824547033773e-03 -2.88913977885378e-02 + 4.73760869802884e-03 -2.53555749353871e-02 + 3.63179948486746e-03 -2.18830234339889e-02 + 2.76343151147194e-03 -1.84654987945057e-02 + 2.02988502957333e-03 -1.51380631574757e-02 + 1.46813569910251e-03 -1.19064518890580e-02 + 8.92625474122533e-04 -8.77454309044243e-03 + 3.99065689084287e-04 -5.74363785175138e-03 + 8.70943828190601e-05 -2.81422588679827e-03 + 0.00000000000000e+00 0.00000000000000e+00 + 8.02187075687612e-05 3.23896444371914e-03 + 2.92360984112174e-04 6.64836967518462e-03 + 6.77158021962086e-04 1.01332887079749e-02 + 1.19066014968889e-03 1.36987991407504e-02 + 1.78076395507241e-03 1.73491673472808e-02 + 2.40903747756074e-03 2.10824160991588e-02 + 3.12276106703853e-03 2.48895553910672e-02 + 4.07783832276212e-03 2.87525459149076e-02 + 5.29086782469029e-03 3.26492458807703e-02 + 6.76340526224963e-03 3.65661596791223e-02 + 8.38018584402884e-03 4.05288053998209e-02 + 1.02253241413783e-02 4.44891365322827e-02 + 1.22248587000671e-02 4.85018949098202e-02 + 1.44438730234543e-02 5.25327300962284e-02 + 1.69548467514969e-02 5.65334970723320e-02 + 1.96931133190989e-02 6.05207316239289e-02 + 2.25638609500651e-02 6.45491498636593e-02 + 2.56161511220727e-02 6.85831866314810e-02 + 2.89202819428702e-02 7.25851847243638e-02 + 3.25062523751746e-02 7.65285938527960e-02 + 3.62951761898641e-02 8.04726459274233e-02 + 4.02846009364239e-02 8.44024704703390e-02 + 4.45007879918332e-02 8.82780700165274e-02 + 4.89247556185767e-02 9.21060334637697e-02 + 5.35723096647886e-02 9.58897521485476e-02 + 5.84592407255586e-02 9.96298721593641e-02 + 6.35713075613679e-02 1.03329002883886e-01 + 6.89278104673831e-02 1.06940810225108e-01 + 7.45312963741614e-02 1.10457519647787e-01 + 8.03023396546418e-02 1.13808960354886e-01 + 8.63179073064753e-02 1.16806322489047e-01 + 9.25972420849028e-02 1.19687016346367e-01 + 9.90811043339423e-02 1.22544358196588e-01 + 1.05787895955984e-01 1.25340806259942e-01 + 1.12724232239356e-01 1.28073095299648e-01 + 1.19892971306548e-01 1.30703114138229e-01 + 1.27273440293726e-01 1.33288917717216e-01 + 1.34877152315313e-01 1.35805891937509e-01 + 1.42744011141429e-01 1.38116832152479e-01 + 1.50823603558752e-01 1.40392690357772e-01 + 1.59107761029883e-01 1.42661149234078e-01 + 1.67629352696633e-01 1.44772172686264e-01 + 1.76377704606620e-01 1.46774529039623e-01 + 1.85370180781539e-01 1.48614215130669e-01 + 1.94612923349638e-01 1.50247989477911e-01 + 2.04074586490007e-01 1.51818931098813e-01 + 2.13747530977158e-01 1.53313183639193e-01 + 2.23645236800479e-01 1.54647357802947e-01 + 2.33775728681758e-01 1.55792644992903e-01 + 2.44138440260482e-01 1.56752241560042e-01 + 2.54726045330669e-01 1.57590263699543e-01 + 2.65537343044850e-01 1.58361624334313e-01 + 2.76567564773377e-01 1.58942652997736e-01 + 2.87817345414617e-01 1.59319971716534e-01 + 2.99290232425583e-01 1.59589784224439e-01 + 3.10982335287392e-01 1.59671340810000e-01 + 3.22895608718648e-01 1.59537343958620e-01 + 3.35033089062765e-01 1.59236217541811e-01 + 3.47389002674619e-01 1.58767154984173e-01 + 3.59961889407242e-01 1.58139657212231e-01 + 3.72743440456310e-01 1.57309327495217e-01 + 3.85733458057802e-01 1.56248726075227e-01 + 3.98930703138098e-01 1.54975303437308e-01 + 4.12345184105345e-01 1.53551512089131e-01 + 4.25954142961272e-01 1.51935725721345e-01 + 4.39739441903326e-01 1.50056917065730e-01 + 4.53714268006763e-01 1.47990332900825e-01 + 4.67878910856137e-01 1.45763613299970e-01 + 4.82224623597588e-01 1.43333415389031e-01 + 4.96738039338005e-01 1.40653686928458e-01 + 5.11425301120766e-01 1.37802798976480e-01 + 5.26284017534203e-01 1.34778098917954e-01 + 5.41313223595069e-01 1.31616771414899e-01 + 5.56506191866471e-01 1.28282935128933e-01 + 5.71853456832878e-01 1.24814251336103e-01 + 5.87352855179168e-01 1.21054902047869e-01 + 6.03005431727672e-01 1.17060565551195e-01 + 6.18822144334829e-01 1.12966378040271e-01 + 6.34781882100071e-01 1.08702844246632e-01 + 6.50899402129147e-01 1.04349818477932e-01 + 6.67165890781568e-01 9.99118836260051e-02 + 6.83560340804585e-01 9.53341953789793e-02 + 7.00082231463252e-01 9.07664656077491e-02 + 7.16736439213004e-01 8.61324826330526e-02 + 7.33532609513889e-01 8.14583044049984e-02 + 7.50453705328182e-01 7.67128793620926e-02 + 7.67496896127474e-01 7.18988453285231e-02 + 7.84651539969057e-01 6.69901347588158e-02 + 8.01917466461742e-01 6.20117979514114e-02 + 8.19294924371077e-01 5.69943186539853e-02 + 8.36792306469474e-01 5.19801638256853e-02 + 8.54409507470158e-01 4.69691610485990e-02 + 8.72138737961771e-01 4.19401147746978e-02 + 8.89967727577875e-01 3.68416407164412e-02 + 9.07923286973654e-01 3.17741055104095e-02 + 9.26040022335196e-01 2.69066169756247e-02 + 9.44348788456134e-01 2.21078957421789e-02 + 9.62867272385349e-01 1.70474154188180e-02 + 9.81428540150012e-01 1.18282222218164e-02 + 1.00000000000000e+00 6.42193222596370e-03 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF11_Coords.txt b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF11_Coords.txt new file mode 100644 index 000000000..cea9e0996 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF11_Coords.txt @@ -0,0 +1,208 @@ + 201 NumCoords ! The number of coordinates in the airfoil shape file (including an extra coordinate for airfoil reference). Set to zero if coordinates not included. +! ......... x-y coordinates are next if NumCoords > 0 ............. +! x-y coordinate of airfoil reference +! x/c y/c + 0.250000 0 +! coordinates of airfoil shape +! interpolation to 200 points +! x/c y/c + 1.00000000000000e+00 -5.69525046509396e-03 + 9.78806538918783e-01 -1.52333707624982e-03 + 9.57388982524555e-01 1.12180524962487e-03 + 9.36194732688498e-01 2.02641546982668e-03 + 9.15272729634671e-01 1.50711995585143e-03 + 8.94450817639587e-01 -1.31121257641393e-04 + 8.73855886372089e-01 -2.82614463352886e-03 + 8.53513143501759e-01 -6.40839878682634e-03 + 8.33476839211981e-01 -1.08310870429086e-02 + 8.13756218644144e-01 -1.59345264947230e-02 + 7.94338172931301e-01 -2.15617459883902e-02 + 7.75223162367073e-01 -2.76433664245668e-02 + 7.56430809853826e-01 -3.41498879519738e-02 + 7.37902039055167e-01 -4.08770619092354e-02 + 7.19666804126832e-01 -4.78568465131379e-02 + 7.01658130282083e-01 -5.49136484928595e-02 + 6.83899927259984e-01 -6.20881481267653e-02 + 6.66390228117896e-01 -6.93121843337415e-02 + 6.49139979076653e-01 -7.65617633025002e-02 + 6.32111246018286e-01 -8.37529658171195e-02 + 6.15288445442940e-01 -9.08626791271311e-02 + 5.98643467384132e-01 -9.78302135918077e-02 + 5.82199702299186e-01 -1.04659155113551e-01 + 5.65994720552908e-01 -1.11376506607751e-01 + 5.49978071618322e-01 -1.17862982731167e-01 + 5.34153023591067e-01 -1.24136613279468e-01 + 5.18499703066478e-01 -1.30142303625889e-01 + 5.03010433237196e-01 -1.35847983922864e-01 + 4.87668238679784e-01 -1.41188236613217e-01 + 4.72507803295827e-01 -1.46221700598355e-01 + 4.57497896342093e-01 -1.50852564976543e-01 + 4.42633017601021e-01 -1.55032379104410e-01 + 4.27932599332219e-01 -1.58778956843575e-01 + 4.13418848394650e-01 -1.62120173617977e-01 + 3.99086452753069e-01 -1.64971636857931e-01 + 3.84948831136274e-01 -1.67048827443987e-01 + 3.71039880058497e-01 -1.68671738056494e-01 + 3.57369018629051e-01 -1.69925952664825e-01 + 3.43942688850799e-01 -1.70795813632049e-01 + 3.30784793117660e-01 -1.71334788788157e-01 + 3.17893696334626e-01 -1.71490756553470e-01 + 3.05286580000178e-01 -1.71294197311131e-01 + 2.92974406928141e-01 -1.70717197421300e-01 + 2.80951411412875e-01 -1.69737797343376e-01 + 2.69233585663057e-01 -1.68548716430126e-01 + 2.57805947668032e-01 -1.67130702113460e-01 + 2.46678614080578e-01 -1.65444540916611e-01 + 2.35855708755702e-01 -1.63515711588020e-01 + 2.25324636807488e-01 -1.61458171344871e-01 + 2.15089578214410e-01 -1.59139131505499e-01 + 2.05150257762253e-01 -1.56651810005603e-01 + 1.95498465637821e-01 -1.54032321793723e-01 + 1.86133303884814e-01 -1.51267800061800e-01 + 1.77048514682184e-01 -1.48396307898530e-01 + 1.68247904545403e-01 -1.45397772039655e-01 + 1.59721997054468e-01 -1.42280347630919e-01 + 1.51466704551609e-01 -1.39072008137626e-01 + 1.43490819529254e-01 -1.35772826875173e-01 + 1.35761290420028e-01 -1.32454355349041e-01 + 1.28278100435328e-01 -1.29124976897121e-01 + 1.21061925252952e-01 -1.25731442239843e-01 + 1.14106782713019e-01 -1.22244231683582e-01 + 1.07392996712928e-01 -1.18723433818558e-01 + 1.00921587269965e-01 -1.15182636140660e-01 + 9.46841600395731e-02 -1.11678741751433e-01 + 8.86904020175527e-02 -1.08199712602269e-01 + 8.29295937403109e-02 -1.04690677290643e-01 + 7.73855253774526e-02 -1.01182355772936e-01 + 7.20632038828038e-02 -9.76537898724569e-02 + 6.69567872583836e-02 -9.41087513314784e-02 + 6.20974140669556e-02 -9.05039743293917e-02 + 5.74408846245436e-02 -8.69216814878245e-02 + 5.29472035657151e-02 -8.34211011266652e-02 + 4.86830821705248e-02 -7.98783109729412e-02 + 4.46330074510540e-02 -7.63028087621810e-02 + 4.07611793756051e-02 -7.27687863405534e-02 + 3.71009763948847e-02 -6.92364489374634e-02 + 3.36248359360092e-02 -6.57310546071755e-02 + 3.03041413909075e-02 -6.22959704284829e-02 + 2.71879524688719e-02 -5.88684263115360e-02 + 2.42717576545455e-02 -5.54343443189173e-02 + 2.15027525196933e-02 -5.20540051592585e-02 + 1.89137313912481e-02 -4.87090785971533e-02 + 1.65182266978350e-02 -4.53887621601851e-02 + 1.43049162404917e-02 -4.21042791351809e-02 + 1.23028427731255e-02 -3.88313724591694e-02 + 1.04741934250062e-02 -3.55976591947433e-02 + 8.78311115027676e-03 -3.24338519377945e-02 + 7.24533815833448e-03 -2.93330391673238e-02 + 5.86947854914707e-03 -2.62910386079313e-02 + 4.69611128198702e-03 -2.32928044536227e-02 + 3.68981688144507e-03 -2.03556383168934e-02 + 2.82187228866077e-03 -1.74932823095649e-02 + 2.14089095819824e-03 -1.46985911948591e-02 + 1.57630652997499e-03 -1.19942243149679e-02 + 1.18984777333983e-03 -9.38552769920999e-03 + 7.38439523884420e-04 -6.87678063790083e-03 + 3.33591616922490e-04 -4.47097508153630e-03 + 7.46901189097683e-05 -2.17087537934301e-03 + 0.00000000000000e+00 0.00000000000000e+00 + 6.92412634353660e-05 2.74621576665460e-03 + 2.49543457687775e-04 5.67381024680127e-03 + 5.69195748818264e-04 8.67143602234610e-03 + 9.96695834445714e-04 1.17435040095864e-02 + 1.48928310396865e-03 1.48940750374214e-02 + 1.98849119023728e-03 1.81207435789369e-02 + 2.54959257779418e-03 2.14141902325502e-02 + 3.34181357652084e-03 2.47615483193398e-02 + 4.35138049766192e-03 2.81462543893500e-02 + 5.57852652609682e-03 3.15563440839828e-02 + 6.92222649894473e-03 3.50119837686661e-02 + 8.43795113911303e-03 3.84786497098604e-02 + 1.00930905567546e-02 4.19960985164764e-02 + 1.19621589285143e-02 4.55325565150444e-02 + 1.40852578757622e-02 4.90549107074214e-02 + 1.64039291216290e-02 5.25767354668559e-02 + 1.88398593495795e-02 5.61372533386474e-02 + 2.14333380897448e-02 5.97116148591461e-02 + 2.42465708836148e-02 6.32736158904520e-02 + 2.73128417251185e-02 6.68021029337550e-02 + 3.05634247430033e-02 7.03446938508445e-02 + 3.40012367549624e-02 7.38799559097142e-02 + 3.76412740591324e-02 7.73776756177052e-02 + 4.14526743416006e-02 8.08567034039700e-02 + 4.54648935651470e-02 8.43141185886057e-02 + 4.97138325875744e-02 8.77373418115587e-02 + 5.41781481654145e-02 9.11359855290002e-02 + 5.88644478021621e-02 9.44797733214635e-02 + 6.37759842093246e-02 9.77593136724116e-02 + 6.88488483685858e-02 1.00823224034846e-01 + 7.41507917548021e-02 1.03488541051867e-01 + 7.97016770601785e-02 1.06075588555681e-01 + 8.54487989072580e-02 1.08666353687266e-01 + 9.14085009112059e-02 1.11233062570593e-01 + 9.75916624744935e-02 1.13770253357497e-01 + 1.03999187359272e-01 1.16244616416147e-01 + 1.10612131361174e-01 1.18708964579629e-01 + 1.17449024487558e-01 1.21131135964468e-01 + 1.24546888925588e-01 1.23387153002500e-01 + 1.31860808435011e-01 1.25637788779435e-01 + 1.39382107499695e-01 1.27944947022874e-01 + 1.47138451129947e-01 1.30161879268156e-01 + 1.55130130177100e-01 1.32297385813300e-01 + 1.63380895148427e-01 1.34288717996456e-01 + 1.71895347851209e-01 1.36104388754837e-01 + 1.80641095940374e-01 1.37908869745374e-01 + 1.89607443624250e-01 1.39694681869496e-01 + 1.98815192027444e-01 1.41352012545062e-01 + 2.08277829742442e-01 1.42856034753896e-01 + 2.17998788821085e-01 1.44187980224416e-01 + 2.27971555762112e-01 1.45430091516579e-01 + 2.38195302318094e-01 1.46673887296536e-01 + 2.48670661039287e-01 1.47744688351893e-01 + 2.59395614367826e-01 1.48645867466862e-01 + 2.70380513809449e-01 1.49438453642673e-01 + 2.81625107704732e-01 1.50057622177488e-01 + 2.93131175607184e-01 1.50496964150777e-01 + 3.04908162749787e-01 1.50795041350106e-01 + 3.16953693264067e-01 1.50926867573051e-01 + 3.29263945095546e-01 1.50884243661390e-01 + 3.41831054632093e-01 1.50627191696395e-01 + 3.54660098331472e-01 1.50114926580935e-01 + 3.67749572260908e-01 1.49411069482863e-01 + 3.81111124669245e-01 1.48516691724055e-01 + 3.94719101684341e-01 1.47440799158347e-01 + 4.08554267680281e-01 1.46095627806137e-01 + 4.22629583420339e-01 1.44515583307731e-01 + 4.36948565719152e-01 1.42787868414573e-01 + 4.51504717292113e-01 1.40851047954471e-01 + 4.66284547735849e-01 1.38636208645556e-01 + 4.81291098416158e-01 1.36225156460815e-01 + 4.96521243549536e-01 1.33595494775405e-01 + 5.11977506070676e-01 1.30819756217691e-01 + 5.27648084830866e-01 1.27801959456686e-01 + 5.43529232837187e-01 1.24624712255092e-01 + 5.59617766329048e-01 1.21167360031619e-01 + 5.75910930604750e-01 1.17465675967471e-01 + 5.92420943986219e-01 1.13641307775934e-01 + 6.09129433020705e-01 1.09627607546218e-01 + 6.26048292506993e-01 1.05505710212843e-01 + 6.43163878485665e-01 1.01266416248930e-01 + 6.60456216477355e-01 9.68592270720327e-02 + 6.77923642030845e-01 9.24805992427934e-02 + 6.95566193064319e-01 8.80054199530201e-02 + 7.13393826614235e-01 8.34592506694026e-02 + 7.31389719769680e-01 7.88141754388108e-02 + 7.49549904053857e-01 7.40757159847257e-02 + 7.67859592973647e-01 6.92056573065396e-02 + 7.86320983784494e-01 6.42470162878310e-02 + 8.04932658647533e-01 5.92311705291700e-02 + 8.23696980505892e-01 5.41849164919753e-02 + 8.42611206733270e-01 4.91017607941500e-02 + 8.61674584002276e-01 4.39898310628447e-02 + 8.80870637502453e-01 3.87781149653440e-02 + 9.00229080614011e-01 3.35800045674166e-02 + 9.19795776538293e-01 2.86236343997086e-02 + 9.39609936409794e-01 2.37339679553963e-02 + 9.59701477871013e-01 1.84898366266777e-02 + 9.79845921697258e-01 1.30253668628043e-02 + 1.00000000000000e+00 7.30191104279453e-03 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF12_Coords.txt b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF12_Coords.txt new file mode 100644 index 000000000..0559474f8 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF12_Coords.txt @@ -0,0 +1,208 @@ + 201 NumCoords ! The number of coordinates in the airfoil shape file (including an extra coordinate for airfoil reference). Set to zero if coordinates not included. +! ......... x-y coordinates are next if NumCoords > 0 ............. +! x-y coordinate of airfoil reference +! x/c y/c + 0.250000 0 +! coordinates of airfoil shape +! interpolation to 200 points +! x/c y/c + 1.00000000000000e+00 -6.59289903496683e-03 + 9.77462574493223e-01 -2.16354893719578e-03 + 9.54655435704073e-01 6.29155968453326e-04 + 9.32021629665813e-01 1.58147595579106e-03 + 9.09641132745904e-01 9.68321497165801e-04 + 8.87387976484538e-01 -8.61665541778709e-04 + 8.65383162362486e-01 -3.80055493480974e-03 + 8.43662068878266e-01 -7.69211321552455e-03 + 8.22270394573964e-01 -1.24281363324318e-02 + 8.01229047333685e-01 -1.78818932097066e-02 + 7.80519648544988e-01 -2.38576889999194e-02 + 7.60137450727518e-01 -3.02583777838988e-02 + 7.40098281598073e-01 -3.70398802849335e-02 + 7.20352027908950e-01 -4.40116142510090e-02 + 7.00939656244907e-01 -5.12328611067571e-02 + 6.81776953494553e-01 -5.84627261960696e-02 + 6.62912611308619e-01 -6.58049585843197e-02 + 6.44324407874433e-01 -7.31351438149378e-02 + 6.26033587000552e-01 -8.04556049946791e-02 + 6.08009280948661e-01 -8.76887844187042e-02 + 5.90240034355429e-01 -9.48121792091236e-02 + 5.72698730868021e-01 -1.01757526822754e-01 + 5.55411618765222e-01 -1.08539348714150e-01 + 5.38410505295645e-01 -1.15176730540461e-01 + 5.21641137664166e-01 -1.21526455119343e-01 + 5.05120327854410e-01 -1.27641178842136e-01 + 4.88826034147189e-01 -1.33452107654868e-01 + 4.72756829324759e-01 -1.38943797888081e-01 + 4.56889462779481e-01 -1.44022468696136e-01 + 4.41254283784751e-01 -1.48736664468832e-01 + 4.25828763295902e-01 -1.53009077959500e-01 + 4.10608396875106e-01 -1.56781442021245e-01 + 3.95611341439966e-01 -1.60067008778474e-01 + 3.80859198346160e-01 -1.62886386652726e-01 + 3.66352119576184e-01 -1.65155670170054e-01 + 3.52107005040102e-01 -1.66902005730228e-01 + 3.38156214714513e-01 -1.68180087712901e-01 + 3.24513341344794e-01 -1.69002675432013e-01 + 3.11187922762876e-01 -1.69365388971009e-01 + 2.98201656691272e-01 -1.69321104984817e-01 + 2.85552513851790e-01 -1.68850434152112e-01 + 2.73253227372360e-01 -1.67989608645765e-01 + 2.61314584364762e-01 -1.66716467434525e-01 + 2.49717456201525e-01 -1.65067768351444e-01 + 2.38481581724083e-01 -1.63168950410788e-01 + 2.27577633315906e-01 -1.61061577397165e-01 + 2.17016518468669e-01 -1.58704919182658e-01 + 2.06802133386028e-01 -1.56117655460340e-01 + 1.96916073521044e-01 -1.53408634182298e-01 + 1.87348745914297e-01 -1.50498802686717e-01 + 1.78110341897585e-01 -1.47440177216010e-01 + 1.69187136270505e-01 -1.44263475400156e-01 + 1.60570365998313e-01 -1.40988056631572e-01 + 1.52250193619772e-01 -1.37644886570335e-01 + 1.44230669463642e-01 -1.34212542197887e-01 + 1.36494686486109e-01 -1.30715956516135e-01 + 1.29041497441893e-01 -1.27160062404650e-01 + 1.21885590388894e-01 -1.23534314732798e-01 + 1.14973606123809e-01 -1.19946512938672e-01 + 1.08305921585264e-01 -1.16388074461917e-01 + 1.01909359633608e-01 -1.12800979544153e-01 + 9.57707298096185e-02 -1.09166779555742e-01 + 8.98707927414503e-02 -1.05536283052279e-01 + 8.42125339933439e-02 -1.01922663598644e-01 + 7.87856905027138e-02 -9.84078143770367e-02 + 7.35906514404928e-02 -9.49953343228512e-02 + 6.86172317695538e-02 -9.15875578296713e-02 + 6.38533217988130e-02 -8.82040084294520e-02 + 5.92980557795527e-02 -8.48301665574652e-02 + 5.49408872977093e-02 -8.14740098816748e-02 + 5.08036836099950e-02 -7.81032042579184e-02 + 4.68610047073478e-02 -7.47702209343977e-02 + 4.30785112607683e-02 -7.15190729392446e-02 + 3.94919427630735e-02 -6.82684814540532e-02 + 3.60951095929823e-02 -6.50177741480466e-02 + 3.28772361824951e-02 -6.18076334563007e-02 + 2.98476901787584e-02 -5.86203472715078e-02 + 2.69646970034140e-02 -5.54923720162200e-02 + 2.42190323125321e-02 -5.24435068585061e-02 + 2.16645901488774e-02 -4.94116456937637e-02 + 1.92850652097574e-02 -4.63923677020781e-02 + 1.70282894977093e-02 -4.34389302947373e-02 + 1.49260602838669e-02 -4.05334871230597e-02 + 1.29912536138279e-02 -3.76649194227854e-02 + 1.12187903727820e-02 -3.48395240965275e-02 + 9.62813430202066e-03 -3.20378388982212e-02 + 8.18092003399821e-03 -2.92857015336182e-02 + 6.84633398695211e-03 -2.66067373303015e-02 + 5.62450310894219e-03 -2.40002771296278e-02 + 4.52964061799434e-03 -2.14585557295876e-02 + 3.61249392215131e-03 -1.89621107862018e-02 + 2.83156382020768e-03 -1.65274274071386e-02 + 2.15391143043915e-03 -1.41677824378179e-02 + 1.61971733933399e-03 -1.18767840274053e-02 + 1.18249367536328e-03 -9.66762809531005e-03 + 9.00276584579961e-04 -7.54452003683207e-03 + 5.63461991934761e-04 -5.51056387158645e-03 + 2.59288533302532e-04 -3.56890304558222e-03 + 6.06131716837195e-05 -1.72224692907942e-03 + 0.00000000000000e+00 0.00000000000000e+00 + 5.67835389889402e-05 2.23388026035764e-03 + 2.00952097149670e-04 4.61469303956217e-03 + 4.46675038797624e-04 7.05931530631234e-03 + 7.76575926534887e-04 9.57140139412797e-03 + 1.15849680432229e-03 1.21547788698366e-02 + 1.54614500966935e-03 1.48065561530573e-02 + 2.00070260770825e-03 1.75170400276963e-02 + 2.65215356260171e-03 2.02792339598468e-02 + 3.47323279235998e-03 2.30829050644064e-02 + 4.46819146620787e-03 2.59178267189914e-02 + 5.56561856863645e-03 2.87980918982248e-02 + 6.79056284994487e-03 3.17045231575689e-02 + 8.13858873349298e-03 3.46598711622827e-02 + 9.68330745830288e-03 3.76352864715079e-02 + 1.14346994907591e-02 4.06147151377888e-02 + 1.33491940226201e-02 4.36083707829037e-02 + 1.53772074549925e-02 4.66378931168147e-02 + 1.75443628317557e-02 4.96905933565631e-02 + 1.98915287956748e-02 5.27532648459689e-02 + 2.24474950353453e-02 5.58108786203703e-02 + 2.51624414470984e-02 5.88978723678661e-02 + 2.80522645924001e-02 6.19853661991399e-02 + 3.11264629746060e-02 6.50542499375811e-02 + 3.43410667421415e-02 6.81372889799119e-02 + 3.77308203466917e-02 7.12243994705516e-02 + 4.13453068432654e-02 7.42879931829202e-02 + 4.51595000908772e-02 7.73456299876008e-02 + 4.91686920501722e-02 8.03852564794801e-02 + 5.33801809367164e-02 8.33956461149312e-02 + 5.77512987175583e-02 8.62331801696985e-02 + 6.23344808339581e-02 8.87547541886008e-02 + 6.71482925323690e-02 9.12346139217212e-02 + 7.21514064313091e-02 9.37368421170488e-02 + 7.73578208727705e-02 9.62429430485729e-02 + 8.27840233215640e-02 9.87392024812666e-02 + 8.84305455042329e-02 1.01203971113129e-01 + 9.42784521040168e-02 1.03684898058958e-01 + 1.00349482885677e-01 1.06148999300961e-01 + 1.06675746455941e-01 1.08500173174811e-01 + 1.13224681689826e-01 1.10860453971563e-01 + 1.19991569273127e-01 1.13309399912637e-01 + 1.26997678082753e-01 1.15723096597717e-01 + 1.34248487747998e-01 1.18083169460431e-01 + 1.41766455235735e-01 1.20337838546890e-01 + 1.49556942766775e-01 1.22463305444449e-01 + 1.57594884531095e-01 1.24605078711964e-01 + 1.65872323102866e-01 1.26751754125367e-01 + 1.74414303121935e-01 1.28791936379402e-01 + 1.83232973200224e-01 1.30716996095475e-01 + 1.92334031181005e-01 1.32504394318715e-01 + 2.01714845882273e-01 1.34221597554837e-01 + 2.11376563986695e-01 1.35950985429642e-01 + 2.21327073690106e-01 1.37513571507823e-01 + 2.31558674587867e-01 1.38949208546669e-01 + 2.42086808461520e-01 1.40274988342984e-01 + 2.52916621133675e-01 1.41437460216382e-01 + 2.64046135586957e-01 1.42454319791249e-01 + 2.75489341566209e-01 1.43333195335266e-01 + 2.87249360771650e-01 1.44017218149413e-01 + 2.99320864102740e-01 1.44510983023378e-01 + 3.11697880289428e-01 1.44782627217238e-01 + 3.24389216406290e-01 1.44771773129655e-01 + 3.37389885735918e-01 1.44584432506276e-01 + 3.50711947471814e-01 1.44154382165419e-01 + 3.64333063360102e-01 1.43552910023117e-01 + 3.78238232522780e-01 1.42687210105816e-01 + 3.92437161035743e-01 1.41543861735063e-01 + 4.06934048908587e-01 1.40264190680221e-01 + 4.21723746945062e-01 1.38767747462759e-01 + 4.36795000699457e-01 1.36967177057565e-01 + 4.52149019127696e-01 1.34947664351219e-01 + 4.67781452534759e-01 1.32666334029277e-01 + 4.83698128848859e-01 1.30225012111576e-01 + 4.99881720532700e-01 1.27468428284761e-01 + 5.16334894694303e-01 1.24505686672269e-01 + 5.33052962546645e-01 1.21341841759092e-01 + 5.50029162636473e-01 1.17972273560778e-01 + 5.67273658847011e-01 1.14454109134925e-01 + 5.84769489731911e-01 1.10723931887335e-01 + 6.02525985564944e-01 1.06864330068656e-01 + 6.20526328831323e-01 1.02850463209321e-01 + 6.38751539751037e-01 9.86367644668299e-02 + 6.57200727073522e-01 9.44111760430084e-02 + 6.75869233343243e-01 9.00585516397063e-02 + 6.94763003002744e-01 8.56060946859686e-02 + 7.13862552225269e-01 8.10172115726413e-02 + 7.33163934294235e-01 7.63128882283146e-02 + 7.52650023865557e-01 7.14576086673483e-02 + 7.72322163431510e-01 6.65036673628003e-02 + 7.92171758296376e-01 6.14635847757860e-02 + 8.12193610513406e-01 5.63508957281089e-02 + 8.32382188739325e-01 5.11679507532475e-02 + 8.52739781790815e-01 4.59537194411629e-02 + 8.73243502309430e-01 4.06300736331539e-02 + 8.93910339588305e-01 3.52818185648098e-02 + 9.14779694269379e-01 3.01276312748428e-02 + 9.35880709193391e-01 2.50231519126587e-02 + 9.57228053275711e-01 1.95608523563538e-02 + 9.78615505631340e-01 1.38731920021658e-02 + 1.00000000000000e+00 7.91978608447872e-03 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF13_Coords.txt b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF13_Coords.txt new file mode 100644 index 000000000..1e2d36014 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF13_Coords.txt @@ -0,0 +1,208 @@ + 201 NumCoords ! The number of coordinates in the airfoil shape file (including an extra coordinate for airfoil reference). Set to zero if coordinates not included. +! ......... x-y coordinates are next if NumCoords > 0 ............. +! x-y coordinate of airfoil reference +! x/c y/c + 0.250000 0 +! coordinates of airfoil shape +! interpolation to 200 points +! x/c y/c + 1.00000000000000e+00 -7.43253554058350e-03 + 9.76403943349399e-01 -2.76411676761089e-03 + 9.52484559548605e-01 1.70901095140179e-04 + 9.28638752659537e-01 1.17264141488701e-03 + 9.04989311213425e-01 4.70169949588895e-04 + 8.81494872571301e-01 -1.54228412257468e-03 + 8.58261823976117e-01 -4.71323858688598e-03 + 8.35336988680772e-01 -8.89913342673737e-03 + 8.12757098532986e-01 -1.39333287845482e-02 + 7.90553516827622e-01 -1.97204508402206e-02 + 7.68704378080380e-01 -2.60279549350672e-02 + 7.47200735959936e-01 -3.27322719971618e-02 + 7.26054587908095e-01 -3.97754488388574e-02 + 7.05225114492986e-01 -4.69799082848601e-02 + 6.84763435154875e-01 -5.44309327674479e-02 + 6.64571290619340e-01 -6.18254862513697e-02 + 6.44721094918900e-01 -6.93273346207594e-02 + 6.25169625290117e-01 -7.67585322065482e-02 + 6.05945813175358e-01 -8.41464455288096e-02 + 5.87027171152179e-01 -9.14195705532406e-02 + 5.68408265127836e-01 -9.85559847621229e-02 + 5.50064494090816e-01 -1.05480219170930e-01 + 5.32022391078534e-01 -1.12217201602923e-01 + 5.14305379706589e-01 -1.18778483581882e-01 + 4.96856985375564e-01 -1.24998074174480e-01 + 4.79708052221339e-01 -1.30961580748527e-01 + 4.62835414864543e-01 -1.36587172753257e-01 + 4.46243569969428e-01 -1.41875228138195e-01 + 4.29903985709251e-01 -1.46704975300093e-01 + 4.13842250877566e-01 -1.51115352601705e-01 + 3.98044961478621e-01 -1.55046661039126e-01 + 3.82509179271707e-01 -1.58431291993384e-01 + 3.67251501006871e-01 -1.61278156599173e-01 + 3.52292583349217e-01 -1.63600947933904e-01 + 3.37637965766980e-01 -1.65316224048267e-01 + 3.23307637097987e-01 -1.66752310164544e-01 + 3.09331872759859e-01 -1.67700911633119e-01 + 2.95728021634658e-01 -1.68102591062499e-01 + 2.82508440825120e-01 -1.67965908456118e-01 + 2.69692479373679e-01 -1.67345872254253e-01 + 2.57277849131547e-01 -1.66258775918654e-01 + 2.45272663136680e-01 -1.64751212632708e-01 + 2.33687365765199e-01 -1.62810360546622e-01 + 2.22490214641063e-01 -1.60532132121801e-01 + 2.11704186735648e-01 -1.57971495180763e-01 + 2.01286775160185e-01 -1.55229506262782e-01 + 1.91249599793888e-01 -1.52264499706685e-01 + 1.81596180932401e-01 -1.49084933070302e-01 + 1.72302626179722e-01 -1.45794670174339e-01 + 1.63346132459904e-01 -1.42374113100026e-01 + 1.54746809674797e-01 -1.38830155258698e-01 + 1.46486022194054e-01 -1.35188632600945e-01 + 1.38547760953462e-01 -1.31493700970626e-01 + 1.30918888826124e-01 -1.27769213465648e-01 + 1.23603494162898e-01 -1.23994562827742e-01 + 1.16577318947649e-01 -1.20210273993055e-01 + 1.09842714794822e-01 -1.16401422895844e-01 + 1.03419770202037e-01 -1.12543409822447e-01 + 9.72370562742986e-02 -1.08770274872843e-01 + 9.12953749434174e-02 -1.05058596046523e-01 + 8.56266337766400e-02 -1.01348959545830e-01 + 8.02107080494107e-02 -9.76386287937753e-02 + 7.50289238576886e-02 -9.39674688861899e-02 + 7.00863608932403e-02 -9.03441792141839e-02 + 6.53714233337561e-02 -8.68604994148313e-02 + 6.08759530256630e-02 -8.35323692737949e-02 + 5.65902415275960e-02 -8.02398098638649e-02 + 5.25059651925724e-02 -7.69927063770997e-02 + 4.86166628447913e-02 -7.37837554314917e-02 + 4.49077582947745e-02 -7.06237618527845e-02 + 4.13927777039596e-02 -6.74897039413312e-02 + 3.80641981810206e-02 -6.44036061372499e-02 + 3.48929832724408e-02 -6.13951848582158e-02 + 3.18856459672562e-02 -5.84268249770528e-02 + 2.90442132262908e-02 -5.54899494869964e-02 + 2.63811004580753e-02 -5.25920709101139e-02 + 2.38848880530692e-02 -4.97328732122965e-02 + 2.15021569942004e-02 -4.69560380557319e-02 + 1.92408086204874e-02 -4.42606273044788e-02 + 1.71577483979552e-02 -4.15892362716984e-02 + 1.52256501903280e-02 -3.89479589361177e-02 + 1.33940150325620e-02 -3.63811619058724e-02 + 1.16945968480858e-02 -3.38694685065991e-02 + 1.01399947277134e-02 -3.14005699954941e-02 + 8.73005199067174e-03 -2.89778491430780e-02 + 7.47487782179956e-03 -2.65876880354154e-02 + 6.33594551826867e-03 -2.42535714842850e-02 + 5.28961501167165e-03 -2.19902421680995e-02 + 4.32280168968960e-03 -1.98014211395919e-02 + 3.45367866450521e-03 -1.76778349381210e-02 + 2.74078600109631e-03 -1.55973088719527e-02 + 2.13806582939436e-03 -1.35749028237675e-02 + 1.61183106799287e-03 -1.16229600944032e-02 + 1.19278741801813e-03 -9.73562172682337e-03 + 8.52780015436871e-04 -7.91879592506294e-03 + 6.34492750095705e-04 -6.17534236909210e-03 + 3.96951815978446e-04 -4.50663935247869e-03 + 1.88581057949551e-04 -2.91531619917444e-03 + 4.72174234786785e-05 -1.40304801253723e-03 + 0.00000000000000e+00 0.00000000000000e+00 + 4.49286575851582e-05 1.76091109368109e-03 + 1.54712126205946e-04 3.62140154224627e-03 + 3.30083241230729e-04 5.53978075065709e-03 + 5.67107864039499e-04 7.51898308153193e-03 + 8.43717618992945e-04 9.56261412743599e-03 + 1.13820712865826e-03 1.16673197751854e-02 + 1.51620497309045e-03 1.38230510834726e-02 + 2.05010390234215e-03 1.60283976006057e-02 + 2.70761333894050e-03 1.82791506633120e-02 + 3.49886357702170e-03 2.05667372944473e-02 + 4.38563597305350e-03 2.28994709759180e-02 + 5.36480583545219e-03 2.52727779283164e-02 + 6.45176350756975e-03 2.76932258096428e-02 + 7.71493839934877e-03 3.01347479048045e-02 + 9.13811424494260e-03 3.25975238107331e-02 + 1.06948081659682e-02 3.50885690282112e-02 + 1.23665030939463e-02 3.76127912846818e-02 + 1.41631103789096e-02 4.01690740091098e-02 + 1.61006676743100e-02 4.27565790645424e-02 + 1.82006253144294e-02 4.53661056474953e-02 + 2.04339011456132e-02 4.80195490755358e-02 + 2.28313083356356e-02 5.06809426782037e-02 + 2.53998275561691e-02 5.33417422932120e-02 + 2.80831554197667e-02 5.60479549242059e-02 + 3.09172689371117e-02 5.87826801739081e-02 + 3.39613669672685e-02 6.15040472448373e-02 + 3.71885488983873e-02 6.42371788378289e-02 + 4.05844892078012e-02 6.69873627303355e-02 + 4.41615443337093e-02 6.97416261506273e-02 + 4.78986121512040e-02 7.24009578305107e-02 + 5.18317438541022e-02 7.48725582194455e-02 + 5.59775247308777e-02 7.73346153272878e-02 + 6.03069307314000e-02 7.98322938773953e-02 + 6.48317249020550e-02 8.23552542934740e-02 + 6.95740177949655e-02 8.48797840519584e-02 + 7.45346746264872e-02 8.73976434260533e-02 + 7.96940411568568e-02 8.99518601786404e-02 + 8.50751411244750e-02 9.25115521139639e-02 + 9.07047952097347e-02 9.50119363718962e-02 + 9.65644778591387e-02 9.75280567202470e-02 + 1.02654922362443e-01 1.00141176068606e-01 + 1.08991128382069e-01 1.02759655535384e-01 + 1.15580811141506e-01 1.05350177915118e-01 + 1.22442015345549e-01 1.07879078703890e-01 + 1.29581761141198e-01 1.10327867455967e-01 + 1.36985125957807e-01 1.12805201120027e-01 + 1.44649070157922e-01 1.15294515341388e-01 + 1.52601162527081e-01 1.17695162751273e-01 + 1.60849467906986e-01 1.20016136499640e-01 + 1.69400994120977e-01 1.22239166511633e-01 + 1.78257906944928e-01 1.24404435861666e-01 + 1.87423810521919e-01 1.26566367432406e-01 + 1.96913917030033e-01 1.28565322487382e-01 + 2.06714122721902e-01 1.30480002121111e-01 + 2.16843733267671e-01 1.32284460248505e-01 + 2.27313503043412e-01 1.33932897606815e-01 + 2.38116555091135e-01 1.35466082264203e-01 + 2.49270187442578e-01 1.36855347383195e-01 + 2.60783364777495e-01 1.38015044037685e-01 + 2.72649760913212e-01 1.38972898742601e-01 + 2.84865722003232e-01 1.39703902024797e-01 + 2.97442765366165e-01 1.40129901393810e-01 + 3.10371404770489e-01 1.40389901175565e-01 + 3.23663550383385e-01 1.40356686531760e-01 + 3.37302478141465e-01 1.40159944002643e-01 + 3.51279258331868e-01 1.39708203283014e-01 + 3.65599383240653e-01 1.38942103586727e-01 + 3.80266593353821e-01 1.38048333465819e-01 + 3.95276573569828e-01 1.36930305581693e-01 + 4.10621082225397e-01 1.35488514837408e-01 + 4.26300213083275e-01 1.33810605435263e-01 + 4.42308306311055e-01 1.31836152808260e-01 + 4.58654091580520e-01 1.29693294983505e-01 + 4.75315068619854e-01 1.27173492402662e-01 + 4.92299980112839e-01 1.24408547660075e-01 + 5.09602575838928e-01 1.21522453981813e-01 + 5.27212395134502e-01 1.18468930195838e-01 + 5.45136348862968e-01 1.15242151997318e-01 + 5.63358188082521e-01 1.11781777741663e-01 + 5.81885057318307e-01 1.08171778668078e-01 + 6.00697978768359e-01 1.04372430246799e-01 + 6.19778853163952e-01 1.00342858722927e-01 + 6.39128296470107e-01 9.62399740334075e-02 + 6.58737479416311e-01 9.19824964120890e-02 + 6.78606901768962e-01 8.76000132289643e-02 + 6.98713465939465e-01 8.30431156104294e-02 + 7.19053735025290e-01 7.83520462505258e-02 + 7.39609238737388e-01 7.34999974962512e-02 + 7.60379187011757e-01 6.85439537095766e-02 + 7.81346186916718e-01 6.34710892603186e-02 + 8.02497578082114e-01 5.82840033620211e-02 + 8.23825251477110e-01 5.29994283777580e-02 + 8.45332549847506e-01 4.76847762917876e-02 + 8.66989872326120e-01 4.22607936796464e-02 + 8.88796133601469e-01 3.67689289229451e-02 + 9.10777419149797e-01 3.13903865017990e-02 + 9.32946008475891e-01 2.60399205588807e-02 + 9.55291210260545e-01 2.03661935434009e-02 + 9.77655302958250e-01 1.44867409656004e-02 + 1.00000000000000e+00 8.36305924051618e-03 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF14_Coords.txt b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF14_Coords.txt new file mode 100644 index 000000000..21ac9bc90 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF14_Coords.txt @@ -0,0 +1,208 @@ + 201 NumCoords ! The number of coordinates in the airfoil shape file (including an extra coordinate for airfoil reference). Set to zero if coordinates not included. +! ......... x-y coordinates are next if NumCoords > 0 ............. +! x-y coordinate of airfoil reference +! x/c y/c + 0.250000 0 +! coordinates of airfoil shape +! interpolation to 200 points +! x/c y/c + 1.00000000000000e+00 -8.14836236062521e-03 + 9.75605454220754e-01 -3.27870018079412e-03 + 9.50836784314451e-01 -2.20900988818551e-04 + 9.26031070036306e-01 8.25225422744434e-04 + 9.01354150415546e-01 4.63723364948677e-05 + 8.76856729032888e-01 -2.12212287818620e-03 + 8.52628325860033e-01 -5.49153345932107e-03 + 8.28726407818510e-01 -9.92913740060339e-03 + 8.05179636734850e-01 -1.52183220368432e-02 + 7.82028005324449e-01 -2.12905294714742e-02 + 7.59247407101620e-01 -2.78817020291902e-02 + 7.36825672022388e-01 -3.48456742332678e-02 + 7.14771415904034e-01 -4.21126282820779e-02 + 6.93052137845832e-01 -4.95161086094975e-02 + 6.71727481343893e-01 -5.71636330448956e-02 + 6.50688318620596e-01 -6.46990238340603e-02 + 6.30027418222565e-01 -7.23373717103563e-02 + 6.09682760834827e-01 -7.98549524801710e-02 + 5.89688828203817e-01 -8.73005491504785e-02 + 5.70031102500545e-01 -9.46078346312720e-02 + 5.50710313744022e-01 -1.01755382714016e-01 + 5.31704773200269e-01 -1.08661561649762e-01 + 5.13040076772302e-01 -1.15360198522277e-01 + 4.94731072648672e-01 -1.21856401857074e-01 + 4.76720063365871e-01 -1.27964705191137e-01 + 4.59050447577727e-01 -1.33798894725046e-01 + 4.41698554665827e-01 -1.39265991429221e-01 + 4.24673935956588e-01 -1.44379903497306e-01 + 4.07943877996459e-01 -1.48996777520091e-01 + 3.91529590322889e-01 -1.53147337031555e-01 + 3.75425881926708e-01 -1.56786941146897e-01 + 3.59631453908511e-01 -1.59839992659012e-01 + 3.44161400760639e-01 -1.62311690399160e-01 + 3.29035392588028e-01 -1.64209813619226e-01 + 3.14263667203509e-01 -1.65451316764320e-01 + 2.99868746495612e-01 -1.66506903639003e-01 + 2.85878821421829e-01 -1.67028933600720e-01 + 2.72314348501668e-01 -1.66931590818852e-01 + 2.59190034344532e-01 -1.66240903049082e-01 + 2.46523097896223e-01 -1.65015711658322e-01 + 2.34311085993631e-01 -1.63309762544107e-01 + 2.22557973039563e-01 -1.61179016172101e-01 + 2.11273825191574e-01 -1.58619367104621e-01 + 2.00416162834866e-01 -1.55781295522583e-01 + 1.90010573443506e-01 -1.52649361562255e-01 + 1.80003508496110e-01 -1.49375875213019e-01 + 1.70407177602816e-01 -1.45918068123790e-01 + 1.61224702358730e-01 -1.42273052042672e-01 + 1.52427517023986e-01 -1.38535454147255e-01 + 1.43981471299467e-01 -1.34741684356880e-01 + 1.35915137076383e-01 -1.30853570083458e-01 + 1.28205843380849e-01 -1.26896454867671e-01 + 1.20831500156688e-01 -1.22926515095291e-01 + 1.13776200252657e-01 -1.18962260383654e-01 + 1.07043970465416e-01 -1.14984403533098e-01 + 1.00604490983182e-01 -1.11043538945192e-01 + 9.44627247382671e-02 -1.07112169597954e-01 + 8.86436371027153e-02 -1.03150305327463e-01 + 8.30609551236505e-02 -9.93048193507565e-02 + 7.77158685764800e-02 -9.55452265219299e-02 + 7.26442623777319e-02 -9.18109492601984e-02 + 6.78200455328382e-02 -8.81164194990571e-02 + 6.32251003858072e-02 -8.44890217245990e-02 + 5.88664059457334e-02 -8.09291839835693e-02 + 5.47314426912757e-02 -7.75147830298754e-02 + 5.08048887650857e-02 -7.42689802432870e-02 + 4.70774277960059e-02 -7.10840961776320e-02 + 4.35439177679982e-02 -6.79622663696009e-02 + 4.01931090877671e-02 -6.49028866719955e-02 + 3.70071961558051e-02 -6.19186097345931e-02 + 3.39928055580254e-02 -5.89938489520709e-02 + 3.11577683019826e-02 -5.61235560760588e-02 + 2.84775442869274e-02 -5.33253098749644e-02 + 2.59337722860059e-02 -5.06003306707210e-02 + 2.35351879537169e-02 -4.79341414523893e-02 + 2.13137371577664e-02 -4.53052669924546e-02 + 1.92412232739687e-02 -4.27265135238339e-02 + 1.72551808149047e-02 -4.02460777005286e-02 + 1.53775125192213e-02 -3.78461069409167e-02 + 1.36669286314092e-02 -3.54751904767474e-02 + 1.20867763486272e-02 -3.31490567840202e-02 + 1.05884996763417e-02 -3.09033988993154e-02 + 9.20425453765281e-03 -2.87165660887120e-02 + 7.94657176624660e-03 -2.65748008857490e-02 + 6.81901031712526e-03 -2.44798541378323e-02 + 5.82356366307817e-03 -2.24237272913497e-02 + 4.92174384636360e-03 -2.04275731539013e-02 + 4.09719664088157e-03 -1.84975012786712e-02 + 3.32633841273745e-03 -1.66402354620686e-02 + 2.63006056419046e-03 -1.48461343785805e-02 + 2.07265379541992e-03 -1.30914265545919e-02 + 1.60475669651842e-03 -1.13896387204853e-02 + 1.19362491575511e-03 -9.75207784151342e-03 + 8.61158304775857e-04 -8.17325143675256e-03 + 5.92658871339785e-04 -6.65366840829812e-03 + 4.11941085518658e-04 -5.19491140252507e-03 + 2.54556569896829e-04 -3.79658841465355e-03 + 1.28113832478964e-04 -2.46056989256330e-03 + 3.57617220409199e-05 -1.18717030094207e-03 + 0.00000000000000e+00 0.00000000000000e+00 + 3.47906660476153e-05 1.35864880901149e-03 + 1.15168885058535e-04 2.77417290109050e-03 + 2.30376916315236e-04 4.24252249803400e-03 + 3.87976131495443e-04 5.76601626174964e-03 + 5.74526506204122e-04 7.34806995808761e-03 + 7.95654255520616e-04 8.98493392763457e-03 + 1.12021971636174e-03 1.06662550219730e-02 + 1.56154664930487e-03 1.23953998641279e-02 + 2.08683544746350e-03 1.41733115513416e-02 + 2.71224085851922e-03 1.59928312616081e-02 + 3.43035954718513e-03 1.78573300023999e-02 + 4.21435009067654e-03 1.97747226754239e-02 + 5.09317032805970e-03 2.17377376445490e-02 + 6.12872222137403e-03 2.37226879106243e-02 + 7.28358292664935e-03 2.57436355827732e-02 + 8.54729910157088e-03 2.78048612104546e-02 + 9.92972828959359e-03 2.98969637573703e-02 + 1.14264946100910e-02 3.20287229123090e-02 + 1.30302058764849e-02 3.42098777797921e-02 + 1.47545509310666e-02 3.64362116507928e-02 + 1.65895142682137e-02 3.87188939282128e-02 + 1.85799091430884e-02 4.10158975075125e-02 + 2.07318790579148e-02 4.33277140117620e-02 + 2.29786410496385e-02 4.57116743283601e-02 + 2.53553835037421e-02 4.81450487278177e-02 + 2.79278776797602e-02 5.05737523231150e-02 + 3.06684104757498e-02 5.30293753541954e-02 + 3.35549896302923e-02 5.55320353345598e-02 + 3.66048832549710e-02 5.80672661628428e-02 + 3.98160878278975e-02 6.05922518843348e-02 + 4.32097657635900e-02 6.30632131339738e-02 + 4.68004477364611e-02 6.55508747412392e-02 + 5.05703468888338e-02 6.80833115592091e-02 + 5.45293129960311e-02 7.06568325856674e-02 + 5.87044042125043e-02 7.32381347585862e-02 + 6.30971043353738e-02 7.58315677252795e-02 + 6.76867916036615e-02 7.84763490181517e-02 + 7.24967292572105e-02 8.11447924400529e-02 + 7.75489190519818e-02 8.38012218025252e-02 + 8.28379430912991e-02 8.64755853792752e-02 + 8.83700160522555e-02 8.92311260118967e-02 + 9.41546877815251e-02 9.20147089552618e-02 + 1.00200275044183e-01 9.47925250920637e-02 + 1.06519506627458e-01 9.75499482587641e-02 + 1.13121273553931e-01 1.00272215404985e-01 + 1.20000865270765e-01 1.03022793377647e-01 + 1.27160568795956e-01 1.05784624380971e-01 + 1.34629377330607e-01 1.08475019956957e-01 + 1.42410501436542e-01 1.11115501827654e-01 + 1.50511658880668e-01 1.13695222223560e-01 + 1.58939652295794e-01 1.16224524312285e-01 + 1.67700467710513e-01 1.18723937489766e-01 + 1.76815783980035e-01 1.21067625942295e-01 + 1.86265538652919e-01 1.23365512977448e-01 + 1.96071866452217e-01 1.25554708540608e-01 + 2.06250547051562e-01 1.27593275787970e-01 + 2.16789870603760e-01 1.29541754711146e-01 + 2.27709471480002e-01 1.31337948456032e-01 + 2.39023607624358e-01 1.32877774715532e-01 + 2.50725312099806e-01 1.34211878219550e-01 + 2.62813163393733e-01 1.35317273908679e-01 + 2.75300589304416e-01 1.36105292149500e-01 + 2.88173680979742e-01 1.36733482190757e-01 + 3.01443959248928e-01 1.37027602201975e-01 + 3.15100693572125e-01 1.37162360722735e-01 + 3.29141136015704e-01 1.37051985111160e-01 + 3.43566633885766e-01 1.36597826483452e-01 + 3.58379996607331e-01 1.36020493099717e-01 + 3.73577404766437e-01 1.35212892447741e-01 + 3.89153622315017e-01 1.34072142153192e-01 + 4.05108094120761e-01 1.32686673560345e-01 + 4.21433969423481e-01 1.30984053441620e-01 + 4.38142341403862e-01 1.29118324458878e-01 + 4.55206328011914e-01 1.26836633577195e-01 + 4.72639853963158e-01 1.24300133080523e-01 + 4.90435271070256e-01 1.21679117794261e-01 + 5.08579010309887e-01 1.18895867110872e-01 + 5.27074571229468e-01 1.15918274965440e-01 + 5.45906008138401e-01 1.12688629331682e-01 + 5.65078719861412e-01 1.09292084145262e-01 + 5.84572298052518e-01 1.05676186408607e-01 + 6.04369364403524e-01 1.01804075775369e-01 + 6.24472197888980e-01 9.77950051523939e-02 + 6.44868545310258e-01 9.36084798785348e-02 + 6.65553461692358e-01 8.92765243340495e-02 + 6.86500234562328e-01 8.47365603510263e-02 + 7.07706100172094e-01 8.00475004561028e-02 + 7.29151865146187e-01 7.51929614727690e-02 + 7.50834276036418e-01 7.02319315014268e-02 + 7.72727461247450e-01 6.51263205099363e-02 + 7.94812249063048e-01 5.98701925922095e-02 + 8.17078362972243e-01 5.44954720205527e-02 + 8.39529154287222e-01 4.90934541266714e-02 + 8.62128984506176e-01 4.35866611147249e-02 + 8.84858418262504e-01 3.79716307048406e-02 + 9.07728679674592e-01 3.23837149939797e-02 + 9.30734095888120e-01 2.68027303925987e-02 + 9.53837027134021e-01 2.09467195741978e-02 + 9.76936319972422e-01 1.49132298932001e-02 + 1.00000000000000e+00 8.66710884250080e-03 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF15_Coords.txt b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF15_Coords.txt new file mode 100644 index 000000000..670d0c5a7 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF15_Coords.txt @@ -0,0 +1,208 @@ + 201 NumCoords ! The number of coordinates in the airfoil shape file (including an extra coordinate for airfoil reference). Set to zero if coordinates not included. +! ......... x-y coordinates are next if NumCoords > 0 ............. +! x-y coordinate of airfoil reference +! x/c y/c + 0.250000 0 +! coordinates of airfoil shape +! interpolation to 200 points +! x/c y/c + 1.00000000000000e+00 -8.57879977773810e-03 + 9.75180222150308e-01 -3.03879904135747e-03 + 9.49954708363444e-01 -1.26002872729501e-04 + 9.24617663626292e-01 6.10122226095701e-04 + 8.99362589909934e-01 -2.13375521927681e-04 + 8.74301657857705e-01 -2.47307597608542e-03 + 8.49512831893362e-01 -5.95848312946069e-03 + 8.25060132654372e-01 -1.05432097366251e-02 + 8.00967349009157e-01 -1.59814342852104e-02 + 7.77279396459348e-01 -2.22202726470426e-02 + 7.53971146353458e-01 -2.89772479518455e-02 + 7.31028686926424e-01 -3.60929872413459e-02 + 7.08458616265561e-01 -4.34907379085029e-02 + 6.86233439551971e-01 -5.10105449101421e-02 + 6.64417721038235e-01 -5.87729225500483e-02 + 6.42896424356607e-01 -6.63906320145616e-02 + 6.21774241465352e-01 -7.41087631455492e-02 + 6.00977841522425e-01 -8.16768344389446e-02 + 5.80544552788493e-01 -8.91561467273735e-02 + 5.60464827414216e-01 -9.64833988179528e-02 + 5.40743392390515e-01 -1.03637454592294e-01 + 5.21360556780428e-01 -1.10533080197566e-01 + 5.02340910284044e-01 -1.17209304289204e-01 + 4.83693742857298e-01 -1.23667469493609e-01 + 4.65360905225594e-01 -1.29710726001548e-01 + 4.47393349439378e-01 -1.35469330395386e-01 + 4.29767286515700e-01 -1.40843787417424e-01 + 4.12495217820767e-01 -1.45855913618906e-01 + 3.95542115741603e-01 -1.50348364394606e-01 + 3.78926510481714e-01 -1.54347061753637e-01 + 3.62648170482185e-01 -1.57816166203811e-01 + 3.46706871509637e-01 -1.60675411249642e-01 + 3.31116764742986e-01 -1.62927825900264e-01 + 3.15896874263702e-01 -1.64577732807176e-01 + 3.01060219418983e-01 -1.65542318105973e-01 + 2.86630760513041e-01 -1.66019067198897e-01 + 2.72635352957487e-01 -1.65852810272617e-01 + 2.59096229086319e-01 -1.65053656791642e-01 + 2.46029444917578e-01 -1.63674484017382e-01 + 2.33450927162206e-01 -1.61779021413358e-01 + 2.21358148093932e-01 -1.59458179997197e-01 + 2.09752590238530e-01 -1.56768645463127e-01 + 1.98644065634366e-01 -1.53708652225252e-01 + 1.87983838111383e-01 -1.50468466633829e-01 + 1.77798959359292e-01 -1.46968929468240e-01 + 1.68029515979667e-01 -1.43391369897358e-01 + 1.58688054711323e-01 -1.39690800395147e-01 + 1.49777434120809e-01 -1.35854606762879e-01 + 1.41266364582040e-01 -1.31957036662395e-01 + 1.33114043882986e-01 -1.28072240442312e-01 + 1.25353982091811e-01 -1.24123605323377e-01 + 1.17961213252232e-01 -1.20147065379440e-01 + 1.10910137898332e-01 -1.16185429245801e-01 + 1.04183249914720e-01 -1.12256793878014e-01 + 9.77845035922472e-02 -1.08341834070059e-01 + 9.16800568181114e-02 -1.04487577173595e-01 + 8.58763837804680e-02 -1.00669929174109e-01 + 8.04013343441990e-02 -9.68347298049542e-02 + 7.51601956348723e-02 -9.31177415424908e-02 + 7.01543935952098e-02 -8.94997948476300e-02 + 6.54219938355571e-02 -8.59156686036492e-02 + 6.09334040261291e-02 -8.23945222782936e-02 + 5.66708598548473e-02 -7.89496641080547e-02 + 5.26424925924951e-02 -7.55684130212430e-02 + 4.88353267109018e-02 -7.22706692662718e-02 + 4.52299098002129e-02 -6.90769445598798e-02 + 4.18171486326621e-02 -6.59585470797291e-02 + 3.85937390562270e-02 -6.29132740880722e-02 + 3.55456313710721e-02 -5.99446421848028e-02 + 3.26532165695984e-02 -5.70661627728155e-02 + 2.99191791468483e-02 -5.42663897359114e-02 + 2.73603366698335e-02 -5.15240489459803e-02 + 2.49547621710270e-02 -4.88496591224952e-02 + 2.26696019923393e-02 -4.62677203676052e-02 + 2.05173895362584e-02 -4.37606410408951e-02 + 1.85413689047946e-02 -4.12897613211990e-02 + 1.67039255897644e-02 -3.88748760932536e-02 + 1.49376604499564e-02 -3.65661749206043e-02 + 1.32724098833742e-02 -3.43362370571288e-02 + 1.17676398242478e-02 -3.21379214236623e-02 + 1.03812841619170e-02 -2.99928372995567e-02 + 9.06612278982865e-03 -2.79311924288680e-02 + 7.85471709046639e-03 -2.59296320464281e-02 + 6.75962346486767e-03 -2.39733845222929e-02 + 5.78638085277238e-03 -2.20635808604033e-02 + 4.93219411743517e-03 -2.01957483008656e-02 + 4.15866656660073e-03 -1.83895524002002e-02 + 3.45414954175195e-03 -1.66456540575484e-02 + 2.78923310544400e-03 -1.49722402872741e-02 + 2.18613805623396e-03 -1.33598127496920e-02 + 1.71216161569515e-03 -1.17839473069557e-02 + 1.31624248102220e-03 -1.02571525116732e-02 + 9.66801840458578e-04 -8.79003718291119e-03 + 6.80319528299336e-04 -7.37728839044000e-03 + 4.49100581451274e-04 -6.01658261674601e-03 + 2.83701305712447e-04 -4.70870707990412e-03 + 1.71327286198412e-04 -3.45212068865394e-03 + 9.27710524239121e-05 -2.24812638028363e-03 + 2.90659238934096e-05 -1.09605843814913e-03 + 0.00000000000000e+00 0.00000000000000e+00 + 2.88650625107761e-05 1.11148823849564e-03 + 9.20560654498922e-05 2.26693180022457e-03 + 1.72099085901139e-04 3.47224142051019e-03 + 2.83274561762190e-04 4.72937588738418e-03 + 4.17185695243679e-04 6.04164001396517e-03 + 5.97882203243190e-04 7.40505294611765e-03 + 8.95891727887411e-04 8.80908372794426e-03 + 1.28619996129368e-03 1.02598911578957e-02 + 1.73718091964475e-03 1.17614295105485e-02 + 2.26889766516844e-03 1.33073665302488e-02 + 2.89290184609361e-03 1.48981843737658e-02 + 3.56863592046535e-03 1.65490975122241e-02 + 4.33167262281806e-03 1.82447453137629e-02 + 5.23928473841845e-03 1.99628317108720e-02 + 6.24211877712485e-03 2.17255330691366e-02 + 7.33964056226407e-03 2.35355313731346e-02 + 8.55899423724526e-03 2.53750621882832e-02 + 9.88712266524690e-03 2.72586895159738e-02 + 1.13020867063170e-02 2.92023348035768e-02 + 1.28124619939745e-02 3.12046945194575e-02 + 1.44198946335000e-02 3.32706688249579e-02 + 1.61778638266544e-02 3.53546883232132e-02 + 1.80925347692918e-02 3.74625260070275e-02 + 2.00910255479398e-02 3.96581315151937e-02 + 2.22073480805733e-02 4.19153679037419e-02 + 2.45104741518688e-02 4.41730112135886e-02 + 2.69725227219957e-02 4.64664319277826e-02 + 2.95672369905170e-02 4.88244154637241e-02 + 3.23149834672359e-02 5.12316228766112e-02 + 3.52251763885414e-02 5.36850922615401e-02 + 3.83099350602331e-02 5.61720264031417e-02 + 4.15824489104227e-02 5.86905077324653e-02 + 4.50317770709382e-02 6.12582681605947e-02 + 4.86666503586395e-02 6.38753760166677e-02 + 5.25170727043328e-02 6.65025186818970e-02 + 5.65850189187534e-02 6.91518398462091e-02 + 6.08491647683366e-02 7.18603850558563e-02 + 6.53325801131270e-02 7.46028792309043e-02 + 7.00543348142427e-02 7.73615611579748e-02 + 7.50171013293054e-02 8.01381142978750e-02 + 8.02306159895163e-02 8.29454075566739e-02 + 8.57012088705319e-02 8.57724141117260e-02 + 9.14370395472359e-02 8.86083733592826e-02 + 9.74471306573141e-02 9.14506955541571e-02 + 1.03741642665461e-01 9.42869115799166e-02 + 1.10322431016719e-01 9.71366683959768e-02 + 1.17195331455295e-01 9.99963817208149e-02 + 1.24389884664589e-01 1.02804765589993e-01 + 1.31905935056049e-01 1.05580086008781e-01 + 1.39751456026638e-01 1.08317196263952e-01 + 1.47936168023821e-01 1.11006216128796e-01 + 1.56467558128623e-01 1.13642271424664e-01 + 1.65371163914618e-01 1.16141616432774e-01 + 1.74623252652850e-01 1.18621015919461e-01 + 1.84247428093051e-01 1.20997142483866e-01 + 1.94262496093302e-01 1.23226242267470e-01 + 2.04653672488981e-01 1.25380363541681e-01 + 2.15441765864240e-01 1.27378959185081e-01 + 2.26644243180055e-01 1.29123968217828e-01 + 2.38253845273158e-01 1.30674870254090e-01 + 2.50270552701415e-01 1.31999307783067e-01 + 2.62708751790901e-01 1.33015597369151e-01 + 2.75551725512235e-01 1.33872159509066e-01 + 2.88810665433822e-01 1.34378959676908e-01 + 3.02478807217932e-01 1.34723171413855e-01 + 3.16557400521368e-01 1.34828318979527e-01 + 3.31045159681679e-01 1.34573337077908e-01 + 3.45944140981529e-01 1.34191735267806e-01 + 3.61250730235273e-01 1.33577791174796e-01 + 3.76961614806380e-01 1.32641039909018e-01 + 3.93075978637921e-01 1.31467341415961e-01 + 4.09586247490783e-01 1.29983874522969e-01 + 4.26504850189084e-01 1.28372193187690e-01 + 4.43802359792042e-01 1.26353263881723e-01 + 4.61495724587332e-01 1.24138877363526e-01 + 4.79576454948711e-01 1.21758646632159e-01 + 4.98029186432348e-01 1.19133369177162e-01 + 5.16855180283856e-01 1.16301424988927e-01 + 5.36038549215196e-01 1.13206639039446e-01 + 5.55583719652262e-01 1.09934856544340e-01 + 5.75469608979237e-01 1.06426184782536e-01 + 5.95679247848144e-01 1.02646109224194e-01 + 6.16216032509872e-01 9.86875548679134e-02 + 6.37065764297449e-01 9.45384567802663e-02 + 6.58220009598337e-01 9.02324184327279e-02 + 6.79649739397516e-01 8.56983061171984e-02 + 7.01352675498130e-01 8.10067998035236e-02 + 7.23309367720016e-01 7.61487654794268e-02 + 7.45514874390413e-01 7.11835831183337e-02 + 7.67937997489119e-01 6.60570021231055e-02 + 7.90555709099499e-01 6.07584149955232e-02 + 8.13356480155146e-01 5.53297489402000e-02 + 8.36343320325429e-01 4.98760881816722e-02 + 8.59476947043660e-01 4.43220559191783e-02 + 8.82726076021484e-01 3.86348982394945e-02 + 9.06091895800112e-01 3.29178055135213e-02 + 9.29556869258233e-01 2.71942568107446e-02 + 9.53065562517705e-01 2.12312867691710e-02 + 9.76555746470235e-01 1.51116304681152e-02 + 1.00000000000000e+00 8.80279316603190e-03 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF16_Coords.txt b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF16_Coords.txt new file mode 100644 index 000000000..c1f50c91b --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF16_Coords.txt @@ -0,0 +1,208 @@ + 201 NumCoords ! The number of coordinates in the airfoil shape file (including an extra coordinate for airfoil reference). Set to zero if coordinates not included. +! ......... x-y coordinates are next if NumCoords > 0 ............. +! x-y coordinate of airfoil reference +! x/c y/c + 0.250000 0 +! coordinates of airfoil shape +! interpolation to 200 points +! x/c y/c + 1.00000000000000e+00 -7.93823528916634e-03 + 9.75306611523266e-01 -3.07804362808370e-03 + 9.50254896398834e-01 2.12362996603380e-05 + 9.25086956564820e-01 1.10034879293892e-03 + 8.99988535976524e-01 4.37422920277549e-04 + 8.75072599857149e-01 -1.69228312874642e-03 + 8.50417485943084e-01 -5.02575124436309e-03 + 8.26088106219083e-01 -9.48963995265479e-03 + 8.02111382252523e-01 -1.48157088586162e-02 + 7.78533224241522e-01 -2.09559594834436e-02 + 7.55333131164625e-01 -2.76360667094703e-02 + 7.32498770899621e-01 -3.46931927585546e-02 + 7.10037524800713e-01 -4.20512954807589e-02 + 6.87921684496055e-01 -4.95447286109428e-02 + 6.66209179710118e-01 -5.72757010622818e-02 + 6.44793205529505e-01 -6.48779142100834e-02 + 6.23770247083330e-01 -7.25767710634749e-02 + 6.03070773283972e-01 -8.01314038494710e-02 + 5.82725782097447e-01 -8.75866260531345e-02 + 5.62727405516286e-01 -9.48842528629214e-02 + 5.43080423918886e-01 -1.02003644748097e-01 + 5.23763733755852e-01 -1.08853301029009e-01 + 5.04803219809205e-01 -1.15477844917736e-01 + 4.86206982188546e-01 -1.21874673443526e-01 + 4.67921007083763e-01 -1.27856568331733e-01 + 4.49992820623389e-01 -1.33542654805615e-01 + 4.32401794865636e-01 -1.38840810792771e-01 + 4.15160522435188e-01 -1.43774009354166e-01 + 3.98236888852800e-01 -1.48190991673080e-01 + 3.81648251477225e-01 -1.52112731931741e-01 + 3.65396878028470e-01 -1.55516473547203e-01 + 3.49482408564341e-01 -1.58321238170515e-01 + 3.33919160469124e-01 -1.60534240376794e-01 + 3.18725408829206e-01 -1.62165537784395e-01 + 3.03913049141917e-01 -1.63131873998207e-01 + 2.89504737395872e-01 -1.62983765163967e-01 + 2.75525761184225e-01 -1.62070670020849e-01 + 2.61996790164123e-01 -1.60600815773790e-01 + 2.48932908441187e-01 -1.58650156209932e-01 + 2.36348800371720e-01 -1.56288718478177e-01 + 2.24242074483076e-01 -1.53625685704211e-01 + 2.12614132311826e-01 -1.50704613076576e-01 + 2.01474116266847e-01 -1.47515164268461e-01 + 1.90775946871820e-01 -1.44259340711770e-01 + 1.80545164370369e-01 -1.40816254075015e-01 + 1.70726148932411e-01 -1.37356122795043e-01 + 1.61329495142793e-01 -1.33838435774938e-01 + 1.52357448812365e-01 -1.30248116217731e-01 + 1.43781676609354e-01 -1.26622879278557e-01 + 1.35562251699688e-01 -1.23048941083730e-01 + 1.27731865989209e-01 -1.19425293871551e-01 + 1.20263781459649e-01 -1.15816680044401e-01 + 1.13136940952170e-01 -1.12220007869416e-01 + 1.06332983042845e-01 -1.08662489701008e-01 + 9.98554576560956e-02 -1.05123339035014e-01 + 9.36729639947835e-02 -1.01629914852298e-01 + 8.77889829403561e-02 -9.81820383630434e-02 + 8.22313494306295e-02 -9.47155808667247e-02 + 7.69114078116147e-02 -9.13308647018588e-02 + 7.18269333109061e-02 -8.80418761209455e-02 + 6.70154064102991e-02 -8.47739827365595e-02 + 6.24469306153174e-02 -8.15646647777206e-02 + 5.81057659587854e-02 -7.84140549690817e-02 + 5.40009405345228e-02 -7.52947049856435e-02 + 5.01151207789006e-02 -7.21659059076321e-02 + 4.64322700792648e-02 -6.90335942126407e-02 + 4.29462331812666e-02 -6.59671142994205e-02 + 3.96515804572136e-02 -6.29681996718810e-02 + 3.65329345743545e-02 -6.00437178811974e-02 + 3.35738970738148e-02 -5.72025031652544e-02 + 3.07754335365257e-02 -5.44358564951100e-02 + 2.81537659173496e-02 -5.17226337871633e-02 + 2.56886770890630e-02 -4.90717427799052e-02 + 2.33482991143229e-02 -4.65080355566962e-02 + 2.11432730232991e-02 -4.40159414301263e-02 + 1.91121471256101e-02 -4.15606205415437e-02 + 1.72228999311958e-02 -3.91575871889248e-02 + 1.54064395993220e-02 -3.68520424585129e-02 + 1.36928020357784e-02 -3.46229069295389e-02 + 1.21373998162167e-02 -3.24269429373621e-02 + 1.07044618156111e-02 -3.02820978142858e-02 + 9.34868730826734e-03 -2.82170700487391e-02 + 8.09806623056062e-03 -2.62111289422148e-02 + 6.96372181943001e-03 -2.42506526569285e-02 + 5.96056834155680e-03 -2.23318948971137e-02 + 5.06965708895582e-03 -2.04584451649110e-02 + 4.26820207826318e-03 -1.86422076010040e-02 + 3.54215279838966e-03 -1.68853270402674e-02 + 2.85815863780286e-03 -1.51976459649791e-02 + 2.24323664486902e-03 -1.35681174800671e-02 + 1.75728174742475e-03 -1.19752101824980e-02 + 1.34793914004162e-03 -1.04318177524506e-02 + 9.90510266959983e-04 -8.94698512072236e-03 + 6.97578703019438e-04 -7.51579339168028e-03 + 4.64357280248315e-04 -6.13612031461294e-03 + 2.88591972559368e-04 -4.81032939412014e-03 + 1.72652071928442e-04 -3.53504260318557e-03 + 9.21726822772373e-05 -2.31236956248856e-03 + 2.89749158143047e-05 -1.14152595228739e-03 + 0.00000000000000e+00 0.00000000000000e+00 + 2.89846382908482e-05 1.09904377509191e-03 + 9.25460105131971e-05 2.26825426701565e-03 + 1.77372928637046e-04 3.48749114259613e-03 + 2.94928045666597e-04 4.75871421546040e-03 + 4.43018528169673e-04 6.08403094200768e-03 + 6.38312963887756e-04 7.46056696755252e-03 + 9.47163065524872e-04 8.87928204628239e-03 + 1.36292248354851e-03 1.03385546497900e-02 + 1.83694236418441e-03 1.18499779537360e-02 + 2.40074018468558e-03 1.34014033663973e-02 + 3.05594814662641e-03 1.49976678162017e-02 + 3.77032037989221e-03 1.66497807270228e-02 + 4.57488786576987e-03 1.83443029444178e-02 + 5.51906408703589e-03 2.00632619669774e-02 + 6.56072342496301e-03 2.18246212199481e-02 + 7.69623508636216e-03 2.36337857570079e-02 + 8.95571256166709e-03 2.54702712422116e-02 + 1.03262325097732e-02 2.73482935706184e-02 + 1.17850925399475e-02 2.92850723449938e-02 + 1.33375184491728e-02 3.12822963331383e-02 + 1.49920040237809e-02 3.33377667408644e-02 + 1.67963509381930e-02 3.54114606810732e-02 + 1.87564987080519e-02 3.75086023081501e-02 + 2.08048274019325e-02 3.96894126704762e-02 + 2.29716484700822e-02 4.19312226540401e-02 + 2.53216431358212e-02 4.41765315953156e-02 + 2.78298220840403e-02 4.64577629177545e-02 + 3.04725601623169e-02 4.88011066487437e-02 + 3.32695085116736e-02 5.11918075676120e-02 + 3.62304186897929e-02 5.36280031772383e-02 + 3.93644755511771e-02 5.61022315336534e-02 + 4.26868496705988e-02 5.86057232062309e-02 + 4.61876578605174e-02 6.11553846039597e-02 + 4.98741851089849e-02 6.37532547016415e-02 + 5.37745202719990e-02 6.63631960936247e-02 + 5.78890274684652e-02 6.90003260469755e-02 + 6.22045848623571e-02 7.16867591984326e-02 + 6.67395204425100e-02 7.44058004604966e-02 + 7.15094552811985e-02 7.71467339233253e-02 + 7.65211067667525e-02 7.99024876975873e-02 + 8.17838450454122e-02 8.26301768788084e-02 + 8.73028349577319e-02 8.53481713528125e-02 + 9.30858323711997e-02 8.80783750999101e-02 + 9.91416946670507e-02 9.08176986892974e-02 + 1.05480595351981e-01 9.35548293971554e-02 + 1.12106860649107e-01 9.62797051576990e-02 + 1.19024136382428e-01 9.90174394136982e-02 + 1.26260042330622e-01 1.01725417281737e-01 + 1.33816269566989e-01 1.04399273374098e-01 + 1.41700663462267e-01 1.07033756577881e-01 + 1.49922921245669e-01 1.09617507912382e-01 + 1.58490745848084e-01 1.12140288851728e-01 + 1.67427226610566e-01 1.14558206235614e-01 + 1.76710282027346e-01 1.16962741891360e-01 + 1.86363310666109e-01 1.19272582161213e-01 + 1.96405140293252e-01 1.21436031107907e-01 + 2.06821300548881e-01 1.23525479904894e-01 + 2.17631928576255e-01 1.25464812094116e-01 + 2.28852962522468e-01 1.27193749895941e-01 + 2.40477755282815e-01 1.28758039445176e-01 + 2.52507693678930e-01 1.30101102154715e-01 + 2.64955599100463e-01 1.31171639589549e-01 + 2.77806279246518e-01 1.32075007668201e-01 + 2.91070185192249e-01 1.32646573696457e-01 + 3.04740840328737e-01 1.33041903853136e-01 + 3.18819477395129e-01 1.33195283275007e-01 + 3.33304350362167e-01 1.32986169941820e-01 + 3.48197166977535e-01 1.32632958624357e-01 + 3.63493940108890e-01 1.32044025079949e-01 + 3.79191584895447e-01 1.31162317872549e-01 + 3.95288926848852e-01 1.30062172860921e-01 + 4.11778548872039e-01 1.28686018034213e-01 + 4.28672318266481e-01 1.27234783277367e-01 + 4.45941423639317e-01 1.25432754513171e-01 + 4.63601280756515e-01 1.23542253443373e-01 + 4.81644473880432e-01 1.21300435261224e-01 + 5.00056154441041e-01 1.18664422872359e-01 + 5.18836063389421e-01 1.15815814392759e-01 + 5.37969499408613e-01 1.12707530577688e-01 + 5.57460349222905e-01 1.09422776572642e-01 + 5.77288515939648e-01 1.05906885195990e-01 + 5.97436626517306e-01 1.02120358117792e-01 + 6.17906665003925e-01 9.81468229100023e-02 + 6.38686205928774e-01 9.39865902403502e-02 + 6.59766571546815e-01 8.96723879840407e-02 + 6.81119084918578e-01 8.51320545501444e-02 + 7.02741779443877e-01 8.04384800208977e-02 + 7.24615479257981e-01 7.55830551158126e-02 + 7.46734371501449e-01 7.06203776437117e-02 + 7.69068303705288e-01 6.55004145708381e-02 + 7.91594648342087e-01 6.02131883818753e-02 + 8.14301397875068e-01 5.47976161070736e-02 + 8.37189869304468e-01 4.93502115779818e-02 + 8.60223965891098e-01 4.38110631161306e-02 + 8.83371421758982e-01 3.81398145030035e-02 + 9.06633371381850e-01 3.24408481950457e-02 + 9.29989733000046e-01 2.67257978266275e-02 + 9.53387742290786e-01 2.07144753192261e-02 + 9.76768638918538e-01 1.45035303709754e-02 + 1.00000000000000e+00 8.08144847432573e-03 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF17_Coords.txt b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF17_Coords.txt new file mode 100644 index 000000000..e8398cd38 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF17_Coords.txt @@ -0,0 +1,208 @@ + 201 NumCoords ! The number of coordinates in the airfoil shape file (including an extra coordinate for airfoil reference). Set to zero if coordinates not included. +! ......... x-y coordinates are next if NumCoords > 0 ............. +! x-y coordinate of airfoil reference +! x/c y/c + 0.250000 0 +! coordinates of airfoil shape +! interpolation to 200 points +! x/c y/c + 1.00000000000000e+00 -5.45301418050398e-03 + 9.75817754636844e-01 -1.07014594571340e-03 + 9.51454474857096e-01 1.91024365189180e-03 + 9.26967643090702e-01 3.00968706555777e-03 + 9.02511079251701e-01 2.94654327425755e-03 + 8.78192574605997e-01 1.33458056758987e-03 + 8.54093368263713e-01 -1.40182384869508e-03 + 8.30280803054358e-01 -5.36722915654211e-03 + 8.06793858998891e-01 -1.02284409757101e-02 + 7.83681486977920e-01 -1.59512159380425e-02 + 7.60940204843493e-01 -2.22950822168370e-02 + 7.38563657479683e-01 -2.90867632401626e-02 + 7.16562339357988e-01 -3.62524846703740e-02 + 6.94907137649732e-01 -4.36064241543176e-02 + 6.73631134029173e-01 -5.11811692579687e-02 + 6.52658302378040e-01 -5.86920124341470e-02 + 6.32053668313489e-01 -6.62866061150648e-02 + 6.11762998595842e-01 -7.37633434906679e-02 + 5.91793833227140e-01 -8.11048412074493e-02 + 5.72143812615339e-01 -8.82708930236720e-02 + 5.52817394328116e-01 -9.52421061177968e-02 + 5.33788045856372e-01 -1.01905267173908e-01 + 5.15086541349180e-01 -1.08323876177549e-01 + 4.96717352144744e-01 -1.14481204108679e-01 + 4.78641616276281e-01 -1.20227783933246e-01 + 4.60893396881899e-01 -1.25639100003988e-01 + 4.43463621570381e-01 -1.30651726403441e-01 + 4.26364855167011e-01 -1.35291421458868e-01 + 4.09575905165181e-01 -1.39432097972120e-01 + 3.93110179140291e-01 -1.43077401925812e-01 + 3.76978460385483e-01 -1.46251273376598e-01 + 3.61179752938969e-01 -1.48871519397112e-01 + 3.45729101934949e-01 -1.50960869674387e-01 + 3.30642129005544e-01 -1.52550649026425e-01 + 3.15926278476078e-01 -1.53556648571138e-01 + 3.01599265716078e-01 -1.53406493492377e-01 + 2.87680819991451e-01 -1.52565505829207e-01 + 2.74185684558165e-01 -1.51262467818296e-01 + 2.61125227450442e-01 -1.49553952675144e-01 + 2.48509753994654e-01 -1.47518928364719e-01 + 2.36337378313774e-01 -1.45239165168132e-01 + 2.24609516585392e-01 -1.42744892161473e-01 + 2.13332897224055e-01 -1.40016001929494e-01 + 2.02471916601662e-01 -1.37246042052315e-01 + 1.92046415499529e-01 -1.34302336350696e-01 + 1.82017241046991e-01 -1.31316990852076e-01 + 1.72387811926573e-01 -1.28277098407418e-01 + 1.63158168703259e-01 -1.25175025059640e-01 + 1.54311116670428e-01 -1.22008726981644e-01 + 1.45810745366912e-01 -1.18882519862654e-01 + 1.37686151480707e-01 -1.15678943069290e-01 + 1.29904396960524e-01 -1.12501052056401e-01 + 1.22461453799045e-01 -1.09296875694661e-01 + 1.15336029025638e-01 -1.06110381969955e-01 + 1.08530206086421e-01 -1.02923068284723e-01 + 1.02021937517086e-01 -9.97477261452737e-02 + 9.58035794795516e-02 -9.66087731597880e-02 + 8.99025563208008e-02 -9.34345462961179e-02 + 8.42533694191495e-02 -9.03001520357529e-02 + 7.88404210406804e-02 -8.72478321301334e-02 + 7.36987958956943e-02 -8.41967679007426e-02 + 6.87979160132652e-02 -8.11907184984598e-02 + 6.41293950735861e-02 -7.82219427896279e-02 + 5.97053948052580e-02 -7.52557475365361e-02 + 5.54927030145125e-02 -7.23200756561499e-02 + 5.14882701745751e-02 -6.94055630007988e-02 + 4.76966523729130e-02 -6.65204388093482e-02 + 4.41044276154980e-02 -6.36813418052842e-02 + 4.06917094514561e-02 -6.09068675236080e-02 + 3.74540490762733e-02 -5.81886656057259e-02 + 3.43866063044132e-02 -5.55275845558965e-02 + 3.15023235573427e-02 -5.29049733067924e-02 + 2.87869138658892e-02 -5.03247145633268e-02 + 2.62138854996644e-02 -4.78100517604238e-02 + 2.37865060486491e-02 -4.53531589485433e-02 + 2.15247839409282e-02 -4.29352820557746e-02 + 1.94182671926051e-02 -4.05554813845574e-02 + 1.73965234398919e-02 -3.82405266496950e-02 + 1.54853588645235e-02 -3.59936663761455e-02 + 1.37247140912916e-02 -3.37853520929274e-02 + 1.21016771194090e-02 -3.16194081025936e-02 + 1.05781206388565e-02 -2.95197185049363e-02 + 9.16563324054632e-03 -2.74753790222862e-02 + 7.87017740303867e-03 -2.54771064952531e-02 + 6.73874368242485e-03 -2.35033804471445e-02 + 5.69708622898664e-03 -2.15868085403806e-02 + 4.77713369380707e-03 -1.97111181309851e-02 + 3.95637742176391e-03 -1.78845743446675e-02 + 3.18867965744800e-03 -1.61229116929551e-02 + 2.51755355177319e-03 -1.44093804163539e-02 + 1.97561081401136e-03 -1.27330821562174e-02 + 1.50680513040740e-03 -1.11084517063373e-02 + 1.11087123697807e-03 -9.53891013699422e-03 + 7.87187928013208e-04 -8.02095919047579e-03 + 5.40440313749341e-04 -6.55353655736207e-03 + 3.24451588791395e-04 -5.14486804718090e-03 + 1.88916042874488e-04 -3.78501062412031e-03 + 9.46340362822307e-05 -2.47910069070381e-03 + 2.95523038007147e-05 -1.22605370486567e-03 + 0.00000000000000e+00 0.00000000000000e+00 + 3.01481344622130e-05 1.17505317893727e-03 + 9.71702652511514e-05 2.42646619372459e-03 + 2.03793338171215e-04 3.72885439165868e-03 + 3.50357301196391e-04 5.08422545353897e-03 + 5.56726492329121e-04 6.49032410794411e-03 + 8.10159355539692e-04 7.94834859081885e-03 + 1.16155592002565e-03 9.45472898904353e-03 + 1.67637488199947e-03 1.09790644306452e-02 + 2.24350076193863e-03 1.25604990644086e-02 + 2.93581026563085e-03 1.41655243002384e-02 + 3.71628942355257e-03 1.58152478828471e-02 + 4.58474262640831e-03 1.75044149307111e-02 + 5.55488305863393e-03 1.92276009432552e-02 + 6.64802371618967e-03 2.09824655006495e-02 + 7.84988650655681e-03 2.27705789972541e-02 + 9.14426750365521e-03 2.46074952599354e-02 + 1.05699641486623e-02 2.64638140414759e-02 + 1.21156298219846e-02 2.83517697847890e-02 + 1.37576162529760e-02 3.02925689186482e-02 + 1.54895733386299e-02 3.22984799032679e-02 + 1.73435567726879e-02 3.43421258897796e-02 + 1.93455202749544e-02 3.64041907098984e-02 + 2.15005396192731e-02 3.84872450496868e-02 + 2.37609732142698e-02 4.06370705630654e-02 + 2.61438022753388e-02 4.28440907355414e-02 + 2.86976791253163e-02 4.50652887339507e-02 + 3.14081825116334e-02 4.73218530627499e-02 + 3.42618133903517e-02 4.96294249787890e-02 + 3.72752122579656e-02 5.19754897747939e-02 + 4.04579457665667e-02 5.43568206182997e-02 + 4.38096061596044e-02 5.67814925288692e-02 + 4.73527794655686e-02 5.92252949852968e-02 + 5.10805893305958e-02 6.17034102753216e-02 + 5.49951734742978e-02 6.42246281779437e-02 + 5.91172562090566e-02 6.67651820406855e-02 + 6.34412452148952e-02 6.93500711466022e-02 + 6.79840941864798e-02 7.19471001376835e-02 + 7.27468469458395e-02 7.45705996505986e-02 + 7.77328868720285e-02 7.72333440704537e-02 + 8.29626933019556e-02 7.98998610400721e-02 + 8.84438437146468e-02 8.25516267432993e-02 + 9.41776411888755e-02 8.52039636550780e-02 + 1.00170421380160e-01 8.78676504969935e-02 + 1.06430934474038e-01 9.05393436776120e-02 + 1.12969233548496e-01 9.32086710673799e-02 + 1.19797828219200e-01 9.58462247530667e-02 + 1.26911894255357e-01 9.84958150865328e-02 + 1.34331983632213e-01 1.01128226770770e-01 + 1.42066987117710e-01 1.03723117625941e-01 + 1.50124262102595e-01 1.06274763475707e-01 + 1.58513048529723e-01 1.08770852235264e-01 + 1.67241646522678e-01 1.11196896421823e-01 + 1.76323718493828e-01 1.13540445285679e-01 + 1.85743681389525e-01 1.15873278276396e-01 + 1.95524016824630e-01 1.18115770052045e-01 + 2.05683255342811e-01 1.20208699038275e-01 + 2.16208468120044e-01 1.22224461173209e-01 + 2.27117207800504e-01 1.24090288616604e-01 + 2.38419423158324e-01 1.25782649954125e-01 + 2.50110734150605e-01 1.27336011108803e-01 + 2.62197488700551e-01 1.28669969942400e-01 + 2.74686682065653e-01 1.29764427838693e-01 + 2.87569054903857e-01 1.30681368424973e-01 + 3.00852399367078e-01 1.31283757276969e-01 + 3.14530771437150e-01 1.31692707165930e-01 + 3.28604824690067e-01 1.31851460992892e-01 + 3.43071468150563e-01 1.31640913718290e-01 + 3.57931242815408e-01 1.31256435294713e-01 + 3.73178779264493e-01 1.30614578750586e-01 + 3.88811577543217e-01 1.29697152615801e-01 + 4.04827176697756e-01 1.28553939360805e-01 + 4.21218824620110e-01 1.27145088813715e-01 + 4.37996175755373e-01 1.25658971878768e-01 + 4.55132979373076e-01 1.23843182272296e-01 + 4.72638679585242e-01 1.21926903878881e-01 + 4.90509890590074e-01 1.19631762561332e-01 + 5.08733867924661e-01 1.16939647488128e-01 + 5.27305087603049e-01 1.14015126381095e-01 + 5.46213184288326e-01 1.10843992328087e-01 + 5.65460187911138e-01 1.07498826395060e-01 + 5.85029675577305e-01 1.03944942811554e-01 + 6.04902749493555e-01 1.00126044902967e-01 + 6.25076084848418e-01 9.60954974978452e-02 + 6.45543971739222e-01 9.18933165314899e-02 + 6.66297289512585e-01 8.75484886184110e-02 + 6.87308946494649e-01 8.29877474141992e-02 + 7.08578048914644e-01 7.82894566836472e-02 + 7.30086443256557e-01 7.34459663833689e-02 + 7.51825357054199e-01 6.84945162374382e-02 + 7.73769138587997e-01 6.34023849460844e-02 + 7.95897100069124e-01 5.81625974308282e-02 + 8.18195637696294e-01 5.28018830946166e-02 + 8.40659948231990e-01 4.73841857178122e-02 + 8.63266034014869e-01 4.19041191703725e-02 + 8.85979573720097e-01 3.62991883120328e-02 + 9.08802830149653e-01 3.06806974342369e-02 + 9.31707972602122e-01 2.50135348041367e-02 + 9.54654320230810e-01 1.88471626322655e-02 + 9.77590603702380e-01 1.23214474808323e-02 + 1.00000000000000e+00 5.52162384629112e-03 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF18_Coords.txt b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF18_Coords.txt new file mode 100644 index 000000000..87813ee78 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF18_Coords.txt @@ -0,0 +1,208 @@ + 201 NumCoords ! The number of coordinates in the airfoil shape file (including an extra coordinate for airfoil reference). Set to zero if coordinates not included. +! ......... x-y coordinates are next if NumCoords > 0 ............. +! x-y coordinate of airfoil reference +! x/c y/c + 0.250000 0 +! coordinates of airfoil shape +! interpolation to 200 points +! x/c y/c + 1.00000000000000e+00 -2.37767599414968e-03 + 9.76446819562239e-01 1.18667276573974e-03 + 9.52930798636692e-01 3.80478847156908e-03 + 9.29282208028914e-01 5.37628501132393e-03 + 9.05615578666939e-01 6.07272680933467e-03 + 8.82032334216335e-01 5.18874855240369e-03 + 8.58617284514100e-01 3.26660678111755e-03 + 8.35440764035589e-01 2.67187094232616e-05 + 8.12556593166433e-01 -4.15650599841566e-03 + 7.90017464961696e-01 -9.25945431510779e-03 + 7.67840842437519e-01 -1.50885188225015e-02 + 7.46027726392422e-01 -2.14593261524176e-02 + 7.24592442618031e-01 -2.82974871754426e-02 + 7.03504149817637e-01 -3.53964569024539e-02 + 6.82765349116846e-01 -4.26998988823194e-02 + 6.62337893926518e-01 -5.00271216489902e-02 + 6.42248092575011e-01 -5.74239730292741e-02 + 6.22460538916900e-01 -6.47395984745764e-02 + 6.02953903187687e-01 -7.18789103015881e-02 + 5.83732605013996e-01 -7.88228152136706e-02 + 5.64800704679662e-01 -8.55519158464723e-02 + 5.46124988243235e-01 -9.19284463008494e-02 + 5.27742247208307e-01 -9.80364414989111e-02 + 5.09652486976343e-01 -1.03841306232240e-01 + 4.91835492986616e-01 -1.09243363075515e-01 + 4.74308759446067e-01 -1.14261681915081e-01 + 4.57077435404333e-01 -1.18870892627075e-01 + 4.40154051473917e-01 -1.23098817274973e-01 + 4.23530856843343e-01 -1.26854027870635e-01 + 4.07216398081170e-01 -1.30119328171116e-01 + 3.91231938614656e-01 -1.32976005720577e-01 + 3.75575699731328e-01 -1.35342726415398e-01 + 3.60263622208770e-01 -1.37261172568907e-01 + 3.45308062067250e-01 -1.38788502251440e-01 + 3.30710985565161e-01 -1.39841337156737e-01 + 3.16484027641533e-01 -1.40100625734666e-01 + 3.02640076917013e-01 -1.39862266369132e-01 + 2.89186583012941e-01 -1.39252768782004e-01 + 2.76130340586499e-01 -1.38286107582322e-01 + 2.63476265682543e-01 -1.37049216008764e-01 + 2.51223094661652e-01 -1.35572490644241e-01 + 2.39372261720154e-01 -1.33875529784685e-01 + 2.27927524364597e-01 -1.31931209492906e-01 + 2.16866171615739e-01 -1.29910205264487e-01 + 2.06201029914413e-01 -1.27692002391941e-01 + 1.95913212312204e-01 -1.25358568326782e-01 + 1.85997306093273e-01 -1.22934748923442e-01 + 1.76450637821784e-01 -1.20426052562665e-01 + 1.67269721120968e-01 -1.17795029832047e-01 + 1.58423588488400e-01 -1.15164333199127e-01 + 1.49936911969762e-01 -1.12408754691065e-01 + 1.41769123119841e-01 -1.09669875291307e-01 + 1.33937151744594e-01 -1.06851502319845e-01 + 1.26416097012572e-01 -1.04016679034228e-01 + 1.19206237571905e-01 -1.01151657303313e-01 + 1.12297037125044e-01 -9.82587192113124e-02 + 1.05667160617742e-01 -9.53856625792421e-02 + 9.93435270819619e-02 -9.24557770413018e-02 + 9.32891373053101e-02 -8.95249953967126e-02 + 8.74719354214747e-02 -8.66600851213458e-02 + 8.19240576596432e-02 -8.37764095161515e-02 + 7.66140873543626e-02 -8.09233249988340e-02 + 7.15426883354032e-02 -7.80879536266522e-02 + 6.67258789024077e-02 -7.52313564677441e-02 + 6.21109049974624e-02 -7.24930414546405e-02 + 5.77107003282204e-02 -6.98465745441758e-02 + 5.35430034534783e-02 -6.71846452282005e-02 + 4.95845561568290e-02 -6.45422361158792e-02 + 4.58099226060605e-02 -6.19523763970443e-02 + 4.22293604618921e-02 -5.93855665933846e-02 + 3.88308843695516e-02 -5.68544053787320e-02 + 3.56234006217278e-02 -5.43433098462299e-02 + 3.25999205074709e-02 -5.18499783811972e-02 + 2.97405688058144e-02 -4.93956746514801e-02 + 2.70395385980955e-02 -4.69821041730334e-02 + 2.44940212404595e-02 -4.46103096861655e-02 + 2.21201103864747e-02 -4.22591015257432e-02 + 1.98580479062668e-02 -3.99325658782353e-02 + 1.77168686887470e-02 -3.76638917235478e-02 + 1.57157807032474e-02 -3.54403779106754e-02 + 1.38676651671849e-02 -3.32484674991874e-02 + 1.21441938253155e-02 -3.11061195104619e-02 + 1.05378361076491e-02 -2.90145230640159e-02 + 9.04844929893957e-03 -2.69697346212576e-02 + 7.75683497330708e-03 -2.49283589829342e-02 + 6.52980280782892e-03 -2.29587165235158e-02 + 5.45989916249106e-03 -2.10098573697542e-02 + 4.51688987743758e-03 -1.90975789024075e-02 + 3.64156821001467e-03 -1.72448669660278e-02 + 2.89517955356030e-03 -1.54279532736546e-02 + 2.27709187814676e-03 -1.36490255771574e-02 + 1.72915425508911e-03 -1.19244153221547e-02 + 1.27964769399565e-03 -1.02506222817353e-02 + 9.12717177077437e-04 -8.62589658032073e-03 + 6.43670432858475e-04 -7.05048038051019e-03 + 3.75496964177492e-04 -5.53981424307094e-03 + 2.12451593354277e-04 -4.07587556179559e-03 + 9.85747212878459e-05 -2.66752580611053e-03 + 3.05204163981267e-05 -1.31331094969237e-03 + 0.00000000000000e+00 0.00000000000000e+00 + 3.15800516939920e-05 1.28536935659477e-03 + 1.02861345468154e-04 2.63794919245206e-03 + 2.36308992810849e-04 4.04267190102204e-03 + 4.18574204776478e-04 5.50160407333578e-03 + 6.96667127526426e-04 7.00712121949262e-03 + 1.02165107805804e-03 8.56543372145463e-03 + 1.42540966556040e-03 1.01797040162715e-02 + 2.06214142058454e-03 1.17841124321626e-02 + 2.74385305341704e-03 1.34517101595850e-02 + 3.59432216104703e-03 1.51227008126668e-02 + 4.52897284835177e-03 1.68382166645950e-02 + 5.58705383071816e-03 1.85729863183344e-02 + 6.76096524288088e-03 2.03314489250025e-02 + 8.03743675144860e-03 2.21305025010730e-02 + 9.43646227409209e-03 2.39515425026592e-02 + 1.09263641031346e-02 2.58226128735423e-02 + 1.25566270365459e-02 2.77033405353925e-02 + 1.43178449292754e-02 2.96035213537207e-02 + 1.61852054142408e-02 3.15492683526132e-02 + 1.81381119035080e-02 3.35658704424136e-02 + 2.02376177807679e-02 3.55949640883938e-02 + 2.24827884412515e-02 3.76427169254937e-02 + 2.48776366499191e-02 3.97084340106233e-02 + 2.73991082013164e-02 4.18201264039935e-02 + 3.00477787622335e-02 4.39843306813997e-02 + 3.28525738533268e-02 4.61758552907474e-02 + 3.58120783592458e-02 4.84020618976064e-02 + 3.89252554594669e-02 5.06656093643179e-02 + 4.22050404438107e-02 5.29567403882480e-02 + 4.56607724006619e-02 5.52705490464994e-02 + 4.92802379264876e-02 5.76342317329541e-02 + 5.30951492645608e-02 6.00045745431363e-02 + 5.71023305776689e-02 6.23946378850674e-02 + 6.12975848311221e-02 6.48215197669438e-02 + 6.56925727776909e-02 6.72766782487322e-02 + 7.02743714952992e-02 6.97972744317459e-02 + 7.50969486986961e-02 7.22842735310359e-02 + 8.01400765487782e-02 7.47901896085021e-02 + 8.53920774693246e-02 7.73567066055900e-02 + 9.08903676568554e-02 7.99133996484751e-02 + 9.66403183510142e-02 8.24936560307861e-02 + 1.02638479952074e-01 8.50997650283062e-02 + 1.08889440257636e-01 8.77162219327400e-02 + 1.15401817527268e-01 9.03394906080130e-02 + 1.22185516627081e-01 9.29598512750285e-02 + 1.29263118491494e-01 9.55337809970597e-02 + 1.36619374775123e-01 9.81184385458023e-02 + 1.44266139092389e-01 1.00694502173312e-01 + 1.52221162890854e-01 1.03229848289691e-01 + 1.60491203003249e-01 1.05718276956696e-01 + 1.69084936589124e-01 1.08146601356303e-01 + 1.78011398738398e-01 1.10496847084347e-01 + 1.87272650122097e-01 1.12780737463291e-01 + 1.96861105345526e-01 1.15054643125002e-01 + 2.06798117527740e-01 1.17240543617190e-01 + 2.17101851419760e-01 1.19273158884218e-01 + 2.27761275369060e-01 1.21224134069861e-01 + 2.38790761271252e-01 1.23023413411139e-01 + 2.50192886766329e-01 1.24678047176873e-01 + 2.61966061889217e-01 1.26213824812832e-01 + 2.74122740201456e-01 1.27530811823120e-01 + 2.86662746727198e-01 1.28636005140460e-01 + 2.99584123829558e-01 1.29553120390120e-01 + 3.12891391317914e-01 1.30171094917509e-01 + 3.26579260634688e-01 1.30578353143042e-01 + 3.40647672578538e-01 1.30725411590738e-01 + 3.55091880946261e-01 1.30496104164832e-01 + 3.69910990811779e-01 1.30058415062081e-01 + 3.85097931570468e-01 1.29333718130797e-01 + 4.00650923113019e-01 1.28339370562823e-01 + 4.16565921229797e-01 1.27096432683427e-01 + 4.32836992216272e-01 1.25581769969023e-01 + 4.49471067150447e-01 1.23948898925125e-01 + 4.66445046714551e-01 1.21982635824263e-01 + 4.83761025693294e-01 1.19827800217627e-01 + 5.01420577935565e-01 1.17377223728947e-01 + 5.19413548507589e-01 1.14623284584942e-01 + 5.37727933854121e-01 1.11613572571558e-01 + 5.56358704938187e-01 1.08373804583437e-01 + 5.75305606530518e-01 1.04960916116859e-01 + 5.94556737334723e-01 1.01364726003763e-01 + 6.14091323042302e-01 9.75131887392979e-02 + 6.33899505217000e-01 9.34229607669790e-02 + 6.53983838820148e-01 8.91779646388802e-02 + 6.74334658110115e-01 8.48016108581404e-02 + 6.94926822402831e-01 8.02237288972718e-02 + 7.15760758260989e-01 7.55262386365138e-02 + 7.36819570375329e-01 7.07027052448581e-02 + 7.58090843885297e-01 6.57693336437398e-02 + 7.79554466153280e-01 6.07141783168916e-02 + 8.01192136630880e-01 5.55343914786427e-02 + 8.22988286990664e-01 5.02420511779286e-02 + 8.44930581805388e-01 4.48622679286764e-02 + 8.67009913774751e-01 3.94519467741740e-02 + 8.89189431928600e-01 3.39266635119004e-02 + 9.11472787704912e-01 2.84011627846064e-02 + 9.33822613763039e-01 2.27894520303026e-02 + 9.56213100416208e-01 1.64551756972167e-02 + 9.78602197523542e-01 9.57262213328838e-03 + 1.00000000000000e+00 2.38801343162379e-03 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF19_Coords.txt b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF19_Coords.txt new file mode 100644 index 000000000..ffdbb0d30 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF19_Coords.txt @@ -0,0 +1,208 @@ + 201 NumCoords ! The number of coordinates in the airfoil shape file (including an extra coordinate for airfoil reference). Set to zero if coordinates not included. +! ......... x-y coordinates are next if NumCoords > 0 ............. +! x-y coordinate of airfoil reference +! x/c y/c + 0.250000 0 +! coordinates of airfoil shape +! interpolation to 200 points +! x/c y/c + 1.00000000000000e+00 -3.68399389995869e-04 + 9.76857008771838e-01 2.66731162732446e-03 + 9.53893452982560e-01 5.08228579069216e-03 + 9.30791447416205e-01 6.92341917618193e-03 + 9.07639904153749e-01 8.15655615709104e-03 + 8.84536094791801e-01 7.92264904224889e-03 + 8.61567157501965e-01 6.68493011849853e-03 + 8.38805377497580e-01 4.13452337383163e-03 + 8.16314251999226e-01 5.97915678772836e-04 + 7.94148914190988e-01 -3.89604633156816e-03 + 7.72340484630481e-01 -9.19436001700492e-03 + 7.50894760627057e-01 -1.51087969475548e-02 + 7.29828566229855e-01 -2.15579885729289e-02 + 7.09109933074187e-01 -2.83298125964794e-02 + 6.88721421877958e-01 -3.53036886233563e-02 + 6.68649585846097e-01 -4.23737071775973e-02 + 6.48895487241817e-01 -4.95075181376893e-02 + 6.29435996348719e-01 -5.65920614554448e-02 + 6.10230958530276e-01 -6.34793436033746e-02 + 5.91289213882662e-01 -7.01620809295741e-02 + 5.72614563636092e-01 -7.66179006666135e-02 + 5.54169437142293e-01 -8.26972170912674e-02 + 5.35994549591891e-01 -8.84922462055237e-02 + 5.18086994319589e-01 -9.39558134124888e-02 + 5.00438716025881e-01 -9.90271375426639e-02 + 4.83056404950572e-01 -1.03683276789266e-01 + 4.65954483401666e-01 -1.07928967059445e-01 + 4.49145459682817e-01 -1.11790741247148e-01 + 4.32630347798518e-01 -1.15206880360019e-01 + 4.16414524640443e-01 -1.18147531896552e-01 + 4.00526087330994e-01 -1.20731141532653e-01 + 3.84962746755882e-01 -1.22881481336833e-01 + 3.69741027707524e-01 -1.24652317902417e-01 + 3.54871156825438e-01 -1.26116996793257e-01 + 3.40351528329817e-01 -1.27196549851457e-01 + 3.26189812343215e-01 -1.27831505011485e-01 + 3.12394436962796e-01 -1.28135125466097e-01 + 2.98968095909353e-01 -1.28135971204913e-01 + 2.85914601715587e-01 -1.27815225606007e-01 + 2.73235356281731e-01 -1.27263263044964e-01 + 2.60929501705741e-01 -1.26470643765030e-01 + 2.48998483933274e-01 -1.25450275622875e-01 + 2.37444123255251e-01 -1.24173437692176e-01 + 2.26252115496294e-01 -1.22785796310441e-01 + 2.15430713313732e-01 -1.21185221143952e-01 + 2.04974244392958e-01 -1.19412349992892e-01 + 1.94871537400587e-01 -1.17520737121037e-01 + 1.85118149204518e-01 -1.15527561249974e-01 + 1.75719532106264e-01 -1.13369650618129e-01 + 1.66647941717989e-01 -1.11180617405335e-01 + 1.57925164945130e-01 -1.08833224985739e-01 + 1.49505657854053e-01 -1.06498338398972e-01 + 1.41420016040231e-01 -1.04044619127328e-01 + 1.33640986123984e-01 -1.01549904565748e-01 + 1.26167669913614e-01 -9.90049839819346e-02 + 1.18997037103723e-01 -9.64015758401574e-02 + 1.12098825120963e-01 -9.38093390294696e-02 + 1.05499623500676e-01 -9.11479135507931e-02 + 9.91810164066800e-02 -8.84508376192239e-02 + 9.31002162531755e-02 -8.58102997394773e-02 + 8.72874366774390e-02 -8.31377449587737e-02 + 8.17107141333520e-02 -8.04892138256785e-02 + 7.63766137075373e-02 -7.78449994839546e-02 + 7.13036684223055e-02 -7.51579825759147e-02 + 6.64263817165701e-02 -7.26018598042667e-02 + 6.17681093546461e-02 -7.01301752855594e-02 + 5.73551856813564e-02 -6.76137828225569e-02 + 5.31579386553926e-02 -6.50996263715978e-02 + 4.91473139049403e-02 -6.26301467575107e-02 + 4.53431586149581e-02 -6.01620539688450e-02 + 4.17288283387378e-02 -5.77156085161925e-02 + 3.83105975635588e-02 -5.52772281229456e-02 + 3.50862364938885e-02 -5.28405786158374e-02 + 3.20401842818251e-02 -5.04256327322228e-02 + 2.91607168682362e-02 -4.80403110926350e-02 + 2.64301474681941e-02 -4.56985651824556e-02 + 2.38818791314998e-02 -4.33660011061808e-02 + 2.14869187314351e-02 -4.10319139878904e-02 + 1.92210251217201e-02 -3.87490158345328e-02 + 1.70866204440822e-02 -3.65155909889459e-02 + 1.51088856667703e-02 -3.43067488660566e-02 + 1.32677571342121e-02 -3.21365849699287e-02 + 1.15452964783661e-02 -3.00141740624550e-02 + 9.93785550135011e-03 -2.79390543678102e-02 + 8.53733963199581e-03 -2.58535670157040e-02 + 7.18971942545551e-03 -2.38493192760235e-02 + 6.01408812501931e-03 -2.18527495788709e-02 + 4.98035831239796e-03 -1.98845668008135e-02 + 4.02595523871816e-03 -1.79724851036912e-02 + 3.21872354864114e-03 -1.60881596868680e-02 + 2.53699895316356e-03 -1.42423112550335e-02 + 1.92596838800982e-03 -1.24525079880165e-02 + 1.42958340648342e-03 -1.07107365453782e-02 + 1.02402066973875e-03 -9.01638710474725e-03 + 7.29515457680132e-04 -7.37055242509973e-03 + 4.22134415351005e-04 -5.79337753090592e-03 + 2.34596295265449e-04 -4.26157143671717e-03 + 1.02904903665998e-04 -2.78642458580164e-03 + 3.16491042877115e-05 -1.36624202526467e-03 + 0.00000000000000e+00 0.00000000000000e+00 + 3.25137502262144e-05 1.36126836315680e-03 + 1.06572281496749e-04 2.77981521878749e-03 + 2.57511209208200e-04 4.25126635289481e-03 + 4.63055841935316e-04 5.77772676962173e-03 + 7.87917070457592e-04 7.34807091678409e-03 + 1.15955675201046e-03 8.97177740531396e-03 + 1.59745861466139e-03 1.06563985806526e-02 + 2.31368504535807e-03 1.23130195245482e-02 + 3.07011367084607e-03 1.40368009141934e-02 + 4.02371261501702e-03 1.57508050961990e-02 + 5.05889266777718e-03 1.75092215738978e-02 + 6.24062268199277e-03 1.92737269450562e-02 + 7.54740536677814e-03 2.10551920713005e-02 + 8.94341992064346e-03 2.28830596185717e-02 + 1.04710077300238e-02 2.47255697363701e-02 + 1.20884012253117e-02 2.66189106966348e-02 + 1.38520540216189e-02 2.85155544569944e-02 + 1.57538252832241e-02 3.04237067797815e-02 + 1.77681435802238e-02 3.23726800924697e-02 + 1.98651227360326e-02 3.43962534435927e-02 + 2.21247244203388e-02 3.64158580641648e-02 + 2.45284811789666e-02 3.84542786038096e-02 + 2.70797126293869e-02 4.05086907274035e-02 + 2.97713970613449e-02 4.25955179697784e-02 + 3.25934127100249e-02 4.47318036374387e-02 + 3.55618220018821e-02 4.69039793632072e-02 + 3.86836906268538e-02 4.91103908591560e-02 + 4.19661079042882e-02 5.13452316640530e-02 + 4.54195931002610e-02 5.36005424735060e-02 + 4.90533369175556e-02 5.58703224938828e-02 + 5.28474279411799e-02 5.81942364368840e-02 + 5.68395292704747e-02 6.05166790176710e-02 + 6.10288780337881e-02 6.28493270475509e-02 + 6.54071465451169e-02 6.52146960136306e-02 + 6.99800855562079e-02 6.76141714293276e-02 + 7.47299921393616e-02 7.00928446530985e-02 + 7.97349694380070e-02 7.25080974627385e-02 + 8.49609191753247e-02 7.49373418732565e-02 + 9.03863431014392e-02 7.74411126435351e-02 + 9.60597012920897e-02 7.99261936987175e-02 + 1.01984926382490e-01 8.24310363129346e-02 + 1.08155469732798e-01 8.49653756451838e-02 + 1.14574779429234e-01 8.75131666717048e-02 + 1.21251387707475e-01 9.00699473431387e-02 + 1.28195102790333e-01 9.26263962880819e-02 + 1.35435072734491e-01 9.51218497619305e-02 + 1.42949252027610e-01 9.76304862957753e-02 + 1.50743822415266e-01 1.00143225443294e-01 + 1.58842313055751e-01 1.02614343572487e-01 + 1.67251089180853e-01 1.05037311736569e-01 + 1.75978460980627e-01 1.07398386544002e-01 + 1.85033942788463e-01 1.09676903953931e-01 + 1.94412030223010e-01 1.11906753065792e-01 + 2.04110352857490e-01 1.14127897662318e-01 + 2.14149527961947e-01 1.16265117747636e-01 + 2.24547481767990e-01 1.18248683868967e-01 + 2.35294419696161e-01 1.20148148534840e-01 + 2.46402639597428e-01 1.21897385397864e-01 + 2.57869912676765e-01 1.23526834665610e-01 + 2.69696468272276e-01 1.25053947368743e-01 + 2.81898741199044e-01 1.26364975026619e-01 + 2.94471881045941e-01 1.27487690783284e-01 + 3.07418691339119e-01 1.28414307575311e-01 + 3.20741558118385e-01 1.29056641751163e-01 + 3.34435620226968e-01 1.29474248027250e-01 + 3.48500353688656e-01 1.29624393334326e-01 + 3.62929932989329e-01 1.29396296126059e-01 + 3.77722526892471e-01 1.28930828553253e-01 + 3.92869955516012e-01 1.28156113952553e-01 + 4.08370908134265e-01 1.27114694902152e-01 + 4.24220308156953e-01 1.25806236875891e-01 + 4.40412755529192e-01 1.24220713149001e-01 + 4.56953405525328e-01 1.22475796836960e-01 + 4.73821213743432e-01 1.20395388434913e-01 + 4.91013482752600e-01 1.18050411789495e-01 + 5.08535020400488e-01 1.15490643648704e-01 + 5.26377360286358e-01 1.12710340482628e-01 + 5.44524273775329e-01 1.09660985096774e-01 + 5.62974211427790e-01 1.06393299108221e-01 + 5.81725427948974e-01 1.02949051041186e-01 + 6.00768970403698e-01 9.93338710397741e-02 + 6.20082840879561e-01 9.54749572480719e-02 + 6.39652920613148e-01 9.13660653707297e-02 + 6.59487153767914e-01 8.71101696164325e-02 + 6.79575519171002e-01 8.27251675441617e-02 + 6.99894148304263e-01 7.81515132973927e-02 + 7.20444328669405e-01 7.34673024705215e-02 + 7.41209985385736e-01 6.86669596077010e-02 + 7.62176328526465e-01 6.37536068656100e-02 + 7.83326857277745e-01 5.87278224664763e-02 + 8.04644827719480e-01 5.35902846761059e-02 + 8.26113390531774e-01 4.83441901136536e-02 + 8.47715298834171e-01 4.29917435480749e-02 + 8.69451154762037e-01 3.76211700207279e-02 + 8.91282457860132e-01 3.21440170875230e-02 + 9.13213765042928e-01 2.66674634778728e-02 + 9.35201490491600e-01 2.10851818173222e-02 + 9.57229521434730e-01 1.46843783125432e-02 + 9.79261819214701e-01 7.64883901865307e-03 + 1.00000000000000e+00 3.48671814865888e-04 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF20_Coords.txt b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF20_Coords.txt new file mode 100644 index 000000000..8e86a6c91 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF20_Coords.txt @@ -0,0 +1,208 @@ + 201 NumCoords ! The number of coordinates in the airfoil shape file (including an extra coordinate for airfoil reference). Set to zero if coordinates not included. +! ......... x-y coordinates are next if NumCoords > 0 ............. +! x-y coordinate of airfoil reference +! x/c y/c + 0.250000 0 +! coordinates of airfoil shape +! interpolation to 200 points +! x/c y/c + 1.00000000000000e+00 -1.16970450232154e-05 + 9.76925950475657e-01 2.89849629928081e-03 + 9.54056302293072e-01 5.27987438372875e-03 + 9.31048128850624e-01 7.19864995910977e-03 + 9.07985124166376e-01 8.59432633354728e-03 + 8.84963341017396e-01 8.76245996738773e-03 + 8.62070108500804e-01 7.89821744156301e-03 + 8.39377957233181e-01 5.82757272129634e-03 + 8.16952105741759e-01 2.74131006023888e-03 + 7.94848134812973e-01 -1.31047187114084e-03 + 7.73099762468629e-01 -6.19594038201392e-03 + 7.51713796559463e-01 -1.17316935887704e-02 + 7.30707465507159e-01 -1.78243181962159e-02 + 7.10048880246723e-01 -2.42736757420121e-02 + 6.89717065485909e-01 -3.09377224920066e-02 + 6.69703185975444e-01 -3.77351051006435e-02 + 6.50003630817286e-01 -4.46004260244532e-02 + 6.30597616366455e-01 -5.14349380887498e-02 + 6.11441818070351e-01 -5.80781149510869e-02 + 5.92545822192135e-01 -6.45215136200802e-02 + 5.73913326684091e-01 -7.07373461559128e-02 + 5.55506287086248e-01 -7.65813023757692e-02 + 5.37365867311171e-01 -8.21381752489661e-02 + 5.19488675136997e-01 -8.73572229383648e-02 + 5.01868935197649e-01 -9.21948826265366e-02 + 4.84511382435821e-01 -9.66125856407465e-02 + 4.67432104979211e-01 -1.00628904032081e-01 + 4.50643532673488e-01 -1.04265668268842e-01 + 4.34148314472208e-01 -1.07478023174613e-01 + 4.17951273380630e-01 -1.10235646319524e-01 + 4.02081583043242e-01 -1.12662589853757e-01 + 3.86536904904201e-01 -1.14691181363898e-01 + 3.71333778363175e-01 -1.16376698317397e-01 + 3.56481987324237e-01 -1.17794019293702e-01 + 3.41979279301955e-01 -1.18871441512321e-01 + 3.27832555060862e-01 -1.19600488549061e-01 + 3.14049364730407e-01 -1.20059113518256e-01 + 3.00631508155208e-01 -1.20254220188729e-01 + 2.87582216544618e-01 -1.20159958866052e-01 + 2.74902221193761e-01 -1.19865036371322e-01 + 2.62590720444375e-01 -1.19348842067133e-01 + 2.50649124402496e-01 -1.18621135823199e-01 + 2.39078845345792e-01 -1.17656533028436e-01 + 2.27867184439070e-01 -1.16582394562078e-01 + 2.17021456811297e-01 -1.15308380050123e-01 + 2.06538387308884e-01 -1.13853615562753e-01 + 1.96405791960340e-01 -1.12282176086080e-01 + 1.86618882329224e-01 -1.10617167094150e-01 + 1.77184649555781e-01 -1.08781185951076e-01 + 1.68076082704334e-01 -1.06908773866295e-01 + 1.59314215217802e-01 -1.04873638045081e-01 + 1.50852862448295e-01 -1.02861593237538e-01 + 1.42724842088730e-01 -1.00718365786054e-01 + 1.34902608040035e-01 -9.85287421796948e-02 + 1.27384992592018e-01 -9.62861825827909e-02 + 1.20170299874457e-01 -9.39710611432170e-02 + 1.13226789857415e-01 -9.16709983326127e-02 + 1.06580720474888e-01 -8.93032875865484e-02 + 1.00217178769272e-01 -8.68749312381822e-02 + 9.40916537592124e-02 -8.45028367434999e-02 + 8.82337163668553e-02 -8.20944117938331e-02 + 8.26115051483221e-02 -7.97126340550203e-02 + 7.72312330966435e-02 -7.73288341051596e-02 + 7.21130677350178e-02 -7.48833638768388e-02 + 6.71894736753951e-02 -7.24763209375136e-02 + 6.24856412277135e-02 -7.00416636170101e-02 + 5.80294161668677e-02 -6.75572914548322e-02 + 5.37899973283964e-02 -6.50720675769313e-02 + 4.97376985419173e-02 -6.26297954371682e-02 + 4.58940560730263e-02 -6.01849905424522e-02 + 4.22416037500420e-02 -5.77591819336826e-02 + 3.87861465552347e-02 -5.53392550403537e-02 + 3.55262959996525e-02 -5.29181938435960e-02 + 3.24472582872532e-02 -5.05155931301242e-02 + 2.95362641509762e-02 -4.81404755119313e-02 + 2.67729953169852e-02 -4.58090684459152e-02 + 2.41939083904648e-02 -4.34848129849921e-02 + 2.18141572031663e-02 -4.11543813853988e-02 + 1.95673854713824e-02 -3.88737506338495e-02 + 1.74477564779088e-02 -3.66431614312941e-02 + 1.54752345352323e-02 -3.44358303125963e-02 + 1.36342551938651e-02 -3.22650844102067e-02 + 1.19084234941661e-02 -3.01413804853732e-02 + 1.02942941011661e-02 -2.80648529097022e-02 + 8.86743811777817e-03 -2.59756933328882e-02 + 7.49856900534070e-03 -2.39690434637317e-02 + 6.29098663294263e-03 -2.19677989083217e-02 + 5.22308841935517e-03 -1.99933475331875e-02 + 4.24008866088351e-03 -1.80740827427679e-02 + 3.40280642281631e-03 -1.61810689964114e-02 + 2.68688998868729e-03 -1.43265021403969e-02 + 2.04591034039661e-03 -1.25280222785356e-02 + 1.52162287314027e-03 -1.07769333035290e-02 + 1.09208473544427e-03 -9.07280332309622e-03 + 7.75103994536751e-04 -7.41691607941299e-03 + 4.52353374589913e-04 -5.83014500820004e-03 + 2.49723979775574e-04 -4.28843531366952e-03 + 1.06661955669598e-04 -2.80345353766615e-03 + 3.27195725030880e-05 -1.37348955310638e-03 + 0.00000000000000e+00 0.00000000000000e+00 + 3.26413884329373e-05 1.37318323731147e-03 + 1.07225011317394e-04 2.80153107572479e-03 + 2.61262892040196e-04 4.28285015690166e-03 + 4.70931448264386e-04 5.81923659176159e-03 + 8.04058189317705e-04 7.39899934408296e-03 + 1.18395464357889e-03 9.03211811477640e-03 + 1.62790475131778e-03 1.07268695231018e-02 + 2.35805156291858e-03 1.23907220018351e-02 + 3.12729867551767e-03 1.41221855611746e-02 + 4.09811443518625e-03 1.58417552692127e-02 + 5.15013525889198e-03 1.76056029553215e-02 + 6.35251451470470e-03 1.93733209765600e-02 + 7.68136628992783e-03 2.11568889489349e-02 + 9.09705641338774e-03 2.29878091550079e-02 + 1.06457219627370e-02 2.48321471768241e-02 + 1.22840569946196e-02 2.67273324555485e-02 + 1.40693975554630e-02 2.86248786440320e-02 + 1.59938671904845e-02 3.05326851588142e-02 + 1.80320179344073e-02 3.24804018390111e-02 + 2.01525184247463e-02 3.45030950602257e-02 + 2.24382250539517e-02 3.65190950131922e-02 + 2.48676010790424e-02 3.85540869978262e-02 + 2.74438995195706e-02 4.06048186992883e-02 + 3.01630613080321e-02 4.26855478409807e-02 + 3.30131439394830e-02 4.48150556811931e-02 + 3.60078117153417e-02 4.69819958893802e-02 + 3.91555926213345e-02 4.91831364532758e-02 + 4.24650818770967e-02 5.14111490804253e-02 + 4.59463399533206e-02 5.36584113782445e-02 + 4.96085019195341e-02 5.59187875417100e-02 + 5.34304029583731e-02 5.82339756158755e-02 + 5.74506053673470e-02 6.05464382961678e-02 + 6.16688433559805e-02 6.28675145510649e-02 + 6.60761101690652e-02 6.52205906481849e-02 + 7.06771229650270e-02 6.76087786085493e-02 + 7.54534564656442e-02 7.00783385211843e-02 + 8.04871181124642e-02 7.24796963744080e-02 + 8.57417937708899e-02 7.48942120614805e-02 + 9.11943707542743e-02 7.73854695174959e-02 + 9.68950720892806e-02 7.98566713262581e-02 + 1.02847573387230e-01 8.22876079010535e-02 + 1.09044858215908e-01 8.47210179791181e-02 + 1.15490222891971e-01 8.71750070246340e-02 + 1.22192184613505e-01 8.96434844224979e-02 + 1.29160511286559e-01 9.21174420433711e-02 + 1.36425397154230e-01 9.45156825723323e-02 + 1.43963785764342e-01 9.69333711278718e-02 + 1.51780847657248e-01 9.93726343552587e-02 + 1.59901053759045e-01 1.01772022005663e-01 + 1.68330718517798e-01 1.04124856132688e-01 + 1.77078093160315e-01 1.06417242140794e-01 + 1.86152768336554e-01 1.08626721316434e-01 + 1.95547957086479e-01 1.10808018380726e-01 + 2.05262344651788e-01 1.12982949744755e-01 + 2.15316288411784e-01 1.15080703683943e-01 + 2.25727640430810e-01 1.17028842247463e-01 + 2.36486953294469e-01 1.18893468221244e-01 + 2.47606103597236e-01 1.20613966312300e-01 + 2.59082067962401e-01 1.22236590592394e-01 + 2.70915428466803e-01 1.23770388922269e-01 + 2.83123302721779e-01 1.25093790952213e-01 + 2.95700040272605e-01 1.26248167564620e-01 + 3.08649339579229e-01 1.27202204411106e-01 + 3.21973207911371e-01 1.27886002490200e-01 + 3.35666915940575e-01 1.28336009455904e-01 + 3.49729856148137e-01 1.28515938919406e-01 + 3.64156044605897e-01 1.28322082434802e-01 + 3.78943465936109e-01 1.27872557734258e-01 + 3.94083763263825e-01 1.27105654197604e-01 + 4.09575696342703e-01 1.26076864381629e-01 + 4.25414011369775e-01 1.24776753517338e-01 + 4.41593423933488e-01 1.23203803654028e-01 + 4.58118698550793e-01 1.21453065442532e-01 + 4.74969289264106e-01 1.19379481227578e-01 + 4.92141581296370e-01 1.17024136753557e-01 + 5.09640928459442e-01 1.14468473774205e-01 + 5.27459181191729e-01 1.11706370002499e-01 + 5.45579400762510e-01 1.08675938318902e-01 + 5.64000646601103e-01 1.05430671339811e-01 + 5.82720846933108e-01 1.02001576810010e-01 + 6.01731586141294e-01 9.83969151548686e-02 + 6.21010755973352e-01 9.45591973944104e-02 + 6.40543478738464e-01 9.04796724759952e-02 + 6.60338537645302e-01 8.62499884007561e-02 + 6.80385825453853e-01 8.18833516289867e-02 + 7.00661796733097e-01 7.73360839181257e-02 + 7.21167806331622e-01 7.26753969763489e-02 + 7.41887916488567e-01 6.78960039061239e-02 + 7.62806892564257e-01 6.29998067215964e-02 + 7.83908861634844e-01 5.79878832722068e-02 + 8.05177351436274e-01 5.28629172742288e-02 + 8.26595261100184e-01 4.76276642630319e-02 + 8.48144449629654e-01 4.22843337759070e-02 + 8.69827140629476e-01 3.69111819966000e-02 + 8.91604637206406e-01 3.14360883953754e-02 + 9.13481489167149e-01 2.59485561418769e-02 + 9.35413129302637e-01 2.03601258502341e-02 + 9.57385180896840e-01 1.40200210251241e-02 + 9.79362661611973e-01 7.10265085432084e-03 + 1.00000000000000e+00 -1.07577592503420e-05 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF21_Coords.txt b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF21_Coords.txt new file mode 100644 index 000000000..388e7950b --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF21_Coords.txt @@ -0,0 +1,208 @@ + 201 NumCoords ! The number of coordinates in the airfoil shape file (including an extra coordinate for airfoil reference). Set to zero if coordinates not included. +! ......... x-y coordinates are next if NumCoords > 0 ............. +! x-y coordinate of airfoil reference +! x/c y/c + 0.250000 0 +! coordinates of airfoil shape +! interpolation to 200 points +! x/c y/c + 1.00000000000000e+00 -2.84740725711342e-05 + 9.76865338872185e-01 2.85428304137865e-03 + 9.53929219800446e-01 5.24327408174464e-03 + 9.30868587354945e-01 7.20751732930949e-03 + 9.07757786371386e-01 8.68022664963385e-03 + 8.84685981963589e-01 9.16779767337892e-03 + 8.61737273650503e-01 8.59878745573448e-03 + 8.38982716451081e-01 6.97032631101525e-03 + 8.16487465310072e-01 4.27790070293695e-03 + 7.94307280144394e-01 5.98958387499667e-04 + 7.72478209244049e-01 -3.92421216988763e-03 + 7.51009294443888e-01 -9.11447969158894e-03 + 7.29917171589636e-01 -1.48652160246661e-02 + 7.09173987466613e-01 -2.09915209310793e-02 + 6.88759055777041e-01 -2.73426738600162e-02 + 6.68666517410726e-01 -3.38483930358717e-02 + 6.48890300856279e-01 -4.04237940323079e-02 + 6.29411879426884e-01 -4.69774888101651e-02 + 6.10190624345359e-01 -5.33527496658855e-02 + 5.91235514841636e-01 -5.95364517406264e-02 + 5.72549427006805e-01 -6.54947690043992e-02 + 5.54098681203993e-01 -7.10990749251103e-02 + 5.35920827161821e-01 -7.64189417500869e-02 + 5.18012958869965e-01 -8.14046707993908e-02 + 5.00370906490186e-01 -8.60216565775983e-02 + 4.82998993642838e-01 -9.02272377996711e-02 + 4.65913482233682e-01 -9.40474533539546e-02 + 4.49125729712078e-01 -9.74967264248575e-02 + 4.32639419880572e-01 -1.00542965307158e-01 + 4.16459539589475e-01 -1.03161374243716e-01 + 4.00613215473433e-01 -1.05466420900906e-01 + 3.85098707684728e-01 -1.07402177176065e-01 + 3.69931266330609e-01 -1.09020571824359e-01 + 3.55119768331056e-01 -1.10391209715929e-01 + 3.40661821755905e-01 -1.11451999694907e-01 + 3.26563430473896e-01 -1.12194090288857e-01 + 3.12830956759217e-01 -1.12692769163857e-01 + 2.99465542002860e-01 -1.12952761784846e-01 + 2.86469704616211e-01 -1.12949992221423e-01 + 2.73843543674708e-01 -1.12766407873851e-01 + 2.61586025508254e-01 -1.12380265536283e-01 + 2.49698014015215e-01 -1.11799275824114e-01 + 2.38180021002129e-01 -1.11005012677545e-01 + 2.27020875450809e-01 -1.10103654156307e-01 + 2.16226137874301e-01 -1.09019236030612e-01 + 2.05793116599237e-01 -1.07760935076377e-01 + 1.95709833948425e-01 -1.06391330139806e-01 + 1.85971073779880e-01 -1.04935019609158e-01 + 1.76583031796272e-01 -1.03315378553033e-01 + 1.67520981485238e-01 -1.01654758321660e-01 + 1.58802515906259e-01 -9.98409591053214e-02 + 1.50385000970262e-01 -9.80499859448751e-02 + 1.42298158727063e-01 -9.61306196719593e-02 + 1.34516269147850e-01 -9.41634136087469e-02 + 1.27037305703638e-01 -9.21442045117529e-02 + 1.19859512781939e-01 -9.00492381147093e-02 + 1.12952800949352e-01 -8.79682875564088e-02 + 1.06339499636755e-01 -8.58264580885655e-02 + 1.00007414389900e-01 -8.36143627290609e-02 + 9.39147764330701e-02 -8.14516604635932e-02 + 8.80868393032252e-02 -7.92537536059723e-02 + 8.24946159428780e-02 -7.70801723815972e-02 + 7.71274250919293e-02 -7.49012538073132e-02 + 7.20190535116052e-02 -7.26564811445412e-02 + 6.71057079852937e-02 -7.03934414720974e-02 + 6.24118140095744e-02 -6.80431207723954e-02 + 5.79644757418812e-02 -6.56460890316721e-02 + 5.37333540900433e-02 -6.32481286299431e-02 + 4.96893756299879e-02 -6.08884959776765e-02 + 4.58534457561426e-02 -5.85255201649711e-02 + 4.22083319889390e-02 -5.61793213837462e-02 + 3.87596121937182e-02 -5.38383821901660e-02 + 3.55057922281837e-02 -5.14962236665323e-02 + 3.24322743559543e-02 -4.91703134749231e-02 + 2.95264783129621e-02 -4.68695823371802e-02 + 2.67683318695932e-02 -4.46098816905116e-02 + 2.41934701367245e-02 -4.23573844305122e-02 + 2.18548607049960e-02 -4.00989773901928e-02 + 1.96524338700715e-02 -3.78875178579182e-02 + 1.75755260431319e-02 -3.57232070150690e-02 + 1.56358377059865e-02 -3.35811088781324e-02 + 1.38207984844720e-02 -3.14734077737011e-02 + 1.21180061661380e-02 -2.94102107211683e-02 + 1.05254874189780e-02 -2.73912953793136e-02 + 9.09360929036987e-03 -2.53625298476404e-02 + 7.72181822309867e-03 -2.34101512080760e-02 + 6.49763138245874e-03 -2.14641052056444e-02 + 5.40871842169344e-03 -1.95429445805207e-02 + 4.40961919998241e-03 -1.76727016085954e-02 + 3.55040219006997e-03 -1.58276863888619e-02 + 2.80808183134115e-03 -1.40194239937278e-02 + 2.14649703528823e-03 -1.22634144788593e-02 + 1.59920737776881e-03 -1.05527195276620e-02 + 1.14930375044154e-03 -8.88654178716626e-03 + 8.10231534512569e-04 -7.26673074294147e-03 + 4.78895883677518e-04 -5.71256790934727e-03 + 2.63639401109400e-04 -4.20252872193405e-03 + 1.11557989496940e-04 -2.74745794723513e-03 + 3.44756369415605e-05 -1.34604561592499e-03 + 0.00000000000000e+00 0.00000000000000e+00 + 3.20816693922806e-05 1.34573179197360e-03 + 1.07094538044363e-04 2.74581135191723e-03 + 2.61023002477552e-04 4.19787122797409e-03 + 4.70744609715971e-04 5.70378084563639e-03 + 8.02668778110153e-04 7.25269694625556e-03 + 1.18211679499553e-03 8.85342213515878e-03 + 1.62613136894154e-03 1.05133892427942e-02 + 2.35095850098151e-03 1.21472955138763e-02 + 3.11291707163376e-03 1.38451043913963e-02 + 4.06681615370234e-03 1.55343607101053e-02 + 5.10318321837548e-03 1.72662509388141e-02 + 6.28537915014080e-03 1.90038719565046e-02 + 7.59081076018542e-03 2.07586526711072e-02 + 8.98284133346192e-03 2.25595390649685e-02 + 1.05048772029216e-02 2.43750659231944e-02 + 1.21173705320911e-02 2.62396209517460e-02 + 1.38724687721741e-02 2.81092919141236e-02 + 1.57628531446385e-02 2.99916503138032e-02 + 1.77668024925910e-02 3.19129888938685e-02 + 1.98560304119069e-02 3.39051089397272e-02 + 2.21065209505667e-02 3.58935725801445e-02 + 2.44975644102754e-02 3.79031615747998e-02 + 2.70332347408878e-02 3.99299291146165e-02 + 2.97109628466766e-02 4.19867024992787e-02 + 3.25200587654925e-02 4.40903080891470e-02 + 3.54726867654753e-02 4.62315479726106e-02 + 3.85766530005811e-02 4.84076241040826e-02 + 4.18413693987001e-02 5.06110330462258e-02 + 4.52764942398936e-02 5.28343865988492e-02 + 4.88907425761762e-02 5.50724163659514e-02 + 5.26646691476036e-02 5.73640816538310e-02 + 5.66345029639527e-02 5.96558451069643e-02 + 6.08009395375298e-02 6.19577340085226e-02 + 6.51558010698599e-02 6.42917617552471e-02 + 6.97040980071108e-02 6.66604081412036e-02 + 7.44292782322818e-02 6.91063981945018e-02 + 7.94075911539318e-02 7.14919169255233e-02 + 8.46064336120551e-02 7.38912356977943e-02 + 9.00046646171667e-02 7.63634375717562e-02 + 9.56495329755105e-02 7.88186816028507e-02 + 1.01544707534728e-01 8.12061081549737e-02 + 1.07684393957011e-01 8.35823621854077e-02 + 1.14072629815357e-01 8.59820974163730e-02 + 1.20717936678019e-01 8.83984296232361e-02 + 1.27629750106332e-01 9.08236951338500e-02 + 1.34836465041941e-01 9.31733181108972e-02 + 1.42317922535003e-01 9.55435716133629e-02 + 1.50079297300981e-01 9.79421782603361e-02 + 1.58143784516036e-01 1.00304899967289e-01 + 1.66517972957835e-01 1.02624809036553e-01 + 1.75210207161683e-01 1.04888579553756e-01 + 1.84229946037827e-01 1.07074677598208e-01 + 1.93571360679093e-01 1.09243451986783e-01 + 2.03234945574175e-01 1.11402415125159e-01 + 2.13239205546370e-01 1.13491436907172e-01 + 2.23601537222704e-01 1.15440504439587e-01 + 2.34314315339563e-01 1.17306503096526e-01 + 2.45388676682413e-01 1.19037311828905e-01 + 2.56822498877269e-01 1.20681072953816e-01 + 2.68616771371790e-01 1.22241825144540e-01 + 2.80788220103666e-01 1.23601558631169e-01 + 2.93331680600211e-01 1.24805212165338e-01 + 3.06251511490344e-01 1.25807926970102e-01 + 3.19549745336724e-01 1.26554338608240e-01 + 3.33222453479109e-01 1.27061326118213e-01 + 3.47269018943833e-01 1.27298091243991e-01 + 3.61683948293755e-01 1.27170458380383e-01 + 3.76464979016090e-01 1.26770572192297e-01 + 3.91604054165987e-01 1.26048320133488e-01 + 4.07099743027696e-01 1.25063728629558e-01 + 4.22946891110087e-01 1.23804897872974e-01 + 4.39140508807244e-01 1.22276792353123e-01 + 4.55684294155409e-01 1.20554509111602e-01 + 4.72559601516541e-01 1.18524015966612e-01 + 4.89761912975334e-01 1.16207419090395e-01 + 5.07296139266516e-01 1.13684964275664e-01 + 5.25154357085284e-01 1.10950890395180e-01 + 5.43320252389640e-01 1.07950681161174e-01 + 5.61792716627316e-01 1.04735757711390e-01 + 5.80568803339265e-01 1.01328525940682e-01 + 5.99640262789189e-01 9.77381351876646e-02 + 6.18986539924185e-01 9.39237635066851e-02 + 6.38592769146560e-01 8.98769749368346e-02 + 6.58465976460566e-01 8.56827556065770e-02 + 6.78595728050462e-01 8.13433005574353e-02 + 6.98959863838616e-01 7.68298671125305e-02 + 7.19558497677296e-01 7.21964039086358e-02 + 7.40375559459272e-01 6.74380995266311e-02 + 7.61395509952232e-01 6.25588162368450e-02 + 7.82602242599360e-01 5.75571816126900e-02 + 8.03979199523738e-01 5.24376017015890e-02 + 8.25508947220265e-01 4.72044836666912e-02 + 8.47173082201993e-01 4.18658829372147e-02 + 8.68972243269945e-01 3.64790803343795e-02 + 8.90869140608345e-01 3.09938752249591e-02 + 9.12865896627548e-01 2.54780934053288e-02 + 9.34919781152421e-01 1.98727453143736e-02 + 9.57016514682770e-01 1.36303405789984e-02 + 9.79120888238619e-01 6.90832082291697e-03 + 1.00000000000000e+00 3.57170593908316e-05 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF22_Coords.txt b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF22_Coords.txt new file mode 100644 index 000000000..ee67f764f --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF22_Coords.txt @@ -0,0 +1,208 @@ + 201 NumCoords ! The number of coordinates in the airfoil shape file (including an extra coordinate for airfoil reference). Set to zero if coordinates not included. +! ......... x-y coordinates are next if NumCoords > 0 ............. +! x-y coordinate of airfoil reference +! x/c y/c + 0.250000 0 +! coordinates of airfoil shape +! interpolation to 200 points +! x/c y/c + 1.00000000000000e+00 -1.37905772906987e-04 + 9.76725991935908e-01 2.75905550847849e-03 + 9.53631351611733e-01 5.18607754339260e-03 + 9.30439467907717e-01 7.21116637405844e-03 + 9.07208132179710e-01 8.76441631458846e-03 + 8.84013496158046e-01 9.51161259804528e-03 + 8.60933319861523e-01 9.19547841137385e-03 + 8.38035712490432e-01 7.96595476402018e-03 + 8.15385168895348e-01 5.62847327150540e-03 + 7.93037657818789e-01 2.28558101061580e-03 + 7.71032949299981e-01 -1.90093741181228e-03 + 7.49384114270963e-01 -6.76049461633643e-03 + 7.28106510273087e-01 -1.21725858076415e-02 + 7.07180107191085e-01 -1.79684774976327e-02 + 6.86585882704839e-01 -2.39949416112886e-02 + 6.66322327664117e-01 -3.01870419451860e-02 + 6.46380042253330e-01 -3.64467876017566e-02 + 6.26744157329858e-01 -4.26868759536930e-02 + 6.07380274045402e-01 -4.87646156436792e-02 + 5.88295958690534e-01 -5.46605390281692e-02 + 5.69492521413567e-01 -6.03344111379996e-02 + 5.50944917753757e-01 -6.56813210738157e-02 + 5.32683529719922e-01 -7.07499443242120e-02 + 5.14706548079326e-01 -7.54948621351449e-02 + 4.97012214427392e-01 -7.98856360729547e-02 + 4.79604661938784e-01 -8.38829246167327e-02 + 4.62499971271577e-01 -8.75164861473946e-02 + 4.45707439025159e-01 -9.07910364185073e-02 + 4.29232251749769e-01 -9.36853302638665e-02 + 4.13079887518895e-01 -9.61843197334282e-02 + 3.97273156999330e-01 -9.83823772625506e-02 + 3.81811499955324e-01 -1.00238171273862e-01 + 3.66707654879754e-01 -1.01796983957391e-01 + 3.51968873020320e-01 -1.03118493586559e-01 + 3.37592692843044e-01 -1.04152291381984e-01 + 3.23583613955391e-01 -1.04892228070397e-01 + 3.09945962441104e-01 -1.05403595252986e-01 + 2.96679877893668e-01 -1.05689666745533e-01 + 2.83786673843868e-01 -1.05732022868329e-01 + 2.71265428998315e-01 -1.05601326789481e-01 + 2.59114641005256e-01 -1.05279433841182e-01 + 2.47334122817983e-01 -1.04772898258849e-01 + 2.35922762413987e-01 -1.04073450080798e-01 + 2.24871859339431e-01 -1.03261410015675e-01 + 2.14183854398850e-01 -1.02280347491613e-01 + 2.03856443420195e-01 -1.01137855951245e-01 + 1.93878365466042e-01 -9.98859412460872e-02 + 1.84243680326433e-01 -9.85473584321357e-02 + 1.74956557366324e-01 -9.70603160684741e-02 + 1.65996483607503e-01 -9.55230954068784e-02 + 1.57374597017771e-01 -9.38510527263059e-02 + 1.49055367342827e-01 -9.21872601100961e-02 + 1.41061804544547e-01 -9.04086149008263e-02 + 1.33371830662132e-01 -8.85813343893779e-02 + 1.25981833168783e-01 -8.67037376102544e-02 + 1.18889524396252e-01 -8.47556746420726e-02 + 1.12068484997073e-01 -8.28134777714908e-02 + 1.05533508673527e-01 -8.08202882655789e-02 + 9.92765954754487e-02 -7.87616970055698e-02 + 9.32618460232315e-02 -7.67377034670206e-02 + 8.75063188947793e-02 -7.46839878289475e-02 + 8.19865845292902e-02 -7.26460887111042e-02 + 7.66696758964058e-02 -7.06018837113606e-02 + 7.16044906719353e-02 -6.85025449105124e-02 + 6.67363367619081e-02 -6.63816283727544e-02 + 6.20862671655154e-02 -6.41837626120213e-02 + 5.76781158267178e-02 -6.19465872092337e-02 + 5.34835811930607e-02 -5.97092958338184e-02 + 4.94762917876905e-02 -5.75018783824138e-02 + 4.56743711349976e-02 -5.52907634791866e-02 + 4.20616172369434e-02 -5.30929364276299e-02 + 3.86426064710656e-02 -5.08998396737268e-02 + 3.54153788093397e-02 -4.87062512082961e-02 + 3.23662010540160e-02 -4.65256202361847e-02 + 2.94833263627923e-02 -4.43663553536911e-02 + 2.67477674550665e-02 -4.22428674968400e-02 + 2.41915370057616e-02 -4.01273164512632e-02 + 2.18857573818062e-02 -3.80078237337925e-02 + 1.97179884024849e-02 -3.59301627477569e-02 + 1.76757845498892e-02 -3.38938481159999e-02 + 1.57641027306169e-02 -3.18781262584388e-02 + 1.39724593422236e-02 -2.98931987545935e-02 + 1.22918968479213e-02 -2.79480618328304e-02 + 1.07221372201749e-02 -2.60416137215328e-02 + 9.28872160500910e-03 -2.41314304207875e-02 + 7.91630048953282e-03 -2.22853322080103e-02 + 6.67953167608040e-03 -2.04480781470025e-02 + 5.57389618300349e-03 -1.86324963909326e-02 + 4.56332093730877e-03 -1.68598162507488e-02 + 3.68524480226045e-03 -1.51108431623255e-02 + 2.91938579202685e-03 -1.33953381237321e-02 + 2.24116079129066e-03 -1.17246173969605e-02 + 1.67248583161617e-03 -1.00953735229212e-02 + 1.20324454848532e-03 -8.50604304796152e-03 + 8.41606529174913e-04 -6.95951603892573e-03 + 5.04718335749302e-04 -5.47175146445821e-03 + 2.77648316387901e-04 -4.02638290581776e-03 + 1.17748797893260e-04 -2.63253995295761e-03 + 3.69468292642352e-05 -1.28969548263411e-03 + 0.00000000000000e+00 0.00000000000000e+00 + 3.09535021918612e-05 1.28936436929246e-03 + 1.06637401949987e-04 2.63142100210815e-03 + 2.59964572072159e-04 4.02351019908418e-03 + 4.69920111426106e-04 5.46706336175963e-03 + 7.96541452526313e-04 6.95306199333623e-03 + 1.17401205379525e-03 8.48786363886347e-03 + 1.61831089593917e-03 1.00770346353190e-02 + 2.32333874774940e-03 1.16504559884271e-02 + 3.06712959817167e-03 1.32804282822632e-02 + 3.98276803748560e-03 1.49090049113570e-02 + 4.98344743343845e-03 1.65770603791945e-02 + 6.11996090735756e-03 1.82551557640217e-02 + 7.37297343445192e-03 1.99533035573824e-02 + 8.71286539087883e-03 2.16948370578646e-02 + 1.01765501551493e-02 2.34537701968742e-02 + 1.17322670694759e-02 2.52581891303742e-02 + 1.34217992141067e-02 2.70733747583812e-02 + 1.52388298301360e-02 2.89063564237294e-02 + 1.71688461558914e-02 3.07767937542747e-02 + 1.91899331878790e-02 3.27097377805680e-02 + 2.13638093661363e-02 3.46457797783486e-02 + 2.36723297656305e-02 3.66070405437775e-02 + 2.61211854117630e-02 3.85883561887161e-02 + 2.87097811699761e-02 4.06004475067315e-02 + 3.14304301249726e-02 4.26557978654197e-02 + 3.42931270832587e-02 4.47486944963130e-02 + 3.73038188445460e-02 4.68776749211300e-02 + 4.04730361230994e-02 4.90353694174481e-02 + 4.38097981156242e-02 5.12147401773910e-02 + 4.73220204778543e-02 5.34122475810596e-02 + 5.09939923040230e-02 5.56608916859612e-02 + 5.48571252255563e-02 5.79155152658394e-02 + 5.89138291139096e-02 6.01837002893103e-02 + 6.31577497344129e-02 6.24845191863370e-02 + 6.75947899647940e-02 6.48186842922515e-02 + 7.22122652229698e-02 6.72216823767386e-02 + 7.70740114758716e-02 6.95807319849553e-02 + 8.21553322345438e-02 7.19550902719777e-02 + 8.74394236745447e-02 7.43941379373109e-02 + 9.29672017196781e-02 7.68226772209049e-02 + 9.87424021686052e-02 7.91978116359561e-02 + 1.04761752867740e-01 8.15667320414124e-02 + 1.11030780081871e-01 8.39572315421679e-02 + 1.17558018563720e-01 8.63625746301939e-02 + 1.24352270186846e-01 8.87774608495421e-02 + 1.31438105054613e-01 9.11321173164249e-02 + 1.38801313550205e-01 9.35029309525731e-02 + 1.46447393656373e-01 9.58971156573319e-02 + 1.54396766312990e-01 9.82613258248415e-02 + 1.62656569565700e-01 1.00588261686332e-01 + 1.71235347766832e-01 1.02865843879122e-01 + 1.80142279870852e-01 1.05076149462146e-01 + 1.89373799652761e-01 1.07269345993908e-01 + 1.98933590722142e-01 1.09443191127768e-01 + 2.08836636556623e-01 1.11554276573076e-01 + 2.19099471288483e-01 1.13540075332887e-01 + 2.29717904676441e-01 1.15442617819263e-01 + 2.40701766215834e-01 1.17220973164961e-01 + 2.52050933191971e-01 1.18911560197852e-01 + 2.63767077262110e-01 1.20517086973916e-01 + 2.75865949946677e-01 1.21934154882854e-01 + 2.88343581116220e-01 1.23201688742876e-01 + 3.01205334203085e-01 1.24270880831573e-01 + 3.14453408998862e-01 1.25097439258154e-01 + 3.28085392677879e-01 1.25681829879209e-01 + 3.42100675917614e-01 1.25997636647737e-01 + 3.56494768423971e-01 1.25962526629538e-01 + 3.71264984512598e-01 1.25638758942093e-01 + 3.86403905621335e-01 1.24988484201363e-01 + 4.01909708696471e-01 1.24068994185517e-01 + 4.17777487590764e-01 1.22870793211783e-01 + 4.34002789914367e-01 1.21403723025625e-01 + 4.50587361686721e-01 1.19722425477543e-01 + 4.67516097146081e-01 1.17745691253289e-01 + 4.84783008098729e-01 1.15478338348871e-01 + 5.02391973551338e-01 1.12996226374276e-01 + 5.20335411416213e-01 1.10293881931109e-01 + 5.38598443680468e-01 1.07327040011182e-01 + 5.57179445389403e-01 1.04143490655964e-01 + 5.76073870986909e-01 1.00758354775127e-01 + 5.95273625837750e-01 9.71818954906031e-02 + 6.14761209512960e-01 9.33892639430016e-02 + 6.34522016454894e-01 8.93721485884786e-02 + 6.54559394245177e-01 8.52121018071187e-02 + 6.74862300856641e-01 8.08992604208061e-02 + 6.95411169374383e-01 7.64180821116692e-02 + 7.16203679512635e-01 7.18100281693020e-02 + 7.37223461079002e-01 6.70709646616096e-02 + 7.58454521150695e-01 6.22070114365566e-02 + 7.79880103179641e-01 5.72143218232588e-02 + 8.01483398149160e-01 5.20988678810583e-02 + 8.23246404130259e-01 4.68667510151217e-02 + 8.45150485874660e-01 4.15319681044740e-02 + 8.67192695150624e-01 3.61314252690582e-02 + 8.89338539461505e-01 3.06353825258196e-02 + 9.11585423298854e-01 2.50909095333333e-02 + 9.33894494503434e-01 1.94679731415527e-02 + 9.56251121560769e-01 1.33384432495636e-02 + 9.78619325570430e-01 6.83697775457594e-03 + 1.00000000000000e+00 2.05198748460235e-04 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF23_Coords.txt b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF23_Coords.txt new file mode 100644 index 000000000..b7ccee656 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF23_Coords.txt @@ -0,0 +1,208 @@ + 201 NumCoords ! The number of coordinates in the airfoil shape file (including an extra coordinate for airfoil reference). Set to zero if coordinates not included. +! ......... x-y coordinates are next if NumCoords > 0 ............. +! x-y coordinate of airfoil reference +! x/c y/c + 0.250000 0 +! coordinates of airfoil shape +! interpolation to 200 points +! x/c y/c + 1.00000000000000e+00 -3.89631805446465e-04 + 9.76523223440909e-01 2.57752479218257e-03 + 9.53190468875220e-01 5.08428616099728e-03 + 9.29793700110228e-01 7.19463079459903e-03 + 9.06373069230989e-01 8.83683936265999e-03 + 8.82989474321167e-01 9.75643931673717e-03 + 8.59712867174704e-01 9.61496203663975e-03 + 8.36607653336429e-01 8.67096288412905e-03 + 8.13736696364153e-01 6.61459865723342e-03 + 7.91156003915796e-01 3.56436965978782e-03 + 7.68908626920759e-01 -3.19229213119966e-04 + 7.47012054504006e-01 -4.87284377280892e-03 + 7.25479893786865e-01 -9.96177887707548e-03 + 7.04301598747634e-01 -1.54349458980302e-02 + 6.83461873027533e-01 -2.11434442792537e-02 + 6.62962284386421e-01 -2.70203050251467e-02 + 6.42791629284883e-01 -3.29619235742479e-02 + 6.22938362223096e-01 -3.88812963489969e-02 + 6.03377191897424e-01 -4.46577924076831e-02 + 5.84113605921901e-01 -5.02638611712951e-02 + 5.65147058057943e-01 -5.56526737727627e-02 + 5.46463242401931e-01 -6.07476183166026e-02 + 5.28083600651341e-01 -6.55730561886808e-02 + 5.10007892084025e-01 -7.00900567751652e-02 + 4.92236196987507e-01 -7.42679957358169e-02 + 4.74773357090323e-01 -7.80766311425804e-02 + 4.57634431292357e-01 -8.15460818492506e-02 + 4.40826245471248e-01 -8.46702707193481e-02 + 4.24355029015101e-01 -8.74363864527718e-02 + 4.08227124292632e-01 -8.98419112116650e-02 + 3.92459570866590e-01 -9.19539503766752e-02 + 3.77053268096062e-01 -9.37469616449339e-02 + 3.62017890326388e-01 -9.52572816145339e-02 + 3.47358922971653e-01 -9.65314596619472e-02 + 3.33074130797390e-01 -9.75316311345544e-02 + 3.19166552441191e-01 -9.82568017865109e-02 + 3.05638457789601e-01 -9.87570424765259e-02 + 2.92489196946871e-01 -9.90352109981780e-02 + 2.79718896446607e-01 -9.90816142636686e-02 + 2.67325715523272e-01 -9.89532661236331e-02 + 2.55307554299133e-01 -9.86395210813088e-02 + 2.43662963759620e-01 -9.81468679323721e-02 + 2.32389051593200e-01 -9.74790188542946e-02 + 2.21479352444559e-01 -9.66892453470001e-02 + 2.10932960713701e-01 -9.57430626738486e-02 + 2.00746891023561e-01 -9.46523604003965e-02 + 1.90911241857401e-01 -9.34530543544128e-02 + 1.81419357741535e-01 -9.21641429584474e-02 + 1.72272201518936e-01 -9.07467422355202e-02 + 1.63454036160759e-01 -8.92690930011261e-02 + 1.54968504898213e-01 -8.76805069244906e-02 + 1.46789032362938e-01 -8.60792825829244e-02 + 1.38929389926432e-01 -8.43836334579841e-02 + 1.31372073509835e-01 -8.26402323580097e-02 + 1.24111669738838e-01 -8.08497501671892e-02 + 1.17144601558583e-01 -7.89996633722882e-02 + 1.10449627383806e-01 -7.71449373419936e-02 + 1.04032527949034e-01 -7.52514037061188e-02 + 9.78887241867816e-02 -7.33057936883226e-02 + 9.19902897469441e-02 -7.13774864507213e-02 + 8.63446174524882e-02 -6.94278850804577e-02 + 8.09349931912135e-02 -6.74837749535468e-02 + 7.57176279736417e-02 -6.55345654926341e-02 + 7.07422636872318e-02 -6.35487599075303e-02 + 6.59681013466920e-02 -6.15577280140700e-02 + 6.14091796784638e-02 -5.95276219887417e-02 + 5.70825310884753e-02 -5.74696232341217e-02 + 5.29640917916176e-02 -5.54139826908802e-02 + 4.90331099431885e-02 -5.33787557780121e-02 + 4.53019232083321e-02 -5.13412852201466e-02 + 4.17564728311483e-02 -4.93141304770355e-02 + 3.83992522495016e-02 -4.72921118209637e-02 + 3.52273324651378e-02 -4.52718650652909e-02 + 3.22287783868937e-02 -4.32621299402485e-02 + 2.93935765607861e-02 -4.12701495319455e-02 + 2.67049962322860e-02 -3.93074868211488e-02 + 2.41875159700224e-02 -3.73546300420540e-02 + 2.19051355335849e-02 -3.54024649802942e-02 + 1.97596598780863e-02 -3.34865723449696e-02 + 1.77404917592603e-02 -3.16046902103228e-02 + 1.58480959117786e-02 -2.97420661384396e-02 + 1.40731937772208e-02 -2.79068578544306e-02 + 1.24092192372854e-02 -2.61060448917434e-02 + 1.08572800374988e-02 -2.43371683353192e-02 + 9.42416939885715e-03 -2.25730887258294e-02 + 8.05945666798942e-03 -2.08575096912792e-02 + 6.81900211726789e-03 -1.91549248355902e-02 + 5.70427188596224e-03 -1.74708678303986e-02 + 4.68929550551071e-03 -1.58203951766527e-02 + 3.79718481534846e-03 -1.41925025018919e-02 + 3.01254414274189e-03 -1.25940941416061e-02 + 2.32306506044275e-03 -1.10313592778986e-02 + 1.73616370284593e-03 -9.50573827422768e-03 + 1.25001115654578e-03 -8.01464961151014e-03 + 8.66582941084615e-04 -6.56215809631841e-03 + 5.27892943221305e-04 -5.15982819826281e-03 + 2.90620181051750e-04 -3.79793930383067e-03 + 1.24304967749036e-04 -2.48335242246912e-03 + 3.96737576866571e-05 -1.21650060438702e-03 + 0.00000000000000e+00 0.00000000000000e+00 + 2.95189184277812e-05 1.21614429607452e-03 + 1.05767060451514e-04 2.48286216056600e-03 + 2.57762778152470e-04 3.79720959162143e-03 + 4.68204860110995e-04 5.16008910759149e-03 + 7.83797140932723e-04 6.56497526010459e-03 + 1.15715502367995e-03 8.01500849124157e-03 + 1.60204509969143e-03 9.51313492711731e-03 + 2.26838290451738e-03 1.10094565184360e-02 + 2.98389530162135e-03 1.25531639212653e-02 + 3.84468300573088e-03 1.41052049491652e-02 + 4.79382432709198e-03 1.56929490788932e-02 + 5.86480251491728e-03 1.72970451450205e-02 + 7.04339712537743e-03 1.89252483507722e-02 + 8.31036366558127e-03 2.05930697348407e-02 + 9.69288686144440e-03 2.22822382309425e-02 + 1.11694244157683e-02 2.40125728679872e-02 + 1.27687195678609e-02 2.57610052570714e-02 + 1.44855480622724e-02 2.75340521574697e-02 + 1.63141117762223e-02 2.93431371358707e-02 + 1.82409459730255e-02 3.12044757360750e-02 + 2.03090129151232e-02 3.30784440112194e-02 + 2.25047656211822e-02 3.49825288350549e-02 + 2.48358954405978e-02 3.69102907266350e-02 + 2.73027851057594e-02 3.88709280586456e-02 + 2.99022786432083e-02 4.08708020979388e-02 + 3.26428835363264e-02 4.29073735254742e-02 + 3.55275801260422e-02 4.49815642845116e-02 + 3.85675366725734e-02 4.70868993056664e-02 + 4.17712151330545e-02 4.92166052451779e-02 + 4.51455848984656e-02 5.13693116705787e-02 + 4.86800832975236e-02 5.35697871829730e-02 + 5.23998258242555e-02 5.57840039693155e-02 + 5.63090699963194e-02 5.80167300546564e-02 + 6.04040077958621e-02 6.02830393557848e-02 + 6.46921254503434e-02 6.25806625362446e-02 + 6.91657933196187e-02 6.49357139206047e-02 + 7.38718601029010e-02 6.72692279831682e-02 + 7.87963189404003e-02 6.96202880139496e-02 + 8.39284216127343e-02 7.20249986111878e-02 + 8.93005278379212e-02 7.44277079926884e-02 + 9.49165785178080e-02 7.68080305069524e-02 + 1.00776596462740e-01 7.91941589367465e-02 + 1.06887992955234e-01 8.15979852235107e-02 + 1.13259326028114e-01 8.40133348371362e-02 + 1.19898645623439e-01 8.64376453292622e-02 + 1.26825363129969e-01 8.88246082279034e-02 + 1.34032996617006e-01 9.12209273262398e-02 + 1.41527923866446e-01 9.36300218950618e-02 + 1.49326736108375e-01 9.60160327660242e-02 + 1.57437264377705e-01 9.83712642438628e-02 + 1.65868324600152e-01 1.00685218752554e-01 + 1.74628718266615e-01 1.02944937223580e-01 + 1.83718250107745e-01 1.05182085806860e-01 + 1.93143977808745e-01 1.07387673596204e-01 + 2.02916723675256e-01 1.09537420256945e-01 + 2.13052007685298e-01 1.11578803647391e-01 + 2.23549653724373e-01 1.13536674601117e-01 + 2.34418102657221e-01 1.15382216081547e-01 + 2.45660047881914e-01 1.17132423550172e-01 + 2.57277821794247e-01 1.18790833197830e-01 + 2.69285661481619e-01 1.20274563173763e-01 + 2.81681435328113e-01 1.21610792504416e-01 + 2.94471299405458e-01 1.22753207590004e-01 + 3.07657839217654e-01 1.23665554126748e-01 + 3.21240423603742e-01 1.24335192568048e-01 + 3.35218492732312e-01 1.24739126354752e-01 + 3.49588853515411e-01 1.24807697648437e-01 + 3.64348393745959e-01 1.24573091480070e-01 + 3.79490557018895e-01 1.24009550543367e-01 + 3.95013008833302e-01 1.23166425873097e-01 + 4.10911230551784e-01 1.22040125894596e-01 + 4.27181368064296e-01 1.20643690185419e-01 + 4.43822979334143e-01 1.19012214211741e-01 + 4.60825027599087e-01 1.17096430824897e-01 + 4.78180176231373e-01 1.14887296599190e-01 + 4.95890785853081e-01 1.12452966207322e-01 + 5.13949537326196e-01 1.09787047252637e-01 + 5.32343642071341e-01 1.06859196176221e-01 + 5.51070553747742e-01 1.03710967331665e-01 + 5.70123937401839e-01 1.00351455565678e-01 + 5.89495628773574e-01 9.67909361070087e-02 + 6.09171898570426e-01 9.30211098562286e-02 + 6.29138822745811e-01 8.90355090111987e-02 + 6.49394868003684e-01 8.49035724050775e-02 + 6.69928293397831e-01 8.06107601158379e-02 + 6.90722533013325e-01 7.61534793554206e-02 + 7.11772271356487e-01 7.15640092699005e-02 + 7.33060707027799e-01 6.68388174833136e-02 + 7.54571508751324e-01 6.19858692115997e-02 + 7.76286826841553e-01 5.69994231785712e-02 + 7.98189415948090e-01 5.18865779509044e-02 + 8.20260703237170e-01 4.66547433653687e-02 + 8.42482201370411e-01 4.13224819490564e-02 + 8.64845816185461e-01 3.59114363001708e-02 + 8.87320554539452e-01 3.04068317544367e-02 + 9.09898081718863e-01 2.48403197190891e-02 + 9.32544737844051e-01 1.92037035893727e-02 + 9.55244628007707e-01 1.31962135682704e-02 + 9.77960328149588e-01 6.92447736867692e-03 + 1.00000000000000e+00 5.33569410323788e-04 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF24_Coords.txt b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF24_Coords.txt new file mode 100644 index 000000000..dee2a6739 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF24_Coords.txt @@ -0,0 +1,208 @@ + 201 NumCoords ! The number of coordinates in the airfoil shape file (including an extra coordinate for airfoil reference). Set to zero if coordinates not included. +! ......... x-y coordinates are next if NumCoords > 0 ............. +! x-y coordinate of airfoil reference +! x/c y/c + 0.250000 0 +! coordinates of airfoil shape +! interpolation to 200 points +! x/c y/c + 1.00000000000000e+00 -7.50291333776672e-04 + 9.76298896194702e-01 2.32889115261073e-03 + 9.52696096636841e-01 4.94521028450639e-03 + 9.29060312605788e-01 7.15692894407718e-03 + 9.05417910316586e-01 8.89067899641578e-03 + 8.81816184123139e-01 9.89569835581813e-03 + 8.58317705959904e-01 9.84322267766306e-03 + 8.34983301808537e-01 9.04823588658875e-03 + 8.11873434560873e-01 7.18374392840931e-03 + 7.89043919534343e-01 4.37297375841967e-03 + 7.66539540795448e-01 7.44223479357781e-04 + 7.44381391909662e-01 -3.54660860602751e-03 + 7.22581240917263e-01 -8.35156649411918e-03 + 7.01137346622867e-01 -1.35373495193734e-02 + 6.80039693873756e-01 -1.89641771354476e-02 + 6.59290364533785e-01 -2.45571754348028e-02 + 6.38878859868852e-01 -3.02132879449722e-02 + 6.18795535800661e-01 -3.58428941592947e-02 + 5.99025214360609e-01 -4.13502377144402e-02 + 5.79571063345178e-01 -4.66989833430834e-02 + 5.60430857912260e-01 -5.18361266758138e-02 + 5.41600549487872e-01 -5.67126894278324e-02 + 5.23093012388221e-01 -6.13292557711388e-02 + 5.04909716783247e-01 -6.56538953621398e-02 + 4.87051293227111e-01 -6.96530548678958e-02 + 4.69524243044734e-01 -7.33080529423055e-02 + 4.52341821294675e-01 -7.66472468360973e-02 + 4.35508589614116e-01 -7.96544207222355e-02 + 4.19030914862448e-01 -8.23226920725703e-02 + 4.02916228417393e-01 -8.46623466695113e-02 + 3.87175637539370e-01 -8.67119738820041e-02 + 3.71811428132166e-01 -8.84606569575440e-02 + 3.56830409304917e-01 -8.99353602919689e-02 + 3.42236645717252e-01 -9.11689881156119e-02 + 3.28028443529475e-01 -9.21352973252990e-02 + 3.14207871794200e-01 -9.28394446226089e-02 + 3.00775731152437e-01 -9.33148765751533e-02 + 2.87731091983130e-01 -9.35649492324365e-02 + 2.75073270707374e-01 -9.35897732815692e-02 + 2.62799911559184e-01 -9.34332051784304e-02 + 2.50908328649408e-01 -9.30938200207195e-02 + 2.39395914296969e-01 -9.25789080830780e-02 + 2.28258324217990e-01 -9.19038525166016e-02 + 2.17490357613613e-01 -9.10978135960199e-02 + 2.07088466750961e-01 -9.01469095785202e-02 + 1.97047806459751e-01 -8.90697005309464e-02 + 1.87360260340612e-01 -8.78852780089872e-02 + 1.78018682210870e-01 -8.66086122363040e-02 + 1.69020258315682e-01 -8.52244126115397e-02 + 1.60353331264926e-01 -8.37720812851559e-02 + 1.52014939197557e-01 -8.22330718969560e-02 + 1.43987185788990e-01 -8.06620558758565e-02 + 1.36274091000982e-01 -7.90182608959080e-02 + 1.28862566102960e-01 -7.73292710854366e-02 + 1.21745655831401e-01 -7.55977296970018e-02 + 1.14917898957625e-01 -7.38189265766767e-02 + 1.08363637615901e-01 -7.20267149673762e-02 + 1.02080415985040e-01 -7.02081908521227e-02 + 9.60650562136330e-02 -6.83524876726988e-02 + 9.02979483004230e-02 -6.64992618936153e-02 + 8.47777986078614e-02 -6.46338463331624e-02 + 7.94941040279597e-02 -6.27654801484029e-02 + 7.44102991938022e-02 -6.08945434432346e-02 + 6.95582747844778e-02 -5.90057327945389e-02 + 6.49131793283190e-02 -5.71216563862163e-02 + 6.04794197269670e-02 -5.52290978859873e-02 + 5.62646886835696e-02 -5.33218521504249e-02 + 5.22507416096869e-02 -5.14208493808622e-02 + 4.84245433996503e-02 -4.95323182851412e-02 + 4.47904867206598e-02 -4.76449015546858e-02 + 4.13374558635882e-02 -4.57663829252569e-02 + 3.80650840253715e-02 -4.38944940923365e-02 + 3.49691116419480e-02 -4.20279518522186e-02 + 3.20400727373755e-02 -4.01712967041496e-02 + 2.92703341033774e-02 -3.83301218257238e-02 + 2.66462635908786e-02 -3.65121714900467e-02 + 2.41819941212201e-02 -3.47068073590117e-02 + 2.19143199986438e-02 -3.29088330701643e-02 + 1.97796258019261e-02 -3.11426553752093e-02 + 1.77718675728929e-02 -2.94033561455842e-02 + 1.58892791802320e-02 -2.76827467855728e-02 + 1.41231129715086e-02 -2.59874713046408e-02 + 1.24680257561555e-02 -2.43219224431366e-02 + 1.09259070704779e-02 -2.26820710355976e-02 + 9.49343298356482e-03 -2.10561306903018e-02 + 8.14503768413817e-03 -1.94635072722990e-02 + 6.90999917273266e-03 -1.78889094607232e-02 + 5.79390475471148e-03 -1.63307209071248e-02 + 4.78106804114271e-03 -1.47978940894094e-02 + 3.88016584757143e-03 -1.32873649605637e-02 + 3.08233798054177e-03 -1.18026200908121e-02 + 2.38686534170238e-03 -1.03450301564476e-02 + 1.78599805341179e-03 -8.92081233071476e-03 + 1.28652156378685e-03 -7.52634471004791e-03 + 8.83996769448488e-04 -6.16669016705767e-03 + 5.46612029292912e-04 -4.84894257335285e-03 + 3.01376049559927e-04 -3.56996967423148e-03 + 1.30154076571712e-04 -2.33432457843823e-03 + 4.21374163304318e-05 -1.14334359217422e-03 + 0.00000000000000e+00 0.00000000000000e+00 + 2.81157574964881e-05 1.14295937760577e-03 + 1.04621923266427e-04 2.33440626401102e-03 + 2.54739066947636e-04 3.57120735782472e-03 + 4.65849257103884e-04 4.85377645755166e-03 + 7.66296706792806e-04 6.17820210329396e-03 + 1.13400710680486e-03 7.54436835218198e-03 + 1.57970905045129e-03 8.95240763421855e-03 + 2.19446599887451e-03 1.03731283301651e-02 + 2.87705684559474e-03 1.18324568030195e-02 + 3.67789371859726e-03 1.33102740954264e-02 + 4.57036584246313e-03 1.48203416608747e-02 + 5.56967498060080e-03 1.63537813005310e-02 + 6.66759090523285e-03 1.79156766085822e-02 + 7.85649334745409e-03 1.95131911485843e-02 + 9.15255477687989e-03 2.11363600124788e-02 + 1.05445488424763e-02 2.27966579112874e-02 + 1.20486064407746e-02 2.44823719840950e-02 + 1.36603871932619e-02 2.61996974106957e-02 + 1.53821576127598e-02 2.79522040521000e-02 + 1.72090722971723e-02 2.97472094765997e-02 + 1.91651219523706e-02 3.15651260035317e-02 + 2.12426156558742e-02 3.34176370326924e-02 + 2.34511443758688e-02 3.52973320141773e-02 + 2.57904895361023e-02 3.72130957307203e-02 + 2.82626509750913e-02 3.91646919322919e-02 + 3.08759739857624e-02 4.11514060005145e-02 + 3.36299253040576e-02 4.31771896078588e-02 + 3.65354985842998e-02 4.52371794325495e-02 + 3.96008704268746e-02 4.73246766888027e-02 + 4.28321561070921e-02 4.94404029988426e-02 + 4.62242346874908e-02 5.16004112773017e-02 + 4.97958902647260e-02 5.37820404238713e-02 + 5.35528496536011e-02 5.59876066111493e-02 + 5.74940264314054e-02 5.82280097517281e-02 + 6.16289114941267e-02 6.04973177565880e-02 + 6.59549586653717e-02 6.28123067599801e-02 + 7.05011791699481e-02 6.51291026479873e-02 + 7.52646676807933e-02 6.74659569979716e-02 + 8.02411483868892e-02 6.98450349458632e-02 + 8.54541005536459e-02 7.22307435968477e-02 + 9.09077876598320e-02 7.46202759272474e-02 + 9.66055445093218e-02 7.70252439848328e-02 + 1.02556617968726e-01 7.94445037398437e-02 + 1.08769595464231e-01 8.18723919264446e-02 + 1.15251846243329e-01 8.43087989893419e-02 + 1.22017436032429e-01 8.67299569776199e-02 + 1.29067606508560e-01 8.91543819424277e-02 + 1.36410072520413e-01 9.15812636222036e-02 + 1.44057372467977e-01 9.39916412991629e-02 + 1.52018009642350e-01 9.63774884768607e-02 + 1.60301083370340e-01 9.87298228910894e-02 + 1.68915004119298e-01 1.01040503878498e-01 + 1.77863375679202e-01 1.03322385460583e-01 + 1.87155863329685e-01 1.05561389941643e-01 + 1.96799541214523e-01 1.07750710152026e-01 + 2.06809021346131e-01 1.09847473640509e-01 + 2.17187694050625e-01 1.11860752579225e-01 + 2.27942920264959e-01 1.13772677888835e-01 + 2.39080425704280e-01 1.15580120940451e-01 + 2.50602978823008e-01 1.17288028936626e-01 + 2.62523055501980e-01 1.18833856236034e-01 + 2.74840647475125e-01 1.20232024719622e-01 + 2.87562192937226e-01 1.21441226349321e-01 + 3.00690830602118e-01 1.22430852727519e-01 + 3.14227523639263e-01 1.23178402093805e-01 + 3.28171801048535e-01 1.23663484726724e-01 + 3.42521760498053e-01 1.23828016318311e-01 + 3.57273986043832e-01 1.23678074838371e-01 + 3.72422815778781e-01 1.23198599341217e-01 + 3.87965402200350e-01 1.22429097089126e-01 + 4.03897678601998e-01 1.21373131778580e-01 + 4.20216289788358e-01 1.20045527577897e-01 + 4.36918952632428e-01 1.18464558254558e-01 + 4.53998170716250e-01 1.16608654175239e-01 + 4.71445818375774e-01 1.14459171027755e-01 + 4.89262561234794e-01 1.12074715982259e-01 + 5.07441163553935e-01 1.09446574254448e-01 + 5.25971148178741e-01 1.06560361311888e-01 + 5.44848798428680e-01 1.03449434794008e-01 + 5.64066277235567e-01 1.00118102629513e-01 + 5.83615080942241e-01 9.65751507526858e-02 + 6.03485053765207e-01 9.28288280428212e-02 + 6.23663294928140e-01 8.88766391764726e-02 + 6.44143290404599e-01 8.47640847275778e-02 + 6.64912691365091e-01 8.04820587812154e-02 + 6.85957565742361e-01 7.60375257877561e-02 + 7.07269770163650e-01 7.14578896712954e-02 + 7.28832031023755e-01 6.67399716333503e-02 + 7.50627928640914e-01 6.18927779581912e-02 + 7.72638273090132e-01 5.69095365551616e-02 + 7.94845273313031e-01 5.17979358377091e-02 + 8.17229952512696e-01 4.65661010560639e-02 + 8.39774418012758e-01 4.12350839199444e-02 + 8.62464948057395e-01 3.58183297895103e-02 + 8.85273913513708e-01 3.03089834179839e-02 + 9.08187630633643e-01 2.47304583972593e-02 + 9.31177783406441e-01 1.90863321564750e-02 + 9.54226411846771e-01 1.31957781659379e-02 + 9.77294204499900e-01 7.13558621173920e-03 + 1.00000000000000e+00 9.69484227912823e-04 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF25_Coords.txt b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF25_Coords.txt new file mode 100644 index 000000000..f5baf4581 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF25_Coords.txt @@ -0,0 +1,208 @@ + 201 NumCoords ! The number of coordinates in the airfoil shape file (including an extra coordinate for airfoil reference). Set to zero if coordinates not included. +! ......... x-y coordinates are next if NumCoords > 0 ............. +! x-y coordinate of airfoil reference +! x/c y/c + 0.250000 0 +! coordinates of airfoil shape +! interpolation to 200 points +! x/c y/c + 1.00000000000000e+00 -1.09250671868000e-03 + 9.76115586099618e-01 2.09600510332978e-03 + 9.52288294552172e-01 4.81417885933177e-03 + 9.28450060797343e-01 7.11490117592222e-03 + 9.04619297601449e-01 8.92329765774539e-03 + 8.80834074284664e-01 9.95340950185301e-03 + 8.57151659839586e-01 9.92756319875484e-03 + 8.33630254563209e-01 9.17783270101517e-03 + 8.10328015134571e-01 7.42012067290446e-03 + 7.87300463622396e-01 4.77516783787571e-03 + 7.64592703953390e-01 1.32624859090481e-03 + 7.42228033108644e-01 -2.77682728463799e-03 + 7.20216772646893e-01 -7.37607048945225e-03 + 6.98563400687629e-01 -1.23524458090196e-02 + 6.77262887692173e-01 -1.75755523866722e-02 + 6.56316064999009e-01 -2.29614286738159e-02 + 6.35714570806867e-01 -2.84102836191219e-02 + 6.15449288352083e-01 -3.38290876998397e-02 + 5.95513325480546e-01 -3.91424755035297e-02 + 5.75907942700664e-01 -4.43068439562326e-02 + 5.56629760363534e-01 -4.92645154005323e-02 + 5.37682173510500e-01 -5.39873548651573e-02 + 5.19071820661838e-01 -5.84578413099440e-02 + 5.00801555954315e-01 -6.26495762564164e-02 + 4.82871601768206e-01 -6.65256315806630e-02 + 4.65290321806567e-01 -7.00771541943242e-02 + 4.48069107802193e-01 -7.33303008744292e-02 + 4.31210942377935e-01 -7.62613694929760e-02 + 4.14721717256527e-01 -7.88670112627226e-02 + 3.98609830485640e-01 -8.11674486204708e-02 + 3.82881803238740e-01 -8.31789010896421e-02 + 3.67540922501510e-01 -8.49011792837672e-02 + 3.52591959359744e-01 -8.63538669976877e-02 + 3.38038125513927e-01 -8.75591661511401e-02 + 3.23878337769632e-01 -8.84993826488772e-02 + 3.10114246734585e-01 -8.91848244796117e-02 + 2.96745918134662e-01 -8.96356484654719e-02 + 2.83772536979569e-01 -8.98560569285609e-02 + 2.71193048529533e-01 -8.98541970412896e-02 + 2.59004966514683e-01 -8.96641882545778e-02 + 2.47205169565799e-01 -8.92924468430343e-02 + 2.35790240472659e-01 -8.87473051941079e-02 + 2.24754947680772e-01 -8.80529555951448e-02 + 2.14094425301211e-01 -8.72214656839783e-02 + 2.03803579375793e-01 -8.62541002544239e-02 + 1.93875405543264e-01 -8.51751516327919e-02 + 1.84303408655320e-01 -8.39908637540001e-02 + 1.75080215317279e-01 -8.27132159406177e-02 + 1.66199793240435e-01 -8.13445725448274e-02 + 1.57653122663062e-01 -7.99033042566852e-02 + 1.49432819276280e-01 -7.83940014030634e-02 + 1.41527369025976e-01 -7.68397516570057e-02 + 1.33933094840571e-01 -7.52295246442809e-02 + 1.26640143243466e-01 -7.35770567956669e-02 + 1.19640559393263e-01 -7.18863418890472e-02 + 1.12927077813054e-01 -7.01581195662533e-02 + 1.06488519837237e-01 -6.84113181275732e-02 + 1.00316701895756e-01 -6.66480482070258e-02 + 9.44082133574360e-02 -6.48587314973944e-02 + 8.87499483874507e-02 -6.30623827083626e-02 + 8.33346753623294e-02 -6.12610269188888e-02 + 7.81562621654159e-02 -5.94517874653428e-02 + 7.31951432238743e-02 -5.76424972836634e-02 + 6.84577626403403e-02 -5.58286777757905e-02 + 6.39326342358596e-02 -5.40173864513933e-02 + 5.96152121769926e-02 -5.22094494493164e-02 + 5.55045079578264e-02 -5.03979483760663e-02 + 5.15876859053906e-02 -4.85965280700871e-02 + 4.78588835860377e-02 -4.68025488097465e-02 + 4.43151088293809e-02 -4.50134393598166e-02 + 4.09479814741917e-02 -4.32331507155101e-02 + 3.77544761371438e-02 -4.14613164257821e-02 + 3.47290964996220e-02 -3.96983685901773e-02 + 3.18646716164714e-02 -3.79460007064151e-02 + 2.91557807064150e-02 -3.62082493349325e-02 + 2.65916717593254e-02 -3.44893521422311e-02 + 2.41768614668749e-02 -3.27857249071581e-02 + 2.19169363744281e-02 -3.10958697248329e-02 + 1.97853574099944e-02 -2.94351217148795e-02 + 1.77809502328637e-02 -2.77959928991413e-02 + 1.59012923654057e-02 -2.61756147968822e-02 + 1.41377791124355e-02 -2.45798265623274e-02 + 1.24854340081653e-02 -2.30107015135764e-02 + 1.09463949529226e-02 -2.14628875680232e-02 + 9.51420326071247e-03 -1.99362443503988e-02 + 8.18367131774184e-03 -1.84317002704562e-02 + 6.95781355369571e-03 -1.69495477016988e-02 + 5.84461757031922e-03 -1.54828594722959e-02 + 4.83675987451319e-03 -1.40360192911298e-02 + 3.93148210889690e-03 -1.26118037509212e-02 + 3.12597705524147e-03 -1.12107577936507e-02 + 2.42827959498203e-03 -9.83080813631348e-03 + 1.81848159181735e-03 -8.48180028772974e-03 + 1.31026857339993e-03 -7.15931186006862e-03 + 8.94028566689473e-04 -5.86904696569661e-03 + 5.59139659541858e-04 -4.61467241237522e-03 + 3.08713803920484e-04 -3.39799797587375e-03 + 1.34284352600275e-04 -2.22180755581035e-03 + 4.38766782931077e-05 -1.08808364043886e-03 + 0.00000000000000e+00 0.00000000000000e+00 + 2.70754963215136e-05 1.08767660334744e-03 + 1.03580808069746e-04 2.22228516879441e-03 + 2.51928419550096e-04 3.40061010146026e-03 + 4.63659613080425e-04 4.62272156443479e-03 + 7.50030014672317e-04 5.88676081458818e-03 + 1.11249110649511e-03 7.19012596240712e-03 + 1.55894767722491e-03 8.53069940774572e-03 + 2.12648113335517e-03 9.89524770439861e-03 + 2.78122395867452e-03 1.12920178518460e-02 + 3.53349472781731e-03 1.27152234032320e-02 + 4.37986080892483e-03 1.41682764668305e-02 + 5.32108740225112e-03 1.56504595401408e-02 + 6.35403104634295e-03 1.71645723270603e-02 + 7.48065465647005e-03 1.87111343722309e-02 + 8.70798790603196e-03 2.02868357356723e-02 + 1.00326625323290e-02 2.18967960271385e-02 + 1.14615517896570e-02 2.35376948845036e-02 + 1.29908498121995e-02 2.52156066282122e-02 + 1.46285017870635e-02 2.69284106702504e-02 + 1.63762840007771e-02 2.86766604856462e-02 + 1.82437127611806e-02 3.04560704781735e-02 + 2.02283271437812e-02 3.22731904280343e-02 + 2.23410892379826e-02 3.41200707129672e-02 + 2.45803161096591e-02 3.60061322399834e-02 + 2.69523034357121e-02 3.79258490183542e-02 + 2.94661214249216e-02 3.98790227559557e-02 + 3.21182316854737e-02 4.18723073706309e-02 + 3.49189765158157e-02 4.39025161395751e-02 + 3.78764907558025e-02 4.59628851663624e-02 + 4.09963031658456e-02 4.80556676923546e-02 + 4.42775927892050e-02 5.01900205707697e-02 + 4.77343365858657e-02 5.23520241988731e-02 + 5.13731297355052e-02 5.45423734775189e-02 + 5.51950546654045e-02 5.67687018233320e-02 + 5.92113866358186e-02 5.90218736527301e-02 + 6.34234392442166e-02 6.13116302117422e-02 + 6.78462003333466e-02 6.36214314140050e-02 + 7.24854173464343e-02 6.59533657552206e-02 + 7.73419721841157e-02 6.83186401819959e-02 + 8.24324258544088e-02 7.06971481688955e-02 + 8.77613607346135e-02 7.30926428047549e-02 + 9.33346253668055e-02 7.55076582271502e-02 + 9.91628221387800e-02 7.79350885797270e-02 + 1.05254564598752e-01 8.03695380742510e-02 + 1.11616753158002e-01 8.28125781644698e-02 + 1.18259294307182e-01 8.52558088653510e-02 + 1.25189263783572e-01 8.76985152086404e-02 + 1.32415679289748e-01 9.01369747472587e-02 + 1.39947873838956e-01 9.25638030881446e-02 + 1.47794845481183e-01 9.49707607832480e-02 + 1.55965915271520e-01 9.73499622034032e-02 + 1.64469189511735e-01 9.96967278841057e-02 + 1.73311416702080e-01 1.02010530578746e-01 + 1.82503742461270e-01 1.04273623478212e-01 + 1.92050672615684e-01 1.06491541481398e-01 + 2.01966200947807e-01 1.08628345168654e-01 + 2.12256126598972e-01 1.10681929211142e-01 + 2.22927191842667e-01 1.12642214263348e-01 + 2.33987552164155e-01 1.14491142152048e-01 + 2.45440161850974e-01 1.16234688095526e-01 + 2.57296008031495e-01 1.17825202458106e-01 + 2.69556869203747e-01 1.19267427279133e-01 + 2.82229070262522e-01 1.20524379694892e-01 + 2.95316275100028e-01 1.21569011458766e-01 + 3.08820531899773e-01 1.22372406982529e-01 + 3.22741461950530e-01 1.22915930928339e-01 + 3.37078134209340e-01 1.23149875849477e-01 + 3.51826981727722e-01 1.23062131822088e-01 + 3.66983039246985e-01 1.22645337613189e-01 + 3.82543070599223e-01 1.21930860322884e-01 + 3.98503391798556e-01 1.20928153680211e-01 + 4.14860961126985e-01 1.19652845240075e-01 + 4.31612326060530e-01 1.18111343121154e-01 + 4.48752327492312e-01 1.16301638158787e-01 + 4.66272601249854e-01 1.14199654104434e-01 + 4.84172419107913e-01 1.11855636518184e-01 + 5.02444493519843e-01 1.09258193501888e-01 + 5.21080236029992e-01 1.06406605973784e-01 + 5.40074886324364e-01 1.03326688418026e-01 + 5.59419655929053e-01 1.00019465978113e-01 + 5.79105612175721e-01 9.64916235087976e-02 + 5.99125173361441e-01 9.27647911198193e-02 + 6.19466430557399e-01 8.88409323564860e-02 + 6.40119041978738e-01 8.47390121899819e-02 + 6.61070257644903e-01 8.04603243420791e-02 + 6.82307901055849e-01 7.60197144231869e-02 + 7.03821798847536e-01 7.14430901975401e-02 + 7.25594294352276e-01 6.67273876453086e-02 + 7.47609060933277e-01 6.18819437827459e-02 + 7.69845737824426e-01 5.68996656088332e-02 + 7.92286051630428e-01 5.17884210392101e-02 + 8.14910827049322e-01 4.65565586752961e-02 + 8.37702906504111e-01 4.12259060670082e-02 + 8.60644007466582e-01 3.58073758391948e-02 + 8.83708956400804e-01 3.02965383060978e-02 + 9.06880276867715e-01 2.47142694962048e-02 + 9.30133788123677e-01 1.90677931913939e-02 + 9.53449456906722e-01 1.32665027689235e-02 + 9.76786262644257e-01 7.36258542738043e-03 + 1.00000000000000e+00 1.36768088735877e-03 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF26_Coords.txt b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF26_Coords.txt new file mode 100644 index 000000000..cf7fc7ad4 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF26_Coords.txt @@ -0,0 +1,208 @@ + 201 NumCoords ! The number of coordinates in the airfoil shape file (including an extra coordinate for airfoil reference). Set to zero if coordinates not included. +! ......... x-y coordinates are next if NumCoords > 0 ............. +! x-y coordinate of airfoil reference +! x/c y/c + 0.250000 0 +! coordinates of airfoil shape +! interpolation to 200 points +! x/c y/c + 1.00000000000000e+00 -1.24163918250367e-03 + 9.76041165887563e-01 1.99488268803741e-03 + 9.52121914098850e-01 4.75706252222044e-03 + 9.28199957236603e-01 7.09542956274019e-03 + 9.04291190262318e-01 8.93443745793852e-03 + 8.80430343444036e-01 9.96657729426452e-03 + 8.56672689113696e-01 9.94290435584814e-03 + 8.33075425877888e-01 9.19689625764953e-03 + 8.09695700165266e-01 7.47347691185626e-03 + 7.86588885771507e-01 4.89111440127801e-03 + 7.63799981052509e-01 1.51070336812985e-03 + 7.41353018207342e-01 -2.52044512396319e-03 + 7.19257743648676e-01 -7.04038680187796e-03 + 6.97520950922480e-01 -1.19358851549070e-02 + 6.76139778430185e-01 -1.70807096849569e-02 + 6.55114191085606e-01 -2.23867022793893e-02 + 6.34437029834687e-01 -2.77559055040500e-02 + 6.14099171583599e-01 -3.30936716419077e-02 + 5.94097092702040e-01 -3.83329090713677e-02 + 5.74431276878783e-01 -4.34270288627529e-02 + 5.55097922205893e-01 -4.83165117769746e-02 + 5.36103244219295e-01 -5.29813461185869e-02 + 5.17451514118577e-01 -5.73969020907143e-02 + 4.99146144876149e-01 -6.15389789381977e-02 + 4.81187008959400e-01 -6.53691205567300e-02 + 4.63583334863196e-01 -6.88825029007271e-02 + 4.46345674250821e-01 -7.21042694778078e-02 + 4.29476426936704e-01 -7.50078286995993e-02 + 4.12981165598887e-01 -7.75910433182066e-02 + 3.96868697220895e-01 -7.98780646047934e-02 + 3.81143737274277e-01 -8.18762285984978e-02 + 3.65809950832190e-01 -8.35894755418217e-02 + 3.50871346715946e-01 -8.50344502846749e-02 + 3.36330856482784e-01 -8.62291005970239e-02 + 3.22187680974826e-01 -8.71590314211491e-02 + 3.08443381198299e-01 -8.78366569779970e-02 + 2.95097824515779e-01 -8.82768172546241e-02 + 2.82150316172696e-01 -8.84841421890272e-02 + 2.69599713195053e-01 -8.84700415928376e-02 + 2.57443538674293e-01 -8.82648900755557e-02 + 2.45678503760535e-01 -8.78783328013873e-02 + 2.34300892069519e-01 -8.73191978590562e-02 + 2.23305176083759e-01 -8.66151143715721e-02 + 2.12686475906400e-01 -8.57717042278548e-02 + 2.02439201431732e-01 -8.47960575058360e-02 + 1.92555334399891e-01 -8.37147804336106e-02 + 1.83029072759030e-01 -8.25291243560209e-02 + 1.73852988185549e-01 -8.12499391500962e-02 + 1.65019713285519e-01 -7.98863532611348e-02 + 1.56521149653515e-01 -7.84487425858802e-02 + 1.48348326905127e-01 -7.69504193661685e-02 + 1.40492169632055e-01 -7.54025801721342e-02 + 1.32945934195466e-01 -7.38053647018080e-02 + 1.25701000521494e-01 -7.21672889164535e-02 + 1.18749063872964e-01 -7.04928479452887e-02 + 1.12082069469409e-01 -6.87847420009533e-02 + 1.05690639166719e-01 -6.70564170338887e-02 + 9.95644793751720e-02 -6.53155594973088e-02 + 9.36997891046597e-02 -6.35528503057422e-02 + 8.80860404700645e-02 -6.17798179936638e-02 + 8.27138402760154e-02 -6.00046280095742e-02 + 7.75786796919451e-02 -5.82199952095701e-02 + 7.26702775903076e-02 -5.64364109081874e-02 + 6.79824154250675e-02 -5.46532131450536e-02 + 6.35091047142614e-02 -5.28689233118743e-02 + 5.92419326453291e-02 -5.10893765254210e-02 + 5.51761610142073e-02 -4.93108527891892e-02 + 5.13012904354392e-02 -4.75441103336549e-02 + 4.76145565870374e-02 -4.57830799218584e-02 + 4.41097775457074e-02 -4.40286611417737e-02 + 4.07797547228364e-02 -4.22832639538696e-02 + 3.76203144073222e-02 -4.05471915450099e-02 + 3.46254260858043e-02 -3.88215755752492e-02 + 3.17889101119942e-02 -3.71070792104368e-02 + 2.91063013242030e-02 -3.54070623086104e-02 + 2.65680917385227e-02 -3.37242560099722e-02 + 2.41746444824902e-02 -3.20578976536326e-02 + 2.19171444247013e-02 -3.04080975483655e-02 + 1.97858149698125e-02 -2.87865206302891e-02 + 1.77816785975911e-02 -2.71845498672619e-02 + 1.59022597396959e-02 -2.56014672844354e-02 + 1.41389646872167e-02 -2.40428780632352e-02 + 1.24868469400250e-02 -2.25098697316461e-02 + 1.09480652882895e-02 -2.09965445874096e-02 + 9.51590058520777e-03 -1.95072970846173e-02 + 8.19359579424781e-03 -1.80358499675050e-02 + 6.97242094431141e-03 -1.65886214694131e-02 + 5.86117299541770e-03 -1.51566425360256e-02 + 4.85595721623195e-03 -1.37425320553921e-02 + 3.94940941742267e-03 -1.23512986917568e-02 + 3.14133805635955e-03 -1.09822611963997e-02 + 2.44321685058300e-03 -9.63205407941857e-03 + 1.83022786901874e-03 -8.31193681735096e-03 + 1.31884419349740e-03 -7.01717270777278e-03 + 8.97352130663886e-04 -5.75368875832799e-03 + 5.63740815773768e-04 -4.52380901007206e-03 + 3.11436976892490e-04 -3.33125476138120e-03 + 1.35836193808489e-04 -2.17811670838639e-03 + 4.45280502729537e-05 -1.06661993857544e-03 + 0.00000000000000e+00 0.00000000000000e+00 + 2.66760054509128e-05 1.06620363196370e-03 + 1.03135511949883e-04 2.17873971903504e-03 + 2.50714385917578e-04 3.33437480200911e-03 + 4.62713811117844e-04 4.53305150068868e-03 + 7.43003875184307e-04 5.77372654297466e-03 + 1.10319761909825e-03 7.05282637820245e-03 + 1.54998013794877e-03 8.36733050300788e-03 + 2.09725226970234e-03 9.71027755670584e-03 + 2.74048621866142e-03 1.10830229161061e-02 + 3.47313095950444e-03 1.24853542942127e-02 + 4.30082217565610e-03 1.39166476275545e-02 + 5.21857196014794e-03 1.53794131710022e-02 + 6.22534316879645e-03 1.68755017759930e-02 + 7.32700741881788e-03 1.84027736911195e-02 + 8.52685165419718e-03 1.99605923185556e-02 + 9.82457508956703e-03 2.15515967524936e-02 + 1.12235177290181e-02 2.31756834085188e-02 + 1.27200503919435e-02 2.48389080154999e-02 + 1.43242279905998e-02 2.65369959399126e-02 + 1.60404245440130e-02 2.82678634249202e-02 + 1.78725008542331e-02 3.00332073110525e-02 + 1.98202147599872e-02 3.18374092114472e-02 + 2.18950460972363e-02 3.36723552878899e-02 + 2.40945084991586e-02 3.55478542511501e-02 + 2.64266594338935e-02 3.74562543671355e-02 + 2.89010475331631e-02 3.93973576550753e-02 + 3.15128856164724e-02 4.13789637240956e-02 + 3.42721423161374e-02 4.33986437239279e-02 + 3.71869766220148e-02 4.54495802606190e-02 + 4.02627031087678e-02 4.75346101784617e-02 + 4.35002150116920e-02 4.96601391986086e-02 + 4.69116164095437e-02 5.18156791609964e-02 + 5.05037836700218e-02 5.40013488484752e-02 + 5.42786678950318e-02 5.62234865342880e-02 + 5.82483001631071e-02 5.84716108883904e-02 + 6.24154978875846e-02 6.07527350834376e-02 + 6.67896743600186e-02 6.30611281243319e-02 + 7.13799999231155e-02 6.53925012153297e-02 + 7.61894222215938e-02 6.77537053720447e-02 + 8.12317662654453e-02 7.01307269242542e-02 + 8.65117557737097e-02 7.25279882775677e-02 + 9.20362184425747e-02 7.49454680746529e-02 + 9.78162759593724e-02 7.73748306064237e-02 + 1.03860552928939e-01 7.98107486389235e-02 + 1.10175778191298e-01 8.22554075072582e-02 + 1.16770214549517e-01 8.47058953467228e-02 + 1.23653203755665e-01 8.71546056154831e-02 + 1.30834337594950e-01 8.95968004923253e-02 + 1.38321670606146e-01 9.20292431191944e-02 + 1.46124389981669e-01 9.44436195002828e-02 + 1.54251904677806e-01 9.68324582790219e-02 + 1.62712200809751e-01 9.91923751629681e-02 + 1.71513312218537e-01 1.01517930059788e-01 + 1.80666845834493e-01 1.03789912148757e-01 + 1.90176370985942e-01 1.06018468666417e-01 + 2.00055657032727e-01 1.08170258618851e-01 + 2.10311372495842e-01 1.10238994003200e-01 + 2.20950065131051e-01 1.12217532980930e-01 + 2.31980866532305e-01 1.14082146312415e-01 + 2.43406769821147e-01 1.15839163095632e-01 + 2.55238147077280e-01 1.17446579677784e-01 + 2.67477513281741e-01 1.18905422327083e-01 + 2.80131073498889e-01 1.20180419750751e-01 + 2.93202720534022e-01 1.21245816208447e-01 + 3.06694896295832e-01 1.22070353231193e-01 + 3.20607263770737e-01 1.22636054133308e-01 + 3.34939268318345e-01 1.22896410171916e-01 + 3.49687302556342e-01 1.22832514196396e-01 + 3.64846676687070e-01 1.22439952772840e-01 + 3.80414003309436e-01 1.21746813551104e-01 + 3.96385756696833e-01 1.20764922463268e-01 + 4.12759002166226e-01 1.19510124555119e-01 + 4.29529884389691e-01 1.17984334619021e-01 + 4.46694073835668e-01 1.16192944649426e-01 + 4.64243196738119e-01 1.14110111055027e-01 + 4.82175957113290e-01 1.11782567369759e-01 + 5.00485020623298e-01 1.09197665297171e-01 + 5.19162565566196e-01 1.06360394677582e-01 + 5.38203389191021e-01 1.03293317692501e-01 + 5.57598376049888e-01 9.99962209759983e-02 + 5.77338386735964e-01 9.64747451695822e-02 + 5.97416810267783e-01 9.27560007851153e-02 + 6.17822173815498e-01 8.88440305009192e-02 + 6.38542633624223e-01 8.47454500445900e-02 + 6.59565297378976e-01 8.04670393872135e-02 + 6.80878616121945e-01 7.60267543210821e-02 + 7.02471652655181e-01 7.14503788937509e-02 + 7.24326595397154e-01 6.67348588383987e-02 + 7.46427190977622e-01 6.18895589890343e-02 + 7.68752587046382e-01 5.69073596180092e-02 + 7.91284306570890e-01 5.17961434205325e-02 + 8.14003121917812e-01 4.65642776255388e-02 + 8.36892227450033e-01 4.12336544355374e-02 + 8.59931497183523e-01 3.58149763309393e-02 + 8.83096691520270e-01 3.03040139923268e-02 + 9.06368918443855e-01 2.47214332231998e-02 + 9.29725626335315e-01 1.90747607002302e-02 + 9.53145857383183e-01 1.33087425250220e-02 + 9.76587861324942e-01 7.46542536535991e-03 + 1.00000000000000e+00 1.53835660395088e-03 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF27_Coords.txt b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF27_Coords.txt new file mode 100644 index 000000000..a8559b09a --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF27_Coords.txt @@ -0,0 +1,208 @@ + 201 NumCoords ! The number of coordinates in the airfoil shape file (including an extra coordinate for airfoil reference). Set to zero if coordinates not included. +! ......... x-y coordinates are next if NumCoords > 0 ............. +! x-y coordinate of airfoil reference +! x/c y/c + 0.250000 0 +! coordinates of airfoil shape +! interpolation to 200 points +! x/c y/c + 1.00000000000000e+00 -1.24164223325347e-03 + 9.76041164392396e-01 1.99488062082566e-03 + 9.52121910751731e-01 4.75706135335948e-03 + 9.28199952199219e-01 7.09542915865422e-03 + 9.04291183649571e-01 8.93443767118390e-03 + 8.80430335305919e-01 9.96657750751068e-03 + 8.56672679460919e-01 9.94290456909515e-03 + 8.33075414701384e-01 9.19689647089799e-03 + 8.09695687435274e-01 7.47347776900502e-03 + 7.86588871455130e-01 4.89111649401108e-03 + 7.63799965113471e-01 1.51070681640460e-03 + 7.41353000623285e-01 -2.52044025059049e-03 + 7.19257724385752e-01 -7.04038035491660e-03 + 6.97520929992240e-01 -1.19358771025367e-02 + 6.76139755888505e-01 -1.70807000809784e-02 + 6.55114166969036e-01 -2.23866910906930e-02 + 6.34437004205735e-01 -2.77558927368869e-02 + 6.14099144503465e-01 -3.30936572688430e-02 + 5.94097064299627e-01 -3.83328932311329e-02 + 5.74431247267374e-01 -4.34270116338703e-02 + 5.55097891490535e-01 -4.83164932012163e-02 + 5.36103212560625e-01 -5.29813263991864e-02 + 5.17451481630547e-01 -5.73968812892901e-02 + 4.99146111683925e-01 -6.15389571602501e-02 + 4.81186975180132e-01 -6.53690978763222e-02 + 4.63583300631990e-01 -6.88824794729917e-02 + 4.46345639685456e-01 -7.21042454369658e-02 + 4.29476392143564e-01 -7.50078041225779e-02 + 4.12981130677270e-01 -7.75910183051978e-02 + 3.96868662278405e-01 -7.98780393343755e-02 + 3.81143702382537e-01 -8.18762030718283e-02 + 3.65809916070270e-01 -8.35894498418953e-02 + 3.50871312147949e-01 -8.50344244357429e-02 + 3.36330822167539e-01 -8.62290745383426e-02 + 3.22187646977060e-01 -8.71590051574009e-02 + 3.08443347581371e-01 -8.78366305562361e-02 + 2.95097791339595e-01 -8.82767906155356e-02 + 2.82150283499973e-01 -8.84841152823162e-02 + 2.69599681087069e-01 -8.84700144337475e-02 + 2.57443507192848e-01 -8.82648626051867e-02 + 2.45678472964112e-01 -8.78783050259134e-02 + 2.34300862010750e-01 -8.73191697949781e-02 + 2.23305146809674e-01 -8.66150861037270e-02 + 2.12686447462944e-01 -8.57716757140843e-02 + 2.02439173855586e-01 -8.47960288193625e-02 + 1.92555307706631e-01 -8.37147516939257e-02 + 1.83029046978344e-01 -8.25290955835651e-02 + 1.73852963346223e-01 -8.12499103431124e-02 + 1.65019689389359e-01 -7.98863245514951e-02 + 1.56521126720043e-01 -7.84487139477401e-02 + 1.48348304923117e-01 -7.69503909453266e-02 + 1.40492148638460e-01 -7.54025518805833e-02 + 1.32945914165942e-01 -7.38053366709304e-02 + 1.25700981456047e-01 -7.21672611749456e-02 + 1.18749045764871e-01 -7.04928205316870e-02 + 1.12082052295785e-01 -6.87847149917338e-02 + 1.05690622940757e-01 -6.70563903986223e-02 + 9.95644640688240e-02 -6.53155333147837e-02 + 9.36997746804533e-02 -6.35528246583057e-02 + 8.80860269419856e-02 -6.17797928182627e-02 + 8.27138276159543e-02 -6.00046033630738e-02 + 7.75786679035966e-02 -5.82199710630611e-02 + 7.26702668766427e-02 -5.64363872841197e-02 + 6.79824057221827e-02 -5.46531901393429e-02 + 6.35090960690899e-02 -5.28689008362057e-02 + 5.92419250258708e-02 -5.10893545882387e-02 + 5.51761543119222e-02 -4.93108314830338e-02 + 5.13012845894761e-02 -4.75440896934531e-02 + 4.76145515997845e-02 -4.57830599145488e-02 + 4.41097733544431e-02 -4.40286418035125e-02 + 4.07797512889574e-02 -4.22832452899324e-02 + 3.76203116687853e-02 -4.05471735735779e-02 + 3.46254239696624e-02 -3.88215583285753e-02 + 3.17889085655347e-02 -3.71070627007449e-02 + 2.91063003142196e-02 -3.54070465342894e-02 + 2.65680912572024e-02 -3.37242409387003e-02 + 2.41746444372365e-02 -3.20578833095496e-02 + 2.19171444247057e-02 -3.04080839884921e-02 + 1.97858149698170e-02 -2.87865078379770e-02 + 1.77816785975956e-02 -2.71845378027204e-02 + 1.59022597397006e-02 -2.56014559510294e-02 + 1.41389646872214e-02 -2.40428674601252e-02 + 1.24868469400299e-02 -2.25098598379508e-02 + 1.09480652882944e-02 -2.09965353712404e-02 + 9.51590058521273e-03 -1.95072886041607e-02 + 8.19359596476239e-03 -1.80358421377615e-02 + 6.97242121388991e-03 -1.65886143273830e-02 + 5.86117330807756e-03 -1.51566360782969e-02 + 4.85595758514205e-03 -1.37425262435773e-02 + 3.94940976333073e-03 -1.23512935315688e-02 + 3.14133835342164e-03 -1.09822566687452e-02 + 2.44321714150649e-03 -9.63205013980954e-03 + 1.83022809796061e-03 -8.31193344939125e-03 + 1.31884436057794e-03 -7.01716988880847e-03 + 8.97352193736273e-04 -5.75368646998309e-03 + 5.63740905842356e-04 -4.52380720725293e-03 + 3.11437030347409e-04 -3.33125343689109e-03 + 1.35836224347021e-04 -2.17811584123553e-03 + 4.45280630750671e-05 -1.06661951254253e-03 + 0.00000000000000e+00 0.00000000000000e+00 + 2.66759975469128e-05 1.06620320574453e-03 + 1.03135502882502e-04 2.17873885472331e-03 + 2.50714361136359e-04 3.33437348745562e-03 + 4.62713791811825e-04 4.53304972124580e-03 + 7.43003731765193e-04 5.77372430028259e-03 + 1.10319742939756e-03 7.05282365458086e-03 + 1.54997995490141e-03 8.36732726269284e-03 + 2.09725167376054e-03 9.71027388884010e-03 + 2.74048539040992e-03 1.10830187729024e-02 + 3.47312973743479e-03 1.24853497385656e-02 + 4.30082057862358e-03 1.39166426421534e-02 + 5.21856989199968e-03 1.53794078029284e-02 + 6.22534057591764e-03 1.68754960531490e-02 + 7.32700432621982e-03 1.84027675881834e-02 + 8.52684801153103e-03 1.99605858637636e-02 + 9.82457090745577e-03 2.15515899247781e-02 + 1.12235129483028e-02 2.31756762504219e-02 + 1.27200449567995e-02 2.48389005693531e-02 + 1.43242218865420e-02 2.65369882056060e-02 + 1.60404178082626e-02 2.82678553499417e-02 + 1.78724934115684e-02 3.00331989618528e-02 + 1.98202065802740e-02 3.18374006104675e-02 + 2.18950371605342e-02 3.36723464545640e-02 + 2.40944987682683e-02 3.55478452136134e-02 + 2.64266489071067e-02 3.74562451109318e-02 + 2.89010362193680e-02 3.93973481646352e-02 + 3.15128734993139e-02 4.13789540071277e-02 + 3.42721293711695e-02 4.33986338037802e-02 + 3.71869628254960e-02 4.54495701594197e-02 + 4.02626884327817e-02 4.75345999298599e-02 + 4.35001994625931e-02 4.96601287812404e-02 + 4.69115999564798e-02 5.18156686218105e-02 + 5.05037662874084e-02 5.40013382232845e-02 + 5.42786495746735e-02 5.62234758330505e-02 + 5.82482809121614e-02 5.84716000937855e-02 + 6.24154777430842e-02 6.07527241240193e-02 + 6.67896532476333e-02 6.30611171442784e-02 + 7.13799778368031e-02 6.53924902316809e-02 + 7.61893991966636e-02 6.77536943148228e-02 + 8.12317422826271e-02 7.01307158448530e-02 + 8.65117308166364e-02 7.25279772295263e-02 + 9.20361925143298e-02 7.49454570665521e-02 + 9.78162490733068e-02 7.73748196288702e-02 + 1.03860525098628e-01 7.98107376836716e-02 + 1.10175749426971e-01 8.22553965780306e-02 + 1.16770184828620e-01 8.47058845532950e-02 + 1.23653173100621e-01 8.71545949342700e-02 + 1.30834306039958e-01 8.95967898803351e-02 + 1.38321638159842e-01 9.20292326136635e-02 + 1.46124356656426e-01 9.44436091370127e-02 + 1.54251870487751e-01 9.68324481019705e-02 + 1.62712165766615e-01 9.91923652415109e-02 + 1.71513276359922e-01 1.01517920367561e-01 + 1.80666809206519e-01 1.03789902629961e-01 + 1.90176333616483e-01 1.06018459355824e-01 + 2.00055618945293e-01 1.08170249602257e-01 + 2.10311333730825e-01 1.10238985284240e-01 + 2.20950025725240e-01 1.12217524621099e-01 + 2.31980826542045e-01 1.14082138261491e-01 + 2.43406729303366e-01 1.15839155310084e-01 + 2.55238106076494e-01 1.17446572225308e-01 + 2.67477471857320e-01 1.18905415201973e-01 + 2.80131031707401e-01 1.20180412981259e-01 + 2.93202678436719e-01 1.21245809848125e-01 + 3.06694853961626e-01 1.22070347287731e-01 + 3.20607221269401e-01 1.22636048627399e-01 + 3.34939225727116e-01 1.22896405187495e-01 + 3.49687259951759e-01 1.22832509683795e-01 + 3.64846634151165e-01 1.22439948740756e-01 + 3.80413960921238e-01 1.21746809942571e-01 + 3.96385714538567e-01 1.20764919268824e-01 + 4.12758960322157e-01 1.19510121769152e-01 + 4.29529842936380e-01 1.17984332147218e-01 + 4.46694032865700e-01 1.16192942543521e-01 + 4.64243156344356e-01 1.14110109333428e-01 + 4.82175917377177e-01 1.11782565979692e-01 + 5.00484981625201e-01 1.09197664159710e-01 + 5.19162527401886e-01 1.06360393829411e-01 + 5.38203351947280e-01 1.03293317103930e-01 + 5.57598339807246e-01 9.99962205928791e-02 + 5.77338351570623e-01 9.64747449157602e-02 + 5.97416776275050e-01 9.27560006949552e-02 + 6.17822141099620e-01 8.88440306520127e-02 + 6.38542602259551e-01 8.47454502578335e-02 + 6.59565267437110e-01 8.04670396004571e-02 + 6.80878587686638e-01 7.60267545343259e-02 + 7.02471625795160e-01 7.14503791069948e-02 + 7.24326570178040e-01 6.67348590516426e-02 + 7.46427167466697e-01 6.18895592022783e-02 + 7.68752565300964e-01 5.69073598312532e-02 + 7.91284286644164e-01 5.17961436337766e-02 + 8.14003103862062e-01 4.65642778387828e-02 + 8.36892211324902e-01 4.12336546487814e-02 + 8.59931483011660e-01 3.58149765441833e-02 + 8.83096679342750e-01 3.03040142055707e-02 + 9.06368908273977e-01 2.47214334364437e-02 + 9.29725618218844e-01 1.90747609134739e-02 + 9.53145851346865e-01 1.33087434425404e-02 + 9.76587857380671e-01 7.46542748662253e-03 + 1.00000000000000e+00 1.53836008119114e-03 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF28_Coords.txt b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF28_Coords.txt new file mode 100644 index 000000000..a8559b09a --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF28_Coords.txt @@ -0,0 +1,208 @@ + 201 NumCoords ! The number of coordinates in the airfoil shape file (including an extra coordinate for airfoil reference). Set to zero if coordinates not included. +! ......... x-y coordinates are next if NumCoords > 0 ............. +! x-y coordinate of airfoil reference +! x/c y/c + 0.250000 0 +! coordinates of airfoil shape +! interpolation to 200 points +! x/c y/c + 1.00000000000000e+00 -1.24164223325347e-03 + 9.76041164392396e-01 1.99488062082566e-03 + 9.52121910751731e-01 4.75706135335948e-03 + 9.28199952199219e-01 7.09542915865422e-03 + 9.04291183649571e-01 8.93443767118390e-03 + 8.80430335305919e-01 9.96657750751068e-03 + 8.56672679460919e-01 9.94290456909515e-03 + 8.33075414701384e-01 9.19689647089799e-03 + 8.09695687435274e-01 7.47347776900502e-03 + 7.86588871455130e-01 4.89111649401108e-03 + 7.63799965113471e-01 1.51070681640460e-03 + 7.41353000623285e-01 -2.52044025059049e-03 + 7.19257724385752e-01 -7.04038035491660e-03 + 6.97520929992240e-01 -1.19358771025367e-02 + 6.76139755888505e-01 -1.70807000809784e-02 + 6.55114166969036e-01 -2.23866910906930e-02 + 6.34437004205735e-01 -2.77558927368869e-02 + 6.14099144503465e-01 -3.30936572688430e-02 + 5.94097064299627e-01 -3.83328932311329e-02 + 5.74431247267374e-01 -4.34270116338703e-02 + 5.55097891490535e-01 -4.83164932012163e-02 + 5.36103212560625e-01 -5.29813263991864e-02 + 5.17451481630547e-01 -5.73968812892901e-02 + 4.99146111683925e-01 -6.15389571602501e-02 + 4.81186975180132e-01 -6.53690978763222e-02 + 4.63583300631990e-01 -6.88824794729917e-02 + 4.46345639685456e-01 -7.21042454369658e-02 + 4.29476392143564e-01 -7.50078041225779e-02 + 4.12981130677270e-01 -7.75910183051978e-02 + 3.96868662278405e-01 -7.98780393343755e-02 + 3.81143702382537e-01 -8.18762030718283e-02 + 3.65809916070270e-01 -8.35894498418953e-02 + 3.50871312147949e-01 -8.50344244357429e-02 + 3.36330822167539e-01 -8.62290745383426e-02 + 3.22187646977060e-01 -8.71590051574009e-02 + 3.08443347581371e-01 -8.78366305562361e-02 + 2.95097791339595e-01 -8.82767906155356e-02 + 2.82150283499973e-01 -8.84841152823162e-02 + 2.69599681087069e-01 -8.84700144337475e-02 + 2.57443507192848e-01 -8.82648626051867e-02 + 2.45678472964112e-01 -8.78783050259134e-02 + 2.34300862010750e-01 -8.73191697949781e-02 + 2.23305146809674e-01 -8.66150861037270e-02 + 2.12686447462944e-01 -8.57716757140843e-02 + 2.02439173855586e-01 -8.47960288193625e-02 + 1.92555307706631e-01 -8.37147516939257e-02 + 1.83029046978344e-01 -8.25290955835651e-02 + 1.73852963346223e-01 -8.12499103431124e-02 + 1.65019689389359e-01 -7.98863245514951e-02 + 1.56521126720043e-01 -7.84487139477401e-02 + 1.48348304923117e-01 -7.69503909453266e-02 + 1.40492148638460e-01 -7.54025518805833e-02 + 1.32945914165942e-01 -7.38053366709304e-02 + 1.25700981456047e-01 -7.21672611749456e-02 + 1.18749045764871e-01 -7.04928205316870e-02 + 1.12082052295785e-01 -6.87847149917338e-02 + 1.05690622940757e-01 -6.70563903986223e-02 + 9.95644640688240e-02 -6.53155333147837e-02 + 9.36997746804533e-02 -6.35528246583057e-02 + 8.80860269419856e-02 -6.17797928182627e-02 + 8.27138276159543e-02 -6.00046033630738e-02 + 7.75786679035966e-02 -5.82199710630611e-02 + 7.26702668766427e-02 -5.64363872841197e-02 + 6.79824057221827e-02 -5.46531901393429e-02 + 6.35090960690899e-02 -5.28689008362057e-02 + 5.92419250258708e-02 -5.10893545882387e-02 + 5.51761543119222e-02 -4.93108314830338e-02 + 5.13012845894761e-02 -4.75440896934531e-02 + 4.76145515997845e-02 -4.57830599145488e-02 + 4.41097733544431e-02 -4.40286418035125e-02 + 4.07797512889574e-02 -4.22832452899324e-02 + 3.76203116687853e-02 -4.05471735735779e-02 + 3.46254239696624e-02 -3.88215583285753e-02 + 3.17889085655347e-02 -3.71070627007449e-02 + 2.91063003142196e-02 -3.54070465342894e-02 + 2.65680912572024e-02 -3.37242409387003e-02 + 2.41746444372365e-02 -3.20578833095496e-02 + 2.19171444247057e-02 -3.04080839884921e-02 + 1.97858149698170e-02 -2.87865078379770e-02 + 1.77816785975956e-02 -2.71845378027204e-02 + 1.59022597397006e-02 -2.56014559510294e-02 + 1.41389646872214e-02 -2.40428674601252e-02 + 1.24868469400299e-02 -2.25098598379508e-02 + 1.09480652882944e-02 -2.09965353712404e-02 + 9.51590058521273e-03 -1.95072886041607e-02 + 8.19359596476239e-03 -1.80358421377615e-02 + 6.97242121388991e-03 -1.65886143273830e-02 + 5.86117330807756e-03 -1.51566360782969e-02 + 4.85595758514205e-03 -1.37425262435773e-02 + 3.94940976333073e-03 -1.23512935315688e-02 + 3.14133835342164e-03 -1.09822566687452e-02 + 2.44321714150649e-03 -9.63205013980954e-03 + 1.83022809796061e-03 -8.31193344939125e-03 + 1.31884436057794e-03 -7.01716988880847e-03 + 8.97352193736273e-04 -5.75368646998309e-03 + 5.63740905842356e-04 -4.52380720725293e-03 + 3.11437030347409e-04 -3.33125343689109e-03 + 1.35836224347021e-04 -2.17811584123553e-03 + 4.45280630750671e-05 -1.06661951254253e-03 + 0.00000000000000e+00 0.00000000000000e+00 + 2.66759975469128e-05 1.06620320574453e-03 + 1.03135502882502e-04 2.17873885472331e-03 + 2.50714361136359e-04 3.33437348745562e-03 + 4.62713791811825e-04 4.53304972124580e-03 + 7.43003731765193e-04 5.77372430028259e-03 + 1.10319742939756e-03 7.05282365458086e-03 + 1.54997995490141e-03 8.36732726269284e-03 + 2.09725167376054e-03 9.71027388884010e-03 + 2.74048539040992e-03 1.10830187729024e-02 + 3.47312973743479e-03 1.24853497385656e-02 + 4.30082057862358e-03 1.39166426421534e-02 + 5.21856989199968e-03 1.53794078029284e-02 + 6.22534057591764e-03 1.68754960531490e-02 + 7.32700432621982e-03 1.84027675881834e-02 + 8.52684801153103e-03 1.99605858637636e-02 + 9.82457090745577e-03 2.15515899247781e-02 + 1.12235129483028e-02 2.31756762504219e-02 + 1.27200449567995e-02 2.48389005693531e-02 + 1.43242218865420e-02 2.65369882056060e-02 + 1.60404178082626e-02 2.82678553499417e-02 + 1.78724934115684e-02 3.00331989618528e-02 + 1.98202065802740e-02 3.18374006104675e-02 + 2.18950371605342e-02 3.36723464545640e-02 + 2.40944987682683e-02 3.55478452136134e-02 + 2.64266489071067e-02 3.74562451109318e-02 + 2.89010362193680e-02 3.93973481646352e-02 + 3.15128734993139e-02 4.13789540071277e-02 + 3.42721293711695e-02 4.33986338037802e-02 + 3.71869628254960e-02 4.54495701594197e-02 + 4.02626884327817e-02 4.75345999298599e-02 + 4.35001994625931e-02 4.96601287812404e-02 + 4.69115999564798e-02 5.18156686218105e-02 + 5.05037662874084e-02 5.40013382232845e-02 + 5.42786495746735e-02 5.62234758330505e-02 + 5.82482809121614e-02 5.84716000937855e-02 + 6.24154777430842e-02 6.07527241240193e-02 + 6.67896532476333e-02 6.30611171442784e-02 + 7.13799778368031e-02 6.53924902316809e-02 + 7.61893991966636e-02 6.77536943148228e-02 + 8.12317422826271e-02 7.01307158448530e-02 + 8.65117308166364e-02 7.25279772295263e-02 + 9.20361925143298e-02 7.49454570665521e-02 + 9.78162490733068e-02 7.73748196288702e-02 + 1.03860525098628e-01 7.98107376836716e-02 + 1.10175749426971e-01 8.22553965780306e-02 + 1.16770184828620e-01 8.47058845532950e-02 + 1.23653173100621e-01 8.71545949342700e-02 + 1.30834306039958e-01 8.95967898803351e-02 + 1.38321638159842e-01 9.20292326136635e-02 + 1.46124356656426e-01 9.44436091370127e-02 + 1.54251870487751e-01 9.68324481019705e-02 + 1.62712165766615e-01 9.91923652415109e-02 + 1.71513276359922e-01 1.01517920367561e-01 + 1.80666809206519e-01 1.03789902629961e-01 + 1.90176333616483e-01 1.06018459355824e-01 + 2.00055618945293e-01 1.08170249602257e-01 + 2.10311333730825e-01 1.10238985284240e-01 + 2.20950025725240e-01 1.12217524621099e-01 + 2.31980826542045e-01 1.14082138261491e-01 + 2.43406729303366e-01 1.15839155310084e-01 + 2.55238106076494e-01 1.17446572225308e-01 + 2.67477471857320e-01 1.18905415201973e-01 + 2.80131031707401e-01 1.20180412981259e-01 + 2.93202678436719e-01 1.21245809848125e-01 + 3.06694853961626e-01 1.22070347287731e-01 + 3.20607221269401e-01 1.22636048627399e-01 + 3.34939225727116e-01 1.22896405187495e-01 + 3.49687259951759e-01 1.22832509683795e-01 + 3.64846634151165e-01 1.22439948740756e-01 + 3.80413960921238e-01 1.21746809942571e-01 + 3.96385714538567e-01 1.20764919268824e-01 + 4.12758960322157e-01 1.19510121769152e-01 + 4.29529842936380e-01 1.17984332147218e-01 + 4.46694032865700e-01 1.16192942543521e-01 + 4.64243156344356e-01 1.14110109333428e-01 + 4.82175917377177e-01 1.11782565979692e-01 + 5.00484981625201e-01 1.09197664159710e-01 + 5.19162527401886e-01 1.06360393829411e-01 + 5.38203351947280e-01 1.03293317103930e-01 + 5.57598339807246e-01 9.99962205928791e-02 + 5.77338351570623e-01 9.64747449157602e-02 + 5.97416776275050e-01 9.27560006949552e-02 + 6.17822141099620e-01 8.88440306520127e-02 + 6.38542602259551e-01 8.47454502578335e-02 + 6.59565267437110e-01 8.04670396004571e-02 + 6.80878587686638e-01 7.60267545343259e-02 + 7.02471625795160e-01 7.14503791069948e-02 + 7.24326570178040e-01 6.67348590516426e-02 + 7.46427167466697e-01 6.18895592022783e-02 + 7.68752565300964e-01 5.69073598312532e-02 + 7.91284286644164e-01 5.17961436337766e-02 + 8.14003103862062e-01 4.65642778387828e-02 + 8.36892211324902e-01 4.12336546487814e-02 + 8.59931483011660e-01 3.58149765441833e-02 + 8.83096679342750e-01 3.03040142055707e-02 + 9.06368908273977e-01 2.47214334364437e-02 + 9.29725618218844e-01 1.90747609134739e-02 + 9.53145851346865e-01 1.33087434425404e-02 + 9.76587857380671e-01 7.46542748662253e-03 + 1.00000000000000e+00 1.53836008119114e-03 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF29_Coords.txt b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF29_Coords.txt new file mode 100644 index 000000000..a8559b09a --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AF29_Coords.txt @@ -0,0 +1,208 @@ + 201 NumCoords ! The number of coordinates in the airfoil shape file (including an extra coordinate for airfoil reference). Set to zero if coordinates not included. +! ......... x-y coordinates are next if NumCoords > 0 ............. +! x-y coordinate of airfoil reference +! x/c y/c + 0.250000 0 +! coordinates of airfoil shape +! interpolation to 200 points +! x/c y/c + 1.00000000000000e+00 -1.24164223325347e-03 + 9.76041164392396e-01 1.99488062082566e-03 + 9.52121910751731e-01 4.75706135335948e-03 + 9.28199952199219e-01 7.09542915865422e-03 + 9.04291183649571e-01 8.93443767118390e-03 + 8.80430335305919e-01 9.96657750751068e-03 + 8.56672679460919e-01 9.94290456909515e-03 + 8.33075414701384e-01 9.19689647089799e-03 + 8.09695687435274e-01 7.47347776900502e-03 + 7.86588871455130e-01 4.89111649401108e-03 + 7.63799965113471e-01 1.51070681640460e-03 + 7.41353000623285e-01 -2.52044025059049e-03 + 7.19257724385752e-01 -7.04038035491660e-03 + 6.97520929992240e-01 -1.19358771025367e-02 + 6.76139755888505e-01 -1.70807000809784e-02 + 6.55114166969036e-01 -2.23866910906930e-02 + 6.34437004205735e-01 -2.77558927368869e-02 + 6.14099144503465e-01 -3.30936572688430e-02 + 5.94097064299627e-01 -3.83328932311329e-02 + 5.74431247267374e-01 -4.34270116338703e-02 + 5.55097891490535e-01 -4.83164932012163e-02 + 5.36103212560625e-01 -5.29813263991864e-02 + 5.17451481630547e-01 -5.73968812892901e-02 + 4.99146111683925e-01 -6.15389571602501e-02 + 4.81186975180132e-01 -6.53690978763222e-02 + 4.63583300631990e-01 -6.88824794729917e-02 + 4.46345639685456e-01 -7.21042454369658e-02 + 4.29476392143564e-01 -7.50078041225779e-02 + 4.12981130677270e-01 -7.75910183051978e-02 + 3.96868662278405e-01 -7.98780393343755e-02 + 3.81143702382537e-01 -8.18762030718283e-02 + 3.65809916070270e-01 -8.35894498418953e-02 + 3.50871312147949e-01 -8.50344244357429e-02 + 3.36330822167539e-01 -8.62290745383426e-02 + 3.22187646977060e-01 -8.71590051574009e-02 + 3.08443347581371e-01 -8.78366305562361e-02 + 2.95097791339595e-01 -8.82767906155356e-02 + 2.82150283499973e-01 -8.84841152823162e-02 + 2.69599681087069e-01 -8.84700144337475e-02 + 2.57443507192848e-01 -8.82648626051867e-02 + 2.45678472964112e-01 -8.78783050259134e-02 + 2.34300862010750e-01 -8.73191697949781e-02 + 2.23305146809674e-01 -8.66150861037270e-02 + 2.12686447462944e-01 -8.57716757140843e-02 + 2.02439173855586e-01 -8.47960288193625e-02 + 1.92555307706631e-01 -8.37147516939257e-02 + 1.83029046978344e-01 -8.25290955835651e-02 + 1.73852963346223e-01 -8.12499103431124e-02 + 1.65019689389359e-01 -7.98863245514951e-02 + 1.56521126720043e-01 -7.84487139477401e-02 + 1.48348304923117e-01 -7.69503909453266e-02 + 1.40492148638460e-01 -7.54025518805833e-02 + 1.32945914165942e-01 -7.38053366709304e-02 + 1.25700981456047e-01 -7.21672611749456e-02 + 1.18749045764871e-01 -7.04928205316870e-02 + 1.12082052295785e-01 -6.87847149917338e-02 + 1.05690622940757e-01 -6.70563903986223e-02 + 9.95644640688240e-02 -6.53155333147837e-02 + 9.36997746804533e-02 -6.35528246583057e-02 + 8.80860269419856e-02 -6.17797928182627e-02 + 8.27138276159543e-02 -6.00046033630738e-02 + 7.75786679035966e-02 -5.82199710630611e-02 + 7.26702668766427e-02 -5.64363872841197e-02 + 6.79824057221827e-02 -5.46531901393429e-02 + 6.35090960690899e-02 -5.28689008362057e-02 + 5.92419250258708e-02 -5.10893545882387e-02 + 5.51761543119222e-02 -4.93108314830338e-02 + 5.13012845894761e-02 -4.75440896934531e-02 + 4.76145515997845e-02 -4.57830599145488e-02 + 4.41097733544431e-02 -4.40286418035125e-02 + 4.07797512889574e-02 -4.22832452899324e-02 + 3.76203116687853e-02 -4.05471735735779e-02 + 3.46254239696624e-02 -3.88215583285753e-02 + 3.17889085655347e-02 -3.71070627007449e-02 + 2.91063003142196e-02 -3.54070465342894e-02 + 2.65680912572024e-02 -3.37242409387003e-02 + 2.41746444372365e-02 -3.20578833095496e-02 + 2.19171444247057e-02 -3.04080839884921e-02 + 1.97858149698170e-02 -2.87865078379770e-02 + 1.77816785975956e-02 -2.71845378027204e-02 + 1.59022597397006e-02 -2.56014559510294e-02 + 1.41389646872214e-02 -2.40428674601252e-02 + 1.24868469400299e-02 -2.25098598379508e-02 + 1.09480652882944e-02 -2.09965353712404e-02 + 9.51590058521273e-03 -1.95072886041607e-02 + 8.19359596476239e-03 -1.80358421377615e-02 + 6.97242121388991e-03 -1.65886143273830e-02 + 5.86117330807756e-03 -1.51566360782969e-02 + 4.85595758514205e-03 -1.37425262435773e-02 + 3.94940976333073e-03 -1.23512935315688e-02 + 3.14133835342164e-03 -1.09822566687452e-02 + 2.44321714150649e-03 -9.63205013980954e-03 + 1.83022809796061e-03 -8.31193344939125e-03 + 1.31884436057794e-03 -7.01716988880847e-03 + 8.97352193736273e-04 -5.75368646998309e-03 + 5.63740905842356e-04 -4.52380720725293e-03 + 3.11437030347409e-04 -3.33125343689109e-03 + 1.35836224347021e-04 -2.17811584123553e-03 + 4.45280630750671e-05 -1.06661951254253e-03 + 0.00000000000000e+00 0.00000000000000e+00 + 2.66759975469128e-05 1.06620320574453e-03 + 1.03135502882502e-04 2.17873885472331e-03 + 2.50714361136359e-04 3.33437348745562e-03 + 4.62713791811825e-04 4.53304972124580e-03 + 7.43003731765193e-04 5.77372430028259e-03 + 1.10319742939756e-03 7.05282365458086e-03 + 1.54997995490141e-03 8.36732726269284e-03 + 2.09725167376054e-03 9.71027388884010e-03 + 2.74048539040992e-03 1.10830187729024e-02 + 3.47312973743479e-03 1.24853497385656e-02 + 4.30082057862358e-03 1.39166426421534e-02 + 5.21856989199968e-03 1.53794078029284e-02 + 6.22534057591764e-03 1.68754960531490e-02 + 7.32700432621982e-03 1.84027675881834e-02 + 8.52684801153103e-03 1.99605858637636e-02 + 9.82457090745577e-03 2.15515899247781e-02 + 1.12235129483028e-02 2.31756762504219e-02 + 1.27200449567995e-02 2.48389005693531e-02 + 1.43242218865420e-02 2.65369882056060e-02 + 1.60404178082626e-02 2.82678553499417e-02 + 1.78724934115684e-02 3.00331989618528e-02 + 1.98202065802740e-02 3.18374006104675e-02 + 2.18950371605342e-02 3.36723464545640e-02 + 2.40944987682683e-02 3.55478452136134e-02 + 2.64266489071067e-02 3.74562451109318e-02 + 2.89010362193680e-02 3.93973481646352e-02 + 3.15128734993139e-02 4.13789540071277e-02 + 3.42721293711695e-02 4.33986338037802e-02 + 3.71869628254960e-02 4.54495701594197e-02 + 4.02626884327817e-02 4.75345999298599e-02 + 4.35001994625931e-02 4.96601287812404e-02 + 4.69115999564798e-02 5.18156686218105e-02 + 5.05037662874084e-02 5.40013382232845e-02 + 5.42786495746735e-02 5.62234758330505e-02 + 5.82482809121614e-02 5.84716000937855e-02 + 6.24154777430842e-02 6.07527241240193e-02 + 6.67896532476333e-02 6.30611171442784e-02 + 7.13799778368031e-02 6.53924902316809e-02 + 7.61893991966636e-02 6.77536943148228e-02 + 8.12317422826271e-02 7.01307158448530e-02 + 8.65117308166364e-02 7.25279772295263e-02 + 9.20361925143298e-02 7.49454570665521e-02 + 9.78162490733068e-02 7.73748196288702e-02 + 1.03860525098628e-01 7.98107376836716e-02 + 1.10175749426971e-01 8.22553965780306e-02 + 1.16770184828620e-01 8.47058845532950e-02 + 1.23653173100621e-01 8.71545949342700e-02 + 1.30834306039958e-01 8.95967898803351e-02 + 1.38321638159842e-01 9.20292326136635e-02 + 1.46124356656426e-01 9.44436091370127e-02 + 1.54251870487751e-01 9.68324481019705e-02 + 1.62712165766615e-01 9.91923652415109e-02 + 1.71513276359922e-01 1.01517920367561e-01 + 1.80666809206519e-01 1.03789902629961e-01 + 1.90176333616483e-01 1.06018459355824e-01 + 2.00055618945293e-01 1.08170249602257e-01 + 2.10311333730825e-01 1.10238985284240e-01 + 2.20950025725240e-01 1.12217524621099e-01 + 2.31980826542045e-01 1.14082138261491e-01 + 2.43406729303366e-01 1.15839155310084e-01 + 2.55238106076494e-01 1.17446572225308e-01 + 2.67477471857320e-01 1.18905415201973e-01 + 2.80131031707401e-01 1.20180412981259e-01 + 2.93202678436719e-01 1.21245809848125e-01 + 3.06694853961626e-01 1.22070347287731e-01 + 3.20607221269401e-01 1.22636048627399e-01 + 3.34939225727116e-01 1.22896405187495e-01 + 3.49687259951759e-01 1.22832509683795e-01 + 3.64846634151165e-01 1.22439948740756e-01 + 3.80413960921238e-01 1.21746809942571e-01 + 3.96385714538567e-01 1.20764919268824e-01 + 4.12758960322157e-01 1.19510121769152e-01 + 4.29529842936380e-01 1.17984332147218e-01 + 4.46694032865700e-01 1.16192942543521e-01 + 4.64243156344356e-01 1.14110109333428e-01 + 4.82175917377177e-01 1.11782565979692e-01 + 5.00484981625201e-01 1.09197664159710e-01 + 5.19162527401886e-01 1.06360393829411e-01 + 5.38203351947280e-01 1.03293317103930e-01 + 5.57598339807246e-01 9.99962205928791e-02 + 5.77338351570623e-01 9.64747449157602e-02 + 5.97416776275050e-01 9.27560006949552e-02 + 6.17822141099620e-01 8.88440306520127e-02 + 6.38542602259551e-01 8.47454502578335e-02 + 6.59565267437110e-01 8.04670396004571e-02 + 6.80878587686638e-01 7.60267545343259e-02 + 7.02471625795160e-01 7.14503791069948e-02 + 7.24326570178040e-01 6.67348590516426e-02 + 7.46427167466697e-01 6.18895592022783e-02 + 7.68752565300964e-01 5.69073598312532e-02 + 7.91284286644164e-01 5.17961436337766e-02 + 8.14003103862062e-01 4.65642778387828e-02 + 8.36892211324902e-01 4.12336546487814e-02 + 8.59931483011660e-01 3.58149765441833e-02 + 8.83096679342750e-01 3.03040142055707e-02 + 9.06368908273977e-01 2.47214334364437e-02 + 9.29725618218844e-01 1.90747609134739e-02 + 9.53145851346865e-01 1.33087434425404e-02 + 9.76587857380671e-01 7.46542748662253e-03 + 1.00000000000000e+00 1.53836008119114e-03 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_00.dat b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_00.dat new file mode 100644 index 000000000..b23ba71dd --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_00.dat @@ -0,0 +1,254 @@ +! ------------ AirfoilInfo v1.01.x Input File ---------------------------------- +! AeroElasticSE FAST driver +! line +! line +! ------------------------------------------------------------------------------ +DEFAULT InterpOrd ! Interpolation order to use for quasi-steady table lookup {1=linear; 3=cubic spline; "default"} [default=3] +1 NonDimArea ! The non-dimensional area of the airfoil (area/chord^2) (set to 1.0 if unsure or unneeded) +@"NREL-2p8-127_AF00_Coords.txt" NumCoords ! The number of coordinates in the airfoil shape file. Set to zero if coordinates not included. +AF00_BL.txt BL_file ! The file name including the boundary layer characteristics of the profile. Ignored if the aeroacoustic module is not called. +1 NumTabs ! Number of airfoil tables in this file. Each table must have lines for Re and Ctrl. +! ------------------------------------------------------------------------------ +! data for table 1 +! ------------------------------------------------------------------------------ +6.000000 Re ! Reynolds number in millions +0 Ctrl ! Control setting (must be 0 for current AirfoilInfo) +True InclUAdata ! Is unsteady aerodynamics data included in this table? If TRUE, then include 30 UA coefficients below this line +!........................................ +0.000000 alpha0 ! 0-lift angle of attack, depends on airfoil. +0.000000 alpha1 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA>alpha0. (deg) +0.000000 alpha2 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA1] +0.000000 S2 ! Constant in the f curve best-fit for AOA> alpha1; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S3 ! Constant in the f curve best-fit for alpha2<=AOA< alpha0; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S4 ! Constant in the f curve best-fit for AOA< alpha2; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 Cn1 ! Critical value of C0n at leading edge separation. It should be extracted from airfoil data at a given Mach and Reynolds number. It can be calculated from the static value of Cn at either the break in the pitching moment or the loss of chord force at the onset of stall. It is close to the condition of maximum lift of the airfoil at low Mach numbers. +0.000000 Cn2 ! As Cn1 for negative AOAs. +Default St_sh ! Strouhal's shedding frequency constant. [default = 0.19] +0.000000 Cd0 ! 2D drag coefficient value at 0-lift. +0.000000 Cm0 ! 2D pitching moment coefficient about 1/4-chord location, at 0-lift, positive if nose up. [If the aerodynamics coefficients table does not include a column for Cm, this needs to be set to 0.0] +0.000000 k0 ! Constant in the \hat(x)_cp curve best-fit; = (\hat(x)_AC-0.25). [ignored if UAMod<>1] +0.000000 k1 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k2 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k3 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k1_hat ! Constant in the expression of Cc due to leading edge vortex effects. [ignored if UAMod<>1] +Default x_cp_bar ! Constant in the expression of \hat(x)_cp^v. [ignored if UAMod<>1, default = 0.2] +Default UACutout ! Angle of attack above which unsteady aerodynamics are disabled (deg). [Specifying the string "Default" sets UACutout to 45 degrees] +Default filtCutOff ! Cut-off frequency (-3 dB corner frequency) for low-pass filtering the AoA input to UA, as well as the 1st and 2nd derivatives (Hz) [default = 20] +!........................................ +! Table of aerodynamics coefficients +200 NumAlf ! Number of data lines in the following table +! Alpha Cl Cd Cm +! (deg) (-) (-) (-) +-1.80000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.77000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.74000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 -2.77555756156289e-17 +-1.71000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.68000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.65000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.62000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.59000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.56000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.53000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.50000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.47000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.44000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.41000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.38000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.35000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.32000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.29000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.26000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.23000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.20000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.17000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.14000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.11000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.08000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.05000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.02000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-9.90000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-9.60000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-9.30000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-9.00000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-8.70000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-8.40000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-8.10000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-7.80000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-7.50000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-7.20000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-6.90000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-6.60000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-6.30000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-6.00000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-5.70000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-5.40000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-5.10000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-4.80000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-4.50000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-4.20000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-3.90000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-3.60000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-3.30000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-3.00000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-2.93939393939394e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-2.87878787878788e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-2.81818181818182e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-2.75757575757576e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-2.69696969696970e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-2.63636363636364e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-2.57575757575758e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-2.51515151515151e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-2.45454545454545e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-2.39393939393939e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-2.33333333333333e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-2.27272727272727e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-2.21212121212121e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-2.15151515151515e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-2.09090909090909e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-2.03030303030303e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.96969696969697e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.90909090909091e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.84848484848485e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.78787878787879e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.72727272727273e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.66666666666667e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.60606060606061e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.54545454545455e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.48484848484848e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.42424242424242e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.36363636363636e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.30303030303030e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.24242424242424e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.18181818181818e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.12121212121212e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.06060606060606e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.00000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-9.39393939393939e+00 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-8.78787878787879e+00 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-8.18181818181818e+00 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-7.57575757575758e+00 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-6.96969696969697e+00 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-6.36363636363636e+00 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-5.75757575757576e+00 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-5.15151515151515e+00 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-4.54545454545454e+00 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-3.93939393939394e+00 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-3.33333333333333e+00 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-2.72727272727273e+00 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-2.12121212121212e+00 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-1.51515151515152e+00 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-9.09090909090912e-01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 +-3.03030303030302e-01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 3.03030303030302e-01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 9.09090909090912e-01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.51515151515152e+00 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 2.12121212121212e+00 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 2.72727272727273e+00 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 3.33333333333333e+00 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 3.93939393939394e+00 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 4.54545454545455e+00 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 5.15151515151515e+00 1.11022302462516e-16 5.00000000000000e-01 0.00000000000000e+00 + 5.75757575757576e+00 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 6.36363636363637e+00 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 6.96969696969697e+00 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 7.57575757575757e+00 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 8.18181818181818e+00 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 8.78787878787879e+00 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 9.39393939393939e+00 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.00000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.06060606060606e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.12121212121212e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.18181818181818e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.24242424242424e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.30303030303030e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.36363636363636e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.42424242424242e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.48484848484848e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.54545454545455e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.60606060606061e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.66666666666667e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.72727272727273e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.78787878787879e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.84848484848485e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.90909090909091e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.96969696969697e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 2.03030303030303e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 2.09090909090909e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 2.15151515151515e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 2.21212121212121e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 2.27272727272727e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 2.33333333333333e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 2.39393939393939e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 2.45454545454545e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 2.51515151515151e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 2.57575757575758e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 2.63636363636364e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 2.69696969696970e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 2.75757575757576e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 2.81818181818182e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 2.87878787878788e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 2.93939393939394e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 3.00000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 3.30000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 3.60000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 3.90000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 4.20000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 4.50000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 4.80000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 5.10000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 5.40000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 5.70000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 6.00000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 6.30000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 6.60000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 6.90000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 7.20000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 7.50000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 7.80000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 8.10000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 8.40000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 8.70000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 9.00000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 9.30000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 9.60000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 9.90000000000000e+01 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.02000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.05000000000000e+02 2.77555756156289e-17 5.00000000000000e-01 0.00000000000000e+00 + 1.08000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.11000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.14000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.17000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.20000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.23000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.26000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.29000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.32000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.35000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.38000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.41000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.44000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.47000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.50000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.53000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.56000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.59000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.62000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.65000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.68000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.71000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.74000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.77000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 + 1.80000000000000e+02 0.00000000000000e+00 5.00000000000000e-01 0.00000000000000e+00 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_01.dat b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_01.dat new file mode 100644 index 000000000..b197c6370 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_01.dat @@ -0,0 +1,254 @@ +! ------------ AirfoilInfo v1.01.x Input File ---------------------------------- +! AeroElasticSE FAST driver +! line +! line +! ------------------------------------------------------------------------------ +DEFAULT InterpOrd ! Interpolation order to use for quasi-steady table lookup {1=linear; 3=cubic spline; "default"} [default=3] +1 NonDimArea ! The non-dimensional area of the airfoil (area/chord^2) (set to 1.0 if unsure or unneeded) +@"NREL-2p8-127_AF01_Coords.txt" NumCoords ! The number of coordinates in the airfoil shape file. Set to zero if coordinates not included. +AF01_BL.txt BL_file ! The file name including the boundary layer characteristics of the profile. Ignored if the aeroacoustic module is not called. +1 NumTabs ! Number of airfoil tables in this file. Each table must have lines for Re and Ctrl. +! ------------------------------------------------------------------------------ +! data for table 1 +! ------------------------------------------------------------------------------ +6.000000 Re ! Reynolds number in millions +0 Ctrl ! Control setting (must be 0 for current AirfoilInfo) +True InclUAdata ! Is unsteady aerodynamics data included in this table? If TRUE, then include 30 UA coefficients below this line +!........................................ +0.000000 alpha0 ! 0-lift angle of attack, depends on airfoil. +0.000000 alpha1 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA>alpha0. (deg) +0.000000 alpha2 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA1] +0.000000 S2 ! Constant in the f curve best-fit for AOA> alpha1; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S3 ! Constant in the f curve best-fit for alpha2<=AOA< alpha0; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S4 ! Constant in the f curve best-fit for AOA< alpha2; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 Cn1 ! Critical value of C0n at leading edge separation. It should be extracted from airfoil data at a given Mach and Reynolds number. It can be calculated from the static value of Cn at either the break in the pitching moment or the loss of chord force at the onset of stall. It is close to the condition of maximum lift of the airfoil at low Mach numbers. +0.000000 Cn2 ! As Cn1 for negative AOAs. +Default St_sh ! Strouhal's shedding frequency constant. [default = 0.19] +0.000000 Cd0 ! 2D drag coefficient value at 0-lift. +0.000000 Cm0 ! 2D pitching moment coefficient about 1/4-chord location, at 0-lift, positive if nose up. [If the aerodynamics coefficients table does not include a column for Cm, this needs to be set to 0.0] +0.000000 k0 ! Constant in the \hat(x)_cp curve best-fit; = (\hat(x)_AC-0.25). [ignored if UAMod<>1] +0.000000 k1 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k2 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k3 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k1_hat ! Constant in the expression of Cc due to leading edge vortex effects. [ignored if UAMod<>1] +Default x_cp_bar ! Constant in the expression of \hat(x)_cp^v. [ignored if UAMod<>1, default = 0.2] +Default UACutout ! Angle of attack above which unsteady aerodynamics are disabled (deg). [Specifying the string "Default" sets UACutout to 45 degrees] +Default filtCutOff ! Cut-off frequency (-3 dB corner frequency) for low-pass filtering the AoA input to UA, as well as the 1st and 2nd derivatives (Hz) [default = 20] +!........................................ +! Table of aerodynamics coefficients +200 NumAlf ! Number of data lines in the following table +! Alpha Cl Cd Cm +! (deg) (-) (-) (-) +-1.80000000000000e+02 0.00000000000000e+00 4.98298540333591e-01 0.00000000000000e+00 +-1.77000000000000e+02 6.22917411225319e-03 4.99373778033698e-01 7.76775909182493e-03 +-1.74000000000000e+02 1.25154154596942e-02 4.99419482735902e-01 1.56066808333025e-02 +-1.71000000000000e+02 1.87731622461588e-02 4.99461965511715e-01 2.34100699534240e-02 +-1.68000000000000e+02 2.34094297732302e-02 4.99530448606310e-01 2.52436698228222e-02 +-1.65000000000000e+02 2.72360674222744e-02 4.99608171404762e-01 2.40924447430971e-02 +-1.62000000000000e+02 3.10637475603965e-02 4.99680051763820e-01 2.29412064713014e-02 +-1.59000000000000e+02 3.36494201711338e-02 4.99754234730512e-01 2.21517716457378e-02 +-1.56000000000000e+02 3.37510782194723e-02 4.99836914626034e-01 2.20859314734659e-02 +-1.53000000000000e+02 3.38548418745498e-02 4.99908331389323e-01 2.20200907982144e-02 +-1.50000000000000e+02 3.39610598736408e-02 4.99965130046894e-01 2.19542509808981e-02 +-1.47000000000000e+02 3.40022351252792e-02 5.01549605455131e-01 2.23645223424130e-02 +-1.44000000000000e+02 3.40443360294749e-02 5.07633704084372e-01 2.27747952710201e-02 +-1.41000000000000e+02 3.40874558144093e-02 5.13717849193324e-01 2.31850713339235e-02 +-1.38000000000000e+02 3.36790582106382e-02 5.20009950681803e-01 2.35945800253753e-02 +-1.35000000000000e+02 3.30448480367859e-02 5.26406029938182e-01 2.40037050326582e-02 +-1.32000000000000e+02 3.24110462717851e-02 5.32802182487933e-01 2.44128347281493e-02 +-1.29000000000000e+02 3.14966524820477e-02 5.39025691193689e-01 2.47587684454421e-02 +-1.26000000000000e+02 3.00203897774573e-02 5.44903911391262e-01 2.49783099065228e-02 +-1.23000000000000e+02 2.85442923527018e-02 5.47997043443126e-01 2.51978496904198e-02 +-1.20000000000000e+02 2.70683874187890e-02 5.50390438255170e-01 2.54173886357562e-02 +-1.17000000000000e+02 2.48208058238953e-02 5.51842311486022e-01 2.53547661804404e-02 +-1.14000000000000e+02 2.25732865469572e-02 5.53294177329843e-01 2.52921434125441e-02 +-1.11000000000000e+02 2.03258601363591e-02 5.54746032082366e-01 2.52295211230444e-02 +-1.08000000000000e+02 1.77044555792872e-02 5.55339410798165e-01 2.49510697467495e-02 +-1.05000000000000e+02 1.48960397658858e-02 5.55503544958830e-01 2.45647021836766e-02 +-1.02000000000000e+02 1.20876828091304e-02 5.55667677238678e-01 2.41783390479984e-02 +-9.90000000000000e+01 9.19392120485563e-03 5.55336597556942e-01 2.36900749881812e-02 +-9.60000000000000e+01 6.12926766887735e-03 5.54015072501802e-01 2.29980046662208e-02 +-9.30000000000000e+01 3.06463754512461e-03 5.52693557542367e-01 2.23059396312876e-02 +-9.00000000000000e+01 1.91272727247280e-08 5.51372047630695e-01 2.15841433608613e-02 +-8.70000000000000e+01 -3.06463440848635e-03 5.52693556189802e-01 2.16338466189352e-02 +-8.40000000000000e+01 -6.12927623833141e-03 5.54015076197080e-01 2.16677916947745e-02 +-8.10000000000000e+01 -9.19389465618328e-03 5.55336586108752e-01 2.16947509086332e-02 +-7.80000000000000e+01 -1.20876692076357e-02 5.55667678033613e-01 2.14919425433851e-02 +-7.50000000000000e+01 -1.48960583459338e-02 5.55503543872940e-01 2.11742464233755e-02 +-7.20000000000000e+01 -1.77044419776618e-02 5.55339411593092e-01 2.08565539438687e-02 +-6.90000000000000e+01 -2.03258406672883e-02 5.54746044659799e-01 2.04334687101240e-02 +-6.60000000000000e+01 -2.25732928313413e-02 5.53294173270158e-01 1.97995893374298e-02 +-6.30000000000000e+01 -2.48208206936227e-02 5.51842301880517e-01 1.91657099647355e-02 +-6.00000000000000e+01 -2.70683971825928e-02 5.50390422420595e-01 1.85318284698429e-02 +-5.70000000000000e+01 -2.85443021178706e-02 5.47997027608551e-01 1.76503617476530e-02 +-5.40000000000000e+01 -3.00203995438562e-02 5.44903872501265e-01 1.67688916585075e-02 +-5.10000000000000e+01 -3.14966622493741e-02 5.39025652303692e-01 1.58874148353996e-02 +-4.80000000000000e+01 -3.24110456233041e-02 5.32802189034552e-01 1.48845508415255e-02 +-4.50000000000000e+01 -3.30448401226552e-02 5.26406109778172e-01 1.38209952131320e-02 +-4.20000000000000e+01 -3.36790575613502e-02 5.20009957227964e-01 1.27574273972622e-02 +-3.90000000000000e+01 -3.40874557757088e-02 5.13717843800706e-01 1.16502587670957e-02 +-3.60000000000000e+01 -3.40443359103789e-02 5.07633687072646e-01 1.04558679399742e-02 +-3.30000000000000e+01 -3.40022354063646e-02 5.01549646541201e-01 9.26149992360155e-03 +-3.00000000000000e+01 -3.39610593176495e-02 4.99965129704843e-01 8.06710800308781e-03 +-2.93939393939394e+01 -3.39393842149473e-02 4.99955039870966e-01 7.77133972459921e-03 +-2.87878787878788e+01 -3.39178226626962e-02 4.99944209186026e-01 7.47170990628286e-03 +-2.81818181818182e+01 -3.38963709780943e-02 4.99932679692807e-01 7.17234251862615e-03 +-2.75757575757576e+01 -3.38750252088939e-02 4.99920490061147e-01 6.87323704771576e-03 +-2.69696969696970e+01 -3.38537822279900e-02 4.99907676487852e-01 6.57440256765985e-03 +-2.63636363636364e+01 -3.38326389844070e-02 4.99894272577114e-01 6.27584744506084e-03 +-2.57575757575758e+01 -3.38115926180026e-02 4.99880309637533e-01 5.97758105595668e-03 +-2.51515151515151e+01 -3.37906402717716e-02 4.99865816763762e-01 5.67961122622956e-03 +-2.45454545454545e+01 -3.37697787305793e-02 4.99850820740502e-01 5.38193913346827e-03 +-2.39393939393939e+01 -3.37490052565293e-02 4.99835346782305e-01 5.08457126751900e-03 +-2.33333333333333e+01 -3.37283172206986e-02 4.99819418446624e-01 4.78751430822279e-03 +-2.27272727272727e+01 -3.37077120977687e-02 4.99803057767734e-01 4.49077513241954e-03 +-2.21212121212121e+01 -3.36871874609726e-02 4.99786285377891e-01 4.19436082126422e-03 +-2.15151515151515e+01 -3.36667405096286e-02 4.99769120219361e-01 3.89827188626708e-03 +-2.09090909090909e+01 -3.36463693546679e-02 4.99751580718914e-01 3.60252094397359e-03 +-2.03030303030303e+01 -3.36260719547005e-02 4.99733684020483e-01 3.30711743419011e-03 +-1.96969696969697e+01 -3.29941770005342e-02 4.99715928910410e-01 2.97198266169500e-03 +-1.90909090909091e+01 -3.17509544740198e-02 4.99698118180787e-01 2.59700694849448e-03 +-1.84848484848485e+01 -3.05081921751880e-02 4.99679692312574e-01 2.22228885632221e-03 +-1.78787878787879e+01 -2.92658434632383e-02 4.99660638867322e-01 1.84786105360303e-03 +-1.72727272727273e+01 -2.80238734929002e-02 4.99640945159408e-01 1.47377573016103e-03 +-1.66666666666667e+01 -2.67823588448486e-02 4.99620599927312e-01 1.10014144572659e-03 +-1.60606060606061e+01 -2.55413203393379e-02 4.99599590742328e-01 7.27083418764568e-04 +-1.54545454545455e+01 -2.43008440419113e-02 4.99577905993521e-01 3.54797120669601e-04 +-1.48484848484848e+01 -2.30608787869031e-02 4.99555531346250e-01 4.21684305218460e-05 +-1.42424242424242e+01 -2.18214069842467e-02 4.99532452564366e-01 2.71911216522822e-05 +-1.36363636363636e+01 -2.05833091301585e-02 4.99508671393742e-01 1.42264537010822e-05 +-1.30303030303030e+01 -1.93442785240345e-02 4.99484131275150e-01 4.31295864732214e-06 +-1.24242424242424e+01 -1.81074797005703e-02 4.99458875874706e-01 -1.61041962405105e-04 +-1.18181818181818e+01 -1.68699463185017e-02 4.99432832875225e-01 -7.83817617224051e-04 +-1.12121212121212e+01 -1.56337784253251e-02 4.99406027440083e-01 -1.40654332027136e-03 +-1.06060606060606e+01 -1.43985688202720e-02 4.99052692242324e-01 -2.02931540870597e-03 +-1.00000000000000e+01 -1.31630022724158e-02 4.97993704507194e-01 -2.65204851654948e-03 +-9.39393939393939e+00 -1.11477228175490e-02 4.96487069320693e-01 -2.55646323442072e-03 +-8.78787878787879e+00 -9.13290842766007e-03 4.94977661180442e-01 -2.46147157009362e-03 +-8.18181818181818e+00 -7.12154268363285e-03 4.93467019568035e-01 -2.36566761577865e-03 +-7.57575757575758e+00 -5.11266117893152e-03 4.91954998300813e-01 -2.26283387170764e-03 +-6.96969696969697e+00 -3.10698824489412e-03 4.90440242965021e-01 -2.08181170391097e-03 +-6.36363636363636e+00 -1.10309834514044e-03 4.88921311313049e-01 -1.89874522974860e-03 +-5.75757575757576e+00 -3.00747474205360e-04 4.87401751405469e-01 -1.71567088819378e-03 +-5.15151515151515e+00 -2.21631176101127e-04 4.85879616962190e-01 -1.53403240787112e-03 +-4.54545454545454e+00 -1.49616631477367e-04 4.84353891592103e-01 -1.35030844364575e-03 +-3.93939393939394e+00 -8.68897616353509e-05 4.82825709613375e-01 -1.16711649919569e-03 +-3.33333333333333e+00 -3.06390387180330e-05 4.81485638756053e-01 -1.06097220254243e-03 +-2.72727272727273e+00 2.49883470329266e-03 4.81081167821070e-01 -1.11471300781816e-03 +-2.12121212121212e+00 9.70229526683138e-03 4.81205260595194e-01 -1.25146797918653e-03 +-1.51515151515152e+00 1.69064135086061e-02 4.81329323131111e-01 -1.47373619873665e-03 +-9.09090909090912e-01 2.15687752025109e-02 4.81450361624086e-01 -1.68081905636486e-03 +-3.03030303030302e-01 2.42404595537528e-02 4.81560887996981e-01 -1.90313415400156e-03 + 3.03030303030302e-01 2.69131749150450e-02 4.81684879937810e-01 -2.12376124690789e-03 + 9.09090909090912e-01 2.95856638229001e-02 4.81808857865227e-01 -2.33301661078614e-03 + 1.51515151515152e+00 3.22398936101882e-02 4.81929840079279e-01 -2.55120165338738e-03 + 2.12121212121212e+00 3.66675784640552e-02 4.81924986740543e-01 -2.77391835793390e-03 + 2.72727272727273e+00 4.19698427928253e-02 4.81879454613869e-01 -2.98510710550669e-03 + 3.33333333333333e+00 4.72717179522425e-02 4.81833922593971e-01 -3.18573614963958e-03 + 3.93939393939394e+00 5.25753326357400e-02 4.81775728360497e-01 -3.38638186200821e-03 + 4.54545454545455e+00 5.78765746006633e-02 4.81728632143155e-01 -3.59889201718914e-03 + 5.15151515151515e+00 6.31803800322498e-02 4.81680617938285e-01 -3.79953830438974e-03 + 5.75757575757576e+00 6.78668119866628e-02 4.81626107889307e-01 -4.03804041841606e-03 + 6.36363636363637e+00 7.15042486961224e-02 4.81584603835809e-01 -4.34980617905866e-03 + 6.96969696969697e+00 7.49998526302299e-02 4.81530576563388e-01 -4.66507085142508e-03 + 7.57575757575757e+00 7.85534281259633e-02 4.81489207644286e-01 -4.96022383060956e-03 + 8.18181818181818e+00 8.27222397693518e-02 4.81442706653469e-01 -5.12210053319802e-03 + 8.78787878787879e+00 8.59673537796770e-02 4.81485608223198e-01 -5.30026887591891e-03 + 9.39393939393939e+00 8.63938854494780e-02 4.81734888790963e-01 -5.58390579608546e-03 + 1.00000000000000e+01 8.61476310716953e-02 4.82033636040847e-01 -5.89351913489291e-03 + 1.06060606060606e+01 1.14640664678628e-02 4.86367761950627e-01 -4.32401101558585e-03 + 1.12121212121212e+01 1.77109990487445e-03 4.90977291638818e-01 -5.52690415533776e-05 + 1.18181818181818e+01 1.63608094150530e-03 4.94596563237555e-01 -4.71568484033090e-05 + 1.24242424242424e+01 5.38023265894621e-02 4.97637007791052e-01 -7.01427597271410e-05 + 1.30303030303030e+01 7.07102583465799e-02 4.99408388908304e-01 -2.78511851302713e-04 + 1.36363636363636e+01 6.81632004936948e-02 4.99466710089213e-01 -3.41458399817878e-04 + 1.42424242424242e+01 6.49592840496404e-02 4.99515392758744e-01 -3.60890382699212e-04 + 1.48484848484848e+01 6.00226087507924e-02 4.99558582755279e-01 -3.80502489146672e-04 + 1.54545454545455e+01 5.42932388358678e-02 4.99595173447000e-01 -3.60569709918067e-04 + 1.60606060606061e+01 4.89399852015463e-02 4.99626659734195e-01 -3.74707069218248e-04 + 1.66666666666667e+01 4.90264804982352e-02 4.99643029856566e-01 -8.14570485140793e-04 + 1.72727272727273e+01 4.89767434358854e-02 4.99658738397009e-01 -1.29542584308036e-03 + 1.78787878787879e+01 4.87601917929942e-02 4.99673710331708e-01 -1.82640692279492e-03 + 1.84848484848485e+01 4.85448822816922e-02 4.99688486075466e-01 -2.35860501303099e-03 + 1.90909090909091e+01 4.83300562227171e-02 4.99703072863703e-01 -2.89167774847090e-03 + 1.96969696969697e+01 4.81154623433704e-02 4.99717479015725e-01 -3.42523467641370e-03 + 2.03030303030303e+01 4.80233231913679e-02 4.99733684020482e-01 -3.86916331990858e-03 + 2.09090909090909e+01 4.80535318777004e-02 4.99751580718914e-01 -4.22318641357654e-03 + 2.15151515151515e+01 4.80838465710918e-02 4.99769120219361e-01 -4.57757988364418e-03 + 2.21212121212121e+01 4.81142702027946e-02 4.99786285377891e-01 -4.93233346765168e-03 + 2.27272727272727e+01 4.81448054735174e-02 4.99803057767734e-01 -5.28743306710894e-03 + 2.33333333333333e+01 4.81754564360106e-02 4.99819418446624e-01 -5.64287905507360e-03 + 2.39393939393939e+01 4.82062265821584e-02 4.99835346782305e-01 -5.99866390348971e-03 + 2.45454545454545e+01 4.82371195457987e-02 4.99850820740502e-01 -6.35478030087519e-03 + 2.51515151515151e+01 4.82681391100110e-02 4.99865816763762e-01 -6.71122114458926e-03 + 2.57575757575758e+01 4.82992892148572e-02 4.99880309637533e-01 -7.06797953342872e-03 + 2.63636363636364e+01 4.83305745045125e-02 4.99894272577114e-01 -7.42505490046007e-03 + 2.69696969696970e+01 4.83619990851020e-02 4.99907676487852e-01 -7.78243869417755e-03 + 2.75757575757576e+01 4.83935670617676e-02 4.99920490061147e-01 -8.14012048538783e-03 + 2.81818181818182e+01 4.84252828173819e-02 4.99932679692807e-01 -8.49809103217069e-03 + 2.87878787878788e+01 4.84571508417891e-02 4.99944209186026e-01 -8.85634022554155e-03 + 2.93939393939394e+01 4.84891768440017e-02 4.99955039870966e-01 -9.21486940940596e-03 + 3.00000000000000e+01 4.85213661255990e-02 4.99965129704843e-01 -9.57367290978077e-03 + 3.30000000000000e+01 4.85783850925221e-02 5.01549646541201e-01 -1.08893308683242e-02 + 3.60000000000000e+01 4.86367279082047e-02 5.07633687072646e-01 -1.21830696545693e-02 + 3.90000000000000e+01 4.86965308414856e-02 5.13717843800706e-01 -1.34715855024972e-02 + 4.20000000000000e+01 4.81074542024269e-02 5.20009957227964e-01 -1.45755410030633e-02 + 4.50000000000000e+01 4.71938349445183e-02 5.26406109778172e-01 -1.55872262614513e-02 + 4.80000000000000e+01 4.62807992978572e-02 5.32802189034552e-01 -1.65988999268877e-02 + 5.10000000000000e+01 4.49696537236258e-02 5.39025652303692e-01 -1.75196039279897e-02 + 5.40000000000000e+01 4.28613244897533e-02 5.44903872501265e-01 -1.82583627521897e-02 + 5.70000000000000e+01 4.07532301242102e-02 5.47997027608551e-01 -1.89971159327085e-02 + 6.00000000000000e+01 3.86454092273193e-02 5.50390422420595e-01 -1.97358662914081e-02 + 6.30000000000000e+01 3.54441639493027e-02 5.51842301880517e-01 -2.01991699310181e-02 + 6.60000000000000e+01 3.22429963032422e-02 5.53294173270158e-01 -2.06624712096125e-02 + 6.90000000000000e+01 2.90419479592744e-02 5.54746044659799e-01 -2.11257724882070e-02 + 7.20000000000000e+01 2.52997639160426e-02 5.55339411593092e-01 -2.14026262276280e-02 + 7.50000000000000e+01 2.12869899032544e-02 5.55503543872940e-01 -2.15862600142917e-02 + 7.80000000000000e+01 1.72742065965976e-02 5.55667678033613e-01 -2.17698959052524e-02 + 8.10000000000000e+01 1.31391516042592e-02 5.55336586108752e-01 -2.18644734045035e-02 + 8.40000000000000e+01 8.75945317316178e-03 5.54015076197080e-01 -2.17809402678169e-02 + 8.70000000000000e+01 4.37972128358576e-03 5.52693556189802e-01 -2.16904207186265e-02 + 9.00000000000000e+01 -1.91272727377706e-08 5.51372047630695e-01 -2.15841433608613e-02 + 9.30000000000000e+01 -3.06463754512461e-03 5.52693557542367e-01 -2.23059396312876e-02 + 9.60000000000000e+01 -6.12926766887736e-03 5.54015072501802e-01 -2.29980046662208e-02 + 9.90000000000000e+01 -9.19392120485563e-03 5.55336597556942e-01 -2.36900749881812e-02 + 1.02000000000000e+02 -1.20876828091304e-02 5.55667677238678e-01 -2.41783390479984e-02 + 1.05000000000000e+02 -1.48960397658858e-02 5.55503544958831e-01 -2.45647021836766e-02 + 1.08000000000000e+02 -1.77044555792872e-02 5.55339410798165e-01 -2.49510697467495e-02 + 1.11000000000000e+02 -2.03258601363591e-02 5.54746032082366e-01 -2.52295211230444e-02 + 1.14000000000000e+02 -2.25732865469573e-02 5.53294177329843e-01 -2.52921434125440e-02 + 1.17000000000000e+02 -2.48208058238953e-02 5.51842311486022e-01 -2.53547661804404e-02 + 1.20000000000000e+02 -2.70683874187890e-02 5.50390438255170e-01 -2.54173886357562e-02 + 1.23000000000000e+02 -2.85442923527018e-02 5.47997043443125e-01 -2.51978496904198e-02 + 1.26000000000000e+02 -3.00203897774573e-02 5.44903911391262e-01 -2.49783099065228e-02 + 1.29000000000000e+02 -3.14966524820477e-02 5.39025691193689e-01 -2.47587684454421e-02 + 1.32000000000000e+02 -3.24110462717851e-02 5.32802182487933e-01 -2.44128347281493e-02 + 1.35000000000000e+02 -3.30448480367859e-02 5.26406029938182e-01 -2.40037050326582e-02 + 1.38000000000000e+02 -3.36790582106382e-02 5.20009950681803e-01 -2.35945800253753e-02 + 1.41000000000000e+02 -3.40874558144093e-02 5.13717849193324e-01 -2.31850713339234e-02 + 1.44000000000000e+02 -3.40443360294749e-02 5.07633704084372e-01 -2.27747952710201e-02 + 1.47000000000000e+02 -3.40022351252792e-02 5.01549605455131e-01 -2.23645223424130e-02 + 1.50000000000000e+02 -3.39610598736408e-02 4.99965130046894e-01 -2.19542509808981e-02 + 1.53000000000000e+02 -3.38548418745498e-02 4.99908331389323e-01 -2.20200907982144e-02 + 1.56000000000000e+02 -3.37510782194723e-02 4.99836914626034e-01 -2.20859314734659e-02 + 1.59000000000000e+02 -3.36494201711338e-02 4.99754234730512e-01 -2.21517716457378e-02 + 1.62000000000000e+02 -3.10637475603964e-02 4.99680051763820e-01 -2.42417639918563e-02 + 1.65000000000000e+02 -2.72360674222744e-02 4.99608171404762e-01 -2.73438495435689e-02 + 1.68000000000000e+02 -2.34094297732302e-02 4.99530448606310e-01 -3.04458995483989e-02 + 1.71000000000000e+02 -1.87731622461588e-02 4.99461965511715e-01 -2.92625874417800e-02 + 1.74000000000000e+02 -1.25154154596942e-02 4.99419482735902e-01 -1.95083510416281e-02 + 1.77000000000000e+02 -6.22917411225319e-03 4.99373778033698e-01 -9.70969886478117e-03 + 1.80000000000000e+02 0.00000000000000e+00 4.98298540333591e-01 0.00000000000000e+00 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_02.dat b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_02.dat new file mode 100644 index 000000000..3b06888a9 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_02.dat @@ -0,0 +1,254 @@ +! ------------ AirfoilInfo v1.01.x Input File ---------------------------------- +! AeroElasticSE FAST driver +! line +! line +! ------------------------------------------------------------------------------ +DEFAULT InterpOrd ! Interpolation order to use for quasi-steady table lookup {1=linear; 3=cubic spline; "default"} [default=3] +1 NonDimArea ! The non-dimensional area of the airfoil (area/chord^2) (set to 1.0 if unsure or unneeded) +@"NREL-2p8-127_AF02_Coords.txt" NumCoords ! The number of coordinates in the airfoil shape file. Set to zero if coordinates not included. +AF02_BL.txt BL_file ! The file name including the boundary layer characteristics of the profile. Ignored if the aeroacoustic module is not called. +1 NumTabs ! Number of airfoil tables in this file. Each table must have lines for Re and Ctrl. +! ------------------------------------------------------------------------------ +! data for table 1 +! ------------------------------------------------------------------------------ +6.000000 Re ! Reynolds number in millions +0 Ctrl ! Control setting (must be 0 for current AirfoilInfo) +True InclUAdata ! Is unsteady aerodynamics data included in this table? If TRUE, then include 30 UA coefficients below this line +!........................................ +0.000000 alpha0 ! 0-lift angle of attack, depends on airfoil. +0.000000 alpha1 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA>alpha0. (deg) +0.000000 alpha2 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA1] +0.000000 S2 ! Constant in the f curve best-fit for AOA> alpha1; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S3 ! Constant in the f curve best-fit for alpha2<=AOA< alpha0; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S4 ! Constant in the f curve best-fit for AOA< alpha2; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 Cn1 ! Critical value of C0n at leading edge separation. It should be extracted from airfoil data at a given Mach and Reynolds number. It can be calculated from the static value of Cn at either the break in the pitching moment or the loss of chord force at the onset of stall. It is close to the condition of maximum lift of the airfoil at low Mach numbers. +0.000000 Cn2 ! As Cn1 for negative AOAs. +Default St_sh ! Strouhal's shedding frequency constant. [default = 0.19] +0.000000 Cd0 ! 2D drag coefficient value at 0-lift. +0.000000 Cm0 ! 2D pitching moment coefficient about 1/4-chord location, at 0-lift, positive if nose up. [If the aerodynamics coefficients table does not include a column for Cm, this needs to be set to 0.0] +0.000000 k0 ! Constant in the \hat(x)_cp curve best-fit; = (\hat(x)_AC-0.25). [ignored if UAMod<>1] +0.000000 k1 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k2 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k3 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k1_hat ! Constant in the expression of Cc due to leading edge vortex effects. [ignored if UAMod<>1] +Default x_cp_bar ! Constant in the expression of \hat(x)_cp^v. [ignored if UAMod<>1, default = 0.2] +Default UACutout ! Angle of attack above which unsteady aerodynamics are disabled (deg). [Specifying the string "Default" sets UACutout to 45 degrees] +Default filtCutOff ! Cut-off frequency (-3 dB corner frequency) for low-pass filtering the AoA input to UA, as well as the 1st and 2nd derivatives (Hz) [default = 20] +!........................................ +! Table of aerodynamics coefficients +200 NumAlf ! Number of data lines in the following table +! Alpha Cl Cd Cm +! (deg) (-) (-) (-) +-1.80000000000000e+02 0.00000000000000e+00 4.43994184250602e-01 0.00000000000000e+00 +-1.77000000000000e+02 5.28218858836285e-02 4.51778947168691e-01 6.31301215186523e-02 +-1.74000000000000e+02 1.06127688082721e-01 4.54846200132976e-01 1.26838596030369e-01 +-1.71000000000000e+02 1.59191863314727e-01 4.57721687001980e-01 1.90258289868333e-01 +-1.68000000000000e+02 1.97447618139026e-01 4.62593607482116e-01 2.03998727898909e-01 +-1.65000000000000e+02 2.28363691552126e-01 4.68241882193770e-01 1.92900117855920e-01 +-1.62000000000000e+02 2.59339036364168e-01 4.73545480231159e-01 1.81801380632199e-01 +-1.59000000000000e+02 2.79820337838342e-01 4.79170658239085e-01 1.73519743179148e-01 +-1.56000000000000e+02 2.79311457907633e-01 4.85668590966138e-01 1.70872209970165e-01 +-1.53000000000000e+02 2.78926753637668e-01 4.91502040321387e-01 1.68224656535610e-01 +-1.50000000000000e+02 2.78686833504982e-01 4.96473066155593e-01 1.65577105058638e-01 +-1.47000000000000e+02 2.78482617289417e-01 5.10449666953889e-01 1.68109661007669e-01 +-1.44000000000000e+02 2.78333002128108e-01 5.51477403517201e-01 1.70642226630173e-01 +-1.41000000000000e+02 2.78243478183707e-01 5.92505453513528e-01 1.73174811600312e-01 +-1.38000000000000e+02 2.74638204421170e-01 6.34935844279750e-01 1.76256259812944e-01 +-1.35000000000000e+02 2.69271830313825e-01 6.78067402586119e-01 1.79612138533394e-01 +-1.32000000000000e+02 2.63929918544127e-01 7.21199455141732e-01 1.82968055709224e-01 +-1.29000000000000e+02 2.56353341244360e-01 7.63167294790495e-01 1.86036517826043e-01 +-1.26000000000000e+02 2.44267095501969e-01 8.02806703094638e-01 1.88530068460767e-01 +-1.23000000000000e+02 2.32190027809931e-01 8.30095142617392e-01 1.91023600046048e-01 +-1.20000000000000e+02 2.20124030074996e-01 8.54280447094884e-01 1.93517122106963e-01 +-1.17000000000000e+02 2.01822771772063e-01 8.71322712892104e-01 1.94226310566758e-01 +-1.14000000000000e+02 1.83524830303930e-01 8.88364899623064e-01 1.94935492828237e-01 +-1.11000000000000e+02 1.65231494534441e-01 9.05406956162956e-01 1.95644669672032e-01 +-1.08000000000000e+02 1.43911689592217e-01 9.15698197853296e-01 1.94815640807175e-01 +-1.05000000000000e+02 1.21077486266499e-01 9.22613980715162e-01 1.93217497375608e-01 +-1.02000000000000e+02 9.82451183513876e-02 9.29529684328913e-01 1.91619372257204e-01 +-9.90000000000000e+01 7.47225598413416e-02 9.32477260333714e-01 1.89218782642220e-01 +-9.60000000000000e+01 4.98149331461973e-02 9.27488409240135e-01 1.85213229275117e-01 +-9.30000000000000e+01 2.49074967312809e-02 9.22499596258566e-01 1.81207706508184e-01 +-9.00000000000000e+01 1.55454756347091e-07 9.17510802332658e-01 1.75447976882559e-01 +-8.70000000000000e+01 -2.49074712386065e-02 9.22499591152534e-01 1.75821854055456e-01 +-8.40000000000000e+01 -4.98150027934706e-02 9.27488423190074e-01 1.75265803096445e-01 +-8.10000000000000e+01 -7.47223440699950e-02 9.32477217115983e-01 1.74297623848041e-01 +-7.80000000000000e+01 -9.82450077740596e-02 9.29529717823434e-01 1.71657379233808e-01 +-7.50000000000000e+01 -1.21077637330475e-01 9.22613934961229e-01 1.68181073081051e-01 +-7.20000000000000e+01 -1.43911579000158e-01 9.15698231347477e-01 1.64704806763536e-01 +-6.90000000000000e+01 -1.65231336083193e-01 9.05407103798478e-01 1.60521039551036e-01 +-6.60000000000000e+01 -1.83524881462789e-01 8.88364851969969e-01 1.54922212612248e-01 +-6.30000000000000e+01 -2.01822892842596e-01 8.71322600141459e-01 1.49323385673460e-01 +-6.00000000000000e+01 -2.20124109861353e-01 8.54280287086177e-01 1.43724546113009e-01 +-5.70000000000000e+01 -2.32190107676827e-01 8.30094982608685e-01 1.36653206413885e-01 +-5.40000000000000e+01 -2.44267175435753e-01 8.02806440842389e-01 1.29581839704227e-01 +-5.10000000000000e+01 -2.56353421232862e-01 7.63167032538246e-01 1.22510418973089e-01 +-4.80000000000000e+01 -2.63929913090152e-01 7.21199499288443e-01 1.14843085027639e-01 +-4.50000000000000e+01 -2.69271763474185e-01 6.78067940982074e-01 1.06877804052201e-01 +-4.20000000000000e+01 -2.74638198917296e-01 6.34935888423376e-01 9.89124318011671e-02 +-3.90000000000000e+01 -2.78243478234639e-01 5.92505417148744e-01 9.07777362760891e-02 +-3.60000000000000e+01 -2.78333002465160e-01 5.51477288799700e-01 8.23042410827366e-02 +-3.30000000000000e+01 -2.78482616088909e-01 5.10449944015222e-01 7.38309077181307e-02 +-3.00000000000000e+01 -2.78686834724237e-01 4.96473034437446e-01 6.53574058853759e-02 +-2.93939393939394e+01 -2.78722484884278e-01 4.95550482915159e-01 6.31590888898999e-02 +-2.87878787878788e+01 -2.78764834228033e-01 4.94584223091226e-01 6.07329510056277e-02 +-2.81818181818182e+01 -2.78813665479675e-01 4.93576735381485e-01 5.83222958533192e-02 +-2.75757575757576e+01 -2.78868771825416e-01 4.92530294643563e-01 5.59273989519316e-02 +-2.69696969696970e+01 -2.78929953713021e-01 4.91447040145689e-01 5.35486208968168e-02 +-2.63636363636364e+01 -2.78997019845282e-01 4.90328957261459e-01 5.11863242110430e-02 +-2.57575757575758e+01 -2.79069786417323e-01 4.89177896868326e-01 4.88408872710036e-02 +-2.51515151515151e+01 -2.79148077344780e-01 4.87995577350176e-01 4.65126844314689e-02 +-2.45454545454545e+01 -2.79231725535284e-01 4.86783573310055e-01 4.42020473048908e-02 +-2.39393939393939e+01 -2.79320569460013e-01 4.85543372341575e-01 4.19093587754535e-02 +-2.33333333333333e+01 -2.79414454019281e-01 4.84276364273540e-01 3.96350129365467e-02 +-2.27272727272727e+01 -2.79513230225828e-01 4.82983849071519e-01 3.73794155039853e-02 +-2.21212121212121e+01 -2.79616754906648e-01 4.81667043985251e-01 3.51429842476471e-02 +-2.15151515151515e+01 -2.79724892952109e-01 4.80327059059195e-01 3.29260988660576e-02 +-2.09090909090909e+01 -2.79837510321443e-01 4.78964987050167e-01 3.07292415847816e-02 +-2.03030303030303e+01 -2.79954479045127e-01 4.77581841281423e-01 2.85528819253764e-02 +-1.96969696969697e+01 -2.75171456546404e-01 4.76241678491924e-01 2.59885541142665e-02 +-1.90909090909091e+01 -2.65502607041286e-01 4.74932861964715e-01 2.30296767768801e-02 +-1.84848484848485e+01 -2.55857808543395e-01 4.73587766414009e-01 2.00850651071971e-02 +-1.78787878787879e+01 -2.46237593082487e-01 4.72205644697461e-01 1.71576346825735e-02 +-1.72727272727273e+01 -2.36642641160737e-01 4.70785737308274e-01 1.42512880441333e-02 +-1.66666666666667e+01 -2.27074552079369e-01 4.69327391673071e-01 1.13715515436610e-02 +-1.60606060606061e+01 -2.17534554179683e-01 4.67829874530176e-01 8.52581274757511e-03 +-1.54545454545455e+01 -2.08024441493220e-01 4.66292514169838e-01 5.72461577042921e-03 +-1.48484848484848e+01 -1.98545026218225e-01 4.64714449362364e-01 3.24301314993957e-03 +-1.42424242424242e+01 -1.89097459745549e-01 4.63094831340957e-01 2.15754331667197e-03 +-1.36363636363636e+01 -1.79689119603896e-01 4.61433905636119e-01 1.19082104448867e-03 +-1.30303030303030e+01 -1.70305930436414e-01 4.59727952028918e-01 4.04096803450701e-04 +-1.24242424242424e+01 -1.60970739714131e-01 4.57980061533300e-01 -1.08597634782590e-03 +-1.18181818181818e+01 -1.51665423337775e-01 4.56185474694515e-01 -5.28562481853854e-03 +-1.12121212121212e+01 -1.42405828637851e-01 4.54346018736465e-01 -9.48493644261989e-03 +-1.06060606060606e+01 -1.33190990892009e-01 4.51015638941563e-01 -1.36845608636440e-02 +-1.00000000000000e+01 -1.24014684903561e-01 4.44510346744821e-01 -1.78839224215030e-02 +-9.39393939393939e+00 -1.08436489679061e-01 4.35608923797464e-01 -1.72393490814751e-02 +-8.78787878787879e+00 -9.29541316307449e-02 4.26594514374539e-01 -1.65987787657685e-02 +-8.18181818181818e+00 -7.76026887758120e-02 4.17469560995041e-01 -1.59527308236021e-02 +-7.57575757575758e+00 -6.23970752419446e-02 4.08227566266090e-01 -1.52754905468310e-02 +-6.96969696969697e+00 -4.73685296749869e-02 3.98853223979206e-01 -1.42539284761816e-02 +-6.36363636363636e+00 -3.25421758356058e-02 3.89329220025460e-01 -1.32208969139180e-02 +-5.75757575757576e+00 -2.32883547306756e-02 3.79669167553607e-01 -1.21878209564984e-02 +-5.15151515151515e+00 -1.75463818719779e-02 3.69851724588186e-01 -1.11628011971168e-02 +-4.54545454545454e+00 -1.22231690324848e-02 3.59859373530705e-01 -1.01275683268214e-02 +-3.93939393939394e+00 -7.44825163485882e-03 3.49689752142525e-01 -9.09398161623545e-03 +-3.33333333333333e+00 -2.91658839268368e-03 3.40624828035861e-01 -8.49251566568143e-03 +-2.72727272727273e+00 1.68507347052569e-02 3.37851584545355e-01 -9.05855564667579e-03 +-2.12121212121212e+00 6.54268180916555e-02 3.38696970690453e-01 -1.01724248228530e-02 +-1.51515151515152e+00 1.14007336489887e-01 3.39540888251967e-01 -1.18440226132878e-02 +-9.09090909090912e-01 1.51313727007511e-01 3.40364324377504e-01 -1.33594433207991e-02 +-3.03030303030302e-01 1.79793106660581e-01 3.41119901467205e-01 -1.49439775633901e-02 + 3.03030303030302e-01 2.08277227321411e-01 3.41959802485552e-01 -1.65190153005760e-02 + 9.09090909090912e-01 2.36761120877396e-01 3.42798375876233e-01 -1.80436696564668e-02 + 1.51515151515152e+00 2.62099120009543e-01 3.43615726098759e-01 -1.96089791867871e-02 + 2.12121212121212e+00 2.98214942887010e-01 3.43590036955630e-01 -2.12433569551258e-02 + 2.72727272727273e+00 3.41265305298494e-01 3.43282612273994e-01 -2.28522580646574e-02 + 3.33333333333333e+00 3.84321941282732e-01 3.42975023524515e-01 -2.44142825317703e-02 + 3.93939393939394e+00 4.27399321163861e-01 3.42588020332646e-01 -2.59764367716794e-02 + 4.54545454545455e+00 4.70462749288264e-01 3.42270335299019e-01 -2.75887619844635e-02 + 5.15151515151515e+00 5.13550609798191e-01 3.41947566135864e-01 -2.91509206998043e-02 + 5.75757575757576e+00 5.51690452105184e-01 3.41583432622427e-01 -3.09254291087337e-02 + 6.36363636363637e+00 5.81502121097488e-01 3.41302193452691e-01 -3.30991045572195e-02 + 6.96969696969697e+00 6.10301560112658e-01 3.40942615842003e-01 -3.52998315891569e-02 + 7.57575757575757e+00 6.39640830053245e-01 3.40662394282476e-01 -3.74120160931164e-02 + 8.18181818181818e+00 6.73716922359672e-01 3.40349350542629e-01 -3.89332211349433e-02 + 8.78787878787879e+00 7.00575005999923e-01 3.40649231227702e-01 -4.05874368999055e-02 + 9.39393939393939e+00 7.05980518760212e-01 3.42347265627704e-01 -4.28334247556514e-02 + 1.00000000000000e+01 7.06877424431301e-01 3.44374177297010e-01 -4.52251156741810e-02 + 1.06060606060606e+01 2.24043543681458e-01 3.72918111447314e-01 -3.53747047936440e-02 + 1.12121212121212e+01 1.40264660669456e-01 4.01951061572017e-01 -4.64618913321433e-03 + 1.18181818181818e+01 1.31385056875955e-01 4.23992085353333e-01 -4.07850695907500e-03 + 1.24242424242424e+01 4.46038012430764e-01 4.42283118524471e-01 -5.50420221929163e-03 + 1.30303030303030e+01 5.55998373281915e-01 4.54419475361305e-01 -7.26003568693194e-03 + 1.36363636363636e+01 5.44188127636130e-01 4.58360923643072e-01 -7.86408309600584e-03 + 1.42424242424242e+01 5.27942944540329e-01 4.61684804811602e-01 -8.24435657376023e-03 + 1.48484848484848e+01 4.89688648561149e-01 4.64663565131384e-01 -8.63252791099281e-03 + 1.54545454545455e+01 4.48737588342535e-01 4.67211594818839e-01 -8.81024773998454e-03 + 1.60606060606061e+01 4.12943834077636e-01 4.69433759746416e-01 -9.21685653350780e-03 + 1.66666666666667e+01 4.12507412476758e-01 4.70665756115078e-01 -1.23356902066896e-02 + 1.72727272727273e+01 4.11140315107920e-01 4.71853296753582e-01 -1.57410394707879e-02 + 1.78787878787879e+01 4.08617622571655e-01 4.72990750025282e-01 -1.94979904601476e-02 + 1.84848484848485e+01 4.06114881343676e-01 4.74116453453578e-01 -2.33119670538974e-02 + 1.90909090909091e+01 4.03627419358201e-01 4.75230998047512e-01 -2.71766217490092e-02 + 1.96969696969697e+01 4.01154151508036e-01 4.76335071600720e-01 -3.10855411393017e-02 + 2.03030303030303e+01 3.99841450263120e-01 4.77581841281423e-01 -3.43354943821136e-02 + 2.09090909090909e+01 3.99682666388390e-01 4.78964987050167e-01 -3.69103854071785e-02 + 2.15151515151515e+01 3.99530136656685e-01 4.80327059059195e-01 -3.95071276844189e-02 + 2.21212121212121e+01 3.99384045127721e-01 4.81667043985251e-01 -4.21252206930270e-02 + 2.27272727272727e+01 3.99244584495002e-01 4.82983849071519e-01 -4.47641473640253e-02 + 2.33333333333333e+01 3.99111949378307e-01 4.84276364273540e-01 -4.74235100634337e-02 + 2.39393939393939e+01 3.98986345789788e-01 4.85543372341575e-01 -5.01028646553693e-02 + 2.45454545454545e+01 3.98867988116513e-01 4.86783573310055e-01 -5.28017797812506e-02 + 2.51515151515151e+01 3.98757099550410e-01 4.87995577350176e-01 -5.55198364035922e-02 + 2.57575757575758e+01 3.98653912544980e-01 4.89177896868326e-01 -5.82566273692076e-02 + 2.63636363636364e+01 3.98558667733390e-01 4.90328957261459e-01 -6.10118045012879e-02 + 2.69696969696970e+01 3.98471618483357e-01 4.91447040145689e-01 -6.37849681601756e-02 + 2.75757575757576e+01 3.98393029231929e-01 4.92530294643563e-01 -6.65757129024393e-02 + 2.81818181818182e+01 3.98323175239888e-01 4.93576735381485e-01 -6.93836508624560e-02 + 2.87878787878788e+01 3.98262343636652e-01 4.94584223091226e-01 -7.22083954498178e-02 + 2.93939393939394e+01 3.98210832316413e-01 4.95550482915159e-01 -7.50496587540483e-02 + 3.00000000000000e+01 3.98168954058675e-01 4.96473034437446e-01 -7.79071060247789e-02 + 3.30000000000000e+01 3.97861629624178e-01 5.10449944015222e-01 -8.85000759993798e-02 + 3.60000000000000e+01 3.97632504408999e-01 5.51477288799700e-01 -9.78012526556367e-02 + 3.90000000000000e+01 3.97489452250910e-01 5.92505417148744e-01 -1.06793009320285e-01 + 4.20000000000000e+01 3.92296355524120e-01 6.34935888423376e-01 -1.14716558885029e-01 + 4.50000000000000e+01 3.84572561868948e-01 6.78067940982074e-01 -1.22106077030729e-01 + 4.80000000000000e+01 3.76882670622963e-01 7.21199499288443e-01 -1.29495510499575e-01 + 5.10000000000000e+01 3.66020533668567e-01 7.63167032538246e-01 -1.36361479578265e-01 + 5.40000000000000e+01 3.48758349336931e-01 8.02806440842389e-01 -1.42180486224307e-01 + 5.70000000000000e+01 3.31509203268269e-01 8.30094982608685e-01 -1.47999448416575e-01 + 6.00000000000000e+01 3.14275781966473e-01 8.54280287086177e-01 -1.53818388382123e-01 + 6.30000000000000e+01 2.88206454299320e-01 8.71322600141459e-01 -1.57969229855332e-01 + 6.60000000000000e+01 2.62142183925970e-01 8.88364851969969e-01 -1.62120057030290e-01 + 6.90000000000000e+01 2.36084952068339e-01 9.05407103798478e-01 -1.66270884205247e-01 + 7.20000000000000e+01 2.05649772307401e-01 9.15698231347478e-01 -1.69225081057529e-01 + 7.50000000000000e+01 1.73023749638975e-01 9.22613934961229e-01 -1.71580987245091e-01 + 7.80000000000000e+01 1.40399517677831e-01 9.29529717823434e-01 -1.73936920429460e-01 + 8.10000000000000e+01 1.06786972533886e-01 9.32477217115983e-01 -1.75676992294215e-01 + 8.40000000000000e+01 7.11914675762680e-02 9.27488423190074e-01 -1.76185384031098e-01 + 8.70000000000000e+01 3.55956906886392e-02 9.22499591152534e-01 -1.76281636984940e-01 + 9.00000000000000e+01 -1.55454756453089e-07 9.17510802332658e-01 -1.75447976882559e-01 + 9.30000000000000e+01 -2.49074967312808e-02 9.22499596258566e-01 -1.81207706508184e-01 + 9.60000000000000e+01 -4.98149331461974e-02 9.27488409240135e-01 -1.85213229275117e-01 + 9.90000000000000e+01 -7.47225598413417e-02 9.32477260333714e-01 -1.89218782642220e-01 + 1.02000000000000e+02 -9.82451183513876e-02 9.29529684328913e-01 -1.91619372257204e-01 + 1.05000000000000e+02 -1.21077486266499e-01 9.22613980715162e-01 -1.93217497375608e-01 + 1.08000000000000e+02 -1.43911689592217e-01 9.15698197853296e-01 -1.94815640807175e-01 + 1.11000000000000e+02 -1.65231494534441e-01 9.05406956162956e-01 -1.95644669672032e-01 + 1.14000000000000e+02 -1.83524830303930e-01 8.88364899623064e-01 -1.94935492828237e-01 + 1.17000000000000e+02 -2.01822771772063e-01 8.71322712892104e-01 -1.94226310566758e-01 + 1.20000000000000e+02 -2.20124030074997e-01 8.54280447094884e-01 -1.93517122106963e-01 + 1.23000000000000e+02 -2.32190027809931e-01 8.30095142617392e-01 -1.91023600046048e-01 + 1.26000000000000e+02 -2.44267095501969e-01 8.02806703094638e-01 -1.88530068460767e-01 + 1.29000000000000e+02 -2.56353341244360e-01 7.63167294790494e-01 -1.86036517826043e-01 + 1.32000000000000e+02 -2.63929918544127e-01 7.21199455141732e-01 -1.82968055709224e-01 + 1.35000000000000e+02 -2.69271830313825e-01 6.78067402586119e-01 -1.79612138533394e-01 + 1.38000000000000e+02 -2.74638204421170e-01 6.34935844279749e-01 -1.76256259812944e-01 + 1.41000000000000e+02 -2.78243478183707e-01 5.92505453513527e-01 -1.73174811600312e-01 + 1.44000000000000e+02 -2.78333002128108e-01 5.51477403517201e-01 -1.70642226630173e-01 + 1.47000000000000e+02 -2.78482617289417e-01 5.10449666953889e-01 -1.68109661007669e-01 + 1.50000000000000e+02 -2.78686833504982e-01 4.96473066155593e-01 -1.65577105058638e-01 + 1.53000000000000e+02 -2.78926753637668e-01 4.91502040321387e-01 -1.68224656535610e-01 + 1.56000000000000e+02 -2.79311457907633e-01 4.85668590966138e-01 -1.70872209970165e-01 + 1.59000000000000e+02 -2.79820337838342e-01 4.79170658239085e-01 -1.73519743179148e-01 + 1.62000000000000e+02 -2.59339036364167e-01 4.73545480231159e-01 -1.92371270010081e-01 + 1.65000000000000e+02 -2.28363691552126e-01 4.68241882193770e-01 -2.19324930692370e-01 + 1.68000000000000e+02 -1.97447618139026e-01 4.62593607482116e-01 -2.46278282511930e-01 + 1.71000000000000e+02 -1.59191863314727e-01 4.57721687001980e-01 -2.37822862335416e-01 + 1.74000000000000e+02 -1.06127688082721e-01 4.54846200132976e-01 -1.58548245037961e-01 + 1.77000000000000e+02 -5.28218858836285e-02 4.51778947168691e-01 -7.89126518983154e-02 + 1.80000000000000e+02 0.00000000000000e+00 4.43994184250602e-01 0.00000000000000e+00 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_03.dat b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_03.dat new file mode 100644 index 000000000..1c63fe2f4 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_03.dat @@ -0,0 +1,254 @@ +! ------------ AirfoilInfo v1.01.x Input File ---------------------------------- +! AeroElasticSE FAST driver +! line +! line +! ------------------------------------------------------------------------------ +DEFAULT InterpOrd ! Interpolation order to use for quasi-steady table lookup {1=linear; 3=cubic spline; "default"} [default=3] +1 NonDimArea ! The non-dimensional area of the airfoil (area/chord^2) (set to 1.0 if unsure or unneeded) +@"NREL-2p8-127_AF03_Coords.txt" NumCoords ! The number of coordinates in the airfoil shape file. Set to zero if coordinates not included. +AF03_BL.txt BL_file ! The file name including the boundary layer characteristics of the profile. Ignored if the aeroacoustic module is not called. +1 NumTabs ! Number of airfoil tables in this file. Each table must have lines for Re and Ctrl. +! ------------------------------------------------------------------------------ +! data for table 1 +! ------------------------------------------------------------------------------ +6.000000 Re ! Reynolds number in millions +0 Ctrl ! Control setting (must be 0 for current AirfoilInfo) +True InclUAdata ! Is unsteady aerodynamics data included in this table? If TRUE, then include 30 UA coefficients below this line +!........................................ +0.000000 alpha0 ! 0-lift angle of attack, depends on airfoil. +0.000000 alpha1 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA>alpha0. (deg) +0.000000 alpha2 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA1] +0.000000 S2 ! Constant in the f curve best-fit for AOA> alpha1; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S3 ! Constant in the f curve best-fit for alpha2<=AOA< alpha0; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S4 ! Constant in the f curve best-fit for AOA< alpha2; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 Cn1 ! Critical value of C0n at leading edge separation. It should be extracted from airfoil data at a given Mach and Reynolds number. It can be calculated from the static value of Cn at either the break in the pitching moment or the loss of chord force at the onset of stall. It is close to the condition of maximum lift of the airfoil at low Mach numbers. +0.000000 Cn2 ! As Cn1 for negative AOAs. +Default St_sh ! Strouhal's shedding frequency constant. [default = 0.19] +0.000000 Cd0 ! 2D drag coefficient value at 0-lift. +0.000000 Cm0 ! 2D pitching moment coefficient about 1/4-chord location, at 0-lift, positive if nose up. [If the aerodynamics coefficients table does not include a column for Cm, this needs to be set to 0.0] +0.000000 k0 ! Constant in the \hat(x)_cp curve best-fit; = (\hat(x)_AC-0.25). [ignored if UAMod<>1] +0.000000 k1 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k2 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k3 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k1_hat ! Constant in the expression of Cc due to leading edge vortex effects. [ignored if UAMod<>1] +Default x_cp_bar ! Constant in the expression of \hat(x)_cp^v. [ignored if UAMod<>1, default = 0.2] +Default UACutout ! Angle of attack above which unsteady aerodynamics are disabled (deg). [Specifying the string "Default" sets UACutout to 45 degrees] +Default filtCutOff ! Cut-off frequency (-3 dB corner frequency) for low-pass filtering the AoA input to UA, as well as the 1st and 2nd derivatives (Hz) [default = 20] +!........................................ +! Table of aerodynamics coefficients +200 NumAlf ! Number of data lines in the following table +! Alpha Cl Cd Cm +! (deg) (-) (-) (-) +-1.80000000000000e+02 0.00000000000000e+00 2.86667939639823e-01 0.00000000000000e+00 +-1.77000000000000e+02 1.03993393584518e-01 2.98099548900633e-01 1.09870530503698e-01 +-1.74000000000000e+02 2.08939500216179e-01 3.07632373564454e-01 2.20747616176905e-01 +-1.71000000000000e+02 3.13409902357768e-01 3.16774623015665e-01 3.31122113148220e-01 +-1.68000000000000e+02 3.85054442612432e-01 3.34234373573580e-01 3.53101024359159e-01 +-1.65000000000000e+02 4.40412121695890e-01 3.55419527359135e-01 3.30883174396667e-01 +-1.62000000000000e+02 4.95885499788614e-01 3.75931646834106e-01 3.08665069836311e-01 +-1.59000000000000e+02 5.30626275353240e-01 3.98846265744607e-01 2.91144350600985e-01 +-1.56000000000000e+02 5.23897762918947e-01 4.27014220182996e-01 2.83018243112307e-01 +-1.53000000000000e+02 5.17411720704259e-01 4.53884562381070e-01 2.74892073545017e-01 +-1.50000000000000e+02 5.11208424965791e-01 4.79070665595520e-01 2.66765899031848e-01 +-1.47000000000000e+02 5.07722631231294e-01 5.14614980861448e-01 2.69838067335530e-01 +-1.44000000000000e+02 5.04343461108966e-01 5.71996674202226e-01 2.72910247373812e-01 +-1.41000000000000e+02 5.01081625048703e-01 6.29378805912717e-01 2.75982450882136e-01 +-1.38000000000000e+02 4.92453728624275e-01 6.88722261711689e-01 2.80934437546522e-01 +-1.35000000000000e+02 4.81136499725427e-01 7.49046375576140e-01 2.86826311975596e-01 +-1.32000000000000e+02 4.69867035979492e-01 8.09371180701211e-01 2.92718253920303e-01 +-1.29000000000000e+02 4.54938482726295e-01 8.68067709113985e-01 2.98486582390899e-01 +-1.26000000000000e+02 4.32612975232015e-01 9.23507676366582e-01 3.04007683325731e-01 +-1.23000000000000e+02 4.10305382623877e-01 9.74580839620112e-01 3.09528742082194e-01 +-1.20000000000000e+02 3.88019404664959e-01 1.02455678086533e+00 3.15049779750259e-01 +-1.17000000000000e+02 3.55328226413339e-01 1.06294869915767e+00 3.18312911803281e-01 +-1.14000000000000e+02 3.22643517723842e-01 1.10134044814828e+00 3.21576026976400e-01 +-1.11000000000000e+02 2.89967780617592e-01 1.13973190385125e+00 3.24839117221471e-01 +-1.08000000000000e+02 2.52261395940272e-01 1.16675109608688e+00 3.25784702971782e-01 +-1.05000000000000e+02 2.12037421291888e-01 1.18808406999478e+00 3.25571518828366e-01 +-1.02000000000000e+02 1.71816981097322e-01 1.20941679944765e+00 3.25358337127833e-01 +-9.90000000000000e+01 1.30505705696886e-01 1.22393767216320e+00 3.23791373077473e-01 +-9.60000000000000e+01 8.70036173585535e-02 1.22483453634678e+00 3.19516785688025e-01 +-9.30000000000000e+01 4.35018613516539e-02 1.22573139367882e+00 3.15242230954016e-01 +-9.00000000000000e+01 2.71507463396801e-07 1.22662824758516e+00 3.07541711312162e-01 +-8.70000000000000e+01 -4.35018168277582e-02 1.22573139459675e+00 3.06500259153458e-01 +-8.40000000000000e+01 -8.70037390000840e-02 1.22483453383895e+00 3.03642638678455e-01 +-8.10000000000000e+01 -1.30505328844274e-01 1.22393767993261e+00 2.99980148628166e-01 +-7.80000000000000e+01 -1.71816786310515e-01 1.20941690276751e+00 2.93732912001213e-01 +-7.50000000000000e+01 -2.12037687400372e-01 1.18808392885856e+00 2.86193257479784e-01 +-7.20000000000000e+01 -2.52261201124482e-01 1.16675119940570e+00 2.78653689355799e-01 +-6.90000000000000e+01 -2.89967497594430e-01 1.13973223643685e+00 2.70131045852760e-01 +-6.60000000000000e+01 -3.22643609105459e-01 1.10134034079787e+00 2.59642171088866e-01 +-6.30000000000000e+01 -3.55328442677626e-01 1.06294844515890e+00 2.49153296324973e-01 +-6.00000000000000e+01 -3.88019552026475e-01 1.02455645022712e+00 2.38664407299212e-01 +-5.70000000000000e+01 -4.10305530142687e-01 9.74580508981902e-01 2.26511664589643e-01 +-5.40000000000000e+01 -4.32613122881359e-01 9.23507309578663e-01 2.14358875460006e-01 +-5.10000000000000e+01 -4.54938630482502e-01 8.68067342326065e-01 2.02205993489526e-01 +-4.80000000000000e+01 -4.69867024471485e-01 8.09371242445124e-01 1.89666602848052e-01 +-4.50000000000000e+01 -4.81136358743375e-01 7.49047128580672e-01 1.76933964082825e-01 +-4.20000000000000e+01 -4.92453717018877e-01 6.88722323451287e-01 1.64201179411986e-01 +-3.90000000000000e+01 -5.01081627884301e-01 6.29378755052664e-01 1.51481884585662e-01 +-3.60000000000000e+01 -5.04343470398699e-01 5.71996513757487e-01 1.38789326350142e-01 +-3.30000000000000e+01 -5.07722608040306e-01 5.14615368361460e-01 1.26097010519998e-01 +-3.00000000000000e+01 -5.11208459117473e-01 4.79070493417508e-01 1.13404444471583e-01 +-2.93939393939394e+01 -5.12436596980431e-01 4.74141998928450e-01 1.10133084143430e-01 +-2.87878787878788e+01 -5.13677818293272e-01 4.69128142491057e-01 1.06416791520792e-01 +-2.81818181818182e+01 -5.14931698718120e-01 4.64033768336758e-01 1.02730736544464e-01 +-2.75757575757576e+01 -5.16197857581441e-01 4.58863256541541e-01 9.90754777938710e-02 +-2.69696969696970e+01 -5.17475891884770e-01 4.53620820905796e-01 9.54517077990795e-02 +-2.63636363636364e+01 -5.18765418068804e-01 4.48310365722169e-01 9.18601257810618e-02 +-2.57575757575758e+01 -5.20066063887109e-01 4.42935541572834e-01 8.83014589939624e-02 +-2.51515151515151e+01 -5.21377478812960e-01 4.37499722355814e-01 8.47764326963560e-02 +-2.45454545454545e+01 -5.22699356428834e-01 4.32005929515122e-01 8.12857120895547e-02 +-2.39393939393939e+01 -5.24031381270285e-01 4.26457068308669e-01 7.78300449431755e-02 +-2.33333333333333e+01 -5.25373250428924e-01 4.20855853060512e-01 7.44102009183187e-02 +-2.27272727272727e+01 -5.26724672933875e-01 4.15204822592555e-01 7.10269723745852e-02 +-2.21212121212121e+01 -5.28085369169450e-01 4.09506354183381e-01 6.76811752130597e-02 +-2.15151515151515e+01 -5.29455101817919e-01 4.03762544083001e-01 6.43735744019926e-02 +-2.09090909090909e+01 -5.30833589187798e-01 3.97975580174912e-01 6.11050941602448e-02 +-2.03030303030303e+01 -5.32220574716406e-01 3.92147459389974e-01 5.78766456029426e-02 +-1.96969696969697e+01 -5.25041853310013e-01 3.86734130344610e-01 5.36740381794206e-02 +-1.90909090909091e+01 -5.09325030771277e-01 3.81712847911617e-01 4.84844307653104e-02 +-1.84848484848485e+01 -4.93655025441404e-01 3.76620832907035e-01 4.33226553930925e-02 +-1.78787878787879e+01 -4.78033039651211e-01 3.71456499045297e-01 3.81944365371004e-02 +-1.72727272727273e+01 -4.62460538476065e-01 3.66218257085999e-01 3.31074211396244e-02 +-1.66666666666667e+01 -4.46940500203995e-01 3.60904945553023e-01 2.80723751195183e-02 +-1.60606060606061e+01 -4.31475323775307e-01 3.55515132392443e-01 2.31037263323430e-02 +-1.54545454545455e+01 -4.16068349642614e-01 3.50047632879528e-01 1.82220369706882e-02 +-1.48484848484848e+01 -4.00721354508913e-01 3.44500616736217e-01 1.35484980910323e-02 +-1.42424242424242e+01 -3.85436695885767e-01 3.38872341578923e-01 9.50016605244364e-03 +-1.36363636363636e+01 -3.70224538567261e-01 3.33164648622073e-01 5.68381330007907e-03 +-1.30303030303030e+01 -3.55069373476952e-01 3.27366609646139e-01 2.21886814225965e-03 +-1.24242424242424e+01 -3.39999733693878e-01 3.21489179943910e-01 -1.51885448689381e-03 +-1.18181818181818e+01 -3.24995626539620e-01 3.15518354985586e-01 -7.39251364704825e-03 +-1.12121212121212e+01 -3.10077560762327e-01 3.09460976947365e-01 -1.32657016910330e-02 +-1.06060606060606e+01 -2.95245474304323e-01 3.02802644980894e-01 -1.91393272151166e-02 +-1.00000000000000e+01 -2.80494800381428e-01 2.94941318686088e-01 -2.50125850968491e-02 +-9.39393939393939e+00 -2.53378368416910e-01 2.85498339501372e-01 -2.41110800948355e-02 +-8.78787878787879e+00 -2.26455617318188e-01 2.75839796452712e-01 -2.32151737520043e-02 +-8.18181818181818e+00 -1.99780347135765e-01 2.65960153502913e-01 -2.23116063606220e-02 +-7.57575757575758e+00 -1.73389839145603e-01 2.55848927836634e-01 -2.13969572586265e-02 +-6.96969696969697e+00 -1.47345183372831e-01 2.45482961997361e-01 -2.03679525995866e-02 +-6.36363636363636e+00 -1.21705108097721e-01 2.34834463036821e-01 -1.93275559307849e-02 +-5.75757575757576e+00 -9.84583488516512e-02 2.23910273504550e-01 -1.82871145503072e-02 +-5.15151515151515e+00 -7.69804748827422e-02 2.12678155631259e-01 -1.72546758160953e-02 +-4.54545454545454e+00 -5.63182850040337e-02 2.01106147724455e-01 -1.62156816231646e-02 +-3.93939393939394e+00 -3.67302227953779e-02 1.89186489694562e-01 -1.51750925589128e-02 +-3.33333333333333e+00 -1.62909510485965e-02 1.78416547415723e-01 -1.45633390580307e-02 +-2.72727272727273e+00 2.35675611773452e-02 1.75058203392890e-01 -1.57637846300459e-02 +-2.12121212121212e+00 9.15064277602737e-02 1.76056082872914e-01 -1.78244951342892e-02 +-1.51515151515152e+00 1.59451497183287e-01 1.77051126032286e-01 -2.03910649409379e-02 +-9.09090909090912e-01 2.23403602833365e-01 1.78026120925083e-01 -2.27493568922369e-02 +-3.03030303030302e-01 2.84237891949164e-01 1.78938378727225e-01 -2.51368568675113e-02 + 3.03030303030302e-01 3.45074372567327e-01 1.79925592577568e-01 -2.75148616917628e-02 + 9.09090909090912e-01 4.05913145027735e-01 1.80910163063640e-01 -2.98751951472708e-02 + 1.51515151515152e+00 4.60391564367498e-01 1.81869640777608e-01 -3.22531226669864e-02 + 2.12121212121212e+00 5.26159436695712e-01 1.81867217039864e-01 -3.48049504623527e-02 + 2.72727272727273e+00 6.00837730272748e-01 1.81506752812675e-01 -3.74260524663783e-02 + 3.33333333333333e+00 6.75529949068352e-01 1.81145950978939e-01 -4.00304350025881e-02 + 3.93939393939394e+00 7.50255901253955e-01 1.80716836967219e-01 -4.26350339105715e-02 + 4.54545454545455e+00 8.24966195051160e-01 1.80347288666951e-01 -4.52499112015484e-02 + 5.15151515151515e+00 8.99712588876260e-01 1.79976785308154e-01 -4.78545175714740e-02 + 5.75757575757576e+00 9.67968657716851e-01 1.79568694884216e-01 -5.06699455716737e-02 + 6.36363636363637e+00 1.02536319902264e+00 1.79238042626890e-01 -5.38531921907918e-02 + 6.96969696969697e+00 1.08152198541483e+00 1.78841802101979e-01 -5.70812124887872e-02 + 7.57575757575757e+00 1.13835718017464e+00 1.78513776681022e-01 -6.02799006382464e-02 + 8.18181818181818e+00 1.20034525413988e+00 1.78155584214918e-01 -6.32698190171098e-02 + 8.78787878787879e+00 1.25229031916550e+00 1.78543028590070e-01 -6.64922350787756e-02 + 9.39393939393939e+00 1.27694825197027e+00 1.80574010062172e-01 -7.03025346844773e-02 + 1.00000000000000e+01 1.29634873488058e+00 1.82986102023255e-01 -7.42574649964911e-02 + 1.06060606060606e+01 7.61428140940585e-01 2.15852259319746e-01 -6.42507106934242e-02 + 1.12121212121212e+01 6.15718379411708e-01 2.48106113414377e-01 -2.23104303837720e-02 + 1.18181818181818e+01 5.89645960609568e-01 2.71990713431963e-01 -2.03506593942910e-02 + 1.24242424242424e+01 8.40078452027123e-01 2.92157538787909e-01 -2.37998425692650e-02 + 1.30303030303030e+01 9.36540372696081e-01 3.08975183148329e-01 -2.65133219580019e-02 + 1.36363636363636e+01 9.30793183702627e-01 3.21455925212482e-01 -2.79339590650596e-02 + 1.42424242424242e+01 9.21535598013246e-01 3.32263191328175e-01 -2.92269843086423e-02 + 1.48484848484848e+01 8.79920211959341e-01 3.42195165358544e-01 -3.05512733483560e-02 + 1.54545454545455e+01 8.39112171194525e-01 3.50890504854493e-01 -3.17289039382959e-02 + 1.60606060606061e+01 8.05866011124999e-01 3.58713280531263e-01 -3.32426789378008e-02 + 1.66666666666667e+01 8.00847317731894e-01 3.63662607459754e-01 -3.82620408096336e-02 + 1.72727272727273e+01 7.94727809634000e-01 3.68473291646017e-01 -4.36253357634993e-02 + 1.78787878787879e+01 7.87227516277651e-01 3.73122818099744e-01 -4.94117560810391e-02 + 1.84848484848485e+01 7.79760973975816e-01 3.77747724480973e-01 -5.53090732287109e-02 + 1.90909090909091e+01 7.72322946522647e-01 3.82350733174758e-01 -6.13053346702226e-02 + 1.96969696969697e+01 7.64912514438728e-01 3.86935069316851e-01 -6.73885480064952e-02 + 2.03030303030303e+01 7.60227909567809e-01 3.92147459389974e-01 -7.23552962067858e-02 + 2.09090909090909e+01 7.58256171990743e-01 3.97975580174912e-01 -7.61741534254430e-02 + 2.15151515151515e+01 7.56296648702810e-01 4.03762544083001e-01 -8.00356859572341e-02 + 2.21212121212121e+01 7.54349708693408e-01 4.09506354183381e-01 -8.39389232226646e-02 + 2.27272727272727e+01 7.52415756848464e-01 4.15204822592555e-01 -8.78828761836009e-02 + 2.33333333333333e+01 7.50495135179352e-01 4.20855853060512e-01 -9.18667405374683e-02 + 2.39393939393939e+01 7.48588246026085e-01 4.26457068308669e-01 -9.58896488905942e-02 + 2.45454545454545e+01 7.46695508084816e-01 4.32005929515122e-01 -9.99507588032690e-02 + 2.51515151515151e+01 7.44817357247520e-01 4.37499722355814e-01 -1.04049251898781e-01 + 2.57575757575758e+01 7.42954247493942e-01 4.42935541572834e-01 -1.08184333010354e-01 + 2.63636363636364e+01 7.41106620219380e-01 4.48310365722169e-01 -1.12355301356762e-01 + 2.69696969696970e+01 7.39274979765670e-01 4.53620820905796e-01 -1.16561383374543e-01 + 2.75757575757576e+01 7.37459861618629e-01 4.58863256541540e-01 -1.20801801101431e-01 + 2.81818181818182e+01 7.35661817641651e-01 4.64033768336758e-01 -1.25075807437783e-01 + 2.87878787878788e+01 7.33881427635071e-01 4.69128142491057e-01 -1.29382661238589e-01 + 2.93939393939394e+01 7.32119240063399e-01 4.74141998928450e-01 -1.33721775955579e-01 + 3.00000000000000e+01 7.30375865782397e-01 4.79070493417508e-01 -1.38092497824076e-01 + 3.30000000000000e+01 7.25362478438806e-01 5.14615368361460e-01 -1.54403266201777e-01 + 3.60000000000000e+01 7.20501914137933e-01 5.71996513757487e-01 -1.68191263513666e-01 + 3.90000000000000e+01 7.15809365515503e-01 6.29378755052664e-01 -1.81374882567390e-01 + 4.20000000000000e+01 7.03433185279059e-01 6.88722323451288e-01 -1.93418520707176e-01 + 4.50000000000000e+01 6.87204092577322e-01 7.49047128580672e-01 -2.04892279627535e-01 + 4.80000000000000e+01 6.71041224113679e-01 8.09371242445124e-01 -2.16365907069522e-01 + 5.10000000000000e+01 6.49672046103066e-01 8.68067342326066e-01 -2.27288040920096e-01 + 5.40000000000000e+01 6.17781812255886e-01 9.23507309578663e-01 -2.37107152133572e-01 + 5.70000000000000e+01 5.85917028103372e-01 9.74580508981902e-01 -2.46926188334836e-01 + 6.00000000000000e+01 5.54082947327309e-01 1.02455645022712e+00 -2.56745187030279e-01 + 6.30000000000000e+01 5.07474214362050e-01 1.06294844515890e+00 -2.64611277891633e-01 + 6.60000000000000e+01 4.60875379522342e-01 1.10134034079787e+00 -2.72477352013468e-01 + 6.90000000000000e+01 4.14290290845089e-01 1.13973223643685e+00 -2.80343426135302e-01 + 7.20000000000000e+01 3.60455499151900e-01 1.16675119940570e+00 -2.86657663083315e-01 + 7.50000000000000e+01 3.02992179274825e-01 1.18808392885856e+00 -2.92196013212590e-01 + 7.80000000000000e+01 2.45532428311787e-01 1.20941690276751e+00 -2.97734426806946e-01 + 8.10000000000000e+01 1.86507133137001e-01 1.22393767993261e+00 -3.02380776716557e-01 + 8.40000000000000e+01 1.24338355198263e-01 1.22483453383895e+00 -3.05243060833536e-01 + 8.70000000000000e+01 6.21691023243765e-02 1.22573139459675e+00 -3.07300455628019e-01 + 9.00000000000000e+01 -2.71507463581614e-07 1.22662824758516e+00 -3.07541711312162e-01 + 9.30000000000000e+01 -4.35018613516539e-02 1.22573139367882e+00 -3.15242230954016e-01 + 9.60000000000000e+01 -8.70036173585537e-02 1.22483453634678e+00 -3.19516785688025e-01 + 9.90000000000000e+01 -1.30505705696887e-01 1.22393767216320e+00 -3.23791373077473e-01 + 1.02000000000000e+02 -1.71816981097322e-01 1.20941679944765e+00 -3.25358337127833e-01 + 1.05000000000000e+02 -2.12037421291888e-01 1.18808406999478e+00 -3.25571518828366e-01 + 1.08000000000000e+02 -2.52261395940272e-01 1.16675109608688e+00 -3.25784702971782e-01 + 1.11000000000000e+02 -2.89967780617593e-01 1.13973190385125e+00 -3.24839117221471e-01 + 1.14000000000000e+02 -3.22643517723843e-01 1.10134044814828e+00 -3.21576026976400e-01 + 1.17000000000000e+02 -3.55328226413339e-01 1.06294869915767e+00 -3.18312911803281e-01 + 1.20000000000000e+02 -3.88019404664959e-01 1.02455678086533e+00 -3.15049779750259e-01 + 1.23000000000000e+02 -4.10305382623878e-01 9.74580839620111e-01 -3.09528742082193e-01 + 1.26000000000000e+02 -4.32612975232015e-01 9.23507676366582e-01 -3.04007683325731e-01 + 1.29000000000000e+02 -4.54938482726295e-01 8.68067709113984e-01 -2.98486582390899e-01 + 1.32000000000000e+02 -4.69867035979492e-01 8.09371180701210e-01 -2.92718253920303e-01 + 1.35000000000000e+02 -4.81136499725427e-01 7.49046375576140e-01 -2.86826311975596e-01 + 1.38000000000000e+02 -4.92453728624275e-01 6.88722261711688e-01 -2.80934437546522e-01 + 1.41000000000000e+02 -5.01081625048703e-01 6.29378805912717e-01 -2.75982450882136e-01 + 1.44000000000000e+02 -5.04343461108966e-01 5.71996674202226e-01 -2.72910247373812e-01 + 1.47000000000000e+02 -5.07722631231294e-01 5.14614980861448e-01 -2.69838067335530e-01 + 1.50000000000000e+02 -5.11208424965791e-01 4.79070665595519e-01 -2.66765899031848e-01 + 1.53000000000000e+02 -5.17411720704259e-01 4.53884562381070e-01 -2.74892073545017e-01 + 1.56000000000000e+02 -5.23897762918947e-01 4.27014220182996e-01 -2.83018243112307e-01 + 1.59000000000000e+02 -5.30626275353240e-01 3.98846265744607e-01 -2.91144350600985e-01 + 1.62000000000000e+02 -4.95885499788614e-01 3.75931646834106e-01 -3.27060715613266e-01 + 1.65000000000000e+02 -4.40412121695890e-01 3.55419527359135e-01 -3.76872444414846e-01 + 1.68000000000000e+02 -3.85054442612432e-01 3.34234373573580e-01 -4.26683602422472e-01 + 1.71000000000000e+02 -3.13409902357768e-01 3.16774623015665e-01 -4.13902641435275e-01 + 1.74000000000000e+02 -2.08939500216179e-01 3.07632373564454e-01 -2.75934520221132e-01 + 1.77000000000000e+02 -1.03993393584518e-01 2.98099548900633e-01 -1.37338163129622e-01 + 1.80000000000000e+02 0.00000000000000e+00 2.86667939639823e-01 0.00000000000000e+00 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_04.dat b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_04.dat new file mode 100644 index 000000000..abbe85601 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_04.dat @@ -0,0 +1,254 @@ +! ------------ AirfoilInfo v1.01.x Input File ---------------------------------- +! AeroElasticSE FAST driver +! line +! line +! ------------------------------------------------------------------------------ +DEFAULT InterpOrd ! Interpolation order to use for quasi-steady table lookup {1=linear; 3=cubic spline; "default"} [default=3] +1 NonDimArea ! The non-dimensional area of the airfoil (area/chord^2) (set to 1.0 if unsure or unneeded) +@"NREL-2p8-127_AF04_Coords.txt" NumCoords ! The number of coordinates in the airfoil shape file. Set to zero if coordinates not included. +AF04_BL.txt BL_file ! The file name including the boundary layer characteristics of the profile. Ignored if the aeroacoustic module is not called. +1 NumTabs ! Number of airfoil tables in this file. Each table must have lines for Re and Ctrl. +! ------------------------------------------------------------------------------ +! data for table 1 +! ------------------------------------------------------------------------------ +6.000000 Re ! Reynolds number in millions +0 Ctrl ! Control setting (must be 0 for current AirfoilInfo) +True InclUAdata ! Is unsteady aerodynamics data included in this table? If TRUE, then include 30 UA coefficients below this line +!........................................ +0.000000 alpha0 ! 0-lift angle of attack, depends on airfoil. +0.000000 alpha1 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA>alpha0. (deg) +0.000000 alpha2 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA1] +0.000000 S2 ! Constant in the f curve best-fit for AOA> alpha1; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S3 ! Constant in the f curve best-fit for alpha2<=AOA< alpha0; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S4 ! Constant in the f curve best-fit for AOA< alpha2; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 Cn1 ! Critical value of C0n at leading edge separation. It should be extracted from airfoil data at a given Mach and Reynolds number. It can be calculated from the static value of Cn at either the break in the pitching moment or the loss of chord force at the onset of stall. It is close to the condition of maximum lift of the airfoil at low Mach numbers. +0.000000 Cn2 ! As Cn1 for negative AOAs. +Default St_sh ! Strouhal's shedding frequency constant. [default = 0.19] +0.000000 Cd0 ! 2D drag coefficient value at 0-lift. +0.000000 Cm0 ! 2D pitching moment coefficient about 1/4-chord location, at 0-lift, positive if nose up. [If the aerodynamics coefficients table does not include a column for Cm, this needs to be set to 0.0] +0.000000 k0 ! Constant in the \hat(x)_cp curve best-fit; = (\hat(x)_AC-0.25). [ignored if UAMod<>1] +0.000000 k1 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k2 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k3 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k1_hat ! Constant in the expression of Cc due to leading edge vortex effects. [ignored if UAMod<>1] +Default x_cp_bar ! Constant in the expression of \hat(x)_cp^v. [ignored if UAMod<>1, default = 0.2] +Default UACutout ! Angle of attack above which unsteady aerodynamics are disabled (deg). [Specifying the string "Default" sets UACutout to 45 degrees] +Default filtCutOff ! Cut-off frequency (-3 dB corner frequency) for low-pass filtering the AoA input to UA, as well as the 1st and 2nd derivatives (Hz) [default = 20] +!........................................ +! Table of aerodynamics coefficients +200 NumAlf ! Number of data lines in the following table +! Alpha Cl Cd Cm +! (deg) (-) (-) (-) +-1.80000000000000e+02 0.00000000000000e+00 1.52890685398725e-01 0.00000000000000e+00 +-1.77000000000000e+02 1.31704479748411e-01 1.63763723652671e-01 1.19452717008645e-01 +-1.74000000000000e+02 2.64615541683425e-01 1.74744683765139e-01 2.39999774321882e-01 +-1.71000000000000e+02 3.96924138305795e-01 1.85683483417484e-01 3.60000410445527e-01 +-1.68000000000000e+02 4.83692709572010e-01 2.10410090026251e-01 3.83359490424043e-01 +-1.65000000000000e+02 5.47678400067375e-01 2.42039936419247e-01 3.58398920279377e-01 +-1.62000000000000e+02 6.11661936785840e-01 2.73684904094820e-01 3.33438064107582e-01 +-1.59000000000000e+02 6.49147890945894e-01 3.10889487497261e-01 3.13527249627107e-01 +-1.56000000000000e+02 6.33627994109589e-01 3.59203284556557e-01 3.03716295849012e-01 +-1.53000000000000e+02 6.18102771363694e-01 4.07545900233725e-01 2.93905168850931e-01 +-1.50000000000000e+02 6.02571440780362e-01 4.55925647601040e-01 2.84093898343018e-01 +-1.47000000000000e+02 5.93851743225456e-01 5.14758887292997e-01 2.87063352917468e-01 +-1.44000000000000e+02 5.85129730070885e-01 5.73263830376554e-01 2.90032783400607e-01 +-1.41000000000000e+02 5.76405140982154e-01 6.31769220410934e-01 2.93002194449487e-01 +-1.38000000000000e+02 5.62958434932229e-01 6.92274906461514e-01 2.98271914144742e-01 +-1.35000000000000e+02 5.47150816004827e-01 7.53780736462377e-01 3.04691792390807e-01 +-1.32000000000000e+02 5.31341994964165e-01 8.15287271265272e-01 3.11111734292256e-01 +-1.29000000000000e+02 5.11898674393990e-01 8.75134136992628e-01 3.17501821606841e-01 +-1.26000000000000e+02 4.85188015388141e-01 9.31661656684178e-01 3.23832218317126e-01 +-1.23000000000000e+02 4.58477182925037e-01 9.88188744534565e-01 3.30162566296010e-01 +-1.20000000000000e+02 4.31765994733252e-01 1.04471561647244e+00 3.36492889647229e-01 +-1.17000000000000e+02 3.94568156643264e-01 1.08888387091091e+00 3.40603620297433e-01 +-1.14000000000000e+02 3.57370304957649e-01 1.13305193246859e+00 3.44714328600463e-01 +-1.11000000000000e+02 3.20172552298473e-01 1.17721965661140e+00 3.48825002561235e-01 +-1.08000000000000e+02 2.77962126266291e-01 1.20912806034645e+00 3.50515840614408e-01 +-1.05000000000000e+02 2.33245372677999e-01 1.23490671052890e+00 3.50996730156169e-01 +-1.02000000000000e+02 1.88529066354869e-01 1.26068506531321e+00 3.51477592241862e-01 +-9.90000000000000e+01 1.42846269453300e-01 1.27908367222767e+00 3.50498451065250e-01 +-9.60000000000000e+01 9.52306422330625e-02 1.28272246374676e+00 3.46599247549748e-01 +-9.30000000000000e+01 4.76153787695439e-02 1.28636122746753e+00 3.42699970222382e-01 +-9.00000000000000e+01 2.97181093101284e-07 1.28999997728939e+00 3.38877476679819e-01 +-8.70000000000000e+01 -4.76153300354876e-02 1.28636123119179e+00 3.34288189245273e-01 +-8.40000000000000e+01 -9.52307753769642e-02 1.28272245357189e+00 3.29739597523247e-01 +-8.10000000000000e+01 -1.42845856965667e-01 1.27908370375002e+00 3.25207993177059e-01 +-7.80000000000000e+01 -1.88528849782130e-01 1.26068519016437e+00 3.17955441758359e-01 +-7.50000000000000e+01 -2.33245668518482e-01 1.23490653998066e+00 3.09344032062908e-01 +-7.20000000000000e+01 -2.77961909696404e-01 1.20912818519635e+00 3.00732721046221e-01 +-6.90000000000000e+01 -3.20172230052935e-01 1.17722003923687e+00 2.91121626468145e-01 +-6.60000000000000e+01 -3.57370408969930e-01 1.13305180896654e+00 2.79510882896335e-01 +-6.30000000000000e+01 -3.94568402742750e-01 1.08888357869621e+00 2.67900139324525e-01 +-6.00000000000000e+01 -4.31766171454802e-01 1.04471524249362e+00 2.56289382389432e-01 +-5.70000000000000e+01 -4.58477359643245e-01 9.88188370555741e-01 2.43119604599202e-01 +-5.40000000000000e+01 -4.85188192105633e-01 9.31661282701068e-01 2.29949776504115e-01 +-5.10000000000000e+01 -5.11898851109208e-01 8.75133763009519e-01 2.16779847798548e-01 +-4.80000000000000e+01 -5.31341959036239e-01 8.15287334218715e-01 2.03370614403917e-01 +-4.50000000000000e+01 -5.47150557766459e-01 7.53781504217852e-01 1.89841732510719e-01 +-4.20000000000000e+01 -5.62958388264277e-01 6.92274969410558e-01 1.76312695587616e-01 +-3.90000000000000e+01 -5.76405141219782e-01 6.31769168555292e-01 1.62884018923624e-01 +-3.60000000000000e+01 -5.85129736228324e-01 5.73263666791100e-01 1.49655804982024e-01 +-3.30000000000000e+01 -5.93851682613004e-01 5.14759282378343e-01 1.36427843675875e-01 +-3.00000000000000e+01 -6.02571527674987e-01 4.55925302880350e-01 1.23199622280574e-01 +-2.93939393939394e+01 -6.05709742968724e-01 4.46148292728679e-01 1.20183218217587e-01 +-2.87878787878788e+01 -6.08847690581429e-01 4.36373153786693e-01 1.17176335932680e-01 +-2.81818181818182e+01 -6.11985380005597e-01 4.26599779864539e-01 1.14168793413229e-01 +-2.75757575757576e+01 -6.15122858980615e-01 4.16827876718823e-01 1.11160516192624e-01 +-2.69696969696970e+01 -6.18260109619839e-01 4.07057465245291e-01 1.08151524224604e-01 +-2.63636363636364e+01 -6.21397122656834e-01 3.97288544820632e-01 1.05141828538283e-01 +-2.57575757575758e+01 -6.24533844014296e-01 3.87521148707597e-01 1.02131448274330e-01 +-2.51515151515151e+01 -6.27670245374249e-01 3.77755259564324e-01 9.91203848845818e-02 +-2.45454545454545e+01 -6.30806424352339e-01 3.67990641254345e-01 9.61085707127930e-02 +-2.39393939393939e+01 -6.33942376901069e-01 3.58227230091829e-01 9.30959891641372e-02 +-2.33333333333333e+01 -6.37078020453462e-01 3.48464966576383e-01 9.00826225283333e-02 +-2.27272727272727e+01 -6.40213455369502e-01 3.38703795054776e-01 8.70684539419758e-02 +-2.21212121212121e+01 -6.43348687727384e-01 3.28943663414953e-01 8.40534654418665e-02 +-2.15151515151515e+01 -6.46483666873065e-01 3.19184299164519e-01 8.10375681805418e-02 +-2.09090909090909e+01 -6.49618442068989e-01 3.09425824234104e-01 7.80207956612929e-02 +-2.03030303030303e+01 -6.52753032833882e-01 2.99668251498965e-01 7.50031458623772e-02 +-1.96969696969697e+01 -6.46281639088916e-01 2.90949411270925e-01 7.04968593518714e-02 +-1.90909090909091e+01 -6.30204218160431e-01 2.83269742867490e-01 6.45023032212650e-02 +-1.84848484848485e+01 -6.14126582290594e-01 2.75592004359402e-01 5.85074349929442e-02 +-1.78787878787879e+01 -5.98047856789765e-01 2.67915828822348e-01 5.25118142631482e-02 +-1.72727272727273e+01 -5.81967302635588e-01 2.60240916364328e-01 4.65150110129194e-02 +-1.66666666666667e+01 -5.65885606263078e-01 2.52567649498003e-01 4.05170693283586e-02 +-1.60606060606061e+01 -5.49802714208954e-01 2.44896059615267e-01 3.45176730639480e-02 +-1.54545454545455e+01 -5.33719399306242e-01 2.37226574370814e-01 2.85166866132808e-02 +-1.48484848484848e+01 -5.17634634029050e-01 2.29558765259197e-01 2.25131018007247e-02 +-1.42424242424242e+01 -5.01547801579493e-01 2.21892402675115e-01 1.65057329856289e-02 +-1.36363636363636e+01 -4.85463674091492e-01 2.14231747747893e-01 1.04934903363307e-02 +-1.30303030303030e+01 -4.69370079236432e-01 2.06565470271126e-01 4.47314506258597e-03 +-1.24242424242424e+01 -4.53283193318206e-01 1.98908867060531e-01 -1.54613211877309e-03 +-1.18181818181818e+01 -4.37187366788929e-01 1.91247369015575e-01 -7.53424241146752e-03 +-1.12121212121212e+01 -4.21093768204950e-01 1.83591167142366e-01 -1.35218680172613e-02 +-1.06060606060606e+01 -4.04998617109735e-01 1.75937905154481e-01 -1.95099338612331e-02 +-1.00000000000000e+01 -3.88896565106125e-01 1.68281357120578e-01 -2.54976171334784e-02 +-9.39393939393939e+00 -3.56980581536747e-01 1.60570608546530e-01 -2.45787021969936e-02 +-8.78787878787879e+00 -3.25052844156906e-01 1.52859809151608e-01 -2.36654666080170e-02 +-8.18181818181818e+00 -2.93123808227596e-01 1.45152920413788e-01 -2.27443554637733e-02 +-7.57575757575758e+00 -2.61189540733289e-01 1.37458302486576e-01 -2.18232254306519e-02 +-6.96969696969697e+00 -2.29253315550365e-01 1.29770338259547e-01 -2.09121948405043e-02 +-6.36363636363636e+00 -1.97299114478799e-01 1.22078681072535e-01 -1.99910067472643e-02 +-5.75757575757576e+00 -1.65337094409309e-01 1.14401642642313e-01 -1.90688307982063e-02 +-5.15151515151515e+00 -1.33363372258401e-01 1.06731125985166e-01 -1.81553134789971e-02 +-4.54545454545454e+00 -1.01365853608070e-01 9.90577635911853e-02 -1.72377886839538e-02 +-3.93939393939394e+00 -6.93567841681647e-02 9.14006376859695e-02 -1.63172897943185e-02 +-3.33333333333333e+00 -3.31807555093951e-02 8.46570826009648e-02 -1.57731499131537e-02 +-2.72727272727273e+00 2.39727377628819e-02 8.25273948895898e-02 -1.71381638240559e-02 +-2.12121212121212e+00 9.32486327068270e-02 8.31141750981614e-02 -1.96272564550678e-02 +-1.51515151515152e+00 1.62528583105757e-01 8.37008175454388e-02 -2.21076923365064e-02 +-9.09090909090912e-01 2.31797235397626e-01 8.42859193789413e-02 -2.45940451844470e-02 +-3.03030303030302e-01 3.01068246865505e-01 8.48656437169153e-02 -2.70868281606804e-02 + 3.03030303030302e-01 3.70338484450812e-01 8.54523328928443e-02 -2.95712433598367e-02 + 9.09090909090912e-01 4.39610300212106e-01 8.60391036829737e-02 -3.20559148731745e-02 + 1.51515151515152e+00 5.09192579530866e-01 8.66138848674114e-02 -3.45449324288621e-02 + 2.12121212121212e+00 5.86406064228343e-01 8.66581954835795e-02 -3.72379475609113e-02 + 2.72727272727273e+00 6.67209757832241e-01 8.64425327187755e-02 -4.00378706815080e-02 + 3.33333333333333e+00 7.48006310769884e-01 8.62268646743108e-02 -4.28376526659724e-02 + 3.93939393939394e+00 8.28814559558240e-01 8.60123335176102e-02 -4.56376672559721e-02 + 4.54545454545455e+00 9.09607713918266e-01 8.57976670724705e-02 -4.84274348252293e-02 + 5.15151515151515e+00 9.90415750809011e-01 8.55913123524140e-02 -5.12274574370195e-02 + 5.75757575757576e+00 1.06840447148798e+00 8.53816156813169e-02 -5.42125455584405e-02 + 6.36363636363637e+00 1.14160400255878e+00 8.51849910150180e-02 -5.75066351634233e-02 + 6.96969696969697e+00 1.21413721717018e+00 8.49944037839137e-02 -6.08487619763315e-02 + 7.57575757575757e+00 1.28664609286845e+00 8.48025295082906e-02 -6.41936917237977e-02 + 8.18181818181818e+00 1.35907367282053e+00 8.46074089108589e-02 -6.75395926025836e-02 + 8.78787878787879e+00 1.42498875451348e+00 8.48939582739108e-02 -7.11385484353892e-02 + 9.39393939393939e+00 1.47790044040096e+00 8.61562125019175e-02 -7.52537462367865e-02 + 1.00000000000000e+01 1.52761951021426e+00 8.76527806305783e-02 -7.94958935415669e-02 + 1.06060606060606e+01 1.21037111221097e+00 1.08368637158632e-01 -7.47780360782507e-02 + 1.12121212121212e+01 1.06745252059869e+00 1.30650270554887e-01 -4.13744293556483e-02 + 1.18181818181818e+01 1.04047682231151e+00 1.48602204458626e-01 -3.87322662567038e-02 + 1.24242424242424e+01 1.02050139325215e+00 1.65510670067403e-01 -4.07401587716326e-02 + 1.30303030303030e+01 1.00956882423978e+00 1.81609086020050e-01 -4.27814866733380e-02 + 1.36363636363636e+01 1.00743778578338e+00 1.96445539032532e-01 -4.48202992152467e-02 + 1.42424242424242e+01 1.00757475615447e+00 2.09842058498476e-01 -4.68758763258071e-02 + 1.48484848484848e+01 1.00899715128062e+00 2.22621760789065e-01 -4.89826947132140e-02 + 1.54545454545455e+01 1.01148957933609e+00 2.34179209308161e-01 -5.10542451445077e-02 + 1.60606060606061e+01 1.01288900592554e+00 2.45010338785109e-01 -5.35062027787723e-02 + 1.66666666666667e+01 1.00195252813289e+00 2.52941797110189e-01 -5.94879954798757e-02 + 1.72727272727273e+01 9.90372353173637e-01 2.60712604214289e-01 -6.56606862514200e-02 + 1.78787878787879e+01 9.78006308087524e-01 2.68286875927460e-01 -7.20666332697287e-02 + 1.84848484848485e+01 9.65644506690629e-01 2.75856403296140e-01 -7.84749075877025e-02 + 1.90909090909091e+01 9.53284332352213e-01 2.83426080329155e-01 -8.48813171286689e-02 + 1.96969696969697e+01 9.40924882807228e-01 2.91001781071828e-01 -9.12808153392477e-02 + 2.03030303030303e+01 9.32508485341658e-01 2.99668251498965e-01 -9.63197520692682e-02 + 2.09090909090909e+01 9.28035612370247e-01 3.09425824234104e-01 -9.99987465351088e-02 + 2.15151515151515e+01 9.23562474293211e-01 3.19184299164519e-01 -1.03676821203003e-01 + 2.21212121212121e+01 9.19089043051198e-01 3.28943663414953e-01 -1.07353977654978e-01 + 2.27272727272727e+01 9.14615247866511e-01 3.38703795054776e-01 -1.11030178126034e-01 + 2.33333333333333e+01 9.10141161527127e-01 3.48464966576383e-01 -1.14705513496165e-01 + 2.39393939393939e+01 9.05666775287466e-01 3.58227230091829e-01 -1.18380002566973e-01 + 2.45454545454545e+01 9.01191945397226e-01 3.67990641254345e-01 -1.22053668013310e-01 + 2.51515151515151e+01 8.96716790059191e-01 3.77755259564324e-01 -1.25726522238022e-01 + 2.57575757575758e+01 8.92241315022274e-01 3.87521148707597e-01 -1.29398582102913e-01 + 2.63636363636364e+01 8.87765380758913e-01 3.97288544820632e-01 -1.33069928789038e-01 + 2.69696969696970e+01 8.83289027675016e-01 4.07057465245291e-01 -1.36740556769150e-01 + 2.75757575757576e+01 8.78812332951360e-01 4.16827876718823e-01 -1.40410439162852e-01 + 2.81818181818182e+01 8.74335309658910e-01 4.26599779864539e-01 -1.44079560303650e-01 + 2.87878787878788e+01 8.69857983172985e-01 4.36373153786694e-01 -1.47747893479490e-01 + 2.93939393939394e+01 8.65380285398246e-01 4.46148292728679e-01 -1.51415526599333e-01 + 3.00000000000000e+01 8.60902202671727e-01 4.55925302880350e-01 -1.55082474171227e-01 + 3.30000000000000e+01 8.48397959434636e-01 5.14759282378343e-01 -1.68663399184894e-01 + 3.60000000000000e+01 8.35890707575628e-01 5.73263666791100e-01 -1.82298027595826e-01 + 3.90000000000000e+01 8.23379662232036e-01 6.31769168555292e-01 -1.95945868274559e-01 + 4.20000000000000e+01 8.04154954731604e-01 6.92274969410558e-01 -2.08554266597334e-01 + 4.50000000000000e+01 7.81573458480718e-01 7.53781504217852e-01 -2.20643060705334e-01 + 4.80000000000000e+01 7.58990915560083e-01 8.15287334218715e-01 -2.32731716287242e-01 + 5.10000000000000e+01 7.31215839592101e-01 8.75133763009519e-01 -2.44320755354886e-01 + 5.40000000000000e+01 6.93057699659601e-01 9.31661282701068e-01 -2.54910529274792e-01 + 5.70000000000000e+01 6.54899314951571e-01 9.88188370555741e-01 -2.65500222295077e-01 + 6.00000000000000e+01 6.16740425757725e-01 1.04471524249362e+00 -2.76089874865860e-01 + 6.30000000000000e+01 5.63629556606820e-01 1.08888357869621e+00 -2.84820525032635e-01 + 6.60000000000000e+01 5.10518346428343e-01 1.13305180896654e+00 -2.93551159264809e-01 + 6.90000000000000e+01 4.57406844501805e-01 1.17722003923687e+00 -3.02281793496983e-01 + 7.20000000000000e+01 3.97127599293486e-01 1.20912818519635e+00 -3.09472835540815e-01 + 7.50000000000000e+01 3.33264710335960e-01 1.23490653998066e+00 -3.15894113007981e-01 + 7.80000000000000e+01 2.69400999928860e-01 1.26068519016437e+00 -3.22315464057870e-01 + 8.10000000000000e+01 2.04142652815547e-01 1.27908370375002e+00 -3.27816939705399e-01 + 8.40000000000000e+01 1.36095393510895e-01 1.28272245357189e+00 -3.31478728044814e-01 + 8.70000000000000e+01 6.80476143629091e-02 1.28636123119179e+00 -3.35157787608892e-01 + 9.00000000000000e+01 -2.97181093302924e-07 1.28999997728939e+00 -3.38875766435868e-01 + 9.30000000000000e+01 -4.76153787695439e-02 1.28636122746753e+00 -3.42699882733940e-01 + 9.60000000000000e+01 -9.52306422330627e-02 1.28272246374676e+00 -3.46597404225314e-01 + 9.90000000000000e+01 -1.42846269453301e-01 1.27908367222767e+00 -3.50494955491782e-01 + 1.02000000000000e+02 -1.88529066354869e-01 1.26068506531321e+00 -3.51472552278717e-01 + 1.05000000000000e+02 -2.33245372677999e-01 1.23490671052890e+00 -3.50990203444848e-01 + 1.08000000000000e+02 -2.77962126266291e-01 1.20912806034645e+00 -3.50507849083669e-01 + 1.11000000000000e+02 -3.20172552298473e-01 1.17721965661140e+00 -3.48815656358806e-01 + 1.14000000000000e+02 -3.57370304957649e-01 1.13305193246859e+00 -3.44703823754748e-01 + 1.17000000000000e+02 -3.94568156643264e-01 1.08888387091091e+00 -3.40591959738759e-01 + 1.20000000000000e+02 -4.31765994733252e-01 1.04471561647244e+00 -3.36480075676600e-01 + 1.23000000000000e+02 -4.58477182925037e-01 9.88188744534564e-01 -3.30149032834181e-01 + 1.26000000000000e+02 -4.85188015388141e-01 9.31661656684178e-01 -3.23817965809434e-01 + 1.29000000000000e+02 -5.11898674393990e-01 8.75134136992627e-01 -3.17486850418223e-01 + 1.32000000000000e+02 -5.31341994964165e-01 8.15287271265271e-01 -3.11096424528303e-01 + 1.35000000000000e+02 -5.47150816004827e-01 7.53780736462377e-01 -3.04676343460043e-01 + 1.38000000000000e+02 -5.62958434932230e-01 6.92274906461514e-01 -2.98256335959350e-01 + 1.41000000000000e+02 -5.76405140982154e-01 6.31769220410933e-01 -2.92986730247466e-01 + 1.44000000000000e+02 -5.85129730070885e-01 5.73263830376554e-01 -2.90017937448097e-01 + 1.47000000000000e+02 -5.93851743225456e-01 5.14758887292997e-01 -2.87049167328765e-01 + 1.50000000000000e+02 -6.02571440780362e-01 4.55925647601039e-01 -2.84080408549046e-01 + 1.53000000000000e+02 -6.18102771363694e-01 4.07545900233725e-01 -2.93893652756478e-01 + 1.56000000000000e+02 -6.33627994109589e-01 3.59203284556557e-01 -3.03706889264038e-01 + 1.59000000000000e+02 -6.49147890945894e-01 3.10889487497261e-01 -3.13520050804901e-01 + 1.62000000000000e+02 -6.11662753189298e-01 2.73684904094820e-01 -3.53432900875577e-01 + 1.65000000000000e+02 -5.47687466921444e-01 2.42039936419247e-01 -4.08395849769896e-01 + 1.68000000000000e+02 -4.83692709572010e-01 2.10410090026251e-01 -4.63358168842291e-01 + 1.71000000000000e+02 -3.96924138305795e-01 1.85683483417484e-01 -4.50000513056908e-01 + 1.74000000000000e+02 -2.64615541683425e-01 1.74744683765139e-01 -2.99999717902353e-01 + 1.77000000000000e+02 -1.31704479748411e-01 1.63763723652671e-01 -1.49315896260807e-01 + 1.80000000000000e+02 0.00000000000000e+00 1.52890685398725e-01 0.00000000000000e+00 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_05.dat b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_05.dat new file mode 100644 index 000000000..28ca6bdbf --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_05.dat @@ -0,0 +1,254 @@ +! ------------ AirfoilInfo v1.01.x Input File ---------------------------------- +! AeroElasticSE FAST driver +! line +! line +! ------------------------------------------------------------------------------ +DEFAULT InterpOrd ! Interpolation order to use for quasi-steady table lookup {1=linear; 3=cubic spline; "default"} [default=3] +1 NonDimArea ! The non-dimensional area of the airfoil (area/chord^2) (set to 1.0 if unsure or unneeded) +@"NREL-2p8-127_AF05_Coords.txt" NumCoords ! The number of coordinates in the airfoil shape file. Set to zero if coordinates not included. +AF05_BL.txt BL_file ! The file name including the boundary layer characteristics of the profile. Ignored if the aeroacoustic module is not called. +1 NumTabs ! Number of airfoil tables in this file. Each table must have lines for Re and Ctrl. +! ------------------------------------------------------------------------------ +! data for table 1 +! ------------------------------------------------------------------------------ +6.000000 Re ! Reynolds number in millions +0 Ctrl ! Control setting (must be 0 for current AirfoilInfo) +True InclUAdata ! Is unsteady aerodynamics data included in this table? If TRUE, then include 30 UA coefficients below this line +!........................................ +-2.550758 alpha0 ! 0-lift angle of attack, depends on airfoil. +11.972792 alpha1 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA>alpha0. (deg) +-3.390653 alpha2 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA1] +0.000000 S2 ! Constant in the f curve best-fit for AOA> alpha1; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S3 ! Constant in the f curve best-fit for alpha2<=AOA< alpha0; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S4 ! Constant in the f curve best-fit for AOA< alpha2; by definition it depends on the airfoil. [ignored if UAMod<>1] +1.577585 Cn1 ! Critical value of C0n at leading edge separation. It should be extracted from airfoil data at a given Mach and Reynolds number. It can be calculated from the static value of Cn at either the break in the pitching moment or the loss of chord force at the onset of stall. It is close to the condition of maximum lift of the airfoil at low Mach numbers. +-0.698181 Cn2 ! As Cn1 for negative AOAs. +Default St_sh ! Strouhal's shedding frequency constant. [default = 0.19] +0.047738 Cd0 ! 2D drag coefficient value at 0-lift. +-0.017884 Cm0 ! 2D pitching moment coefficient about 1/4-chord location, at 0-lift, positive if nose up. [If the aerodynamics coefficients table does not include a column for Cm, this needs to be set to 0.0] +0.000000 k0 ! Constant in the \hat(x)_cp curve best-fit; = (\hat(x)_AC-0.25). [ignored if UAMod<>1] +0.000000 k1 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k2 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k3 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k1_hat ! Constant in the expression of Cc due to leading edge vortex effects. [ignored if UAMod<>1] +Default x_cp_bar ! Constant in the expression of \hat(x)_cp^v. [ignored if UAMod<>1, default = 0.2] +Default UACutout ! Angle of attack above which unsteady aerodynamics are disabled (deg). [Specifying the string "Default" sets UACutout to 45 degrees] +Default filtCutOff ! Cut-off frequency (-3 dB corner frequency) for low-pass filtering the AoA input to UA, as well as the 1st and 2nd derivatives (Hz) [default = 20] +!........................................ +! Table of aerodynamics coefficients +200 NumAlf ! Number of data lines in the following table +! Alpha Cl Cd Cm +! (deg) (-) (-) (-) +-1.80000000000000e+02 0.00000000000000e+00 5.30927947138125e-02 0.00000000000000e+00 +-1.77000000000000e+02 1.43244990746609e-01 5.69851238094485e-02 1.19452717008645e-01 +-1.74000000000000e+02 2.87802289582396e-01 6.09656699428337e-02 2.39999774321882e-01 +-1.71000000000000e+02 4.31704332512692e-01 6.49763275693468e-02 3.60000410445527e-01 +-1.68000000000000e+02 5.23499707930916e-01 8.50931388592694e-02 3.82638556679456e-01 +-1.65000000000000e+02 5.83384432077198e-01 1.13322899941877e-01 3.56596594332269e-01 +-1.62000000000000e+02 6.43053795138515e-01 1.41646320077994e-01 3.30554333566108e-01 +-1.59000000000000e+02 6.78451069490567e-01 1.78095963395456e-01 3.09470086171798e-01 +-1.56000000000000e+02 6.58893043506451e-01 2.30735614552766e-01 2.98273249714432e-01 +-1.53000000000000e+02 6.39361023231318e-01 2.83555584049004e-01 2.87022407877401e-01 +-1.50000000000000e+02 6.19863301663139e-01 3.36609283159026e-01 2.75697034623494e-01 +-1.47000000000000e+02 6.09009472068249e-01 4.01283048649868e-01 2.78062585683198e-01 +-1.44000000000000e+02 5.98171151079133e-01 4.63879476339314e-01 2.80408703728939e-01 +-1.41000000000000e+02 5.87351226752077e-01 5.26476382236643e-01 2.82731729240854e-01 +-1.38000000000000e+02 5.72330730353409e-01 5.91679697265480e-01 2.87760801862453e-01 +-1.35000000000000e+02 5.55209533057542e-01 6.58186211572688e-01 2.94147772624518e-01 +-1.32000000000000e+02 5.38097371011921e-01 7.24693487985318e-01 3.00529378672850e-01 +-1.29000000000000e+02 5.17511317766740e-01 7.89812599804369e-01 3.07049734636571e-01 +-1.26000000000000e+02 4.89961725795433e-01 8.52155375838165e-01 3.13857858392341e-01 +-1.23000000000000e+02 4.62416171597766e-01 9.14497675605232e-01 3.20665726887359e-01 +-1.20000000000000e+02 4.34875524108853e-01 9.76839737247837e-01 3.27473323520141e-01 +-1.17000000000000e+02 3.97141252418688e-01 1.02744833950730e+00 3.32448774893895e-01 +-1.14000000000000e+02 3.59408610235184e-01 1.07805672550782e+00 3.37422939191108e-01 +-1.11000000000000e+02 3.21678367338784e-01 1.12866472489365e+00 3.42395452802871e-01 +-1.08000000000000e+02 2.79088060479540e-01 1.16729127063990e+00 3.45105968655180e-01 +-1.05000000000000e+02 2.34067147859934e-01 1.19992699833297e+00 3.46678811680518e-01 +-1.02000000000000e+02 1.89047548243342e-01 1.23256235205249e+00 3.48239595384036e-01 +-9.90000000000000e+01 1.43131704344168e-01 1.25788743783553e+00 3.48340383273987e-01 +-9.60000000000000e+01 9.54209316759962e-02 1.26859167109942e+00 3.45525190946857e-01 +-9.30000000000000e+01 4.77105235832516e-02 1.27929582258901e+00 3.42653176080977e-01 +-9.00000000000000e+01 2.97774918887840e-07 1.28999993319219e+00 3.41171513503408e-01 +-8.70000000000000e+01 -4.77104747518152e-02 1.27929583354468e+00 3.34817796856754e-01 +-8.40000000000000e+01 -9.54210650859458e-02 1.26859164116800e+00 3.29193185522394e-01 +-8.10000000000000e+01 -1.43131291032302e-01 1.25788753056483e+00 3.23300885206925e-01 +-7.80000000000000e+01 -1.89047330204813e-01 1.23256251011385e+00 3.14255422250019e-01 +-7.50000000000000e+01 -2.34067445710414e-01 1.19992678241918e+00 3.04545364776568e-01 +-7.20000000000000e+01 -2.79087842435176e-01 1.16729142869966e+00 2.94835418571366e-01 +-6.90000000000000e+01 -3.21678040492873e-01 1.12866516331131e+00 2.84308787573372e-01 +-6.60000000000000e+01 -3.59408715740005e-01 1.07805658399745e+00 2.72148720112555e-01 +-6.30000000000000e+01 -3.97141502062332e-01 1.02744800468359e+00 2.59988652651739e-01 +-6.00000000000000e+01 -4.34875706297759e-01 9.76839324796023e-01 2.47828577510345e-01 +-5.70000000000000e+01 -4.62416353822370e-01 9.14497263153418e-01 2.34772451636168e-01 +-5.40000000000000e+01 -4.89961908050355e-01 8.52154963381625e-01 2.21716275891253e-01 +-5.10000000000000e+01 -5.17511500044336e-01 7.89812187347829e-01 2.08660000404101e-01 +-4.80000000000000e+01 -5.38086518717761e-01 7.24693556057142e-01 1.95844288146640e-01 +-4.50000000000000e+01 -5.55175897952576e-01 6.58187041749934e-01 1.83148853637833e-01 +-4.20000000000000e+01 -5.72313983328070e-01 5.91679765332548e-01 1.70453273649745e-01 +-3.90000000000000e+01 -5.87347123075626e-01 5.26476326754529e-01 1.58085355571838e-01 +-3.60000000000000e+01 -5.98161176797901e-01 4.63879301313675e-01 1.46372520769741e-01 +-3.30000000000000e+01 -6.09008454841632e-01 4.01283471365111e-01 1.34659909662040e-01 +-3.00000000000000e+01 -6.19863411384585e-01 3.36608903265194e-01 1.22947070166372e-01 +-2.93939393939394e+01 -6.23846756639890e-01 3.25869060451884e-01 1.20313440786885e-01 +-2.87878787878788e+01 -6.27838778995726e-01 3.15141051259396e-01 1.17614452112613e-01 +-2.81818181818182e+01 -6.31839641876821e-01 3.04424204137947e-01 1.14912699050432e-01 +-2.75757575757576e+01 -6.35836270597920e-01 2.93717682812228e-01 1.12207880384010e-01 +-2.69696969696970e+01 -6.39833911454526e-01 2.83021034017517e-01 1.09499798315900e-01 +-2.63636363636364e+01 -6.43837810956875e-01 2.72333814688203e-01 1.06788280516258e-01 +-2.57575757575758e+01 -6.47833727204863e-01 2.61655649661799e-01 1.04073092351849e-01 +-2.51515151515151e+01 -6.51811878050700e-01 2.50986136645096e-01 1.01353965974111e-01 +-2.45454545454545e+01 -6.55792402610431e-01 2.40324660439802e-01 9.86307582663180e-02 +-2.39393939393939e+01 -6.59769329462643e-01 2.29670818293622e-01 9.59032541531653e-02 +-2.33333333333333e+01 -6.63693753618085e-01 2.19024233923185e-01 9.31708867916564e-02 +-2.27272727272727e+01 -6.67617282194909e-01 2.08384555374766e-01 9.04338238763716e-02 +-2.21212121212121e+01 -6.71539925846911e-01 1.97751453089189e-01 8.76919095450044e-02 +-2.15151515151515e+01 -6.75391364530441e-01 1.87124374677434e-01 8.49442500011879e-02 +-2.09090909090909e+01 -6.79225055311131e-01 1.76503213160456e-01 8.21911480032724e-02 +-2.03030303030303e+01 -6.83058586454578e-01 1.65887757170172e-01 7.94326338508051e-02 +-1.96969696969697e+01 -6.77179366626525e-01 1.57936143099498e-01 7.50259515023840e-02 +-1.90909090909091e+01 -6.61588812956316e-01 1.52651370129665e-01 6.89730817674315e-02 +-1.84848484848485e+01 -6.45998974297365e-01 1.47376694007528e-01 6.29169683694159e-02 +-1.78787878787879e+01 -6.30407947197086e-01 1.42112026219737e-01 5.68565081215708e-02 +-1.72727272727273e+01 -6.14814081267429e-01 1.36857330079429e-01 5.07903974899203e-02 +-1.66666666666667e+01 -5.99217230522637e-01 1.31613040740835e-01 4.47175106901892e-02 +-1.60606060606061e+01 -5.83616581541072e-01 1.26379356727811e-01 3.86359166779271e-02 +-1.54545454545455e+01 -5.68012174444683e-01 1.21156750685727e-01 3.25431989869031e-02 +-1.48484848484848e+01 -5.52402341156080e-01 1.15945116537827e-01 2.64350024320926e-02 +-1.42424242424242e+01 -5.36785838629193e-01 1.10744490215081e-01 2.03050549247369e-02 +-1.36363636363636e+01 -5.21164946554597e-01 1.05556831744732e-01 1.41441663106941e-02 +-1.30303030303030e+01 -5.05532268418259e-01 1.00377944456418e-01 7.93532744678689e-03 +-1.24242424242424e+01 -4.89896163495659e-01 9.52139797533199e-02 1.73252780437516e-03 +-1.18181818181818e+01 -4.74247226456870e-01 9.00595351969602e-02 -4.26939729837575e-03 +-1.12121212121212e+01 -4.58591426990099e-01 8.49188835204796e-02 -1.02684318086498e-02 +-1.06060606060606e+01 -4.42925008308680e-01 7.97910287467256e-02 -1.62647493676347e-02 +-1.00000000000000e+01 -4.27245419806289e-01 7.46743204034461e-02 -2.22564315863916e-02 +-9.39393939393939e+00 -3.94450071012984e-01 7.15761244145179e-02 -2.16020013916610e-02 +-8.78787878787879e+00 -3.61709763635419e-01 6.85053420395361e-02 -2.09365369698145e-02 +-8.18181818181818e+00 -3.29004774877055e-01 6.54609123314964e-02 -2.02303412864217e-02 +-7.57575757575758e+00 -2.96719457325792e-01 6.35194996651035e-02 -1.95537154607737e-02 +-6.96969696969697e+00 -2.64607645997063e-01 6.22646687778469e-02 -1.89056408818654e-02 +-6.36363636363636e+00 -2.32580527152297e-01 6.06079991204510e-02 -1.81689497551464e-02 +-5.75757575757576e+00 -2.00633174166183e-01 5.86072762325081e-02 -1.69119223172787e-02 +-5.15151515151515e+00 -1.68866114677660e-01 5.62255812194239e-02 -1.65526782796882e-02 +-4.54545454545454e+00 -1.37461932635248e-01 5.36929428917852e-02 -1.61977017355170e-02 +-3.93939393939394e+00 -1.06758451318221e-01 5.10791375965595e-02 -1.58364616756710e-02 +-3.33333333333333e+00 -7.62685548653199e-02 4.84672024181126e-02 -1.56131840112851e-02 +-2.72727272727273e+00 -2.30465602521035e-02 4.76318232912975e-02 -1.71370109715407e-02 +-2.12121212121212e+00 5.60835187551921e-02 4.79951799533595e-02 -1.97007210491168e-02 +-1.51515151515152e+00 1.33973262951602e-01 4.82654676882718e-02 -2.19439082938550e-02 +-9.09090909090912e-01 2.11028087723967e-01 4.85254853369285e-02 -2.42243917401695e-02 +-3.03030303030302e-01 2.87261368924859e-01 4.88198593001318e-02 -2.64441305820696e-02 + 3.03030303030302e-01 3.62683470094018e-01 4.90303436956597e-02 -2.86606885206110e-02 + 9.09090909090912e-01 4.37199562095510e-01 4.92283898912697e-02 -3.09291436006373e-02 + 1.51515151515152e+00 5.13610653178412e-01 4.93813249350217e-02 -3.31627344995039e-02 + 2.12121212121212e+00 5.93819523225117e-01 4.94346635643130e-02 -3.56399268252573e-02 + 2.72727272727273e+00 6.74386743494600e-01 4.93129308208056e-02 -3.83078247443938e-02 + 3.33333333333333e+00 7.54945044010580e-01 4.91755144944948e-02 -4.10234230183793e-02 + 3.93939393939394e+00 8.35509088091445e-01 4.91056624497743e-02 -4.37392469039279e-02 + 4.54545454545455e+00 9.16064316845785e-01 4.89398733238135e-02 -4.63880027667541e-02 + 5.15151515151515e+00 9.96625787614405e-01 4.87886086060796e-02 -4.91038344328945e-02 + 5.75757575757576e+00 1.07656301546343e+00 4.86681788543757e-02 -5.18876441202431e-02 + 6.36363636363637e+00 1.15542943443492e+00 4.84580270970572e-02 -5.47393555777829e-02 + 6.96969696969697e+00 1.23410923793262e+00 4.83167054847680e-02 -5.76374031069491e-02 + 7.57575757575757e+00 1.31245193672788e+00 4.80332030687119e-02 -6.06302767966048e-02 + 8.18181818181818e+00 1.38759943761324e+00 4.77434147182263e-02 -6.42287509236700e-02 + 8.78787878787879e+00 1.45873318731176e+00 4.76208649517908e-02 -6.80810236266958e-02 + 9.39393939393939e+00 1.52667302662998e+00 4.74125681417122e-02 -7.21235138863210e-02 + 1.00000000000000e+01 1.59364179899341e+00 4.69592426109806e-02 -7.62125968301386e-02 + 1.06060606060606e+01 1.53266180129203e+00 5.17795621500542e-02 -7.64122517246057e-02 + 1.12121212121212e+01 1.50662714460046e+00 5.81185911119093e-02 -6.22473445320763e-02 + 1.18181818181818e+01 1.52196088499542e+00 6.47040938908333e-02 -6.38501972207365e-02 + 1.24242424242424e+01 1.06125737520671e+00 7.27011070641862e-02 -5.06632430902114e-02 + 1.30303030303030e+01 9.86623647198398e-01 7.99581638241099e-02 -5.02161054006635e-02 + 1.36363636363636e+01 9.95413895615537e-01 8.64252489342137e-02 -5.25392814360008e-02 + 1.42424242424242e+01 1.00924723452713e+00 9.21833608579365e-02 -5.50345279620461e-02 + 1.48484848484848e+01 1.02661321711400e+00 9.75776888323979e-02 -5.76003393676277e-02 + 1.54545454545455e+01 1.05138532349845e+00 1.02292972150637e-01 -6.01726803278759e-02 + 1.60606060606061e+01 1.07964132412529e+00 1.07181768900225e-01 -6.30677892912717e-02 + 1.66666666666667e+01 1.06432412273203e+00 1.15493817389282e-01 -6.88775293421371e-02 + 1.72727272727273e+01 1.04867809191367e+00 1.23747525118351e-01 -7.47996579324639e-02 + 1.78787878787879e+01 1.03269240545081e+00 1.31928776633279e-01 -8.08557118437613e-02 + 1.84848484848485e+01 1.01640007994456e+00 1.40110699660449e-01 -8.69627224737571e-02 + 1.90909090909091e+01 1.00063944099394e+00 1.48295486938811e-01 -9.30638334648102e-02 + 1.96969696969697e+01 9.85938420719178e-01 1.56485775705632e-01 -9.91101057357213e-02 + 2.03030303030303e+01 9.75860062476632e-01 1.65887757170172e-01 -1.03774527782874e-01 + 2.09090909090909e+01 9.70385523569138e-01 1.76503213160456e-01 -1.07066137517572e-01 + 2.15151515151515e+01 9.64910741287637e-01 1.87124374677434e-01 -1.10360436221179e-01 + 2.21212121212121e+01 9.59410539374443e-01 1.97751453089189e-01 -1.13658562031653e-01 + 2.27272727272727e+01 9.53808409121640e-01 2.08384555374766e-01 -1.16963451063534e-01 + 2.33333333333333e+01 9.48205009566551e-01 2.19024233923185e-01 -1.20268180130586e-01 + 2.39393939393939e+01 9.42600325574261e-01 2.29670818293622e-01 -1.23572752917098e-01 + 2.45454545454545e+01 9.36920460742092e-01 2.40324660439802e-01 -1.26879595000076e-01 + 2.51515151515151e+01 9.31235454127077e-01 2.50986136645096e-01 -1.30185781900636e-01 + 2.57575757575758e+01 9.25553857527951e-01 2.61655649661799e-01 -1.33491111669471e-01 + 2.63636363636364e+01 9.19846852026574e-01 2.72333814688203e-01 -1.36796376983463e-01 + 2.69696969696970e+01 9.14128444983841e-01 2.83021034017517e-01 -1.40101150711351e-01 + 2.75757575757576e+01 9.08419019689508e-01 2.93717682812228e-01 -1.43405050790712e-01 + 2.81818181818182e+01 9.02711061316296e-01 3.04424204137947e-01 -1.46708310397499e-01 + 2.87878787878788e+01 8.96997060076054e-01 3.15141051259396e-01 -1.50011073235030e-01 + 2.93939393939394e+01 8.91295747727463e-01 3.25869060451884e-01 -1.53313276996418e-01 + 3.00000000000000e+01 8.85606890090034e-01 3.36608903265194e-01 -1.56615109400843e-01 + 3.30000000000000e+01 8.70046621612218e-01 4.01283471365112e-01 -1.68896662349608e-01 + 3.60000000000000e+01 8.54497762357662e-01 4.63879301313675e-01 -1.80807931817999e-01 + 3.90000000000000e+01 8.38996891272377e-01 5.26476326754529e-01 -1.92637317529328e-01 + 4.20000000000000e+01 8.17522301694096e-01 5.91679765332548e-01 -2.03957651916238e-01 + 4.50000000000000e+01 7.93066546402043e-01 6.58187041749934e-01 -2.15023567058536e-01 + 4.80000000000000e+01 7.68679932146205e-01 7.24693556057142e-01 -2.26089355395965e-01 + 5.10000000000000e+01 7.39303717872206e-01 7.89812187347829e-01 -2.36920708472379e-01 + 5.40000000000000e+01 6.99944452555873e-01 8.52154963381625e-01 -2.47283175955455e-01 + 5.70000000000000e+01 6.60590914392139e-01 9.14497263153418e-01 -2.57645564275396e-01 + 6.00000000000000e+01 6.21244336348351e-01 9.76839324796023e-01 -2.68007913014073e-01 + 6.30000000000000e+01 5.67342239658887e-01 1.02744800468359e+00 -2.77212112250156e-01 + 6.60000000000000e+01 5.13442407001332e-01 1.07805658399745e+00 -2.86416301559060e-01 + 6.90000000000000e+01 4.59545925192930e-01 1.12866516331131e+00 -2.95620490867964e-01 + 7.20000000000000e+01 3.98720080252567e-01 1.16729142869966e+00 -3.03676557424305e-01 + 7.50000000000000e+01 3.34428749413491e-01 1.19992678241918e+00 -3.11158586107968e-01 + 7.80000000000000e+01 2.70137761942138e-01 1.23256251011385e+00 -3.18640700529719e-01 + 8.10000000000000e+01 2.04550434150108e-01 1.25788753056483e+00 -3.25335532450249e-01 + 8.40000000000000e+01 1.36367248239496e-01 1.26859164116800e+00 -3.30455853712348e-01 + 8.70000000000000e+01 6.81835415395329e-02 1.27929583354468e+00 -3.35467708982822e-01 + 9.00000000000000e+01 -2.97774919089685e-07 1.28999993319219e+00 -3.40233119894460e-01 + 9.30000000000000e+01 -4.77105235832516e-02 1.27929582258901e+00 -3.42605172055241e-01 + 9.60000000000000e+01 -9.54209316759964e-02 1.26859167109942e+00 -3.44513777418663e-01 + 9.90000000000000e+01 -1.43131704344168e-01 1.25788743783553e+00 -3.46422397362864e-01 + 1.02000000000000e+02 -1.89047548243342e-01 1.23256235205249e+00 -3.45474218431042e-01 + 1.05000000000000e+02 -2.34067147859934e-01 1.19992699833297e+00 -3.43097670996285e-01 + 1.08000000000000e+02 -2.79088060479540e-01 1.16729127063990e+00 -3.40721096328304e-01 + 1.11000000000000e+02 -3.21678367338785e-01 1.12866472489365e+00 -3.37267285780153e-01 + 1.14000000000000e+02 -3.59408610235184e-01 1.07805672550782e+00 -3.31659036281393e-01 + 1.17000000000000e+02 -3.97141252418688e-01 1.02744833950730e+00 -3.26050743938977e-01 + 1.20000000000000e+02 -4.34875524108853e-01 9.76839737247837e-01 -3.20442427056780e-01 + 1.23000000000000e+02 -4.62416171597766e-01 9.14497675605232e-01 -3.13240052857952e-01 + 1.26000000000000e+02 -4.89961725795433e-01 8.52155375838165e-01 -3.06037651148621e-01 + 1.29000000000000e+02 -5.17511317766740e-01 7.89812599804369e-01 -2.98835194416227e-01 + 1.32000000000000e+02 -5.38097371011921e-01 7.24693487985317e-01 -2.92129065581036e-01 + 1.35000000000000e+02 -5.55209533057542e-01 6.58186211572688e-01 -2.85671100106641e-01 + 1.38000000000000e+02 -5.72330730353409e-01 5.91679697265480e-01 -2.79213208633931e-01 + 1.41000000000000e+02 -5.87351226752077e-01 5.26476382236642e-01 -2.74246677538335e-01 + 1.44000000000000e+02 -5.98171151079133e-01 4.63879476339314e-01 -2.72262879298565e-01 + 1.47000000000000e+02 -6.09009472068249e-01 4.01283048649868e-01 -2.70279096213984e-01 + 1.50000000000000e+02 -6.19863301663139e-01 3.36609283159026e-01 -2.68295320706727e-01 + 1.53000000000000e+02 -6.39361023231318e-01 2.83555584049004e-01 -2.80703642982803e-01 + 1.56000000000000e+02 -6.58893043506451e-01 2.30735614552766e-01 -2.93111951398230e-01 + 1.59000000000000e+02 -6.78451069490567e-01 1.78095963395456e-01 -3.05520165022309e-01 + 1.62000000000000e+02 -6.43501747482713e-01 1.41646320077994e-01 -3.47725013460614e-01 + 1.65000000000000e+02 -5.88359323471862e-01 1.13322899941877e-01 -4.04828431301629e-01 + 1.68000000000000e+02 -5.23499707930916e-01 8.50931388592694e-02 -4.61931194793028e-01 + 1.71000000000000e+02 -4.31704332512692e-01 6.49763275693468e-02 -4.50000513056908e-01 + 1.74000000000000e+02 -2.87802289582396e-01 6.09656699428337e-02 -2.99999717902353e-01 + 1.77000000000000e+02 -1.43244990746609e-01 5.69851238094485e-02 -1.49315896260807e-01 + 1.80000000000000e+02 0.00000000000000e+00 5.30927947138125e-02 0.00000000000000e+00 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_06.dat b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_06.dat new file mode 100644 index 000000000..28b7cb05d --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_06.dat @@ -0,0 +1,254 @@ +! ------------ AirfoilInfo v1.01.x Input File ---------------------------------- +! AeroElasticSE FAST driver +! line +! line +! ------------------------------------------------------------------------------ +DEFAULT InterpOrd ! Interpolation order to use for quasi-steady table lookup {1=linear; 3=cubic spline; "default"} [default=3] +1 NonDimArea ! The non-dimensional area of the airfoil (area/chord^2) (set to 1.0 if unsure or unneeded) +@"NREL-2p8-127_AF06_Coords.txt" NumCoords ! The number of coordinates in the airfoil shape file. Set to zero if coordinates not included. +AF06_BL.txt BL_file ! The file name including the boundary layer characteristics of the profile. Ignored if the aeroacoustic module is not called. +1 NumTabs ! Number of airfoil tables in this file. Each table must have lines for Re and Ctrl. +! ------------------------------------------------------------------------------ +! data for table 1 +! ------------------------------------------------------------------------------ +6.000000 Re ! Reynolds number in millions +0 Ctrl ! Control setting (must be 0 for current AirfoilInfo) +True InclUAdata ! Is unsteady aerodynamics data included in this table? If TRUE, then include 30 UA coefficients below this line +!........................................ +0.000000 alpha0 ! 0-lift angle of attack, depends on airfoil. +0.000000 alpha1 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA>alpha0. (deg) +0.000000 alpha2 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA1] +0.000000 S2 ! Constant in the f curve best-fit for AOA> alpha1; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S3 ! Constant in the f curve best-fit for alpha2<=AOA< alpha0; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S4 ! Constant in the f curve best-fit for AOA< alpha2; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 Cn1 ! Critical value of C0n at leading edge separation. It should be extracted from airfoil data at a given Mach and Reynolds number. It can be calculated from the static value of Cn at either the break in the pitching moment or the loss of chord force at the onset of stall. It is close to the condition of maximum lift of the airfoil at low Mach numbers. +0.000000 Cn2 ! As Cn1 for negative AOAs. +Default St_sh ! Strouhal's shedding frequency constant. [default = 0.19] +0.000000 Cd0 ! 2D drag coefficient value at 0-lift. +0.000000 Cm0 ! 2D pitching moment coefficient about 1/4-chord location, at 0-lift, positive if nose up. [If the aerodynamics coefficients table does not include a column for Cm, this needs to be set to 0.0] +0.000000 k0 ! Constant in the \hat(x)_cp curve best-fit; = (\hat(x)_AC-0.25). [ignored if UAMod<>1] +0.000000 k1 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k2 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k3 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k1_hat ! Constant in the expression of Cc due to leading edge vortex effects. [ignored if UAMod<>1] +Default x_cp_bar ! Constant in the expression of \hat(x)_cp^v. [ignored if UAMod<>1, default = 0.2] +Default UACutout ! Angle of attack above which unsteady aerodynamics are disabled (deg). [Specifying the string "Default" sets UACutout to 45 degrees] +Default filtCutOff ! Cut-off frequency (-3 dB corner frequency) for low-pass filtering the AoA input to UA, as well as the 1st and 2nd derivatives (Hz) [default = 20] +!........................................ +! Table of aerodynamics coefficients +200 NumAlf ! Number of data lines in the following table +! Alpha Cl Cd Cm +! (deg) (-) (-) (-) +-1.80000000000000e+02 0.00000000000000e+00 1.04451467064788e-02 0.00000000000000e+00 +-1.77000000000000e+02 1.47157007613739e-01 1.04872308588687e-02 1.19452717008645e-01 +-1.74000000000000e+02 2.95662162415483e-01 1.05303966409131e-02 2.39999774321882e-01 +-1.71000000000000e+02 4.43494166290477e-01 1.05740045222718e-02 3.60000410445527e-01 +-1.68000000000000e+02 5.36848745324298e-01 2.74506298830325e-02 3.81279166438973e-01 +-1.65000000000000e+02 6.01560063853722e-01 5.27443629674667e-02 3.53198134597150e-01 +-1.62000000000000e+02 6.66223778858103e-01 7.80396220376046e-02 3.25116780970332e-01 +-1.59000000000000e+02 7.02316612456853e-01 1.12504063201209e-01 3.01860860228524e-01 +-1.56000000000000e+02 6.79726083437648e-01 1.65305735070101e-01 2.88248798735499e-01 +-1.53000000000000e+02 6.57149315796707e-01 2.18110193131311e-01 2.74623662647778e-01 +-1.50000000000000e+02 6.34589659449874e-01 2.70917973756332e-01 2.60980583690885e-01 +-1.47000000000000e+02 6.22060969336252e-01 3.35899150571673e-01 2.62488656920504e-01 +-1.44000000000000e+02 6.09539332292595e-01 4.00853059956420e-01 2.63992059057429e-01 +-1.41000000000000e+02 5.97025743089158e-01 4.65807465559123e-01 2.65489913378387e-01 +-1.38000000000000e+02 5.80704075775906e-01 5.33717517969207e-01 2.70296859813583e-01 +-1.35000000000000e+02 5.62478076348152e-01 6.03105387787129e-01 2.76759519512185e-01 +-1.32000000000000e+02 5.44255597967036e-01 6.72494052728241e-01 2.83220945160593e-01 +-1.29000000000000e+02 5.22678505700544e-01 7.40650991852422e-01 2.90064291270315e-01 +-1.26000000000000e+02 4.94385901691070e-01 8.06344473485986e-01 2.97673949948684e-01 +-1.23000000000000e+02 4.66094993647798e-01 8.72037453255156e-01 3.05283501600632e-01 +-1.20000000000000e+02 4.37806027109449e-01 9.37730182101509e-01 3.12892965044744e-01 +-1.17000000000000e+02 3.99577421117098e-01 9.92049662822417e-01 3.19211276900007e-01 +-1.14000000000000e+02 3.61349504390741e-01 1.04636891381409e+00 3.25529257918674e-01 +-1.11000000000000e+02 3.23122662358267e-01 1.10068774984251e+00 3.31846802734848e-01 +-1.08000000000000e+02 2.80173308571465e-01 1.14318523690795e+00 3.36136841670906e-01 +-1.05000000000000e+02 2.34862463623927e-01 1.17977195947738e+00 3.39411510930403e-01 +-1.02000000000000e+02 1.89552426493172e-01 1.21635826279871e+00 3.42683246088910e-01 +-9.90000000000000e+01 1.43411370176115e-01 1.24567433198225e+00 3.44537199174708e-01 +-9.60000000000000e+01 9.56073752226676e-02 1.26044961797812e+00 3.43556506874831e-01 +-9.30000000000000e+01 4.78037454869307e-02 1.27522479109913e+00 3.42562148033031e-01 +-9.00000000000000e+01 2.98356743247137e-07 1.28999990778373e+00 3.41794286215052e-01 +-8.70000000000000e+01 -4.78036965600822e-02 1.27522480622146e+00 3.34958722226529e-01 +-8.40000000000000e+01 -9.56075088932874e-02 1.26044957666313e+00 3.28241304934322e-01 +-8.10000000000000e+01 -1.43410956056677e-01 1.24567445997852e+00 3.21434171665192e-01 +-7.80000000000000e+01 -1.89552207046124e-01 1.21635843999553e+00 3.12123499707622e-01 +-7.50000000000000e+01 -2.34862763393904e-01 1.17977171742431e+00 3.01780409905885e-01 +-7.20000000000000e+01 -2.80173089123731e-01 1.14318541410297e+00 2.91437438626359e-01 +-6.90000000000000e+01 -3.23122331202990e-01 1.10068822040718e+00 2.80383282644346e-01 +-6.60000000000000e+01 -3.61349611282076e-01 1.04636876192745e+00 2.67906699019381e-01 +-6.30000000000000e+01 -3.99577674034013e-01 9.92049303447725e-01 2.55430115394417e-01 +-6.00000000000000e+01 -4.37806214260738e-01 9.37729747481855e-01 2.42953527363207e-01 +-5.70000000000000e+01 -4.66095180812632e-01 8.72037018635503e-01 2.29962886841547e-01 +-5.40000000000000e+01 -4.94386088868899e-01 8.06344038861353e-01 2.16972196699283e-01 +-5.10000000000000e+01 -5.22678692887195e-01 7.40650557227788e-01 2.03981407315058e-01 +-4.80000000000000e+01 -5.44252972972638e-01 6.72494123749236e-01 1.91507677333331e-01 +-4.50000000000000e+01 -5.62469809216957e-01 6.03106253931314e-01 1.79292468742977e-01 +-4.20000000000000e+01 -5.80700032781224e-01 5.33717588985239e-01 1.67077120176337e-01 +-3.90000000000000e+01 -5.97024764718039e-01 4.65807407987464e-01 1.55320402968213e-01 +-3.60000000000000e+01 -6.09536960661095e-01 4.00852878339035e-01 1.44480717872626e-01 +-3.30000000000000e+01 -6.22060657674661e-01 3.35899589207050e-01 1.33641239795822e-01 +-3.00000000000000e+01 -6.34589785519217e-01 2.70917595996388e-01 1.22801551597028e-01 +-2.93939393939394e+01 -6.39157128083239e-01 2.60249253715867e-01 1.20443684761723e-01 +-2.87878787878788e+01 -6.43726970234920e-01 2.49581068160403e-01 1.18056074979326e-01 +-2.81818181818182e+01 -6.48299337915072e-01 2.38913030435958e-01 1.15668753051161e-01 +-2.75757575757576e+01 -6.52871145565939e-01 2.28244918383301e-01 1.13281631608806e-01 +-2.69696969696970e+01 -6.57443601591947e-01 2.17576846610789e-01 1.10894703470960e-01 +-2.63636363636364e+01 -6.62017925284925e-01 2.06908899722581e-01 1.08507963151374e-01 +-2.57575757575758e+01 -6.66590638057245e-01 1.96241193383532e-01 1.06121395705389e-01 +-2.51515151515151e+01 -6.71159355283587e-01 1.85573782554301e-01 1.03734968840955e-01 +-2.45454545454545e+01 -6.75728973211485e-01 1.74906478164995e-01 1.01348641226412e-01 +-2.39393939393939e+01 -6.80298045453838e-01 1.64239274881544e-01 9.89623846880801e-02 +-2.33333333333333e+01 -6.84854798199331e-01 1.53572167720432e-01 9.65760871231664e-02 +-2.27272727272727e+01 -6.89411636551734e-01 1.42905152020367e-01 9.41898138397285e-02 +-2.21212121212121e+01 -6.93968554262710e-01 1.32238223416651e-01 9.18035530549137e-02 +-2.15151515151515e+01 -6.98508709947078e-01 1.21571133361270e-01 8.94170767131999e-02 +-2.09090909090909e+01 -7.03044892648499e-01 1.10904061345980e-01 8.70305146317220e-02 +-2.03030303030303e+01 -7.07581304739425e-01 1.00237064894968e-01 8.46439121010197e-02 +-1.96969696969697e+01 -7.02434146497075e-01 9.30822479646328e-02 8.04176563008526e-02 +-1.90909090909091e+01 -6.87605029081401e-01 8.94394535867222e-02 7.43518989818734e-02 +-1.84848484848485e+01 -6.72778074386064e-01 8.57969669339951e-02 6.82864549586822e-02 +-1.78787878787879e+01 -6.57952316652420e-01 8.21546025938098e-02 6.22210099648385e-02 +-1.72727272727273e+01 -6.43126950262024e-01 7.85122065549102e-02 5.61553003431422e-02 +-1.66666666666667e+01 -6.28302519055304e-01 7.48699483442050e-02 5.00895983301152e-02 +-1.60606060606061e+01 -6.13478902955351e-01 7.12278305909537e-02 4.40238940514546e-02 +-1.54545454545455e+01 -5.98656762623450e-01 6.75860437894719e-02 3.79584834371826e-02 +-1.48484848484848e+01 -5.83835116087009e-01 6.39443715968832e-02 3.18929726477928e-02 +-1.42424242424242e+01 -5.69013374770912e-01 6.03026916613097e-02 2.58271029097552e-02 +-1.36363636363636e+01 -5.54192788419233e-01 5.66613031319075e-02 1.97612536677373e-02 +-1.30303030303030e+01 -5.39371304159858e-01 5.30198014190618e-02 1.36946491482892e-02 +-1.24242424242424e+01 -5.24551543111039e-01 4.93787366739739e-02 7.62887531626830e-03 +-1.18181818181818e+01 -5.09730889357631e-01 4.57375886003972e-02 1.56582884204670e-03 +-1.12121212121212e+01 -4.94911816881562e-01 4.20969074071858e-02 -4.49615178689840e-03 +-1.06060606060606e+01 -4.80091928606605e-01 3.84561282662129e-02 -1.05578228942103e-02 +-1.00000000000000e+01 -4.65272615271009e-01 3.48157175645994e-02 -1.66180951849822e-02 +-9.39393939393939e+00 -4.33015231009942e-01 3.42187656030196e-02 -1.65076215545108e-02 +-8.78787878787879e+00 -4.00776603293592e-01 3.36221501328585e-02 -1.63940097647302e-02 +-8.18181818181818e+00 -3.68550425214672e-01 3.30196417584014e-02 -1.62766322067477e-02 +-7.57575757575758e+00 -3.36434279469676e-01 3.26768333428082e-02 -1.61640703650675e-02 +-6.96969696969697e+00 -3.04375048369348e-01 3.24942948584592e-02 -1.60544597500587e-02 +-6.36363636363636e+00 -2.72349727408693e-01 3.22072522033381e-02 -1.59243774119394e-02 +-5.75757575757576e+00 -2.40358355463915e-01 3.18276476040425e-02 -1.56691283801087e-02 +-5.15151515151515e+00 -2.08432296047144e-01 3.13466648471733e-02 -1.56292523082999e-02 +-4.54545454545454e+00 -1.76609965524745e-01 3.08120593078346e-02 -1.55984117030112e-02 +-3.93939393939394e+00 -1.44997595632154e-01 3.02529210905892e-02 -1.55594122431336e-02 +-3.33333333333333e+00 -1.13863635347939e-01 2.96208324027153e-02 -1.55210128993654e-02 +-2.72727272727273e+00 -5.99893192871201e-02 2.93065185564550e-02 -1.71363467068633e-02 +-2.12121212121212e+00 2.27564888093693e-02 2.93538954238316e-02 -1.97749354532020e-02 +-1.51515151515152e+00 1.05200007924397e-01 2.93787983393214e-02 -2.18495371988307e-02 +-9.09090909090912e-01 1.87443112873824e-01 2.94162855389729e-02 -2.40114002927046e-02 +-3.03030303030302e-01 2.69492451080518e-01 2.95149670076408e-02 -2.60738132222027e-02 + 3.03030303030302e-01 3.51341217387514e-01 2.95252389442168e-02 -2.81360338847481e-02 + 9.09090909090912e-01 4.32977146923541e-01 2.95324300033464e-02 -3.02799067329311e-02 + 1.51515151515152e+00 5.14818629228781e-01 2.95320187044063e-02 -3.23663227732926e-02 + 2.12121212121212e+00 5.95875970346463e-01 2.96220237683965e-02 -3.47191596720360e-02 + 2.72727272727273e+00 6.76364098276864e-01 2.96076377124260e-02 -3.73109856941127e-02 + 3.33333333333333e+00 7.56846420931681e-01 2.95894663968510e-02 -3.99780779670709e-02 + 3.93939393939394e+00 8.37335412739111e-01 2.96601655289752e-02 -4.26453918217197e-02 + 4.54545454545455e+00 9.17819291031016e-01 2.96450963882609e-02 -4.52128978330237e-02 + 5.15151515151515e+00 9.98308476294268e-01 2.96479816058189e-02 -4.78802193292873e-02 + 5.75757575757576e+00 1.07878507397145e+00 2.96910810658735e-02 -5.05480539440911e-02 + 6.36363636363637e+00 1.15925721789623e+00 2.96540309894699e-02 -5.31448705442736e-02 + 6.96969696969697e+00 1.23972406223336e+00 2.97108111966689e-02 -5.57870430345416e-02 + 7.57575757575757e+00 1.31979653762893e+00 2.96607700932776e-02 -5.85770647543249e-02 + 8.18181818181818e+00 1.39574347837112e+00 2.96344899473148e-02 -6.23210696280249e-02 + 8.78787878787879e+00 1.46845278922940e+00 2.96855555923576e-02 -6.63193015468805e-02 + 9.39393939393939e+00 1.54113668312882e+00 2.96488360635837e-02 -7.03198982848751e-02 + 1.00000000000000e+01 1.61380661140144e+00 2.95365970912785e-02 -7.43207867311127e-02 + 1.06060606060606e+01 1.66835969927735e+00 2.93338363207452e-02 -7.80346111337379e-02 + 1.12121212121212e+01 1.70692741182872e+00 2.93798828283306e-02 -8.05927498314898e-02 + 1.18181818181818e+01 1.74587632218544e+00 3.01307604443737e-02 -8.45839669704818e-02 + 1.24242424242424e+01 1.09782720012007e+00 3.33105797425031e-02 -6.18259975113200e-02 + 1.30303030303030e+01 9.73402814155888e-01 3.56492113840093e-02 -5.87718757586572e-02 + 1.36363636363636e+01 9.88485823361229e-01 3.73441347002030e-02 -6.12633502425757e-02 + 1.42424242424242e+01 1.01090647828627e+00 3.86537299612605e-02 -6.40712596029900e-02 + 1.48484848484848e+01 1.04282842508625e+00 3.96717899749230e-02 -6.69529521512987e-02 + 1.54545454545455e+01 1.08269042899909e+00 4.02778502988878e-02 -7.00292393429914e-02 + 1.60606060606061e+01 1.12069441651250e+00 4.15211136336744e-02 -7.34124817337401e-02 + 1.66666666666667e+01 1.10428631804948e+00 4.97349677981258e-02 -7.89834353690655e-02 + 1.72727272727273e+01 1.08784286827117e+00 5.79481890360755e-02 -8.45666402360810e-02 + 1.78787878787879e+01 1.07137007227413e+00 6.61606214571691e-02 -9.01640784321922e-02 + 1.84848484848485e+01 1.05482456124854e+00 7.43726955221486e-02 -9.57806291561119e-02 + 1.90909090909091e+01 1.03840773749638e+00 8.25847845613570e-02 -1.01399088671180e-01 + 1.96969696969697e+01 1.02224607479530e+00 9.07973366722597e-02 -1.07003526290174e-01 + 2.03030303030303e+01 1.01092702064250e+00 1.00237064894968e-01 -1.11264195300182e-01 + 2.09090909090909e+01 1.00444584016781e+00 1.10904061345980e-01 -1.14182224296970e-01 + 2.15151515151515e+01 9.97964986040765e-01 1.21571133361270e-01 -1.17102244903151e-01 + 2.21212121212121e+01 9.91478442890709e-01 1.32238223416651e-01 -1.20024488822164e-01 + 2.27272727272727e+01 9.84967906725073e-01 1.42905152020367e-01 -1.22949596706990e-01 + 2.33333333333333e+01 9.78457485279851e-01 1.53572167720432e-01 -1.25875923784615e-01 + 2.39393939393939e+01 9.71947187592677e-01 1.64239274881544e-01 -1.28803443608322e-01 + 2.45454545454545e+01 9.65419250819274e-01 1.74906478164995e-01 -1.31732713112496e-01 + 2.51515151515151e+01 9.58890536835396e-01 1.85573782554301e-01 -1.34663003015135e-01 + 2.57575757575758e+01 9.52363117111773e-01 1.96241193383532e-01 -1.37594239679627e-01 + 2.63636363636364e+01 9.45829985373321e-01 2.06908899722581e-01 -1.40526626180439e-01 + 2.69696969696970e+01 9.39294556254110e-01 2.17576846610789e-01 -1.43460023904971e-01 + 2.75757575757576e+01 9.32761808370637e-01 2.28244918383301e-01 -1.46394293444329e-01 + 2.81818181818182e+01 9.26229995246710e-01 2.38913030435957e-01 -1.49329450107358e-01 + 2.87878787878788e+01 9.19697387107103e-01 2.49581068160403e-01 -1.52265482124334e-01 + 2.93939393939394e+01 9.13168404913080e-01 2.60249253715867e-01 -1.55202396247522e-01 + 3.00000000000000e+01 9.06643011580764e-01 2.70917595996388e-01 -1.58140217032240e-01 + 3.30000000000000e+01 8.88688675426252e-01 3.35899589207050e-01 -1.69129145388514e-01 + 3.60000000000000e+01 8.70742215903117e-01 4.00852878339035e-01 -1.79949350188385e-01 + 3.90000000000000e+01 8.52812326157355e-01 4.65807407987464e-01 -1.90730956251902e-01 + 4.20000000000000e+01 8.29505265359302e-01 5.33717588985240e-01 -2.01309118189523e-01 + 4.50000000000000e+01 8.03510457214686e-01 6.03106253931314e-01 -2.11785658405499e-01 + 4.80000000000000e+01 7.77534592624486e-01 6.72494123749237e-01 -2.22262078570281e-01 + 5.10000000000000e+01 7.46744805516537e-01 7.40650557227789e-01 -2.32656858855358e-01 + 5.40000000000000e+01 7.06322608215230e-01 8.06344038861353e-01 -2.42888354132579e-01 + 5.70000000000000e+01 6.65902819356557e-01 8.72037018635503e-01 -2.53119771247217e-01 + 6.00000000000000e+01 6.25485786688918e-01 9.37729747481856e-01 -2.63351149280861e-01 + 6.30000000000000e+01 5.70855611235508e-01 9.92049303447725e-01 -2.72828203817710e-01 + 6.60000000000000e+01 5.16226204482826e-01 1.04636876192745e+00 -2.82305251888810e-01 + 6.90000000000000e+01 4.61598036952559e-01 1.10068822040718e+00 -2.91782299959910e-01 + 7.20000000000000e+01 4.00255485500037e-01 1.14318541410298e+00 -3.00336786931006e-01 + 7.50000000000000e+01 3.35555531395701e-01 1.17977171742431e+00 -3.08430012238153e-01 + 7.80000000000000e+01 2.70855228914286e-01 1.21635843999553e+00 -3.16523330287215e-01 + 8.10000000000000e+01 2.04949941366059e-01 1.24567445997852e+00 -3.23905764836268e-01 + 8.40000000000000e+01 1.36633587012766e-01 1.26044957666313e+00 -3.29866481455659e-01 + 8.70000000000000e+01 6.83167107824974e-02 1.27522480622146e+00 -3.35775778267908e-01 + 9.00000000000000e+01 -2.98356743449189e-07 1.28999990778373e+00 -3.41568552350958e-01 + 9.30000000000000e+01 -4.78037454869307e-02 1.27522479109913e+00 -3.42550600496776e-01 + 9.60000000000000e+01 -9.56073752226678e-02 1.26044961797812e+00 -3.43313207813819e-01 + 9.90000000000000e+01 -1.43411370176115e-01 1.24567433198225e+00 -3.44075820956797e-01 + 1.02000000000000e+02 -1.89552426493172e-01 1.21635826279871e+00 -3.42018024992642e-01 + 1.05000000000000e+02 -2.34862463623927e-01 1.17977195947738e+00 -3.38550055015947e-01 + 1.08000000000000e+02 -2.80173308571465e-01 1.14318523690795e+00 -3.35082045299249e-01 + 1.11000000000000e+02 -3.23122662358267e-01 1.10068774984251e+00 -3.30613204224884e-01 + 1.14000000000000e+02 -3.61349504390742e-01 1.04636891381409e+00 -3.24142730917994e-01 + 1.17000000000000e+02 -3.99577421117098e-01 9.92049662822417e-01 -3.17672208180576e-01 + 1.20000000000000e+02 -4.37806027109449e-01 9.37730182101508e-01 -3.11201658314193e-01 + 1.23000000000000e+02 -4.66094993647798e-01 8.72037453255156e-01 -3.03497229746074e-01 + 1.26000000000000e+02 -4.94385901691070e-01 8.06344473485986e-01 -2.95792771749784e-01 + 1.29000000000000e+02 -5.22678505700545e-01 7.40650991852421e-01 -2.88088254894948e-01 + 1.32000000000000e+02 -5.44255597967036e-01 6.72494052728240e-01 -2.81200220471366e-01 + 1.35000000000000e+02 -5.62478076348152e-01 6.03105387787129e-01 -2.74720426295997e-01 + 1.38000000000000e+02 -5.80704075775906e-01 5.33717517969206e-01 -2.68240706372448e-01 + 1.41000000000000e+02 -5.97025743089158e-01 4.65807465559123e-01 -2.63448804520033e-01 + 1.44000000000000e+02 -6.09539332292595e-01 4.00853059956420e-01 -2.62032552505631e-01 + 1.47000000000000e+02 -6.22060969336252e-01 3.35899150571673e-01 -2.60616311310659e-01 + 1.50000000000000e+02 -6.34589659449874e-01 2.70917973756332e-01 -2.59200075525210e-01 + 1.53000000000000e+02 -6.57149315796707e-01 2.18110193131311e-01 -2.73103661656341e-01 + 1.56000000000000e+02 -6.79726083437648e-01 1.65305735070101e-01 -2.87007230377031e-01 + 1.59000000000000e+02 -7.02316612456853e-01 1.12504063201209e-01 -3.00910692883565e-01 + 1.62000000000000e+02 -6.66331535360941e-01 7.80396220376046e-02 -3.44436173003965e-01 + 1.65000000000000e+02 -6.02756791375368e-01 5.27443629674667e-02 -4.02772912450035e-01 + 1.68000000000000e+02 -5.36848745324298e-01 2.74506298830325e-02 -4.61108983413823e-01 + 1.71000000000000e+02 -4.43494166290477e-01 1.05740045222718e-02 -4.50000513056908e-01 + 1.74000000000000e+02 -2.95662162415483e-01 1.05303966409131e-02 -2.99999717902353e-01 + 1.77000000000000e+02 -1.47157007613739e-01 1.04872308588687e-02 -1.49315896260807e-01 + 1.80000000000000e+02 0.00000000000000e+00 1.04451467064788e-02 0.00000000000000e+00 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_07.dat b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_07.dat new file mode 100644 index 000000000..d854bfa0a --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_07.dat @@ -0,0 +1,254 @@ +! ------------ AirfoilInfo v1.01.x Input File ---------------------------------- +! AeroElasticSE FAST driver +! line +! line +! ------------------------------------------------------------------------------ +DEFAULT InterpOrd ! Interpolation order to use for quasi-steady table lookup {1=linear; 3=cubic spline; "default"} [default=3] +1 NonDimArea ! The non-dimensional area of the airfoil (area/chord^2) (set to 1.0 if unsure or unneeded) +@"NREL-2p8-127_AF07_Coords.txt" NumCoords ! The number of coordinates in the airfoil shape file. Set to zero if coordinates not included. +AF07_BL.txt BL_file ! The file name including the boundary layer characteristics of the profile. Ignored if the aeroacoustic module is not called. +1 NumTabs ! Number of airfoil tables in this file. Each table must have lines for Re and Ctrl. +! ------------------------------------------------------------------------------ +! data for table 1 +! ------------------------------------------------------------------------------ +6.000000 Re ! Reynolds number in millions +0 Ctrl ! Control setting (must be 0 for current AirfoilInfo) +True InclUAdata ! Is unsteady aerodynamics data included in this table? If TRUE, then include 30 UA coefficients below this line +!........................................ +-2.175483 alpha0 ! 0-lift angle of attack, depends on airfoil. +12.034907 alpha1 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA>alpha0. (deg) +-4.017330 alpha2 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA1] +0.000000 S2 ! Constant in the f curve best-fit for AOA> alpha1; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S3 ! Constant in the f curve best-fit for alpha2<=AOA< alpha0; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S4 ! Constant in the f curve best-fit for AOA< alpha2; by definition it depends on the airfoil. [ignored if UAMod<>1] +1.598379 Cn1 ! Critical value of C0n at leading edge separation. It should be extracted from airfoil data at a given Mach and Reynolds number. It can be calculated from the static value of Cn at either the break in the pitching moment or the loss of chord force at the onset of stall. It is close to the condition of maximum lift of the airfoil at low Mach numbers. +-0.740046 Cn2 ! As Cn1 for negative AOAs. +Default St_sh ! Strouhal's shedding frequency constant. [default = 0.19] +0.019639 Cd0 ! 2D drag coefficient value at 0-lift. +-0.026025 Cm0 ! 2D pitching moment coefficient about 1/4-chord location, at 0-lift, positive if nose up. [If the aerodynamics coefficients table does not include a column for Cm, this needs to be set to 0.0] +0.000000 k0 ! Constant in the \hat(x)_cp curve best-fit; = (\hat(x)_AC-0.25). [ignored if UAMod<>1] +0.000000 k1 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k2 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k3 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k1_hat ! Constant in the expression of Cc due to leading edge vortex effects. [ignored if UAMod<>1] +Default x_cp_bar ! Constant in the expression of \hat(x)_cp^v. [ignored if UAMod<>1, default = 0.2] +Default UACutout ! Angle of attack above which unsteady aerodynamics are disabled (deg). [Specifying the string "Default" sets UACutout to 45 degrees] +Default filtCutOff ! Cut-off frequency (-3 dB corner frequency) for low-pass filtering the AoA input to UA, as well as the 1st and 2nd derivatives (Hz) [default = 20] +!........................................ +! Table of aerodynamics coefficients +200 NumAlf ! Number of data lines in the following table +! Alpha Cl Cd Cm +! (deg) (-) (-) (-) +-1.80000000000000e+02 0.00000000000000e+00 2.33914127688100e-02 0.00000000000000e+00 +-1.77000000000000e+02 1.43031527763221e-01 2.33914127688100e-02 1.19163615697548e-01 +-1.74000000000000e+02 2.87990892106934e-01 2.66846196171584e-02 2.39999774321882e-01 +-1.71000000000000e+02 4.31987088278764e-01 3.65643482753360e-02 3.60000410445527e-01 +-1.68000000000000e+02 5.31545849874829e-01 5.84098652013656e-02 3.64532897060852e-01 +-1.65000000000000e+02 6.11268538666348e-01 8.62381366029380e-02 3.11332656605488e-01 +-1.62000000000000e+02 6.94600133989169e-01 1.14066726893083e-01 2.58131725599959e-01 +-1.59000000000000e+02 7.40824462046985e-01 1.50632267952715e-01 2.21242462675373e-01 +-1.56000000000000e+02 7.16139659509821e-01 2.04671414989218e-01 2.16831447428975e-01 +-1.53000000000000e+02 6.91423868529968e-01 2.58710851852227e-01 2.12177598920349e-01 +-1.50000000000000e+02 6.66670110194854e-01 3.12750462408367e-01 2.07242736249593e-01 +-1.47000000000000e+02 6.52900940317335e-01 3.79139090101126e-01 2.11698220689362e-01 +-1.44000000000000e+02 6.39116027015019e-01 4.45527909875772e-01 2.16157774411608e-01 +-1.41000000000000e+02 6.25312980734950e-01 5.11917113827909e-01 2.20622202461720e-01 +-1.38000000000000e+02 6.07728072005134e-01 5.81216719268110e-01 2.27857968655088e-01 +-1.35000000000000e+02 5.88252908821619e-01 6.51971519548278e-01 2.36476173369762e-01 +-1.32000000000000e+02 5.68769160282536e-01 7.22726946114877e-01 2.45092460374068e-01 +-1.29000000000000e+02 5.45846532434262e-01 7.92131150298341e-01 2.54083304617287e-01 +-1.26000000000000e+02 5.16059865398949e-01 8.58832903295187e-01 2.63823977750305e-01 +-1.23000000000000e+02 4.86270063393777e-01 9.25534146724964e-01 2.73560128804467e-01 +-1.20000000000000e+02 4.56476301826173e-01 9.92235135380730e-01 2.83291214803044e-01 +-1.17000000000000e+02 4.16489600596796e-01 1.04694876887339e+00 2.91917422175410e-01 +-1.14000000000000e+02 3.76501801901982e-01 1.10166216993032e+00 3.00538465312235e-01 +-1.11000000000000e+02 3.36512597958186e-01 1.15637515301294e+00 3.09153340377474e-01 +-1.08000000000000e+02 2.91693025082505e-01 1.19874087754264e+00 3.15840388222425e-01 +-1.05000000000000e+02 2.44458666678294e-01 1.23493287877690e+00 3.21561919471006e-01 +-1.02000000000000e+02 1.97224219276773e-01 1.27112446528618e+00 3.27278150969725e-01 +-9.90000000000000e+01 1.49160540417765e-01 1.29974121708087e+00 3.31577776566796e-01 +-9.60000000000000e+01 9.94402497296759e-02 1.31320797134044e+00 3.33053601420033e-01 +-9.30000000000000e+01 4.97202158283082e-02 1.32667462272159e+00 3.34536430978363e-01 +-9.00000000000000e+01 3.10317978578370e-07 1.34014122266447e+00 3.35516468539213e-01 +-8.70000000000000e+01 -4.97201649399637e-02 1.32667463650466e+00 3.30914309585675e-01 +-8.40000000000000e+01 -9.94403887586856e-02 1.31320793368439e+00 3.25875044063013e-01 +-8.10000000000000e+01 -1.49160109697721e-01 1.29974133374151e+00 3.20684674998472e-01 +-7.80000000000000e+01 -1.97223990505980e-01 1.27112464057129e+00 3.14068969100332e-01 +-7.50000000000000e+01 -2.44458979176423e-01 1.23493263933526e+00 3.06188477394521e-01 +-7.20000000000000e+01 -2.91692796320390e-01 1.19874105282597e+00 2.98307891491871e-01 +-6.90000000000000e+01 -3.36512251521935e-01 1.15637562699211e+00 2.89561021929827e-01 +-6.60000000000000e+01 -3.76501913717355e-01 1.10166201694156e+00 2.79081514110173e-01 +-6.30000000000000e+01 -4.16489865150498e-01 1.04694840689101e+00 2.68601883289040e-01 +-6.00000000000000e+01 -4.56476498955521e-01 9.92234694090483e-01 2.58122183245595e-01 +-5.70000000000000e+01 -4.86270260493495e-01 9.25533705434717e-01 2.46741658278199e-01 +-5.40000000000000e+01 -5.16060062475956e-01 8.58832461999884e-01 2.35361028339939e-01 +-5.10000000000000e+01 -5.45846729491953e-01 7.92130709003037e-01 2.23980188458352e-01 +-4.80000000000000e+01 -5.69289853059557e-01 7.22744238735752e-01 2.13008982600553e-01 +-4.50000000000000e+01 -5.89557703094231e-01 6.52015452980456e-01 2.02242587171249e-01 +-4.20000000000000e+01 -6.08251798068365e-01 5.81234011749336e-01 1.91868319013648e-01 +-3.90000000000000e+01 -6.25416926876934e-01 5.11597466281429e-01 1.81968105360702e-01 +-3.60000000000000e+01 -6.39316913259601e-01 4.44496914459934e-01 1.73264272171102e-01 +-3.30000000000000e+01 -6.52916432542900e-01 3.78198211323207e-01 1.65338571395536e-01 +-3.00000000000000e+01 -6.66670235178609e-01 3.12750067745499e-01 1.58271579799568e-01 +-2.93939393939394e+01 -6.71047367933391e-01 3.01438712775986e-01 1.57020885663939e-01 +-2.87878787878788e+01 -6.75419095195018e-01 2.90127357806473e-01 1.55835649782268e-01 +-2.81818181818182e+01 -6.79785363067838e-01 2.78816002836960e-01 1.54649678410992e-01 +-2.75757575757576e+01 -6.84281237628547e-01 2.67629852848922e-01 1.53624988893004e-01 +-2.69696969696970e+01 -6.88830733728478e-01 2.56497366741980e-01 1.52669124180276e-01 +-2.63636363636364e+01 -6.93376184149147e-01 2.45364880635039e-01 1.51712730581928e-01 +-2.57575757575758e+01 -6.98037897852729e-01 2.34311621831173e-01 1.50875935757439e-01 +-2.51515151515151e+01 -7.02877385944567e-01 2.23377185516994e-01 1.50218827286969e-01 +-2.45454545454545e+01 -7.07714903614937e-01 2.12442749202814e-01 1.49561371313348e-01 +-2.39393939393939e+01 -7.12595164217054e-01 2.01529837369162e-01 1.48943431555047e-01 +-2.33333333333333e+01 -7.17876308107891e-01 1.90810650027497e-01 1.48683703309005e-01 +-2.27272727272727e+01 -7.23157231061198e-01 1.80091462685832e-01 1.48423779056222e-01 +-2.21212121212121e+01 -7.28437947560357e-01 1.69372275344166e-01 1.48163680826540e-01 +-2.15151515151515e+01 -7.31713351978921e-01 1.58838231776999e-01 1.48337985994225e-01 +-2.09090909090909e+01 -7.34245840474427e-01 1.48350486062725e-01 1.48620871862006e-01 +-2.03030303030303e+01 -7.38065551990425e-01 1.37862740348452e-01 1.48903686939429e-01 +-1.96969696969697e+01 -7.32808819200495e-01 1.29918930302428e-01 1.44712603991306e-01 +-1.90909090909091e+01 -7.18361958000880e-01 1.24518912013222e-01 1.36047824693694e-01 +-1.84848484848485e+01 -7.04189587691779e-01 1.19119156714805e-01 1.27383320623159e-01 +-1.78787878787879e+01 -6.90170520790039e-01 1.13719385941933e-01 1.18718587275407e-01 +-1.72727272727273e+01 -6.76245095637824e-01 1.08319367652727e-01 1.10053115983160e-01 +-1.66666666666667e+01 -6.62381424994436e-01 1.02255720988610e-01 1.01387526517949e-01 +-1.60606060606061e+01 -6.48560316531438e-01 9.61448175238969e-02 9.27217646524863e-02 +-1.54545454545455e+01 -6.34969522120538e-01 9.03872009230254e-02 8.40561496211227e-02 +-1.48484848484848e+01 -6.21508539218862e-01 8.48230957038706e-02 7.53901059090511e-02 +-1.42424242424242e+01 -6.08408366025162e-01 7.96630711027307e-02 6.67232674713552e-02 +-1.36363636363636e+01 -5.95447218953895e-01 7.45632229779760e-02 5.80562179472338e-02 +-1.30303030303030e+01 -5.82646323386179e-01 6.95101444417735e-02 4.93879760859292e-02 +-1.24242424242424e+01 -5.70051253619176e-01 6.44104289730139e-02 4.07195611654372e-02 +-1.18181818181818e+01 -5.57661981483822e-01 5.92219660335435e-02 3.20496569255294e-02 +-1.12121212121212e+01 -5.45521148334811e-01 5.38126013913541e-02 2.33792067297271e-02 +-1.06060606060606e+01 -5.33770601268997e-01 4.82803386350898e-02 1.47062382307926e-02 +-1.00000000000000e+01 -5.22536282520595e-01 4.27091715581483e-02 6.03175191196416e-03 +-9.39393939393939e+00 -4.98663010113629e-01 3.97762979408636e-02 1.46216346791845e-03 +-8.78787878787879e+00 -4.74896579071385e-01 3.69498939396144e-02 -3.11443204072278e-03 +-8.18181818181818e+00 -4.50184735644143e-01 3.36609587046423e-02 -7.71668568938825e-03 +-7.57575757575758e+00 -4.16320862490726e-01 3.11984229016655e-02 -1.02342715344042e-02 +-6.96969696969697e+00 -3.78533908672691e-01 2.88846280067247e-02 -1.18586821223915e-02 +-6.36363636363636e+00 -3.41308425879108e-01 2.66987274834274e-02 -1.37039177713602e-02 +-5.75757575757576e+00 -3.03292128777548e-01 2.47793566352644e-02 -1.57278639083592e-02 +-5.15151515151515e+00 -2.63917787982752e-01 2.33543465327187e-02 -1.65422055989149e-02 +-4.54545454545454e+00 -2.22824817551322e-01 2.20950859887883e-02 -1.76054229676369e-02 +-3.93939393939394e+00 -1.80668798888092e-01 2.09756580073103e-02 -1.88443435684976e-02 +-3.33333333333333e+00 -1.34176568044395e-01 2.04804489661257e-02 -2.02207166542285e-02 +-2.72727272727273e+00 -7.19453798936780e-02 2.00079017312406e-02 -2.28911294526880e-02 +-2.12121212121212e+00 7.07606911784324e-03 1.96027557312253e-02 -2.63328024672574e-02 +-1.51515151515152e+00 8.73289871843104e-02 1.94248148430849e-02 -2.91753660865235e-02 +-9.09090909090912e-01 1.68214610603894e-01 1.93209749444206e-02 -3.21126237712362e-02 +-3.03030303030302e-01 2.49847575674565e-01 1.93085263731067e-02 -3.50069460021776e-02 + 3.03030303030302e-01 3.32076661864978e-01 1.92708245709109e-02 -3.78355127682451e-02 + 9.09090909090912e-01 4.14967913083368e-01 1.92564396323649e-02 -4.06506905185218e-02 + 1.51515151515152e+00 4.97503403994561e-01 1.93240509371219e-02 -4.34545183162005e-02 + 2.12121212121212e+00 5.78017026165593e-01 1.94699699516029e-02 -4.63887820732702e-02 + 2.72727272727273e+00 6.57982538458257e-01 1.95636992876711e-02 -4.91776418225647e-02 + 3.33333333333333e+00 7.37634840577441e-01 1.96859030314327e-02 -5.19181781483109e-02 + 3.93939393939394e+00 8.17042150325575e-01 1.99153209631174e-02 -5.45755311911616e-02 + 4.54545454545455e+00 8.95773550489732e-01 2.01574613792028e-02 -5.71758300930519e-02 + 5.15151515151515e+00 9.74202606524190e-01 2.04147221937826e-02 -5.98020954890244e-02 + 5.75757575757576e+00 1.05192610299832e+00 2.06935862917398e-02 -6.22831373010045e-02 + 6.36363636363637e+00 1.12864853703975e+00 2.09894711710230e-02 -6.45992855497388e-02 + 6.96969696969697e+00 1.20469677736454e+00 2.13767147820252e-02 -6.68719079346452e-02 + 7.57575757575757e+00 1.27852391355893e+00 2.18254003510820e-02 -6.92881289021872e-02 + 8.18181818181818e+00 1.34843619913274e+00 2.23379405478464e-02 -7.23998694538348e-02 + 8.78787878787879e+00 1.41389258501910e+00 2.29917029483263e-02 -7.57224146801624e-02 + 9.39393939393939e+00 1.47693105199554e+00 2.42669452043504e-02 -7.90940633281295e-02 + 1.00000000000000e+01 1.53866152751405e+00 2.58158538548453e-02 -8.24968128995006e-02 + 1.06060606060606e+01 1.58175634209111e+00 2.78715872133015e-02 -8.63366627353863e-02 + 1.12121212121212e+01 1.60853428444793e+00 2.99227788852005e-02 -9.25178530036142e-02 + 1.18181818181818e+01 1.62618116680780e+00 3.25599114107023e-02 -9.61254605123986e-02 + 1.24242424242424e+01 1.17081115183266e+00 3.76946916781032e-02 -7.96133950050748e-02 + 1.30303030303030e+01 1.07057266006274e+00 4.25731273306023e-02 -7.63714447703372e-02 + 1.36363636363636e+01 1.07323785139661e+00 4.76558461605604e-02 -7.83786809582152e-02 + 1.42424242424242e+01 1.08209790208772e+00 5.26403136632421e-02 -8.07401047567165e-02 + 1.48484848484848e+01 1.10354986974947e+00 5.77455347083801e-02 -8.32982121847380e-02 + 1.54545454545455e+01 1.13090095347719e+00 6.28922160620656e-02 -8.70718045668990e-02 + 1.60606060606061e+01 1.15290331847775e+00 6.85681445746570e-02 -9.13408073485258e-02 + 1.66666666666667e+01 1.13888783926795e+00 7.88844991137046e-02 -9.76066740175176e-02 + 1.72727272727273e+01 1.12569869109310e+00 8.91882738787458e-02 -1.03672038183508e-01 + 1.78787878787879e+01 1.11348996181680e+00 9.94766732049302e-02 -1.09493916588364e-01 + 1.84848484848485e+01 1.10412272552069e+00 1.09722110128521e-01 -1.14392819645911e-01 + 1.90909090909091e+01 1.09417618957362e+00 1.19712328172831e-01 -1.19171119055800e-01 + 1.96969696969697e+01 1.07815671838533e+00 1.28316705476137e-01 -1.24569996191147e-01 + 2.03030303030303e+01 1.06590918336347e+00 1.37862740348452e-01 -1.28927442015208e-01 + 2.09090909090909e+01 1.05744457824252e+00 1.48350486062725e-01 -1.32240940695518e-01 + 2.15151515151515e+01 1.04897922606013e+00 1.58838231776999e-01 -1.35550005581577e-01 + 2.21212121212121e+01 1.04069744082963e+00 1.69372275344167e-01 -1.38809930873424e-01 + 2.27272727272727e+01 1.03315254333471e+00 1.80091462685832e-01 -1.41886753748031e-01 + 2.33333333333333e+01 1.02560734768900e+00 1.90810650027497e-01 -1.44960808190677e-01 + 2.39393939393939e+01 1.01806183295191e+00 2.01529837369162e-01 -1.48032154260591e-01 + 2.45454545454545e+01 1.01108909354267e+00 2.12442749202814e-01 -1.50974394253646e-01 + 2.51515151515151e+01 1.00417741009351e+00 2.23377185516994e-01 -1.53900389859026e-01 + 2.57575757575758e+01 9.97262895226883e-01 2.34311621831173e-01 -1.56824213640932e-01 + 2.63636363636364e+01 9.90602272243490e-01 2.45364880635039e-01 -1.59691865247193e-01 + 2.69696969696970e+01 9.84107677556836e-01 2.56497366741980e-01 -1.62521495117230e-01 + 2.75757575757576e+01 9.77607274768511e-01 2.67629852848922e-01 -1.65349122555614e-01 + 2.81818181818182e+01 9.71183535418784e-01 2.78816002836960e-01 -1.68157082819057e-01 + 2.87878787878788e+01 9.64945123677017e-01 2.90127357806473e-01 -1.70921894375263e-01 + 2.93939393939394e+01 9.58698873686608e-01 3.01438712775986e-01 -1.73684689615452e-01 + 3.00000000000000e+01 9.52444862477794e-01 3.12750067745499e-01 -1.76445418513927e-01 + 3.30000000000000e+01 9.32757112804349e-01 3.78198211323207e-01 -1.87615870546037e-01 + 3.60000000000000e+01 9.13290569721045e-01 4.44496914459934e-01 -1.99008415557536e-01 + 3.90000000000000e+01 8.93393781094339e-01 5.11597466281430e-01 -2.09904410150492e-01 + 4.20000000000000e+01 8.68886648478033e-01 5.81234011749336e-01 -2.20659088173443e-01 + 4.50000000000000e+01 8.42222962046853e-01 6.52015452980456e-01 -2.31358509305899e-01 + 4.80000000000000e+01 8.13311107256429e-01 7.22744238735752e-01 -2.42008926938194e-01 + 5.10000000000000e+01 7.79848244960539e-01 7.92130709003037e-01 -2.52553412425687e-01 + 5.40000000000000e+01 7.37292615749320e-01 8.58832461999884e-01 -2.62871600790229e-01 + 5.70000000000000e+01 6.94732715144264e-01 9.25533705434717e-01 -2.73198801942233e-01 + 6.00000000000000e+01 6.52167283863280e-01 9.92234694090484e-01 -2.83534193702832e-01 + 6.30000000000000e+01 5.95021513422317e-01 1.04694840689101e+00 -2.92939646889504e-01 + 6.60000000000000e+01 5.37873671092777e-01 1.10166201694156e+00 -3.02353620386315e-01 + 6.90000000000000e+01 4.80723120327637e-01 1.15637562699211e+00 -3.11775458141060e-01 + 7.20000000000000e+01 4.16702853573743e-01 1.19874105282597e+00 -3.20152624301910e-01 + 7.50000000000000e+01 3.49248630212311e-01 1.23493263933526e+00 -3.28012827849872e-01 + 7.80000000000000e+01 2.81792775389929e-01 1.27112464057129e+00 -3.35882005640500e-01 + 8.10000000000000e+01 2.13139309353073e-01 1.29974133374152e+00 -3.42992209540911e-01 + 8.40000000000000e+01 1.42093279928522e-01 1.31320793368439e+00 -3.48577487448998e-01 + 8.70000000000000e+01 7.10465847027829e-02 1.32667463650466e+00 -3.54286237278487e-01 + 9.00000000000000e+01 -3.10317978790605e-07 1.34014122266447e+00 -3.60261329275921e-01 + 9.30000000000000e+01 -4.97202158283082e-02 1.32667462272159e+00 -3.60939509181810e-01 + 9.60000000000000e+01 -9.94402497296761e-02 1.31320797134044e+00 -3.62101276854683e-01 + 9.90000000000000e+01 -1.49160540417765e-01 1.29974121708087e+00 -3.63263116762426e-01 + 1.02000000000000e+02 -1.97224219276773e-01 1.27112446528618e+00 -3.61500175595017e-01 + 1.05000000000000e+02 -2.44458666678294e-01 1.23493287877690e+00 -3.58275028210518e-01 + 1.08000000000000e+02 -2.91693025082505e-01 1.19874087754264e+00 -3.55049870683841e-01 + 1.11000000000000e+02 -3.36512597958186e-01 1.15637515301294e+00 -3.50765979419127e-01 + 1.14000000000000e+02 -3.76501801901982e-01 1.10166216993032e+00 -3.44364638786946e-01 + 1.17000000000000e+02 -4.16489600596796e-01 1.04694876887339e+00 -3.37963575060275e-01 + 1.20000000000000e+02 -4.56476301826173e-01 9.92235135380730e-01 -3.31562852852576e-01 + 1.23000000000000e+02 -4.86270063393777e-01 9.25534146724963e-01 -3.23780752167797e-01 + 1.26000000000000e+02 -5.16059865398949e-01 8.58832903295187e-01 -3.15999386352538e-01 + 1.29000000000000e+02 -5.45846532434262e-01 7.92131150298340e-01 -3.08218654603481e-01 + 1.32000000000000e+02 -5.68769160282536e-01 7.22726946114877e-01 -3.01185530669448e-01 + 1.35000000000000e+02 -5.88252908821619e-01 6.51971519548278e-01 -2.94527284921154e-01 + 1.38000000000000e+02 -6.07728072005134e-01 5.81216719268109e-01 -2.87870702883092e-01 + 1.41000000000000e+02 -6.25312980734950e-01 5.11917113827908e-01 -2.82904694585223e-01 + 1.44000000000000e+02 -6.39116027015019e-01 4.45527909875772e-01 -2.81319615496767e-01 + 1.47000000000000e+02 -6.52900940317335e-01 3.79139090101126e-01 -2.79738043324018e-01 + 1.50000000000000e+02 -6.66670110194854e-01 3.12750462408366e-01 -2.78159839410523e-01 + 1.53000000000000e+02 -6.91423868529968e-01 2.58710851852227e-01 -2.92436611808699e-01 + 1.56000000000000e+02 -7.16139659509821e-01 2.04671414989218e-01 -3.06713727094434e-01 + 1.59000000000000e+02 -7.40824462046985e-01 1.50632267952715e-01 -3.20991093106481e-01 + 1.62000000000000e+02 -6.92523326346939e-01 1.14218878924218e-01 -3.60600316892406e-01 + 1.65000000000000e+02 -6.04090178045220e-01 8.66185179666223e-02 -4.12875574153840e-01 + 1.68000000000000e+02 -5.25703495579730e-01 5.90182887830723e-02 -4.65150066961505e-01 + 1.71000000000000e+02 -4.24060615670435e-01 3.72487259247374e-02 -4.50000513056908e-01 + 1.74000000000000e+02 -2.82706583196469e-01 2.71407679330614e-02 -2.99999717902353e-01 + 1.77000000000000e+02 -1.40374735896749e-01 2.36166297084173e-02 -1.48954519621935e-01 + 1.80000000000000e+02 0.00000000000000e+00 2.33914127688100e-02 0.00000000000000e+00 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_08.dat b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_08.dat new file mode 100644 index 000000000..d72fa6252 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_08.dat @@ -0,0 +1,254 @@ +! ------------ AirfoilInfo v1.01.x Input File ---------------------------------- +! AeroElasticSE FAST driver +! line +! line +! ------------------------------------------------------------------------------ +DEFAULT InterpOrd ! Interpolation order to use for quasi-steady table lookup {1=linear; 3=cubic spline; "default"} [default=3] +1 NonDimArea ! The non-dimensional area of the airfoil (area/chord^2) (set to 1.0 if unsure or unneeded) +@"NREL-2p8-127_AF08_Coords.txt" NumCoords ! The number of coordinates in the airfoil shape file. Set to zero if coordinates not included. +AF08_BL.txt BL_file ! The file name including the boundary layer characteristics of the profile. Ignored if the aeroacoustic module is not called. +1 NumTabs ! Number of airfoil tables in this file. Each table must have lines for Re and Ctrl. +! ------------------------------------------------------------------------------ +! data for table 1 +! ------------------------------------------------------------------------------ +6.000000 Re ! Reynolds number in millions +0 Ctrl ! Control setting (must be 0 for current AirfoilInfo) +True InclUAdata ! Is unsteady aerodynamics data included in this table? If TRUE, then include 30 UA coefficients below this line +!........................................ +-2.094045 alpha0 ! 0-lift angle of attack, depends on airfoil. +11.810318 alpha1 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA>alpha0. (deg) +-5.789318 alpha2 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA1] +0.000000 S2 ! Constant in the f curve best-fit for AOA> alpha1; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S3 ! Constant in the f curve best-fit for alpha2<=AOA< alpha0; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S4 ! Constant in the f curve best-fit for AOA< alpha2; by definition it depends on the airfoil. [ignored if UAMod<>1] +1.434702 Cn1 ! Critical value of C0n at leading edge separation. It should be extracted from airfoil data at a given Mach and Reynolds number. It can be calculated from the static value of Cn at either the break in the pitching moment or the loss of chord force at the onset of stall. It is close to the condition of maximum lift of the airfoil at low Mach numbers. +-0.791051 Cn2 ! As Cn1 for negative AOAs. +Default St_sh ! Strouhal's shedding frequency constant. [default = 0.19] +0.013400 Cd0 ! 2D drag coefficient value at 0-lift. +-0.038790 Cm0 ! 2D pitching moment coefficient about 1/4-chord location, at 0-lift, positive if nose up. [If the aerodynamics coefficients table does not include a column for Cm, this needs to be set to 0.0] +0.000000 k0 ! Constant in the \hat(x)_cp curve best-fit; = (\hat(x)_AC-0.25). [ignored if UAMod<>1] +0.000000 k1 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k2 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k3 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k1_hat ! Constant in the expression of Cc due to leading edge vortex effects. [ignored if UAMod<>1] +Default x_cp_bar ! Constant in the expression of \hat(x)_cp^v. [ignored if UAMod<>1, default = 0.2] +Default UACutout ! Angle of attack above which unsteady aerodynamics are disabled (deg). [Specifying the string "Default" sets UACutout to 45 degrees] +Default filtCutOff ! Cut-off frequency (-3 dB corner frequency) for low-pass filtering the AoA input to UA, as well as the 1st and 2nd derivatives (Hz) [default = 20] +!........................................ +! Table of aerodynamics coefficients +200 NumAlf ! Number of data lines in the following table +! Alpha Cl Cd Cm +! (deg) (-) (-) (-) +-1.80000000000000e+02 0.00000000000000e+00 4.36560269351644e-02 0.00000000000000e+00 +-1.77000000000000e+02 1.35439946882412e-01 4.36560269351644e-02 1.18726131869253e-01 +-1.74000000000000e+02 2.73681807554892e-01 5.19326935053434e-02 2.39999774321882e-01 +-1.71000000000000e+02 4.10523187830625e-01 7.67629649316860e-02 3.60000410445527e-01 +-1.68000000000000e+02 5.20540196449849e-01 1.06183060966195e-01 3.39345685302513e-01 +-1.65000000000000e+02 6.17416589309490e-01 1.37898015734769e-01 2.48364921181521e-01 +-1.62000000000000e+02 7.20366694799217e-01 1.69613333930037e-01 1.57382975358883e-01 +-1.59000000000000e+02 7.79902956443025e-01 2.09395231609251e-01 1.00198616429354e-01 +-1.56000000000000e+02 7.54094985201384e-01 2.65310015371530e-01 1.10341134086108e-01 +-1.53000000000000e+02 7.28273002358664e-01 3.21224917158275e-01 1.20030838658758e-01 +-1.50000000000000e+02 7.02433949228043e-01 3.77139907333099e-01 1.29188534097997e-01 +-1.47000000000000e+02 6.88056994571163e-01 4.45660752601736e-01 1.38937062638940e-01 +-1.44000000000000e+02 6.73672820323352e-01 5.14181705032495e-01 1.48679864311782e-01 +-1.41000000000000e+02 6.59280196399078e-01 5.82702871795152e-01 1.58415928945197e-01 +-1.38000000000000e+02 6.40870225785841e-01 6.54060157601795e-01 1.69647719764598e-01 +-1.35000000000000e+02 6.20451890084054e-01 7.26835497177056e-01 1.81625021280610e-01 +-1.32000000000000e+02 6.00029188829974e-01 7.99611206996042e-01 1.93595285306556e-01 +-1.29000000000000e+02 5.75956737945601e-01 8.70852261041323e-01 2.05770654480656e-01 +-1.26000000000000e+02 5.44590931294051e-01 9.39023996253647e-01 2.18364183904311e-01 +-1.23000000000000e+02 5.13223602126577e-01 1.00719521066899e+00 2.30949738818684e-01 +-1.20000000000000e+02 4.81854438801891e-01 1.07536616469559e+00 2.43526390646390e-01 +-1.17000000000000e+02 4.39681481271308e-01 1.13061446591332e+00 2.54956685887127e-01 +-1.14000000000000e+02 3.97508111898989e-01 1.18586253082399e+00 2.66377239042142e-01 +-1.11000000000000e+02 3.55334297402172e-01 1.24111017367587e+00 2.77786058750497e-01 +-1.08000000000000e+02 3.08037893527830e-01 1.28321205725494e+00 2.87281519675595e-01 +-1.05000000000000e+02 2.58180351390511e-01 1.31874096109859e+00 2.95813196403833e-01 +-1.02000000000000e+02 2.08323097887283e-01 1.35426945781572e+00 3.04327743613626e-01 +-9.90000000000000e+01 1.57576203402918e-01 1.38176151510008e+00 3.11395522027348e-01 +-9.60000000000000e+01 1.05050834785785e-01 1.39318034541842e+00 3.15588655906570e-01 +-9.30000000000000e+01 5.25255582791447e-02 1.40459908850334e+00 3.19756596609520e-01 +-9.00000000000000e+01 3.27826917023240e-07 1.41601778797233e+00 3.23659461316635e-01 +-8.70000000000000e+01 -5.25255045195490e-02 1.40459910019038e+00 3.22945034933183e-01 +-8.40000000000000e+01 -1.05050981658418e-01 1.39318031348883e+00 3.21791611743605e-01 +-8.10000000000000e+01 -1.57575748382869e-01 1.38176161401983e+00 3.20129918962609e-01 +-7.80000000000000e+01 -2.08322856414832e-01 1.35426962988931e+00 3.17048455458342e-01 +-7.50000000000000e+01 -2.58180681242367e-01 1.31874072604392e+00 3.12905041046394e-01 +-7.20000000000000e+01 -3.08037652060678e-01 1.28321222932679e+00 3.08761210418793e-01 +-6.90000000000000e+01 -3.55333932045767e-01 1.24111065228680e+00 3.03514635390291e-01 +-6.60000000000000e+01 -3.97508229824454e-01 1.18586237634021e+00 2.96062481257706e-01 +-6.30000000000000e+01 -4.39681760287162e-01 1.13061410039362e+00 2.88610017991116e-01 +-6.00000000000000e+01 -4.81854646345531e-01 1.07536571368012e+00 2.81157387364500e-01 +-5.70000000000000e+01 -5.13223809656928e-01 1.00719475965353e+00 2.72212286505312e-01 +-5.40000000000000e+01 -5.44591138813060e-01 9.39023545233018e-01 2.63266996912069e-01 +-5.10000000000000e+01 -5.75956945455947e-01 8.70851810020693e-01 2.54321329847841e-01 +-4.80000000000000e+01 -6.01326324662319e-01 7.99654560229442e-01 2.45618131252866e-01 +-4.50000000000000e+01 -6.23695970153485e-01 7.26944601773029e-01 2.37036162995707e-01 +-4.20000000000000e+01 -6.42168713793076e-01 6.54103510491734e-01 2.29439922053861e-01 +-3.90000000000000e+01 -6.59537045517161e-01 5.81899603350932e-01 2.22338894134465e-01 +-3.60000000000000e+01 -6.74166998306598e-01 5.11590826220192e-01 2.16852610379598e-01 +-3.30000000000000e+01 -6.88095062911521e-01 4.43295420850299e-01 2.13321658336198e-01 +-3.00000000000000e+01 -7.02434061164880e-01 3.77139487001304e-01 2.11949178572412e-01 +-2.93939393939394e+01 -7.06130482490463e-01 3.64852362744942e-01 2.12237605316701e-01 +-2.87878787878788e+01 -7.09824479328829e-01 3.52565238488579e-01 2.12555391583848e-01 +-2.81818181818182e+01 -7.13516027506550e-01 3.40278114232216e-01 2.12872847967098e-01 +-2.75757575757576e+01 -7.17530381434993e-01 3.28305985630029e-01 2.13597061869978e-01 +-2.69696969696970e+01 -7.21682227375692e-01 3.16468866746567e-01 2.14495479961637e-01 +-2.63636363636364e+01 -7.25832258736785e-01 3.04631747863105e-01 2.15393660836009e-01 +-2.57575757575758e+01 -7.30267770470675e-01 2.92993562362201e-01 2.16593296530334e-01 +-2.51515151515151e+01 -7.35132964149189e-01 2.81653730571187e-01 2.18245185960105e-01 +-2.45454545454545e+01 -7.39997274048644e-01 2.70313898780173e-01 2.19896919526772e-01 +-2.39393939393939e+01 -7.44966676859083e-01 2.59028163484346e-01 2.21648566366930e-01 +-2.33333333333333e+01 -7.50889197184390e-01 2.48229307118538e-01 2.24300599299510e-01 +-2.27272727272727e+01 -7.56811618414165e-01 2.37430450752730e-01 2.26952544318588e-01 +-2.21212121212121e+01 -7.62733947044537e-01 2.26631594386922e-01 2.29604411305050e-01 +-2.15151515151515e+01 -7.65543180919198e-01 2.16298421341179e-01 2.33347719604617e-01 +-2.09090909090909e+01 -7.67159390551658e-01 2.06081699080272e-01 2.37363936868452e-01 +-2.03030303030303e+01 -7.70989589899503e-01 1.95864976819365e-01 2.41380122381193e-01 +-1.96969696969697e+01 -7.66408855179284e-01 1.86713082311620e-01 2.37110565273848e-01 +-1.90909090909091e+01 -7.53224334899666e-01 1.78625955319317e-01 2.24555711213706e-01 +-1.84848484848485e+01 -7.40515247767467e-01 1.70539222184923e-01 2.12001402771163e-01 +-1.78787878787879e+01 -7.28073414237448e-01 1.62452465875814e-01 1.99446889701465e-01 +-1.72727272727273e+01 -7.15796412819352e-01 1.54365338883510e-01 1.86891340465851e-01 +-1.66666666666667e+01 -7.03628403601917e-01 1.45137051028637e-01 1.74335949867985e-01 +-1.60606060606061e+01 -6.91536071334431e-01 1.35827440633388e-01 1.61780655103707e-01 +-1.54545454545455e+01 -6.79841375439502e-01 1.27125362674088e-01 1.49225873196518e-01 +-1.48484848484848e+01 -6.68371976472640e-01 1.18756044019379e-01 1.36670824522160e-01 +-1.42424242424242e+01 -6.57525266337486e-01 1.11081575507249e-01 1.24115046890632e-01 +-1.36363636363636e+01 -6.46919349317121e-01 1.03510536591038e-01 1.11559472566631e-01 +-1.30303030303030e+01 -6.36590196575789e-01 9.60197655285123e-02 9.90027923089362e-02 +-1.24242424242424e+01 -6.26616545201912e-01 8.84489364835728e-02 8.64466304336154e-02 +-1.18181818181818e+01 -6.16997647064756e-01 8.07255969659771e-02 7.38892790664918e-02 +-1.12121212121212e+01 -6.07806438992942e-01 7.26223306995905e-02 6.13323781273887e-02 +-1.06060606060606e+01 -5.99288567453162e-01 6.43078358166966e-02 4.87732017593027e-02 +-1.00000000000000e+01 -5.91657873003445e-01 5.59263606591254e-02 3.62141784693746e-02 +-9.39393939393939e+00 -5.79058163807746e-01 4.91379422584400e-02 2.49867487590630e-02 +-8.78787878787879e+00 -5.66700483456983e-01 4.25327427253251e-02 1.37556766416755e-02 +-8.18181818181818e+00 -5.52767057263263e-01 3.51385027365045e-02 2.51431078401171e-03 +-7.57575757575758e+00 -5.16152487631087e-01 3.07167300167049e-02 -3.52520860243561e-03 +-6.96969696969697e+00 -4.69757056162087e-01 2.73460615848954e-02 -7.35433309173912e-03 +-6.36363636363636e+00 -4.23157901477119e-01 2.40466853818601e-02 -1.16480887450771e-02 +-5.75757575757576e+00 -3.74765829542321e-01 2.11022048511000e-02 -1.59084513723056e-02 +-5.15151515151515e+00 -3.23413692430681e-01 1.89550579096399e-02 -1.86750851344994e-02 +-4.54545454545454e+00 -2.68547626763533e-01 1.70622389773778e-02 -2.19719612773405e-02 +-3.93939393939394e+00 -2.11994257260558e-01 1.53692119559176e-02 -2.56157244462441e-02 +-3.33333333333333e+00 -1.48415934878880e-01 1.48139917958905e-02 -2.94968023177144e-02 +-2.72727272727273e+00 -7.89769276979072e-02 1.41624540467447e-02 -3.39437653144343e-02 +-2.12121212121212e+00 -3.46478095391404e-03 1.34145873263993e-02 -3.86035781138906e-02 +-1.51515151515152e+00 7.38291063274909e-02 1.30921930075161e-02 -4.27533487199522e-02 +-9.09090909090912e-01 1.51829760730163e-01 1.28923820998857e-02 -4.69054889010057e-02 +-3.03030303030302e-01 2.30822308320161e-01 1.28050693423605e-02 -5.10801102705995e-02 + 3.03030303030302e-01 3.10463730114934e-01 1.27477575306067e-02 -5.50677649278274e-02 + 9.09090909090912e-01 3.90790263359822e-01 1.27353987638778e-02 -5.88795212672597e-02 + 1.51515151515152e+00 4.71284233730724e-01 1.28776954822189e-02 -6.27273016180439e-02 + 2.12121212121212e+00 5.50963097343411e-01 1.30675735894997e-02 -6.64832475878559e-02 + 2.72727272727273e+00 6.30138935816981e-01 1.32424674678596e-02 -6.95217238202173e-02 + 3.33333333333333e+00 7.08536320290482e-01 1.34717732475649e-02 -7.23228820759458e-02 + 3.93939393939394e+00 7.86307858387585e-01 1.38172159080549e-02 -7.49142757271172e-02 + 4.54545454545455e+00 8.62388339964567e-01 1.42557288224049e-02 -7.75040470102574e-02 + 5.15151515151515e+00 9.37700928676955e-01 1.47059776016534e-02 -8.00049921252249e-02 + 5.75757575757576e+00 1.01125073389474e+00 1.51614417050010e-02 -8.21454604598515e-02 + 6.36363636363637e+00 1.08227624065879e+00 1.57108190803841e-02 -8.39835694506992e-02 + 6.96969696969697e+00 1.15161256120026e+00 1.63448211385627e-02 -8.56439571000181e-02 + 7.57575757575757e+00 1.21596411426272e+00 1.71676404929355e-02 -8.74082304182359e-02 + 8.18181818181818e+00 1.27673300509297e+00 1.80775111046661e-02 -8.94455339298536e-02 + 8.78787878787879e+00 1.33119115050654e+00 1.91750329509376e-02 -9.16003178554933e-02 + 9.39393939393939e+00 1.37956425338417e+00 2.13859354652657e-02 -9.38392678971121e-02 + 1.00000000000000e+01 1.42465603147829e+00 2.40167211153884e-02 -9.61318882807184e-02 + 1.06060606060606e+01 1.44856679840724e+00 2.73518951987084e-02 -9.83269145446295e-02 + 1.12121212121212e+01 1.45643493495683e+00 3.11907783963854e-02 -1.01693563008612e-01 + 1.18181818181818e+01 1.44145511321968e+00 3.67776864017581e-02 -1.04240570768266e-01 + 1.24242424242424e+01 1.25811612577190e+00 4.49502463857501e-02 -9.87981028722830e-02 + 1.30303030303030e+01 1.21783548130362e+00 5.37917825568218e-02 -9.72024540714103e-02 + 1.36363636363636e+01 1.20160458150153e+00 6.40421590933513e-02 -9.82023678961166e-02 + 1.42424242424242e+01 1.18813191525126e+00 7.46618265741957e-02 -9.95181720845514e-02 + 1.48484848484848e+01 1.18027423785320e+00 8.60251229889524e-02 -1.01193555150372e-01 + 1.54545454545455e+01 1.17877779387270e+00 9.81117465457450e-02 -1.05541629489454e-01 + 1.60606060606061e+01 1.17689322444726e+00 1.10556666678342e-01 -1.10785671275185e-01 + 1.66666666666667e+01 1.16581038309829e+00 1.24057053255380e-01 -1.18134261648867e-01 + 1.72727272727273e+01 1.15665660147017e+00 1.37525823660165e-01 -1.25046831531383e-01 + 1.78787878787879e+01 1.14984732933414e+00 1.50955951675739e-01 -1.31427188552528e-01 + 1.84848484848485e+01 1.14985357005765e+00 1.64278673861716e-01 -1.35546000357850e-01 + 1.90909090909091e+01 1.14897293619198e+00 1.76960001690690e-01 -1.39369242924789e-01 + 1.96969696969697e+01 1.13396288213762e+00 1.86157753963698e-01 -1.44719855669495e-01 + 2.03030303030303e+01 1.12113454332556e+00 1.95864976819365e-01 -1.49461918843513e-01 + 2.09090909090909e+01 1.11049287841322e+00 2.06081699080272e-01 -1.53594296036503e-01 + 2.15151515151515e+01 1.09985087842677e+00 2.16298421341179e-01 -1.57724684571442e-01 + 2.21212121212121e+01 1.08964494555376e+00 2.26631594386922e-01 -1.61741842424593e-01 + 2.27272727272727e+01 1.08118409226682e+00 2.37430450752730e-01 -1.65312206684248e-01 + 2.33333333333333e+01 1.07272310525245e+00 2.48229307118538e-01 -1.68881329238900e-01 + 2.39393939393939e+01 1.06426197511829e+00 2.59028163484346e-01 -1.72449237026485e-01 + 2.45454545454545e+01 1.05716247952044e+00 2.70313898780173e-01 -1.75700716715067e-01 + 2.51515151515151e+01 1.05021311424356e+00 2.81653730571187e-01 -1.78916186478768e-01 + 2.57575757575758e+01 1.04326247901123e+00 2.92993562362201e-01 -1.82130682130006e-01 + 2.63636363636364e+01 1.03692547814336e+00 3.04631747863105e-01 -1.85209085023971e-01 + 2.69696969696970e+01 1.03099616857058e+00 3.16468866746567e-01 -1.88196490642796e-01 + 2.75757575757576e+01 1.02506425393147e+00 3.28305985630029e-01 -1.91182998125262e-01 + 2.81818181818182e+01 1.01932894884137e+00 3.40278114232216e-01 -1.94124420358041e-01 + 2.87878787878788e+01 1.01405525818665e+00 3.52565238488579e-01 -1.96961880499345e-01 + 2.93939393939394e+01 1.00877805189828e+00 3.64852362744942e-01 -1.99798436276836e-01 + 3.00000000000000e+01 1.00349736452608e+00 3.77139487001304e-01 -2.02634065252844e-01 + 3.30000000000000e+01 9.82998715735978e-01 4.43295420850300e-01 -2.15352590816283e-01 + 3.60000000000000e+01 9.63089651383735e-01 5.11590826220192e-01 -2.27863925187279e-01 + 3.90000000000000e+01 9.42175986921238e-01 5.81899603350932e-01 -2.39321618575565e-01 + 4.20000000000000e+01 9.17369367761984e-01 6.54103510491734e-01 -2.50662792778012e-01 + 4.50000000000000e+01 8.90994844258789e-01 7.26944601773029e-01 -2.61985791102602e-01 + 4.80000000000000e+01 8.59052634531658e-01 7.99654560229442e-01 -2.73143035398585e-01 + 5.10000000000000e+01 8.22819956247608e-01 8.70851810020694e-01 -2.84140610804423e-01 + 5.40000000000000e+01 7.78010344233567e-01 9.39023545233018e-01 -2.94794033259472e-01 + 5.70000000000000e+01 7.33199012906027e-01 1.00719475965353e+00 -3.05462909314392e-01 + 6.00000000000000e+01 6.88385299195316e-01 1.07536571368012e+00 -3.16145847013128e-01 + 6.30000000000000e+01 6.28130235918108e-01 1.13061410039362e+00 -3.25620798502509e-01 + 6.60000000000000e+01 5.67874167049533e-01 1.18586237634021e+00 -3.35110403637996e-01 + 6.90000000000000e+01 5.07616883385694e-01 1.24111065228680e+00 -3.44613531015476e-01 + 7.20000000000000e+01 4.40053035872077e-01 1.28321222932679e+00 -3.52880607742317e-01 + 7.50000000000000e+01 3.68836397224492e-01 1.31874072604392e+00 -3.60538886626655e-01 + 7.80000000000000e+01 2.97618557438900e-01 1.35426962988931e+00 -3.68212529205940e-01 + 8.10000000000000e+01 2.25125798524460e-01 1.38176161401983e+00 -3.75046689565342e-01 + 8.40000000000000e+01 1.50084444920197e-01 1.39318031348883e+00 -3.80189854624853e-01 + 8.70000000000000e+01 7.50422088870966e-02 1.40459910019038e+00 -3.85401065327424e-01 + 9.00000000000000e+01 -3.27826917250672e-07 1.41601778797233e+00 -3.90743940003956e-01 + 9.30000000000000e+01 -5.25255582791447e-02 1.40459908850334e+00 -3.92409982314967e-01 + 9.60000000000000e+01 -1.05050834785786e-01 1.39318034541842e+00 -3.94293016797664e-01 + 9.90000000000000e+01 -1.57576203402918e-01 1.38176151510008e+00 -3.96176174609728e-01 + 1.02000000000000e+02 -2.08323097887283e-01 1.35426945781572e+00 -3.94964753048719e-01 + 1.05000000000000e+02 -2.58180351390512e-01 1.31874096109859e+00 -3.92206337784692e-01 + 1.08000000000000e+02 -3.08037893527830e-01 1.28321205725494e+00 -3.89447790562342e-01 + 1.11000000000000e+02 -3.55334297402172e-01 1.24111017367587e+00 -3.85534983800253e-01 + 1.14000000000000e+02 -3.97508111898989e-01 1.18586253082399e+00 -3.79313668806810e-01 + 1.17000000000000e+02 -4.39681481271308e-01 1.13061446591332e+00 -3.73092768861011e-01 + 1.20000000000000e+02 -4.81854438801891e-01 1.07536616469558e+00 -3.66872427068639e-01 + 1.23000000000000e+02 -5.13223602126577e-01 1.00719521066899e+00 -3.59027141872641e-01 + 1.26000000000000e+02 -5.44590931294051e-01 9.39023996253647e-01 -3.51183092578474e-01 + 1.29000000000000e+02 -5.75956737945602e-01 8.70852261041322e-01 -3.43340078183588e-01 + 1.32000000000000e+02 -6.00029188829974e-01 7.99611206996042e-01 -3.36135466500916e-01 + 1.35000000000000e+02 -6.20451890084054e-01 7.26835497177056e-01 -3.29251904114765e-01 + 1.38000000000000e+02 -6.40870225785841e-01 6.54060157601795e-01 -3.22371150094234e-01 + 1.41000000000000e+02 -6.59280196399078e-01 5.82702871795151e-01 -3.17195017404215e-01 + 1.44000000000000e+02 -6.73672820323352e-01 5.14181705032495e-01 -3.15427742312397e-01 + 1.47000000000000e+02 -6.88056994571163e-01 4.45660752601736e-01 -3.13666489886140e-01 + 1.50000000000000e+02 -7.02433949228043e-01 3.77139907333099e-01 -3.11911025372031e-01 + 1.53000000000000e+02 -7.28273002358664e-01 3.21224917158276e-01 -3.26779546578991e-01 + 1.56000000000000e+02 -7.54094985201384e-01 2.65310015371530e-01 -3.41648669551904e-01 + 1.59000000000000e+02 -7.79902956443025e-01 2.09395231609251e-01 -3.56518297584456e-01 + 1.62000000000000e+02 -7.15623711897387e-01 1.69995730690300e-01 -3.89180151768352e-01 + 1.65000000000000e+02 -6.04668180255573e-01 1.38854010867083e-01 -4.30738080965074e-01 + 1.68000000000000e+02 -5.04633128784701e-01 1.07712184204155e-01 -4.72295103043239e-01 + 1.71000000000000e+02 -3.90299886270968e-01 7.84829800637506e-02 -4.50000513056908e-01 + 1.74000000000000e+02 -2.60199626255756e-01 5.30791102629704e-02 -2.99999717902353e-01 + 1.77000000000000e+02 -1.28700931105444e-01 4.42220543974298e-02 -1.48407664836567e-01 + 1.80000000000000e+02 0.00000000000000e+00 4.36560269351644e-02 0.00000000000000e+00 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_09.dat b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_09.dat new file mode 100644 index 000000000..709a0e402 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_09.dat @@ -0,0 +1,254 @@ +! ------------ AirfoilInfo v1.01.x Input File ---------------------------------- +! AeroElasticSE FAST driver +! line +! line +! ------------------------------------------------------------------------------ +DEFAULT InterpOrd ! Interpolation order to use for quasi-steady table lookup {1=linear; 3=cubic spline; "default"} [default=3] +1 NonDimArea ! The non-dimensional area of the airfoil (area/chord^2) (set to 1.0 if unsure or unneeded) +@"NREL-2p8-127_AF09_Coords.txt" NumCoords ! The number of coordinates in the airfoil shape file. Set to zero if coordinates not included. +AF09_BL.txt BL_file ! The file name including the boundary layer characteristics of the profile. Ignored if the aeroacoustic module is not called. +1 NumTabs ! Number of airfoil tables in this file. Each table must have lines for Re and Ctrl. +! ------------------------------------------------------------------------------ +! data for table 1 +! ------------------------------------------------------------------------------ +6.000000 Re ! Reynolds number in millions +0 Ctrl ! Control setting (must be 0 for current AirfoilInfo) +True InclUAdata ! Is unsteady aerodynamics data included in this table? If TRUE, then include 30 UA coefficients below this line +!........................................ +-2.060385 alpha0 ! 0-lift angle of attack, depends on airfoil. +11.208140 alpha1 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA>alpha0. (deg) +-7.861323 alpha2 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA1] +0.000000 S2 ! Constant in the f curve best-fit for AOA> alpha1; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S3 ! Constant in the f curve best-fit for alpha2<=AOA< alpha0; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S4 ! Constant in the f curve best-fit for AOA< alpha2; by definition it depends on the airfoil. [ignored if UAMod<>1] +1.367424 Cn1 ! Critical value of C0n at leading edge separation. It should be extracted from airfoil data at a given Mach and Reynolds number. It can be calculated from the static value of Cn at either the break in the pitching moment or the loss of chord force at the onset of stall. It is close to the condition of maximum lift of the airfoil at low Mach numbers. +-0.824883 Cn2 ! As Cn1 for negative AOAs. +Default St_sh ! Strouhal's shedding frequency constant. [default = 0.19] +0.010934 Cd0 ! 2D drag coefficient value at 0-lift. +-0.049324 Cm0 ! 2D pitching moment coefficient about 1/4-chord location, at 0-lift, positive if nose up. [If the aerodynamics coefficients table does not include a column for Cm, this needs to be set to 0.0] +0.000000 k0 ! Constant in the \hat(x)_cp curve best-fit; = (\hat(x)_AC-0.25). [ignored if UAMod<>1] +0.000000 k1 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k2 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k3 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k1_hat ! Constant in the expression of Cc due to leading edge vortex effects. [ignored if UAMod<>1] +Default x_cp_bar ! Constant in the expression of \hat(x)_cp^v. [ignored if UAMod<>1, default = 0.2] +Default UACutout ! Angle of attack above which unsteady aerodynamics are disabled (deg). [Specifying the string "Default" sets UACutout to 45 degrees] +Default filtCutOff ! Cut-off frequency (-3 dB corner frequency) for low-pass filtering the AoA input to UA, as well as the 1st and 2nd derivatives (Hz) [default = 20] +!........................................ +! Table of aerodynamics coefficients +200 NumAlf ! Number of data lines in the following table +! Alpha Cl Cd Cm +! (deg) (-) (-) (-) +-1.80000000000000e+02 0.00000000000000e+00 5.31472191671717e-02 0.00000000000000e+00 +-1.77000000000000e+02 1.29495037060763e-01 5.31472191671717e-02 1.18521230701205e-01 +-1.74000000000000e+02 2.62196549024508e-01 6.37579530831230e-02 2.39999774321882e-01 +-1.71000000000000e+02 3.93295149394492e-01 9.55905031721947e-02 3.60000410445527e-01 +-1.68000000000000e+02 5.10233340661308e-01 1.28558250585849e-01 3.26000611777352e-01 +-1.65000000000000e+02 6.19785379304123e-01 1.62093583412369e-01 2.15002393125294e-01 +-1.62000000000000e+02 7.31395834011373e-01 1.95629300525583e-01 1.04002855069395e-01 +-1.59000000000000e+02 7.97042839057236e-01 2.36917620123939e-01 3.50287462844128e-02 +-1.56000000000000e+02 7.70832295867696e-01 2.93710882428943e-01 5.00110113837699e-02 +-1.53000000000000e+02 7.44620920477827e-01 3.50504182292723e-01 6.48349471240901e-02 +-1.50000000000000e+02 7.18408694438638e-01 4.07297530590864e-01 7.94722317169135e-02 +-1.47000000000000e+02 7.03823896258865e-01 4.76817027337738e-01 9.22485232622368e-02 +-1.44000000000000e+02 6.89238523528509e-01 5.46336591473471e-01 1.05021570591302e-01 +-1.41000000000000e+02 6.74652275680612e-01 6.15856290391738e-01 1.17790814864596e-01 +-1.38000000000000e+02 6.55921766878216e-01 6.88177317217559e-01 1.31322598661476e-01 +-1.35000000000000e+02 6.35119149734577e-01 7.61899002314359e-01 1.45235182430339e-01 +-1.32000000000000e+02 6.14315531955484e-01 8.35620937733996e-01 1.59144670993128e-01 +-1.29000000000000e+02 5.89758365423619e-01 9.07722303996263e-01 1.73171416661612e-01 +-1.26000000000000e+02 5.57694365436177e-01 9.76582524253020e-01 1.87436089134836e-01 +-1.23000000000000e+02 5.25630147618883e-01 1.04544221845313e+00 2.01697660743594e-01 +-1.20000000000000e+02 4.93565771807661e-01 1.11430164963474e+00 2.15955995381730e-01 +-1.17000000000000e+02 4.50397682635010e-01 1.16980036934638e+00 2.29069583999682e-01 +-1.14000000000000e+02 4.07229711397332e-01 1.22529885093775e+00 2.42179581353683e-01 +-1.11000000000000e+02 3.64062034832866e-01 1.28079690855731e+00 2.55285105310821e-01 +-1.08000000000000e+02 3.15627063533621e-01 1.32277521883958e+00 2.66511224315401e-01 +-1.05000000000000e+02 2.64558413703211e-01 1.35799355250651e+00 2.76794753835721e-01 +-1.02000000000000e+02 2.13490336137694e-01 1.39321148260576e+00 2.87071098135651e-01 +-9.90000000000000e+01 1.61500486209697e-01 1.42017677477570e+00 2.95908817817940e-01 +-9.60000000000000e+01 1.07667090348450e-01 1.43063643362188e+00 3.01875969512173e-01 +-9.30000000000000e+01 5.38337094334587e-02 1.44109601256217e+00 3.07830613812683e-01 +-9.00000000000000e+01 3.35991459655313e-07 1.45155555155023e+00 3.13757307492905e-01 +-8.70000000000000e+01 -5.38336543349781e-02 1.44109602326751e+00 3.15792074690342e-01 +-8.40000000000000e+01 -1.07667240878618e-01 1.43063640437435e+00 3.17709664434913e-01 +-8.10000000000000e+01 -1.61500019858388e-01 1.42017686538628e+00 3.19427985605789e-01 +-7.80000000000000e+01 -2.13490088801890e-01 1.39321165317520e+00 3.18443936149184e-01 +-7.50000000000000e+01 -2.64558751566886e-01 1.35799331950653e+00 3.16050829869962e-01 +-7.20000000000000e+01 -3.15626816200455e-01 1.32277538940729e+00 3.13657156553441e-01 +-6.90000000000000e+01 -3.64061660870620e-01 1.28079738933759e+00 3.10049989411700e-01 +-6.60000000000000e+01 -4.07229832102981e-01 1.22529869575376e+00 3.04015735248115e-01 +-6.30000000000000e+01 -4.50397968233045e-01 1.16980000216993e+00 2.97981084772964e-01 +-6.00000000000000e+01 -4.93565983944208e-01 1.11430119406435e+00 2.91946220973731e-01 +-5.70000000000000e+01 -5.25630359754821e-01 1.04544176288274e+00 2.84141782265212e-01 +-5.40000000000000e+01 -5.57694577570126e-01 9.76582068677410e-01 2.76337115591071e-01 +-5.10000000000000e+01 -5.89758577557172e-01 9.07721848420653e-01 2.68531992982216e-01 +-4.80000000000000e+01 -6.15975377464480e-01 8.35676496789876e-01 2.60891044708829e-01 +-4.50000000000000e+01 -6.39268597360940e-01 7.62038630661659e-01 2.53332180964662e-01 +-4.20000000000000e+01 -6.57581661720133e-01 6.88232875834521e-01 2.47037064737753e-01 +-3.90000000000000e+01 -6.74980379108277e-01 6.14826511890619e-01 2.41247071396765e-01 +-3.60000000000000e+01 -6.89869193378202e-01 5.43015121244335e-01 2.37267768231330e-01 +-3.30000000000000e+01 -7.03872456392545e-01 4.73784534746912e-01 2.35795153182948e-01 +-3.00000000000000e+01 -7.18408799575845e-01 4.07297098236698e-01 2.37089771150360e-01 +-2.93939393939394e+01 -7.21762686347836e-01 3.94552959906465e-01 2.38090915530434e-01 +-2.87878787878788e+01 -7.25116462207148e-01 3.81808821576231e-01 2.39093403016499e-01 +-2.81818181818182e+01 -7.28470126047924e-01 3.69064683245998e-01 2.40095875411411e-01 +-2.75757575757576e+01 -7.32236853727248e-01 3.56724431468315e-01 2.41620187509530e-01 +-2.69696969696970e+01 -7.36180584373604e-01 3.44557288776848e-01 2.43368158185924e-01 +-2.63636363636364e+01 -7.40124232008641e-01 3.32390146085381e-01 2.45116118010372e-01 +-2.57575757575758e+01 -7.44432056142082e-01 3.20478002655761e-01 2.47250782325627e-01 +-2.51515151515151e+01 -7.49286130044737e-01 3.08948298688103e-01 2.49965419735941e-01 +-2.45454545454545e+01 -7.54140163517274e-01 2.97418594720445e-01 2.52680050016007e-01 +-2.39393939393939e+01 -7.59128300719057e-01 2.85958242769248e-01 2.55522930540395e-01 +-2.33333333333333e+01 -7.65323729613723e-01 2.75122072393073e-01 2.59520140578325e-01 +-2.27272727272727e+01 -7.71519153975079e-01 2.64285902016898e-01 2.63517346594489e-01 +-2.21212121212121e+01 -7.77714574100304e-01 2.53449731640723e-01 2.67514549040905e-01 +-2.15151515151515e+01 -7.83978195814861e-01 2.43210638882764e-01 2.72910891584855e-01 +-2.09090909090909e+01 -7.90117542155355e-01 2.33120853936042e-01 2.78657108165319e-01 +-2.03030303030303e+01 -7.97012109620063e-01 2.23031068989321e-01 2.84403323293269e-01 +-1.96969696969697e+01 -7.95415736248302e-01 2.13313352612748e-01 2.80089060137697e-01 +-1.90909090909091e+01 -7.85263277790639e-01 2.03967683758259e-01 2.65714886768838e-01 +-1.84848484848485e+01 -7.75273314466664e-01 1.94622470054976e-01 2.51341410437202e-01 +-1.78787878787879e+01 -7.65374889035412e-01 1.85277229570461e-01 2.36967769403479e-01 +-1.72727272727273e+01 -7.55533108229545e-01 1.75931560715972e-01 2.22592985180729e-01 +-1.66666666666667e+01 -7.45728795354525e-01 1.66196420256137e-01 2.08218526695132e-01 +-1.60606060606061e+01 -7.35950554364156e-01 1.56433343834581e-01 1.93844333165442e-01 +-1.54545454545455e+01 -7.26308463193755e-01 1.46878222014310e-01 1.79470874697127e-01 +-1.48484848484848e+01 -7.16743375686355e-01 1.37436585788465e-01 1.65097285434163e-01 +-1.42424242424242e+01 -7.07390619723189e-01 1.28231667233805e-01 1.50723069814813e-01 +-1.36363636363636e+01 -6.98120667001908e-01 1.19062253074563e-01 1.36349337872941e-01 +-1.30303030303030e+01 -6.88944298853437e-01 1.09919099684084e-01 1.21974646106258e-01 +-1.24242424242424e+01 -6.79890334514997e-01 1.00749731941577e-01 1.07600926861901e-01 +-1.18181818181818e+01 -6.70956348082078e-01 9.15279934171627e-02 9.32263230029353e-02 +-1.12121212121212e+01 -6.62168843237812e-01 8.21771971589323e-02 7.88528466356555e-02 +-1.06060606060606e+01 -6.53611277615254e-01 7.27538640183303e-02 6.44774855298434e-02 +-1.00000000000000e+01 -6.45356230550116e-01 6.33080422182624e-02 5.01034327127313e-02 +-9.39393939393939e+00 -6.36593332900123e-01 5.41963669816850e-02 3.57833738354860e-02 +-8.78787878787879e+00 -6.27918256833836e-01 4.51475416350120e-02 2.14623968040231e-02 +-8.18181818181818e+00 -6.18711373162793e-01 3.58305294547305e-02 7.14198465445491e-03 +-7.57575757575758e+00 -5.80216174573165e-01 3.01489440959233e-02 -5.19349418320715e-04 +-6.96969696969697e+00 -5.28953354241068e-01 2.59835542019697e-02 -5.35572587261972e-03 +-6.36363636363636e+00 -4.73862537653747e-01 2.22211779699908e-02 -1.07634960479835e-02 +-5.75757575757576e+00 -4.16582198644429e-01 1.90003840623066e-02 -1.61245333665883e-02 +-5.15151515151515e+00 -3.55933513528219e-01 1.66928246089848e-02 -2.10369141861243e-02 +-4.54545454545454e+00 -2.91472100196896e-01 1.47078923324148e-02 -2.64604110668977e-02 +-3.93939393939394e+00 -2.25304889231469e-01 1.29545096367512e-02 -3.21126856296872e-02 +-3.33333333333333e+00 -1.54104000261012e-01 1.23887165275606e-02 -3.78462438825610e-02 +-2.72727272727273e+00 -8.16248041858842e-02 1.17323458130580e-02 -4.34613224548195e-02 +-2.12121212121212e+00 -7.62116470645060e-03 1.09678271146517e-02 -4.88326464973399e-02 +-1.51515151515152e+00 6.83134982557210e-02 1.06280353358650e-02 -5.37247752016293e-02 +-9.09090909090912e-01 1.44916946777653e-01 1.04099760350921e-02 -5.85191375679298e-02 +-3.03030303030302e-01 2.22554588237817e-01 1.02931716210053e-02 -6.33281972284231e-02 + 3.03030303030302e-01 3.00795206874542e-01 1.02297528304907e-02 -6.78528768736416e-02 + 9.09090909090912e-01 3.79652000805070e-01 1.02202988420258e-02 -7.20918564811688e-02 + 1.51515151515152e+00 4.59004148697031e-01 1.03956813611896e-02 -7.63468764323537e-02 + 2.12121212121212e+00 5.38292042421047e-01 1.06036731488726e-02 -8.03761253262362e-02 + 2.72727272727273e+00 6.17098027022441e-01 1.08115944967115e-02 -8.34392709248819e-02 + 3.33333333333333e+00 6.94907654704091e-01 1.10839446374173e-02 -8.61737788284095e-02 + 3.93939393939394e+00 7.71913058145968e-01 1.14291538648689e-02 -8.86385535504365e-02 + 4.54545454545455e+00 8.46751947966220e-01 1.18860333393268e-02 -9.11095009974341e-02 + 5.15151515151515e+00 9.20604899194484e-01 1.23569858194089e-02 -9.34332370032627e-02 + 5.75757575757576e+00 9.92199902524323e-01 1.28374739059253e-02 -9.53033834851092e-02 + 6.36363636363637e+00 1.06055718025240e+00 1.34310891694729e-02 -9.68110066273987e-02 + 6.96969696969697e+00 1.12674988698576e+00 1.40997355822941e-02 -9.80785912470612e-02 + 7.57575757575757e+00 1.18666342902678e+00 1.49845781349695e-02 -9.93714676847982e-02 + 8.18181818181818e+00 1.24314989353240e+00 1.59667211082838e-02 -1.00692149985168e-01 + 8.78787878787879e+00 1.29245687180882e+00 1.71544710253729e-02 -1.02035478870500e-01 + 9.39393939393939e+00 1.33396126311506e+00 1.95659937586037e-02 -1.03407560601880e-01 + 1.00000000000000e+01 1.37126009363817e+00 2.25665763961257e-02 -1.04797915194330e-01 + 1.06060606060606e+01 1.38618576553784e+00 2.67311075620441e-02 -1.05641194801641e-01 + 1.12121212121212e+01 1.38519725174546e+00 3.17846622479086e-02 -1.06586637285388e-01 + 1.18181818181818e+01 1.35493629423442e+00 3.87531354728749e-02 -1.07628263634721e-01 + 1.24242424242424e+01 1.31246186473740e+00 4.83484785906573e-02 -1.07847108308056e-01 + 1.30303030303030e+01 1.28680791441048e+00 5.91170543627865e-02 -1.08015031049527e-01 + 1.36363636363636e+01 1.26172678770879e+00 7.17168991472314e-02 -1.08181203384768e-01 + 1.42424242424242e+01 1.23769104210515e+00 8.49758848909100e-02 -1.08605313713084e-01 + 1.48484848484848e+01 1.21528767185958e+00 9.92702312554880e-02 -1.09411818544650e-01 + 1.54545454545455e+01 1.19968194488222e+00 1.14607265848385e-01 -1.13749735842298e-01 + 1.60606060606061e+01 1.18663909270316e+00 1.30222530116573e-01 -1.19428362054540e-01 + 1.66666666666667e+01 1.17688627348101e+00 1.45214198979932e-01 -1.27285721302187e-01 + 1.72727272727273e+01 1.16956684907482e+00 1.60165335729503e-01 -1.34601993519905e-01 + 1.78787878787879e+01 1.16522099838670e+00 1.75066932714929e-01 -1.41256962609131e-01 + 1.84848484848485e+01 1.16952525051625e+00 1.89830940964302e-01 -1.45028799262795e-01 + 1.90909090909091e+01 1.17284535113364e+00 2.03772684613384e-01 -1.48423774647318e-01 + 1.96969696969697e+01 1.15835573662925e+00 2.13248351672080e-01 -1.53767566099225e-01 + 2.03030303030303e+01 1.14530509433480e+00 2.23031068989321e-01 -1.58704075145085e-01 + 2.09090909090909e+01 1.13369372685470e+00 2.33120853936042e-01 -1.63233228331231e-01 + 2.15151515151515e+01 1.12208234404602e+00 2.43210638882764e-01 -1.67762290542514e-01 + 2.21212121212121e+01 1.11102321657310e+00 2.53449731640723e-01 -1.72148946259134e-01 + 2.27272727272727e+01 1.10217259984565e+00 2.64285902016898e-01 -1.75966397581727e-01 + 2.33333333333333e+01 1.09332197700060e+00 2.75122072393073e-01 -1.79783792100215e-01 + 2.39393939393939e+01 1.08447134760827e+00 2.85958242769248e-01 -1.83601131046924e-01 + 2.45454545454545e+01 1.07734542237668e+00 2.97418594720445e-01 -1.87014968760816e-01 + 2.51515151515151e+01 1.07041107379095e+00 3.08948298688103e-01 -1.90383934992330e-01 + 2.57575757575758e+01 1.06347666710874e+00 3.20478002655761e-01 -1.93752856661258e-01 + 2.63636363636364e+01 1.05732236007864e+00 3.32390146085381e-01 -1.96948677634826e-01 + 2.69696969696970e+01 1.05168813342601e+00 3.44557288776848e-01 -2.00029068561270e-01 + 2.75757575757576e+01 1.04605378759977e+00 3.56724431468315e-01 -2.03109418400795e-01 + 2.81818181818182e+01 1.04067256013258e+00 3.69064683245998e-01 -2.06133132039065e-01 + 2.87878787878788e+01 1.03588202408929e+00 3.81808821576232e-01 -2.09024762045095e-01 + 2.93939393939394e+01 1.03109132721680e+00 3.94552959906465e-01 -2.11916350679321e-01 + 3.00000000000000e+01 1.02630047109565e+00 4.07297098236698e-01 -2.14807896915288e-01 + 3.30000000000000e+01 1.00553169528085e+00 4.73784534746913e-01 -2.28328930073073e-01 + 3.60000000000000e+01 9.85527854289020e-01 5.43015121244335e-01 -2.41378773612232e-01 + 3.90000000000000e+01 9.64256669240620e-01 6.14826511890619e-01 -2.53786845019076e-01 + 4.20000000000000e+01 9.39401732187148e-01 6.88232875834521e-01 -2.65971257965397e-01 + 4.50000000000000e+01 9.13241579977801e-01 7.62038630661659e-01 -2.78098314901201e-01 + 4.80000000000000e+01 8.79965823978363e-01 8.35676496789876e-01 -2.89925721686919e-01 + 5.10000000000000e+01 8.42513311869095e-01 9.07721848420653e-01 -3.01541565653910e-01 + 5.40000000000000e+01 7.96707214786344e-01 9.76582068677410e-01 -3.12725809880497e-01 + 5.70000000000000e+01 7.50901373321919e-01 1.04544176288274e+00 -3.23914976497956e-01 + 6.00000000000000e+01 7.05095590005431e-01 1.11430119406435e+00 -3.35108765012171e-01 + 6.30000000000000e+01 6.43426651348128e-01 1.16980000216993e+00 -3.44954018840384e-01 + 6.60000000000000e+01 5.81757536770671e-01 1.22529869575376e+00 -3.54804262733281e-01 + 6.90000000000000e+01 5.20088366620145e-01 1.28079738933759e+00 -3.64659118816904e-01 + 7.20000000000000e+01 4.50895765482209e-01 1.32277538940729e+00 -3.73183031740474e-01 + 7.50000000000000e+01 3.77941618474775e-01 1.35799331950653e+00 -3.81044639026107e-01 + 7.80000000000000e+01 3.04986617856015e-01 1.39321165317520e+00 -3.88911546743740e-01 + 8.10000000000000e+01 2.30715110532685e-01 1.42017686538628e+00 -3.95889296470916e-01 + 8.40000000000000e+01 1.53810733540745e-01 1.43063640437435e+00 -4.01084668321152e-01 + 8.70000000000000e+01 7.69053727306556e-02 1.44109602326751e+00 -4.06287962899012e-01 + 9.00000000000000e+01 -3.35991459889849e-07 1.45155555155023e+00 -4.11502017960891e-01 + 9.30000000000000e+01 -5.38337094334587e-02 1.44109601256217e+00 -4.13894658825039e-01 + 9.60000000000000e+01 -1.07667090348450e-01 1.43063643362188e+00 -4.16297269931508e-01 + 9.90000000000000e+01 -1.61500486209697e-01 1.42017677477570e+00 -4.18699936551505e-01 + 1.02000000000000e+02 -2.13490336137694e-01 1.39321148260576e+00 -4.17907661987286e-01 + 1.05000000000000e+02 -2.64558413703211e-01 1.35799355250651e+00 -4.15518040952612e-01 + 1.08000000000000e+02 -3.15627063533621e-01 1.32277521883958e+00 -4.13127922002446e-01 + 1.11000000000000e+02 -3.64062034832866e-01 1.28079690855731e+00 -4.09526520529020e-01 + 1.14000000000000e+02 -4.07229711397332e-01 1.22529885093775e+00 -4.03502582615359e-01 + 1.17000000000000e+02 -4.50397682635010e-01 1.16980036934638e+00 -3.97478465589571e-01 + 1.20000000000000e+02 -4.93565771807662e-01 1.11430164963474e+00 -3.91454376227199e-01 + 1.23000000000000e+02 -5.25630147618883e-01 1.04544221845313e+00 -3.83664668897240e-01 + 1.26000000000000e+02 -5.57694365436177e-01 9.76582524253020e-01 -3.75875218145706e-01 + 1.29000000000000e+02 -5.89758365423620e-01 9.07722303996263e-01 -3.68085790436742e-01 + 1.32000000000000e+02 -6.14315531955485e-01 8.35620937733996e-01 -3.60884266412265e-01 + 1.35000000000000e+02 -6.35119149734577e-01 7.61899002314359e-01 -3.53977324090480e-01 + 1.38000000000000e+02 -6.55921766878216e-01 6.88177317217558e-01 -3.47071391893562e-01 + 1.41000000000000e+02 -6.74652275680612e-01 6.15856290391737e-01 -3.41901008734909e-01 + 1.44000000000000e+02 -6.89238523528509e-01 5.46336591473471e-01 -3.40201601680046e-01 + 1.47000000000000e+02 -7.03823896258865e-01 4.76817027337738e-01 -3.38504257224453e-01 + 1.50000000000000e+02 -7.18408694438638e-01 4.07297530590864e-01 -3.36808891109050e-01 + 1.53000000000000e+02 -7.44620920477827e-01 3.50504182292723e-01 -3.52050708459141e-01 + 1.56000000000000e+02 -7.70832295867696e-01 2.93710882428943e-01 -3.67292718466256e-01 + 1.59000000000000e+02 -7.97042839057236e-01 2.36917620123939e-01 -3.82534823044658e-01 + 1.62000000000000e+02 -7.25443285329967e-01 1.96119535360957e-01 -4.10092686634208e-01 + 1.65000000000000e+02 -6.04863200846212e-01 1.63319174643805e-01 -4.43808469577462e-01 + 1.68000000000000e+02 -4.87346219362824e-01 1.30518595329125e-01 -4.77523282896420e-01 + 1.71000000000000e+02 -3.66753120134991e-01 9.77955724163158e-02 -4.50000513056908e-01 + 1.74000000000000e+02 -2.44501896830564e-01 6.52276659281221e-02 -2.99999717902353e-01 + 1.77000000000000e+02 -1.20729578177091e-01 5.38728696135554e-02 -1.48151538376506e-01 + 1.80000000000000e+02 0.00000000000000e+00 5.31472191671717e-02 0.00000000000000e+00 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_10.dat b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_10.dat new file mode 100644 index 000000000..3d0828bf8 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_10.dat @@ -0,0 +1,254 @@ +! ------------ AirfoilInfo v1.01.x Input File ---------------------------------- +! AeroElasticSE FAST driver +! line +! line +! ------------------------------------------------------------------------------ +DEFAULT InterpOrd ! Interpolation order to use for quasi-steady table lookup {1=linear; 3=cubic spline; "default"} [default=3] +1 NonDimArea ! The non-dimensional area of the airfoil (area/chord^2) (set to 1.0 if unsure or unneeded) +@"NREL-2p8-127_AF10_Coords.txt" NumCoords ! The number of coordinates in the airfoil shape file. Set to zero if coordinates not included. +AF10_BL.txt BL_file ! The file name including the boundary layer characteristics of the profile. Ignored if the aeroacoustic module is not called. +1 NumTabs ! Number of airfoil tables in this file. Each table must have lines for Re and Ctrl. +! ------------------------------------------------------------------------------ +! data for table 1 +! ------------------------------------------------------------------------------ +6.000000 Re ! Reynolds number in millions +0 Ctrl ! Control setting (must be 0 for current AirfoilInfo) +True InclUAdata ! Is unsteady aerodynamics data included in this table? If TRUE, then include 30 UA coefficients below this line +!........................................ +-2.064146 alpha0 ! 0-lift angle of attack, depends on airfoil. +11.141003 alpha1 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA>alpha0. (deg) +-8.373634 alpha2 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA1] +0.000000 S2 ! Constant in the f curve best-fit for AOA> alpha1; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S3 ! Constant in the f curve best-fit for alpha2<=AOA< alpha0; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S4 ! Constant in the f curve best-fit for AOA< alpha2; by definition it depends on the airfoil. [ignored if UAMod<>1] +1.372191 Cn1 ! Critical value of C0n at leading edge separation. It should be extracted from airfoil data at a given Mach and Reynolds number. It can be calculated from the static value of Cn at either the break in the pitching moment or the loss of chord force at the onset of stall. It is close to the condition of maximum lift of the airfoil at low Mach numbers. +-0.848243 Cn2 ! As Cn1 for negative AOAs. +Default St_sh ! Strouhal's shedding frequency constant. [default = 0.19] +0.010759 Cd0 ! 2D drag coefficient value at 0-lift. +-0.057548 Cm0 ! 2D pitching moment coefficient about 1/4-chord location, at 0-lift, positive if nose up. [If the aerodynamics coefficients table does not include a column for Cm, this needs to be set to 0.0] +0.000000 k0 ! Constant in the \hat(x)_cp curve best-fit; = (\hat(x)_AC-0.25). [ignored if UAMod<>1] +0.000000 k1 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k2 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k3 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k1_hat ! Constant in the expression of Cc due to leading edge vortex effects. [ignored if UAMod<>1] +Default x_cp_bar ! Constant in the expression of \hat(x)_cp^v. [ignored if UAMod<>1, default = 0.2] +Default UACutout ! Angle of attack above which unsteady aerodynamics are disabled (deg). [Specifying the string "Default" sets UACutout to 45 degrees] +Default filtCutOff ! Cut-off frequency (-3 dB corner frequency) for low-pass filtering the AoA input to UA, as well as the 1st and 2nd derivatives (Hz) [default = 20] +!........................................ +! Table of aerodynamics coefficients +200 NumAlf ! Number of data lines in the following table +! Alpha Cl Cd Cm +! (deg) (-) (-) (-) +-1.80000000000000e+02 0.00000000000000e+00 5.30837886627506e-02 0.00000000000000e+00 +-1.77000000000000e+02 1.24966191469559e-01 5.30837886627506e-02 1.18576829157013e-01 +-1.74000000000000e+02 2.52998633091314e-01 6.37003001697374e-02 2.39999774321882e-01 +-1.71000000000000e+02 3.79498286143344e-01 9.55501832215890e-02 3.60000410445527e-01 +-1.68000000000000e+02 4.98757573511548e-01 1.28321372265423e-01 3.22914823147173e-01 +-1.65000000000000e+02 6.15220538714466e-01 1.61553203552249e-01 2.07287957565546e-01 +-1.62000000000000e+02 7.27077094368088e-01 1.94785456665805e-01 9.16599143637722e-02 +-1.59000000000000e+02 7.93230980672808e-01 2.35846387240917e-01 1.84100886242669e-02 +-1.56000000000000e+02 7.68234137241237e-01 2.92564407901613e-01 3.03932586734567e-02 +-1.53000000000000e+02 7.43356372402597e-01 3.49282461855920e-01 4.28162358403718e-02 +-1.50000000000000e+02 7.18478522993120e-01 4.06000562593489e-01 5.56156944862064e-02 +-1.47000000000000e+02 7.03955906925430e-01 4.75651465566945e-01 6.92790833714106e-02 +-1.44000000000000e+02 6.89433035390160e-01 5.45302448258410e-01 8.29503219976363e-02 +-1.41000000000000e+02 6.74909652901486e-01 6.14953590391589e-01 9.66309029164283e-02 +-1.38000000000000e+02 6.56219474668182e-01 6.87418368921680e-01 1.10881678895009e-01 +-1.35000000000000e+02 6.35445907015363e-01 7.61289959942459e-01 1.25418499888186e-01 +-1.32000000000000e+02 6.14671501318397e-01 8.35161838486049e-01 1.39961030153749e-01 +-1.29000000000000e+02 5.90134200485388e-01 9.07415349226177e-01 1.54621277427466e-01 +-1.26000000000000e+02 5.58071091549210e-01 9.76432116678355e-01 1.69509055919750e-01 +-1.23000000000000e+02 5.26007827556163e-01 1.04544835687794e+00 1.84402154814945e-01 +-1.20000000000000e+02 4.93944486037582e-01 1.11446433346109e+00 1.99301684126228e-01 +-1.17000000000000e+02 4.50754244383126e-01 1.17011434599327e+00 2.13130402729061e-01 +-1.14000000000000e+02 4.07564132273452e-01 1.22576411981700e+00 2.26966296053101e-01 +-1.11000000000000e+02 3.64374322762834e-01 1.28141346851316e+00 2.40810540320626e-01 +-1.08000000000000e+02 3.15905431030774e-01 1.32353352870914e+00 2.52837246360334e-01 +-1.05000000000000e+02 2.64796957994024e-01 1.35888884163568e+00 2.63961625640692e-01 +-1.02000000000000e+02 2.13689029593013e-01 1.39424374942488e+00 2.75099894116298e-01 +-9.90000000000000e+01 1.61655412340594e-01 1.42133844008909e+00 2.84836104947235e-01 +-9.60000000000000e+01 1.07770377288908e-01 1.43191233870989e+00 2.91753073560900e-01 +-9.30000000000000e+01 5.38853538885643e-02 1.44248615655205e+00 2.98698830338381e-01 +-9.00000000000000e+01 3.36313787357514e-07 1.45305993400564e+00 3.05684965975821e-01 +-8.70000000000000e+01 -5.38852987372259e-02 1.44248616737432e+00 3.09060154363404e-01 +-8.40000000000000e+01 -1.07770527963470e-01 1.43191230914291e+00 3.12686281197342e-01 +-8.10000000000000e+01 -1.61654945541942e-01 1.42133853168932e+00 3.16767616953733e-01 +-7.80000000000000e+01 -2.13688782064248e-01 1.39424392065773e+00 3.16540498625861e-01 +-7.50000000000000e+01 -2.64797296121353e-01 1.35888860772946e+00 3.14266811229411e-01 +-7.20000000000000e+01 -3.15905183504718e-01 1.32353369994026e+00 3.11992145479124e-01 +-6.90000000000000e+01 -3.64373948609042e-01 1.28141395060407e+00 3.08496020987835e-01 +-6.60000000000000e+01 -4.07564253041044e-01 1.22576396420997e+00 3.02557290547327e-01 +-6.30000000000000e+01 -4.50754530127646e-01 1.17011397781587e+00 2.96617404810894e-01 +-6.00000000000000e+01 -4.93944698166970e-01 1.11446387685501e+00 2.90676423054807e-01 +-5.70000000000000e+01 -5.26008039685552e-01 1.04544790027186e+00 2.82948402317780e-01 +-5.40000000000000e+01 -5.58071303677059e-01 9.76431660067037e-01 2.75218817710457e-01 +-5.10000000000000e+01 -5.90134412613238e-01 9.07414892614858e-01 2.67487195859118e-01 +-4.80000000000000e+01 -6.16349723026200e-01 8.35214742285566e-01 2.59915443758204e-01 +-4.50000000000000e+01 -6.39641228159956e-01 7.61422951679187e-01 2.52421684677788e-01 +-4.20000000000000e+01 -6.57897683242975e-01 6.87471272303016e-01 2.46204422934917e-01 +-3.90000000000000e+01 -6.75245094925222e-01 6.13911269891018e-01 2.40506244340753e-01 +-3.60000000000000e+01 -6.90083088589439e-01 5.41941245231535e-01 2.36695331229210e-01 +-3.30000000000000e+01 -7.04017120189319e-01 4.72583293422338e-01 2.35442916975004e-01 +-3.00000000000000e+01 -7.18478627259844e-01 4.06000129199683e-01 2.37016869904415e-01 +-2.93939393939394e+01 -7.21798350573784e-01 3.93221418404654e-01 2.38091117333048e-01 +-2.87878787878788e+01 -7.25118073887724e-01 3.80442707609625e-01 2.39165364761681e-01 +-2.81818181818182e+01 -7.28437797201663e-01 3.67663996814596e-01 2.40239612190314e-01 +-2.75757575757576e+01 -7.32172588884317e-01 3.55293602246098e-01 2.41847562956378e-01 +-2.69696969696970e+01 -7.36085282271228e-01 3.43098215358386e-01 2.43684263346490e-01 +-2.63636363636364e+01 -7.39997975658139e-01 3.30902828470674e-01 2.45520963736601e-01 +-2.57575757575758e+01 -7.44276884748962e-01 3.18965212168995e-01 2.47753414207092e-01 +-2.51515151515151e+01 -7.49105032044442e-01 3.07414191669665e-01 2.50579397563581e-01 +-2.45454545454545e+01 -7.53933179339923e-01 2.95863171170336e-01 2.53405380920070e-01 +-2.39393939393939e+01 -7.58896243502194e-01 2.84382247917907e-01 2.56362693669404e-01 +-2.33333333333333e+01 -7.65073585586137e-01 2.73532213458751e-01 2.60501996380347e-01 +-2.27272727272727e+01 -7.71250927670079e-01 2.62682178999596e-01 2.64779889466675e-01 +-2.21212121212121e+01 -7.77428269754022e-01 2.51832144540440e-01 2.68945623496597e-01 +-2.15151515151515e+01 -7.90262923140693e-01 2.41893541513143e-01 2.73249028596959e-01 +-2.09090909090909e+01 -8.05906043706644e-01 2.32182854971129e-01 2.77270518618669e-01 +-2.03030303030303e+01 -8.19489198628311e-01 2.22472168429115e-01 2.81192694187527e-01 +-1.96969696969697e+01 -8.24678039235549e-01 2.13080793622121e-01 2.75632215545996e-01 +-1.90909090909091e+01 -8.21619989791241e-01 2.04008712486556e-01 2.60613787847909e-01 +-1.84848484848485e+01 -8.18197356256183e-01 1.95010678250887e-01 2.45586809616841e-01 +-1.78787878787879e+01 -8.14569480885818e-01 1.86007505483073e-01 2.30648571774812e-01 +-1.72727272727273e+01 -8.10814834138077e-01 1.76823863436936e-01 2.15753896541975e-01 +-1.66666666666667e+01 -8.06976123403415e-01 1.68593035533169e-01 2.00859509073193e-01 +-1.60606060606061e+01 -8.03078897629092e-01 1.60454418431078e-01 1.85965357045289e-01 +-1.54545454545455e+01 -7.97000707157957e-01 1.51710915395437e-01 1.71396869835783e-01 +-1.48484848484848e+01 -7.89576615706775e-01 1.42625264033402e-01 1.57006741726859e-01 +-1.42424242424242e+01 -7.78781317063958e-01 1.32791872599405e-01 1.43201565946783e-01 +-1.36363636363636e+01 -7.67357420824222e-01 1.22849813294929e-01 1.29490112449071e-01 +-1.30303030303030e+01 -7.55422617396779e-01 1.12823830974163e-01 1.15644996580170e-01 +-1.24242424242424e+01 -7.42969206287619e-01 1.02890282642851e-01 1.01449124172212e-01 +-1.18181818181818e+01 -7.30244644590558e-01 9.31176217950954e-02 8.72464359531469e-02 +-1.12121212121212e+01 -7.17231543580288e-01 8.37383245063512e-02 7.30648930269649e-02 +-1.06060606060606e+01 -7.03577356362280e-01 7.45798495908964e-02 5.90622202437287e-02 +-1.00000000000000e+01 -6.89105145844174e-01 6.55059849764586e-02 4.51630398367081e-02 +-9.39393939393939e+00 -6.76227800071737e-01 5.54692165142735e-02 3.11059783824235e-02 +-8.78787878787879e+00 -6.64141630347962e-01 4.52369131161758e-02 1.71623095710831e-02 +-8.18181818181818e+00 -6.54216850502614e-01 3.55800439872753e-02 3.42154297533580e-03 +-7.57575757575758e+00 -6.14625042059806e-01 2.91666756670593e-02 -3.86341370860449e-03 +-6.96969696969697e+00 -5.61841937827523e-01 2.43864881766210e-02 -8.43665697005592e-03 +-6.36363636363636e+00 -4.99189572128014e-01 2.06688208542298e-02 -1.37959149818896e-02 +-5.75757575757576e+00 -4.34608760745885e-01 1.76932591752901e-02 -1.92729400057168e-02 +-5.15151515151515e+00 -3.67348413458166e-01 1.56052490200204e-02 -2.57288663338659e-02 +-4.54545454545454e+00 -2.97220789753124e-01 1.38965283846311e-02 -3.24773660126783e-02 +-3.93939393939394e+00 -2.25827092845188e-01 1.24332806711584e-02 -3.91885815676604e-02 +-3.33333333333333e+00 -1.54050456378233e-01 1.19149897769548e-02 -4.56999911417254e-02 +-2.72727272727273e+00 -8.12318984160244e-02 1.13706359706548e-02 -5.16384940099625e-02 +-2.12121212121212e+00 -7.14979346296234e-03 1.07859435280497e-02 -5.70801147069148e-02 +-1.51515151515152e+00 6.87826749054011e-02 1.05033451229781e-02 -6.20466375298444e-02 +-9.09090909090912e-01 1.45369872154627e-01 1.03139004235661e-02 -6.68516603553039e-02 +-3.03030303030302e-01 2.23028758160340e-01 1.02094317053058e-02 -7.16176330178895e-02 + 3.03030303030302e-01 3.01237277028695e-01 1.01564455703337e-02 -7.60536458286783e-02 + 9.09090909090912e-01 3.80006385780218e-01 1.01544863426098e-02 -8.01685273418174e-02 + 1.51515151515152e+00 4.59246642973497e-01 1.03195069670379e-02 -8.42292432054636e-02 + 2.12121212121212e+00 5.38436193741909e-01 1.05158173919170e-02 -8.80305585640893e-02 + 2.72727272727273e+00 6.17086435268518e-01 1.07234607719624e-02 -9.09221588982618e-02 + 3.33333333333333e+00 6.94766649922142e-01 1.09892374201398e-02 -9.34851438113357e-02 + 3.93939393939394e+00 7.71665263445708e-01 1.12674755215391e-02 -9.57801882660128e-02 + 4.54545454545455e+00 8.46424118402375e-01 1.16353662750350e-02 -9.80494154414620e-02 + 5.15151515151515e+00 9.20198652009909e-01 1.20213692284540e-02 -1.00166544091476e-01 + 5.75757575757576e+00 9.91711074228843e-01 1.24325530524450e-02 -1.01849307770008e-01 + 6.36363636363637e+00 1.06002251469050e+00 1.29373530659327e-02 -1.03182589271796e-01 + 6.96969696969697e+00 1.12620049862159e+00 1.35051858034989e-02 -1.04281097204592e-01 + 7.57575757575757e+00 1.18623076703795e+00 1.42446030038888e-02 -1.05323489221343e-01 + 8.18181818181818e+00 1.24304860221996e+00 1.50702587438949e-02 -1.06330821016929e-01 + 8.78787878787879e+00 1.29339454484370e+00 1.60680959350975e-02 -1.07320656167730e-01 + 9.39393939393939e+00 1.33640612125946e+00 1.81467491655883e-02 -1.08107944391156e-01 + 1.00000000000000e+01 1.37469506451432e+00 2.09438769808961e-02 -1.08769953707875e-01 + 1.06060606060606e+01 1.39128542708790e+00 2.53973640660572e-02 -1.08704427997839e-01 + 1.12121212121212e+01 1.39247645190556e+00 3.08345002992362e-02 -1.08511132324392e-01 + 1.18181818181818e+01 1.36506866603177e+00 3.75119498467862e-02 -1.07969033181396e-01 + 1.24242424242424e+01 1.33988550587683e+00 4.76821530474488e-02 -1.09070781012852e-01 + 1.30303030303030e+01 1.28517385394240e+00 5.94392540313143e-02 -1.10747213245403e-01 + 1.36363636363636e+01 1.25643020037597e+00 7.18386529645335e-02 -1.10309370469218e-01 + 1.42424242424242e+01 1.22941101634947e+00 8.49147013682724e-02 -1.10076808850556e-01 + 1.48484848484848e+01 1.20587360276360e+00 9.89301897374668e-02 -1.10132396182924e-01 + 1.54545454545455e+01 1.18936767768177e+00 1.13924838258266e-01 -1.13810701314704e-01 + 1.60606060606061e+01 1.17565898671524e+00 1.29176297116898e-01 -1.19071521356745e-01 + 1.66666666666667e+01 1.16603643374085e+00 1.43801932752626e-01 -1.26420182833845e-01 + 1.72727272727273e+01 1.15901294982273e+00 1.58412873301332e-01 -1.33298298163097e-01 + 1.78787878787879e+01 1.15516613881923e+00 1.73005853001785e-01 -1.39601295567204e-01 + 1.84848484848485e+01 1.16035329239803e+00 1.87605989072833e-01 -1.43318174504004e-01 + 1.90909090909091e+01 1.16482121671689e+00 2.01471765042406e-01 -1.46723090792030e-01 + 1.96969696969697e+01 1.15241186617039e+00 2.11164662608912e-01 -1.52023933649729e-01 + 2.03030303030303e+01 1.14108152143087e+00 2.21109741610071e-01 -1.56986307485845e-01 + 2.09090909090909e+01 1.13083024354155e+00 2.31307016312692e-01 -1.61635219687799e-01 + 2.15151515151515e+01 1.12057896565223e+00 2.41504291015314e-01 -1.66292754579922e-01 + 2.21212121212121e+01 1.11061305902249e+00 2.51832144540440e-01 -1.70802437318188e-01 + 2.27272727272727e+01 1.10178834380504e+00 2.62682178999596e-01 -1.74726995984381e-01 + 2.33333333333333e+01 1.09296362858759e+00 2.73532213458751e-01 -1.78657586333139e-01 + 2.39393939393939e+01 1.08413891337014e+00 2.84382247917907e-01 -1.82623234550793e-01 + 2.45454545454545e+01 1.07704877435898e+00 2.95863171170336e-01 -1.86155882534370e-01 + 2.51515151515151e+01 1.07015136189154e+00 3.07414191669665e-01 -1.89640420415756e-01 + 2.57575757575758e+01 1.06325394942410e+00 3.18965212168995e-01 -1.93124958297141e-01 + 2.63636363636364e+01 1.05714092098968e+00 3.30902828470674e-01 -1.96422469773296e-01 + 2.69696969696970e+01 1.05155089650575e+00 3.43098215358386e-01 -1.99595277603454e-01 + 2.75757575757576e+01 1.04596087202182e+00 3.55293602246098e-01 -2.02768085433612e-01 + 2.81818181818182e+01 1.04062530585900e+00 3.67663996814596e-01 -2.05879229073642e-01 + 2.87878787878788e+01 1.03588342484769e+00 3.80442707609625e-01 -2.08846501945758e-01 + 2.93939393939394e+01 1.03114154383638e+00 3.93221418404654e-01 -2.11813774817874e-01 + 3.00000000000000e+01 1.02639966282507e+00 4.06000129199683e-01 -2.14781047689990e-01 + 3.30000000000000e+01 1.00573804168069e+00 4.72583293422338e-01 -2.28629026765098e-01 + 3.60000000000000e+01 9.85833707743003e-01 5.41941245231535e-01 -2.41944387146083e-01 + 3.90000000000000e+01 9.64635684439964e-01 6.13911269891018e-01 -2.55359517097689e-01 + 4.20000000000000e+01 9.39853820984217e-01 6.87471272303016e-01 -2.68402760096020e-01 + 4.50000000000000e+01 9.13773877837909e-01 7.61422951679187e-01 -2.81321973111748e-01 + 4.80000000000000e+01 8.80499938641377e-01 8.35214742285566e-01 -2.93829895857158e-01 + 5.10000000000000e+01 8.43049140618493e-01 9.07414892614859e-01 -3.06092438249886e-01 + 5.40000000000000e+01 7.97244356422135e-01 9.76431660067036e-01 -3.17878305263492e-01 + 5.70000000000000e+01 7.51439922147286e-01 1.04544790027186e+00 -3.29653788801724e-01 + 6.00000000000000e+01 7.05635662831859e-01 1.11446387685501e+00 -3.41419875328892e-01 + 6.30000000000000e+01 6.43935405201049e-01 1.17011397781587e+00 -3.51824168446815e-01 + 6.60000000000000e+01 5.82235011316305e-01 1.22576396420997e+00 -3.62218653318893e-01 + 6.90000000000000e+01 5.20534617431561e-01 1.28141395060407e+00 -3.72603978485147e-01 + 7.20000000000000e+01 4.51293480954431e-01 1.32353369994026e+00 -3.81654848148536e-01 + 7.50000000000000e+01 3.78282127550152e-01 1.35888860772946e+00 -3.90032025372884e-01 + 7.80000000000000e+01 3.05269896475863e-01 1.39424392065773e+00 -3.98398550132911e-01 + 8.10000000000000e+01 2.30935739780878e-01 1.42133853168932e+00 -4.05862264958857e-01 + 8.40000000000000e+01 1.53957823095881e-01 1.43191230914291e+00 -4.11528875629133e-01 + 8.70000000000000e+01 7.69789183415259e-02 1.44248616737432e+00 -4.17182529414559e-01 + 9.00000000000000e+01 -3.36313787592115e-07 1.45305993400564e+00 -4.22823883213375e-01 + 9.30000000000000e+01 -5.38853538885643e-02 1.44248615655205e+00 -4.25531830444160e-01 + 9.60000000000000e+01 -1.07770377288908e-01 1.43191233870989e+00 -4.28239883474790e-01 + 9.90000000000000e+01 -1.61655412340595e-01 1.42133844008909e+00 -4.30948043344561e-01 + 1.02000000000000e+02 -2.13689029593013e-01 1.39424374942488e+00 -4.30426032722678e-01 + 1.05000000000000e+02 -2.64796957994024e-01 1.35888884163568e+00 -4.28288858720630e-01 + 1.08000000000000e+02 -3.15905431030774e-01 1.32353352870914e+00 -4.26150923676660e-01 + 1.11000000000000e+02 -3.64374322762835e-01 1.28141346851316e+00 -4.22781294573843e-01 + 1.14000000000000e+02 -4.07564132273452e-01 1.22576411981700e+00 -4.16948201170771e-01 + 1.17000000000000e+02 -4.50754244383126e-01 1.17011434599327e+00 -4.11114214652485e-01 + 1.20000000000000e+02 -4.93944486037582e-01 1.11446433346109e+00 -4.05279567496773e-01 + 1.23000000000000e+02 -5.26007827556164e-01 1.04544835687794e+00 -3.97635867656992e-01 + 1.26000000000000e+02 -5.58071091549210e-01 9.76432116678355e-01 -3.89990992242211e-01 + 1.29000000000000e+02 -5.90134200485389e-01 9.07415349226176e-01 -3.82344714919725e-01 + 1.32000000000000e+02 -6.14671501318397e-01 8.35161838486048e-01 -3.75290062239593e-01 + 1.35000000000000e+02 -6.35445907015363e-01 7.61289959942459e-01 -3.68529899569896e-01 + 1.38000000000000e+02 -6.56219474668182e-01 6.87418368921679e-01 -3.61767875968571e-01 + 1.41000000000000e+02 -6.74909652901486e-01 6.14953590391588e-01 -3.56786256817077e-01 + 1.44000000000000e+02 -6.89433035390160e-01 5.45302448258410e-01 -3.55365699643800e-01 + 1.47000000000000e+02 -7.03955906925430e-01 4.75651465566945e-01 -3.53940753692651e-01 + 1.50000000000000e+02 -7.18478522993120e-01 4.06000562593488e-01 -3.52511578047886e-01 + 1.53000000000000e+02 -7.42629245947763e-01 3.49402521602820e-01 -3.67942713897313e-01 + 1.56000000000000e+02 -7.66779899087500e-01 2.92804540889390e-01 -3.83374818114856e-01 + 1.59000000000000e+02 -7.91051572510474e-01 2.36206619897226e-01 -3.98807852435555e-01 + 1.62000000000000e+02 -7.19307409708115e-01 1.95606690636341e-01 -4.23162217489700e-01 + 1.65000000000000e+02 -5.99422550148399e-01 1.63005892539676e-01 -4.51976932817733e-01 + 1.68000000000000e+02 -4.72905933087606e-01 1.30404868023183e-01 -4.80790683446680e-01 + 1.71000000000000e+02 -3.52738917050312e-01 9.78037326537191e-02 -4.50000513056908e-01 + 1.74000000000000e+02 -2.35159145800089e-01 6.52023755731394e-02 -2.99999717902353e-01 + 1.77000000000000e+02 -1.16216409329782e-01 5.38259028959444e-02 -1.48221036446267e-01 + 1.80000000000000e+02 0.00000000000000e+00 5.30837886627506e-02 0.00000000000000e+00 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_11.dat b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_11.dat new file mode 100644 index 000000000..742ec4f51 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_11.dat @@ -0,0 +1,254 @@ +! ------------ AirfoilInfo v1.01.x Input File ---------------------------------- +! AeroElasticSE FAST driver +! line +! line +! ------------------------------------------------------------------------------ +DEFAULT InterpOrd ! Interpolation order to use for quasi-steady table lookup {1=linear; 3=cubic spline; "default"} [default=3] +1 NonDimArea ! The non-dimensional area of the airfoil (area/chord^2) (set to 1.0 if unsure or unneeded) +@"NREL-2p8-127_AF11_Coords.txt" NumCoords ! The number of coordinates in the airfoil shape file. Set to zero if coordinates not included. +AF11_BL.txt BL_file ! The file name including the boundary layer characteristics of the profile. Ignored if the aeroacoustic module is not called. +1 NumTabs ! Number of airfoil tables in this file. Each table must have lines for Re and Ctrl. +! ------------------------------------------------------------------------------ +! data for table 1 +! ------------------------------------------------------------------------------ +6.000000 Re ! Reynolds number in millions +0 Ctrl ! Control setting (must be 0 for current AirfoilInfo) +True InclUAdata ! Is unsteady aerodynamics data included in this table? If TRUE, then include 30 UA coefficients below this line +!........................................ +-2.081115 alpha0 ! 0-lift angle of attack, depends on airfoil. +11.269045 alpha1 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA>alpha0. (deg) +-8.662155 alpha2 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA1] +0.000000 S2 ! Constant in the f curve best-fit for AOA> alpha1; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S3 ! Constant in the f curve best-fit for alpha2<=AOA< alpha0; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S4 ! Constant in the f curve best-fit for AOA< alpha2; by definition it depends on the airfoil. [ignored if UAMod<>1] +1.400649 Cn1 ! Critical value of C0n at leading edge separation. It should be extracted from airfoil data at a given Mach and Reynolds number. It can be calculated from the static value of Cn at either the break in the pitching moment or the loss of chord force at the onset of stall. It is close to the condition of maximum lift of the airfoil at low Mach numbers. +-0.915233 Cn2 ! As Cn1 for negative AOAs. +Default St_sh ! Strouhal's shedding frequency constant. [default = 0.19] +0.010727 Cd0 ! 2D drag coefficient value at 0-lift. +-0.065156 Cm0 ! 2D pitching moment coefficient about 1/4-chord location, at 0-lift, positive if nose up. [If the aerodynamics coefficients table does not include a column for Cm, this needs to be set to 0.0] +0.000000 k0 ! Constant in the \hat(x)_cp curve best-fit; = (\hat(x)_AC-0.25). [ignored if UAMod<>1] +0.000000 k1 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k2 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k3 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k1_hat ! Constant in the expression of Cc due to leading edge vortex effects. [ignored if UAMod<>1] +Default x_cp_bar ! Constant in the expression of \hat(x)_cp^v. [ignored if UAMod<>1, default = 0.2] +Default UACutout ! Angle of attack above which unsteady aerodynamics are disabled (deg). [Specifying the string "Default" sets UACutout to 45 degrees] +Default filtCutOff ! Cut-off frequency (-3 dB corner frequency) for low-pass filtering the AoA input to UA, as well as the 1st and 2nd derivatives (Hz) [default = 20] +!........................................ +! Table of aerodynamics coefficients +200 NumAlf ! Number of data lines in the following table +! Alpha Cl Cd Cm +! (deg) (-) (-) (-) +-1.80000000000000e+02 0.00000000000000e+00 5.17338093025581e-02 0.00000000000000e+00 +-1.77000000000000e+02 1.20610218452195e-01 5.17338093025581e-02 1.18763338610947e-01 +-1.74000000000000e+02 2.43846180796722e-01 6.20803661366883e-02 2.39999774321882e-01 +-1.71000000000000e+02 3.65769725958049e-01 9.31203763075915e-02 3.60000410445527e-01 +-1.68000000000000e+02 4.84069232089561e-01 1.24885380987671e-01 3.21035049116140e-01 +-1.65000000000000e+02 6.01637542467089e-01 1.57012874460584e-01 2.02588544427697e-01 +-1.62000000000000e+02 7.13153594297870e-01 1.89140896133777e-01 8.41409821795466e-02 +-1.59000000000000e+02 7.80068980000668e-01 2.29356923814875e-01 7.97341748695581e-03 +-1.56000000000000e+02 7.58681265140819e-01 2.85748689900454e-01 1.75916291927228e-02 +-1.53000000000000e+02 7.37716006162308e-01 3.42140486787254e-01 2.79764209288751e-02 +-1.50000000000000e+02 7.16750629236893e-01 3.98532330574024e-01 3.87597184159220e-02 +-1.47000000000000e+02 7.02430836152056e-01 4.68441880461646e-01 5.28948486721724e-02 +-1.44000000000000e+02 6.88110788374351e-01 5.38351550730586e-01 6.70401805724200e-02 +-1.41000000000000e+02 6.73790231192722e-01 6.08261461770758e-01 8.11976416970075e-02 +-1.38000000000000e+02 6.55253757939153e-01 6.81025000549314e-01 9.58313303466701e-02 +-1.35000000000000e+02 6.34609335202059e-01 7.55215347408169e-01 1.10704411230940e-01 +-1.32000000000000e+02 6.13964075900703e-01 8.29406104470313e-01 1.25585263221553e-01 +-1.29000000000000e+02 5.89541757042321e-01 9.01995435488593e-01 1.40592248603482e-01 +-1.26000000000000e+02 5.57565301171594e-01 9.71381906816171e-01 1.55841088781127e-01 +-1.23000000000000e+02 5.25588689582014e-01 1.04076784806681e+00 1.71097114222845e-01 +-1.20000000000000e+02 4.93612000135919e-01 1.11015352428889e+00 1.86361656418168e-01 +-1.17000000000000e+02 4.50478535342387e-01 1.16621180599633e+00 2.00629220653074e-01 +-1.14000000000000e+02 4.07345160141662e-01 1.22226984751125e+00 2.14906094089605e-01 +-1.11000000000000e+02 3.64212007755362e-01 1.27832746077970e+00 2.29193883251082e-01 +-1.08000000000000e+02 3.15783665079539e-01 1.32087403967776e+00 2.41716558401183e-01 +-1.05000000000000e+02 2.64707686941683e-01 1.35666499851025e+00 2.53364833576556e-01 +-1.02000000000000e+02 2.13632134040282e-01 1.39245554721333e+00 2.65031201575310e-01 +-9.90000000000000e+01 1.61623631750871e-01 1.41999044316543e+00 2.75316312995168e-01 +-9.60000000000000e+01 1.07749190274494e-01 1.43101367601985e+00 2.82819378442760e-01 +-9.30000000000000e+01 5.38747603685306e-02 1.44203682466298e+00 2.90359307559513e-01 +-9.00000000000000e+01 3.36247670192969e-07 1.45305993120123e+00 2.97951186065388e-01 +-8.70000000000000e+01 -5.38747052280345e-02 1.44203683594514e+00 3.01753424548436e-01 +-8.40000000000000e+01 -1.07749340919434e-01 1.43101364519643e+00 3.05884772088962e-01 +-8.10000000000000e+01 -1.61623165043989e-01 1.41999053865818e+00 3.10613470732064e-01 +-7.80000000000000e+01 -2.13631886668320e-01 1.39245572055610e+00 3.10674655777832e-01 +-7.50000000000000e+01 -2.64708024854679e-01 1.35666476172186e+00 3.08542976324719e-01 +-7.20000000000000e+01 -3.15783417710861e-01 1.32087421301878e+00 3.06409302975954e-01 +-6.90000000000000e+01 -3.64211634092392e-01 1.27832794640741e+00 3.03044729448568e-01 +-6.60000000000000e+01 -4.07345280750829e-01 1.22226969076263e+00 2.97219713108405e-01 +-6.30000000000000e+01 -4.50478820711274e-01 1.16621143511785e+00 2.91391620398543e-01 +-6.00000000000000e+01 -4.93612211692021e-01 1.11015306523689e+00 2.85560191488404e-01 +-5.70000000000000e+01 -5.25588901138117e-01 1.04076738901481e+00 2.77925669828566e-01 +-5.40000000000000e+01 -5.57565512726151e-01 9.71381447758911e-01 2.70286195661910e-01 +-5.10000000000000e+01 -5.89541968596878e-01 9.01994976431333e-01 2.62640680641497e-01 +-4.80000000000000e+01 -6.15651105875399e-01 8.29449803698678e-01 2.55153878770895e-01 +-4.50000000000000e+01 -6.38826678153933e-01 7.55325331028288e-01 2.47739559108878e-01 +-4.20000000000000e+01 -6.56940774711891e-01 6.81068699431397e-01 2.41608950158798e-01 +-3.90000000000000e+01 -6.74138230588866e-01 6.07210570957826e-01 2.36033756265024e-01 +-3.60000000000000e+01 -6.88800358432074e-01 5.34964795566947e-01 2.32526368115935e-01 +-3.30000000000000e+01 -7.02527481598747e-01 4.65352126226771e-01 2.31660096996564e-01 +-3.00000000000000e+01 -7.16750731841146e-01 3.98531895640176e-01 2.33717011176468e-01 +-2.93939393939394e+01 -7.20014368241707e-01 3.85709000620782e-01 2.34916176725143e-01 +-2.87878787878788e+01 -7.23278004642269e-01 3.72886105601387e-01 2.36115342273819e-01 +-2.81818181818182e+01 -7.26541641042830e-01 3.60063210581993e-01 2.37314507822494e-01 +-2.75757575757576e+01 -7.30215084645349e-01 3.47650566598554e-01 2.39067661935682e-01 +-2.69696969696970e+01 -7.34064174972939e-01 3.35413759571076e-01 2.41058260087479e-01 +-2.63636363636364e+01 -7.37913265300529e-01 3.23176952543597e-01 2.43048858239275e-01 +-2.57575757575758e+01 -7.42124844608794e-01 3.11199070884588e-01 2.45450980247116e-01 +-2.51515151515151e+01 -7.46880072905424e-01 2.99609516932444e-01 2.48470292128175e-01 +-2.45454545454545e+01 -7.51635301202054e-01 2.88019962980301e-01 2.51489604009234e-01 +-2.39393939393939e+01 -7.56524250108274e-01 2.76500794819509e-01 2.54645697570981e-01 +-2.33333333333333e+01 -7.62616710389763e-01 2.65615112407906e-01 2.59032852740507e-01 +-2.27272727272727e+01 -7.68709170671251e-01 2.54729429996303e-01 2.63911099891641e-01 +-2.21212121212121e+01 -7.74801630952739e-01 2.43843747584701e-01 2.68391913865235e-01 +-2.15151515151515e+01 -7.93896255075763e-01 2.34765567487007e-01 2.69219982182975e-01 +-2.09090909090909e+01 -8.19588776751072e-01 2.26139379234369e-01 2.68013679183985e-01 +-2.03030303030303e+01 -8.41755850773015e-01 2.17513190981731e-01 2.66455457580854e-01 +-1.96969696969697e+01 -8.57132969513166e-01 2.09138320990721e-01 2.57323288186467e-01 +-1.90909090909091e+01 -8.65913538616401e-01 2.01014755044168e-01 2.40703240782996e-01 +-1.84848484848485e+01 -8.74215029540216e-01 1.93152415327005e-01 2.24051125011634e-01 +-1.78787878787879e+01 -8.82246941494251e-01 1.85271935431753e-01 2.07713877216966e-01 +-1.72727272727273e+01 -8.90112513417619e-01 1.76753055824415e-01 1.91533915208804e-01 +-1.66666666666667e+01 -8.97867665288278e-01 1.69666716562767e-01 1.75354108708192e-01 +-1.60606060606061e+01 -9.05545956258092e-01 1.62769575158031e-01 1.59174429439710e-01 +-1.54545454545455e+01 -9.05500228357417e-01 1.54709519958352e-01 1.44263287105186e-01 +-1.48484848484848e+01 -9.00650490354814e-01 1.45972869299812e-01 1.30048437843628e-01 +-1.42424242424242e+01 -8.83881928212747e-01 1.35695161200991e-01 1.18061058367204e-01 +-1.36363636363636e+01 -8.65135255067798e-01 1.25196579166224e-01 1.06372832901923e-01 +-1.30303030303030e+01 -8.44949235869776e-01 1.14536353092698e-01 9.41922629526705e-02 +-1.24242424242424e+01 -8.23438097507769e-01 1.04071539255474e-01 8.07476005612591e-02 +-1.18181818181818e+01 -8.01578346336287e-01 9.39351009261381e-02 6.72989309058954e-02 +-1.12121212121212e+01 -7.79436133521223e-01 8.45784112226453e-02 5.39664027575017e-02 +-1.06060606060606e+01 -7.56125420814654e-01 7.56686775243057e-02 4.13015037835521e-02 +-1.00000000000000e+01 -7.31404178229205e-01 6.69542054267392e-02 2.90154450614047e-02 +-9.39393939393939e+00 -7.10908164656284e-01 5.62659422161747e-02 1.61336287291465e-02 +-8.78787878787879e+00 -6.93895499794178e-01 4.51632034246090e-02 3.66630892977488e-03 +-8.18181818181818e+00 -6.82305849045296e-01 3.46949966165822e-02 -8.06490144015382e-03 +-7.57575757575758e+00 -6.41809741158512e-01 2.77831234233813e-02 -1.41096615374045e-02 +-6.96969696969697e+00 -5.88143925838256e-01 2.28417438781606e-02 -1.78405462944423e-02 +-6.36363636363636e+00 -5.18595414594118e-01 1.94965813878357e-02 -2.29439868991729e-02 +-5.75757575757576e+00 -4.47723085873360e-01 1.68485236815072e-02 -2.81966573016451e-02 +-5.15151515151515e+00 -3.75142989396497e-01 1.49610810018752e-02 -3.47182225820690e-02 +-4.54545454545454e+00 -3.00787223897522e-01 1.34635952053030e-02 -4.14011501128667e-02 +-3.93939393939394e+00 -2.25750200730196e-01 1.21953572497309e-02 -4.79556483496797e-02 +-3.33333333333333e+00 -1.53097407752943e-01 1.17061671579090e-02 -5.41961908245246e-02 +-2.72727272727273e+00 -7.95718917516246e-02 1.12293922425528e-02 -5.97874291038278e-02 +-2.12121212121212e+00 -5.03539621814182e-03 1.07440480589344e-02 -6.48477030716386e-02 +-1.51515151515152e+00 7.10741171824617e-02 1.04901796827387e-02 -6.95072912947862e-02 +-9.09090909090912e-01 1.47800523968434e-01 1.03183543231236e-02 -7.40089097305715e-02 +-3.03030303030302e-01 2.25712116064930e-01 1.02530762212861e-02 -7.84452609734865e-02 + 3.03030303030302e-01 3.04012747719234e-01 1.02309881009218e-02 -8.25691600591865e-02 + 9.09090909090912e-01 3.82711307380014e-01 1.02503405435553e-02 -8.63962105538320e-02 + 1.51515151515152e+00 4.61756851424667e-01 1.03813057971860e-02 -9.01104450324160e-02 + 2.12121212121212e+00 5.40685036400329e-01 1.05415949817604e-02 -9.35850435449342e-02 + 2.72727272727273e+00 6.18886227271413e-01 1.07445792627915e-02 -9.62817005798321e-02 + 3.33333333333333e+00 6.96227792951118e-01 1.09887579176491e-02 -9.86711658811812e-02 + 3.93939393939394e+00 7.72883389885004e-01 1.12344879960209e-02 -1.00807961075492e-01 + 4.54545454545455e+00 8.47551890939517e-01 1.15551058195410e-02 -1.02885524901180e-01 + 5.15151515151515e+00 9.21271553826334e-01 1.18923634479442e-02 -1.04819428291073e-01 + 5.75757575757576e+00 9.92784335144794e-01 1.22610882531594e-02 -1.06359973327630e-01 + 6.36363636363637e+00 1.06131473281146e+00 1.27079774642478e-02 -1.07580975239224e-01 + 6.96969696969697e+00 1.12787422242318e+00 1.32063108971969e-02 -1.08587510060800e-01 + 7.57575757575757e+00 1.18885675085141e+00 1.38302419296642e-02 -1.09502885178324e-01 + 8.18181818181818e+00 1.24720837846946e+00 1.45051079826196e-02 -1.10383577044148e-01 + 8.78787878787879e+00 1.30109155320978e+00 1.52650096833159e-02 -1.11295079946526e-01 + 9.39393939393939e+00 1.34910270552171e+00 1.69597298070715e-02 -1.11617299458299e-01 + 1.00000000000000e+01 1.39122211758901e+00 1.92951287014474e-02 -1.11579588588804e-01 + 1.06060606060606e+01 1.41374692668675e+00 2.32087315726581e-02 -1.10700973175584e-01 + 1.12121212121212e+01 1.42235063763216e+00 2.80043073060677e-02 -1.09633362298298e-01 + 1.18181818181818e+01 1.40509952208549e+00 3.36675325297581e-02 -1.08071370626820e-01 + 1.24242424242424e+01 1.36098461886640e+00 4.53311237959958e-02 -1.09677679611616e-01 + 1.30303030303030e+01 1.27121985294027e+00 5.94850170456720e-02 -1.12451230995673e-01 + 1.36363636363636e+01 1.23331688079203e+00 7.12491888525373e-02 -1.11569128322250e-01 + 1.42424242424242e+01 1.19929983782480e+00 8.34701602960147e-02 -1.10866527861742e-01 + 1.48484848484848e+01 1.17429197921907e+00 9.63163863742802e-02 -1.10364535193828e-01 + 1.54545454545455e+01 1.15693155875190e+00 1.09918192046590e-01 -1.12997477778780e-01 + 1.60606060606061e+01 1.14266018641121e+00 1.23724487625457e-01 -1.16993403213071e-01 + 1.66666666666667e+01 1.13325405216419e+00 1.37104753717798e-01 -1.22803327538571e-01 + 1.72727272727273e+01 1.12686629586509e+00 1.50546395471717e-01 -1.28360097087402e-01 + 1.78787878787879e+01 1.12416770644291e+00 1.64063052701384e-01 -1.33607452032450e-01 + 1.84848484848485e+01 1.13139272733087e+00 1.78010604421774e-01 -1.37206719425119e-01 + 1.90909090909091e+01 1.13867731668370e+00 1.91501101195136e-01 -1.40692310188144e-01 + 1.96969696969697e+01 1.13223871836009e+00 2.01790232355546e-01 -1.45868712277606e-01 + 2.03030303030303e+01 1.12592570808589e+00 2.12197188791206e-01 -1.50881669040385e-01 + 2.09090909090909e+01 1.11973829296607e+00 2.22721977167913e-01 -1.55819852215318e-01 + 2.15151515151515e+01 1.11355087784625e+00 2.33246765544621e-01 -1.60788589705368e-01 + 2.21212121212121e+01 1.10686018543461e+00 2.43843747584701e-01 -1.65603019715883e-01 + 2.27272727272727e+01 1.09815690169093e+00 2.54729429996303e-01 -1.69822108656288e-01 + 2.33333333333333e+01 1.08945361794725e+00 2.65615112407906e-01 -1.74062570732705e-01 + 2.39393939393939e+01 1.08075033420357e+00 2.76500794819509e-01 -1.78427259605238e-01 + 2.45454545454545e+01 1.07376593672417e+00 2.88019962980301e-01 -1.82284015244859e-01 + 2.51515151515151e+01 1.06697252249912e+00 2.99609516932444e-01 -1.86084335072627e-01 + 2.57575757575758e+01 1.06017910827406e+00 3.11199070884588e-01 -1.89884654900395e-01 + 2.63636363636364e+01 1.05416214500944e+00 3.23176952543597e-01 -1.93462066542360e-01 + 2.69696969696970e+01 1.04866289615838e+00 3.35413759571076e-01 -1.96890849633946e-01 + 2.75757575757576e+01 1.04316364730731e+00 3.47650566598554e-01 -2.00319632725532e-01 + 2.81818181818182e+01 1.03791578996892e+00 3.60063210581993e-01 -2.03673565505490e-01 + 2.87878787878788e+01 1.03325446250951e+00 3.72886105601387e-01 -2.06852862539969e-01 + 2.93939393939394e+01 1.02859313505011e+00 3.85709000620782e-01 -2.10032159574448e-01 + 3.00000000000000e+01 1.02393180759070e+00 3.98531895640176e-01 -2.13211456608927e-01 + 3.30000000000000e+01 1.00360981651186e+00 4.65352126226771e-01 -2.27906428002545e-01 + 3.60000000000000e+01 9.84001264428555e-01 5.34964795566947e-01 -2.41925534967727e-01 + 3.90000000000000e+01 9.63054591373508e-01 6.07210570957826e-01 -2.55861101384382e-01 + 4.20000000000000e+01 9.38486939161695e-01 6.81068699431397e-01 -2.69396898615722e-01 + 4.50000000000000e+01 9.12610178291857e-01 7.55325331028288e-01 -2.82806077238433e-01 + 4.80000000000000e+01 8.79501806448111e-01 8.29449803698678e-01 -2.95759616602379e-01 + 5.10000000000000e+01 8.42202650323331e-01 9.01994976431333e-01 -3.08464526695633e-01 + 5.40000000000000e+01 7.96521656220475e-01 9.71381447758911e-01 -3.20679850937119e-01 + 5.70000000000000e+01 7.50841011093444e-01 1.04076738901481e+00 -3.32886639691835e-01 + 6.00000000000000e+01 7.05160540452998e-01 1.11015306523690e+00 -3.45085056710935e-01 + 6.30000000000000e+01 6.43541341893905e-01 1.16621143511785e+00 -3.55934491344085e-01 + 6.60000000000000e+01 5.81922006714618e-01 1.22226969076263e+00 -3.66774194260320e-01 + 6.90000000000000e+01 5.20302671535330e-01 1.27832794640741e+00 -3.77604487698421e-01 + 7.20000000000000e+01 4.51119501480277e-01 1.32087421301878e+00 -3.87119214978594e-01 + 7.50000000000000e+01 3.78154568829116e-01 1.35666476172186e+00 -3.95968866317771e-01 + 7.80000000000000e+01 3.05188640011092e-01 1.39245572055610e+00 -4.04806568926510e-01 + 8.10000000000000e+01 2.30890390081552e-01 1.41999053865818e+00 -4.12748066743701e-01 + 8.40000000000000e+01 1.53927589898212e-01 1.43101364519643e+00 -4.18906566709380e-01 + 8.70000000000000e+01 7.69638017609944e-02 1.44203683594514e+00 -4.25049810698846e-01 + 9.00000000000000e+01 -3.36247670426886e-07 1.45305993120123e+00 -4.31178399042578e-01 + 9.30000000000000e+01 -5.38747603685306e-02 1.44203682466298e+00 -4.34104668279932e-01 + 9.60000000000000e+01 -1.07749190274494e-01 1.43101367601985e+00 -4.37031487108267e-01 + 9.90000000000000e+01 -1.61623631750871e-01 1.41999044316543e+00 -4.39958819257674e-01 + 1.02000000000000e+02 -2.13632134040282e-01 1.39245554721333e+00 -4.39636233003905e-01 + 1.05000000000000e+02 -2.64707686941683e-01 1.35666499851025e+00 -4.37688769297266e-01 + 1.08000000000000e+02 -3.15783665079539e-01 1.32087403967776e+00 -4.35740818710456e-01 + 1.11000000000000e+02 -3.64212007755363e-01 1.27832746077970e+00 -4.32550227083959e-01 + 1.14000000000000e+02 -4.07345160141662e-01 1.22226984751125e+00 -4.26873946888224e-01 + 1.17000000000000e+02 -4.50478535342387e-01 1.16621180599633e+00 -4.21196949202848e-01 + 1.20000000000000e+02 -4.93612000135919e-01 1.11015352428889e+00 -4.15519446213869e-01 + 1.23000000000000e+02 -5.25588689582014e-01 1.04076784806681e+00 -4.08013919223535e-01 + 1.26000000000000e+02 -5.57565301171594e-01 9.71381906816171e-01 -4.00507231110389e-01 + 1.29000000000000e+02 -5.89541757042322e-01 9.01995435488592e-01 -3.92999135332578e-01 + 1.32000000000000e+02 -6.13964075900704e-01 8.29406104470312e-01 -3.86098598415459e-01 + 1.35000000000000e+02 -6.34609335202059e-01 7.55215347408169e-01 -3.79500308090265e-01 + 1.38000000000000e+02 -6.55253757939153e-01 6.81025000549314e-01 -3.72899876934706e-01 + 1.41000000000000e+02 -6.73790231192722e-01 6.08261461770757e-01 -3.68126222376485e-01 + 1.44000000000000e+02 -6.88110788374351e-01 5.38351550730586e-01 -3.67006301532646e-01 + 1.47000000000000e+02 -7.02430836152056e-01 4.68441880461646e-01 -3.65881031661847e-01 + 1.50000000000000e+02 -7.16750629236893e-01 3.98532330574024e-01 -3.64750607711192e-01 + 1.53000000000000e+02 -7.34878858674711e-01 3.42608943418167e-01 -3.80350965963448e-01 + 1.56000000000000e+02 -7.53007027741238e-01 2.86685655813922e-01 -3.95955856199125e-01 + 1.59000000000000e+02 -7.71564544817183e-01 2.30762502127974e-01 -4.11565385415533e-01 + 1.62000000000000e+02 -7.00256219005735e-01 1.90909397104532e-01 -4.33416022361716e-01 + 1.65000000000000e+02 -5.83546590903823e-01 1.59091452320285e-01 -4.58385560746469e-01 + 1.68000000000000e+02 -4.58125712100344e-01 1.27273272145471e-01 -4.83354146585932e-01 + 1.71000000000000e+02 -3.41045278744180e-01 9.54550237835969e-02 -4.50000513056908e-01 + 1.74000000000000e+02 -2.27363439140247e-01 6.36366390444162e-02 -2.99999717902353e-01 + 1.77000000000000e+02 -1.12541609339478e-01 5.25040908476199e-02 -1.48454173263684e-01 + 1.80000000000000e+02 0.00000000000000e+00 5.17338093025581e-02 0.00000000000000e+00 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_12.dat b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_12.dat new file mode 100644 index 000000000..43ee56caf --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_12.dat @@ -0,0 +1,254 @@ +! ------------ AirfoilInfo v1.01.x Input File ---------------------------------- +! AeroElasticSE FAST driver +! line +! line +! ------------------------------------------------------------------------------ +DEFAULT InterpOrd ! Interpolation order to use for quasi-steady table lookup {1=linear; 3=cubic spline; "default"} [default=3] +1 NonDimArea ! The non-dimensional area of the airfoil (area/chord^2) (set to 1.0 if unsure or unneeded) +@"NREL-2p8-127_AF12_Coords.txt" NumCoords ! The number of coordinates in the airfoil shape file. Set to zero if coordinates not included. +AF12_BL.txt BL_file ! The file name including the boundary layer characteristics of the profile. Ignored if the aeroacoustic module is not called. +1 NumTabs ! Number of airfoil tables in this file. Each table must have lines for Re and Ctrl. +! ------------------------------------------------------------------------------ +! data for table 1 +! ------------------------------------------------------------------------------ +6.000000 Re ! Reynolds number in millions +0 Ctrl ! Control setting (must be 0 for current AirfoilInfo) +True InclUAdata ! Is unsteady aerodynamics data included in this table? If TRUE, then include 30 UA coefficients below this line +!........................................ +-2.104210 alpha0 ! 0-lift angle of attack, depends on airfoil. +11.449404 alpha1 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA>alpha0. (deg) +-8.941354 alpha2 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA1] +0.000000 S2 ! Constant in the f curve best-fit for AOA> alpha1; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S3 ! Constant in the f curve best-fit for alpha2<=AOA< alpha0; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S4 ! Constant in the f curve best-fit for AOA< alpha2; by definition it depends on the airfoil. [ignored if UAMod<>1] +1.433280 Cn1 ! Critical value of C0n at leading edge separation. It should be extracted from airfoil data at a given Mach and Reynolds number. It can be calculated from the static value of Cn at either the break in the pitching moment or the loss of chord force at the onset of stall. It is close to the condition of maximum lift of the airfoil at low Mach numbers. +-1.020492 Cn2 ! As Cn1 for negative AOAs. +Default St_sh ! Strouhal's shedding frequency constant. [default = 0.19] +0.010714 Cd0 ! 2D drag coefficient value at 0-lift. +-0.072028 Cm0 ! 2D pitching moment coefficient about 1/4-chord location, at 0-lift, positive if nose up. [If the aerodynamics coefficients table does not include a column for Cm, this needs to be set to 0.0] +0.000000 k0 ! Constant in the \hat(x)_cp curve best-fit; = (\hat(x)_AC-0.25). [ignored if UAMod<>1] +0.000000 k1 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k2 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k3 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k1_hat ! Constant in the expression of Cc due to leading edge vortex effects. [ignored if UAMod<>1] +Default x_cp_bar ! Constant in the expression of \hat(x)_cp^v. [ignored if UAMod<>1, default = 0.2] +Default UACutout ! Angle of attack above which unsteady aerodynamics are disabled (deg). [Specifying the string "Default" sets UACutout to 45 degrees] +Default filtCutOff ! Cut-off frequency (-3 dB corner frequency) for low-pass filtering the AoA input to UA, as well as the 1st and 2nd derivatives (Hz) [default = 20] +!........................................ +! Table of aerodynamics coefficients +200 NumAlf ! Number of data lines in the following table +! Alpha Cl Cd Cm +! (deg) (-) (-) (-) +-1.80000000000000e+02 0.00000000000000e+00 5.02017886725028e-02 0.00000000000000e+00 +-1.77000000000000e+02 1.16814702114733e-01 5.02017886725028e-02 1.18974998388536e-01 +-1.74000000000000e+02 2.35757260050863e-01 6.02419881354083e-02 2.39999774321882e-01 +-1.71000000000000e+02 3.53636476996742e-01 9.03629161351898e-02 3.60000410445527e-01 +-1.68000000000000e+02 4.69829759859863e-01 1.20986055059121e-01 3.19692038335689e-01 +-1.65000000000000e+02 5.86100406969184e-01 1.51860293583585e-01 1.99231033151485e-01 +-1.62000000000000e+02 6.97207018087719e-01 1.82735181026080e-01 7.87690618632042e-02 +-1.59000000000000e+02 7.65053274169454e-01 2.21992372815171e-01 4.59488938113571e-04 +-1.56000000000000e+02 7.47840212628704e-01 2.78013889729193e-01 8.23826475941633e-03 +-1.53000000000000e+02 7.31315050935883e-01 3.34035434615955e-01 1.69033914984109e-02 +-1.50000000000000e+02 7.14789733419415e-01 3.90057026535133e-01 2.57900977189505e-02 +-1.47000000000000e+02 7.00700113478808e-01 4.60260101212902e-01 4.02282514210461e-02 +-1.44000000000000e+02 6.86610239724511e-01 5.30463342418639e-01 5.46749993729137e-02 +-1.41000000000000e+02 6.72519858324716e-01 6.00666916692206e-01 6.91319722248670e-02 +-1.38000000000000e+02 6.54157816774948e-01 6.73769502775919e-01 8.40066813863651e-02 +-1.35000000000000e+02 6.33659953815723e-01 7.48321588883743e-01 9.90913902837609e-02 +-1.32000000000000e+02 6.13161255971681e-01 8.22874224418487e-01 1.14182857514007e-01 +-1.29000000000000e+02 5.88869424113624e-01 8.95844660221988e-01 1.29408668138862e-01 +-1.26000000000000e+02 5.56991306252975e-01 9.65650689048611e-01 1.44894245978222e-01 +-1.23000000000000e+02 5.25113031922222e-01 1.03545618459309e+00 1.60385940835181e-01 +-1.20000000000000e+02 4.93234679359342e-01 1.10526141350648e+00 1.75884859665492e-01 +-1.17000000000000e+02 4.50165647641462e-01 1.16178301844503e+00 1.90450025251094e-01 +-1.14000000000000e+02 4.07096660176995e-01 1.21830438150688e+00 2.05022854430753e-01 +-1.11000000000000e+02 3.64027804983567e-01 1.27482531278278e+00 2.19604660336798e-01 +-1.08000000000000e+02 3.15645479300682e-01 1.31785592534089e+00 2.32463316412531e-01 +-1.05000000000000e+02 2.64606377915867e-01 1.35414127581743e+00 2.44466971927803e-01 +-1.02000000000000e+02 2.13567566267535e-01 1.39042621049931e+00 2.56485516539190e-01 +-9.90000000000000e+01 1.61587565629768e-01 1.41846067229841e+00 2.67134366691667e-01 +-9.60000000000000e+01 1.07725146245282e-01 1.42999383096059e+00 2.75027548957952e-01 +-9.30000000000000e+01 5.38627383393683e-02 1.44152690151593e+00 2.82950978094881e-01 +-9.00000000000000e+01 3.36172637297600e-07 1.45305992801866e+00 2.90917363787953e-01 +-8.70000000000000e+01 -5.38626832111768e-02 1.44152691331999e+00 2.94767512788956e-01 +-8.40000000000000e+01 -1.07725296856606e-01 1.42999379871131e+00 2.98897742164918e-01 +-8.10000000000000e+01 -1.61587099027032e-01 1.41846077220858e+00 3.03536772948404e-01 +-7.80000000000000e+01 -2.13567319073521e-01 1.39042638623652e+00 3.03702648984174e-01 +-7.50000000000000e+01 -2.64606715585627e-01 1.35414103575821e+00 3.01751455652536e-01 +-7.20000000000000e+01 -3.15645232110603e-01 1.31785610107633e+00 2.99797410104482e-01 +-6.90000000000000e+01 -3.64027431877603e-01 1.27482580242423e+00 2.96601873383554e-01 +-6.60000000000000e+01 -4.07096780606374e-01 1.21830422346273e+00 2.90925626936627e-01 +-6.30000000000000e+01 -4.50165932584065e-01 1.16178264450123e+00 2.85244623169737e-01 +-6.00000000000000e+01 -4.93234890264853e-01 1.10526095167874e+00 2.79558323005520e-01 +-5.70000000000000e+01 -5.25113242827733e-01 1.03545572276536e+00 2.72051789581655e-01 +-5.40000000000000e+01 -5.56991517156933e-01 9.65650227215581e-01 2.64537349061016e-01 +-5.10000000000000e+01 -5.88869635017581e-01 8.95844198388958e-01 2.57013385477719e-01 +-4.80000000000000e+01 -6.14858281985569e-01 8.22907477862781e-01 2.49649988716779e-01 +-4.50000000000000e+01 -6.37902288159362e-01 7.48405461801475e-01 2.42355684979480e-01 +-4.20000000000000e+01 -6.55854829508633e-01 6.73802755955525e-01 2.36361332357867e-01 +-3.90000000000000e+01 -6.72882108422873e-01 5.99606299882174e-01 2.30958164591745e-01 +-3.60000000000000e+01 -6.87344655388143e-01 5.27047589477837e-01 2.27795230971316e-01 +-3.30000000000000e+01 -7.00836969047683e-01 4.57145854597990e-01 2.27367173402586e-01 +-3.00000000000000e+01 -7.14789834137016e-01 3.90056589853572e-01 2.29972174924480e-01 +-2.93939393939394e+01 -7.17989820447135e-01 3.77183552479970e-01 2.31313103482737e-01 +-2.87878787878788e+01 -7.21189806757255e-01 3.64310515106369e-01 2.32654032040993e-01 +-2.81818181818182e+01 -7.24389793067374e-01 3.51437477732768e-01 2.33994960599249e-01 +-2.75757575757576e+01 -7.27993615957789e-01 3.38976887108657e-01 2.35912898360177e-01 +-2.69696969696970e+01 -7.31770526515904e-01 3.26693074541322e-01 2.38078146993880e-01 +-2.63636363636364e+01 -7.35547437074019e-01 3.14409261973987e-01 2.40243395627583e-01 +-2.57575757575758e+01 -7.39682607350460e-01 3.02385685277020e-01 2.42838068946369e-01 +-2.51515151515151e+01 -7.44355083707426e-01 2.90752401734336e-01 2.46076779209917e-01 +-2.45454545454545e+01 -7.49027560064392e-01 2.79119118191653e-01 2.49315489473464e-01 +-2.39393939393939e+01 -7.53832399461519e-01 2.67556547894255e-01 2.52697168932637e-01 +-2.33333333333333e+01 -7.59828531846218e-01 2.56630410494836e-01 2.57365598831951e-01 +-2.27272727272727e+01 -7.65824664230917e-01 2.45704273095417e-01 2.62833561583836e-01 +-2.21212121212121e+01 -7.71820796615617e-01 2.34778135695999e-01 2.67654474711527e-01 +-2.15151515151515e+01 -7.96443477215383e-01 2.26676404363075e-01 2.64351420041365e-01 +-2.09090909090909e+01 -8.30849944454416e-01 2.19280956225120e-01 2.57191864213633e-01 +-2.03030303030303e+01 -8.61239798275855e-01 2.11885508087165e-01 2.49459359740882e-01 +-1.96969696969697e+01 -8.86851353917406e-01 2.04664215991167e-01 2.36345486505374e-01 +-1.90909090909091e+01 -9.07849523166766e-01 1.97617070085050e-01 2.17989979126022e-01 +-1.84848484848485e+01 -9.28438728259752e-01 1.90994947917113e-01 1.99581867965191e-01 +-1.78787878787879e+01 -9.48798009848073e-01 1.84343308202159e-01 1.81686497656418e-01 +-1.72727272727273e+01 -9.69015714430469e-01 1.76652563396641e-01 1.64047931232961e-01 +-1.66666666666667e+01 -9.89139234078135e-01 1.70406496274106e-01 1.46409370226095e-01 +-1.60606060606061e+01 -1.00919719372332e+00 1.64405524173896e-01 1.28770813650940e-01 +-1.54545454545455e+01 -1.01540755504446e+00 1.56862910031355e-01 1.13470810022679e-01 +-1.48484848484848e+01 -1.01298433891169e+00 1.48403778032376e-01 9.94548755135208e-02 +-1.42424242424242e+01 -9.89203767259323e-01 1.37794975860024e-01 8.94257900471029e-02 +-1.36363636363636e+01 -9.62014659606293e-01 1.26881241910317e-01 7.98089478777152e-02 +-1.30303030303030e+01 -9.32449292572719e-01 1.15751868266820e-01 6.93414419906876e-02 +-1.24242424242424e+01 -9.00792491049511e-01 1.04900663581092e-01 5.67713948672409e-02 +-1.18181818181818e+01 -8.68848659795491e-01 9.45041039998393e-02 4.42375285802314e-02 +-1.12121212121212e+01 -8.36808576348847e-01 8.51661045609216e-02 3.19958406592258e-02 +-1.06060606060606e+01 -8.03284211237670e-01 7.64433166380479e-02 2.09106002122012e-02 +-1.00000000000000e+01 -7.68096954585546e-01 6.80130732444816e-02 1.04779161942864e-02 +-9.39393939393939e+00 -7.39737601227035e-01 5.68394250941624e-02 -1.00892879318824e-03 +-8.78787878787879e+00 -7.17791627668883e-01 4.50577060106998e-02 -1.17953152141081e-02 +-8.18181818181818e+00 -7.04457618185764e-01 3.35556812007792e-02 -2.13372325268140e-02 +-7.57575757575758e+00 -6.63232806034972e-01 2.62982027978296e-02 -2.60669251138793e-02 +-6.96969696969697e+00 -6.08991380617151e-01 2.14176171488251e-02 -2.89228360247444e-02 +-6.36363636363636e+00 -5.33652028186316e-01 1.85402907866192e-02 -3.37736937247221e-02 +-5.75757575757576e+00 -4.57645786576647e-01 1.62204582639942e-02 -3.87352025598183e-02 +-5.15151515151515e+00 -3.80878183776993e-01 1.45075217386201e-02 -4.47429870829259e-02 +-4.54545454545454e+00 -3.03328576206396e-01 1.31751950655347e-02 -5.08206305818731e-02 +-3.93939393939394e+00 -2.25638938079791e-01 1.20463073814285e-02 -5.67577483907786e-02 +-3.33333333333333e+00 -1.51759128742261e-01 1.15765523813214e-02 -6.23461963393866e-02 +-2.72727272727273e+00 -7.72803618184935e-02 1.11443927588391e-02 -6.73647853995964e-02 +-2.12121212121212e+00 -2.14165309152243e-03 1.07204811423473e-02 -7.19089758691984e-02 +-1.51515151515152e+00 7.42011233954975e-02 1.04829792545349e-02 -7.61446613489007e-02 +-9.09090909090912e-01 1.51109201168349e-01 1.03234088196644e-02 -8.02509486552512e-02 +-3.03030303030302e-01 2.29344027261245e-01 1.03026060888101e-02 -8.42792874035115e-02 + 3.03030303030302e-01 3.07759215649705e-01 1.03155825014327e-02 -8.80359990719921e-02 + 9.09090909090912e-01 3.86363579252603e-01 1.03591204387569e-02 -9.15396518680686e-02 + 1.51515151515152e+00 4.65155136112344e-01 1.04514380417906e-02 -9.48849911388328e-02 + 2.12121212121212e+00 5.43742423609011e-01 1.05708486137771e-02 -9.80280317259123e-02 + 2.72727272727273e+00 6.21355563499191e-01 1.07685455281878e-02 -1.00538334680120e-01 + 3.33333333333333e+00 6.98247696483015e-01 1.09884995827544e-02 -1.02768385980751e-01 + 3.93939393939394e+00 7.74577272776593e-01 1.12160604908465e-02 -1.04764162336771e-01 + 4.54545454545455e+00 8.49123646294387e-01 1.15084433622475e-02 -1.06669894654905e-01 + 5.15151515151515e+00 9.22768835492197e-01 1.18149173971583e-02 -1.08443519681338e-01 + 5.75757575757576e+00 9.94281779511649e-01 1.21556943938836e-02 -1.09866171766382e-01 + 6.36363636363637e+00 1.06310529013751e+00 1.25630225021709e-02 -1.10999261303783e-01 + 6.96969696969697e+00 1.13016792278117e+00 1.30120459327629e-02 -1.11939153730602e-01 + 7.57575757575757e+00 1.19235719212211e+00 1.35489371100261e-02 -1.12757130291620e-01 + 8.18181818181818e+00 1.25253452840185e+00 1.41028478529467e-02 -1.13550777719788e-01 + 8.78787878787879e+00 1.31022818965375e+00 1.46613278249224e-02 -1.14419167648035e-01 + 9.39393939393939e+00 1.36351139175394e+00 1.60081512284208e-02 -1.14359279394763e-01 + 1.00000000000000e+01 1.40997780157282e+00 1.78443424094440e-02 -1.13736890758993e-01 + 1.06060606060606e+01 1.43923730215627e+00 2.09588631373841e-02 -1.12187901895665e-01 + 1.12121212121212e+01 1.45625328102718e+00 2.47924700140119e-02 -1.10420788252029e-01 + 1.18181818181818e+01 1.45052843686856e+00 2.93047053533567e-02 -1.08130034479078e-01 + 1.24242424242424e+01 1.37738927101704e+00 4.26630642527924e-02 -1.10097235207091e-01 + 1.30303030303030e+01 1.25402046394694e+00 5.95100927900937e-02 -1.13671143573967e-01 + 1.36363636363636e+01 1.20642687925599e+00 7.05802370100983e-02 -1.12460113720568e-01 + 1.42424242424242e+01 1.16512824375798e+00 8.18308265484637e-02 -1.11416728271022e-01 + 1.48484848484848e+01 1.13845165437591e+00 9.33501183013086e-02 -1.10513745021243e-01 + 1.54545454545455e+01 1.12012151200243e+00 1.05371259823310e-01 -1.12074593125414e-01 + 1.60606060606061e+01 1.10521158214097e+00 1.17537515544027e-01 -1.14635056143715e-01 + 1.66666666666667e+01 1.09605105013413e+00 1.29504477189816e-01 -1.18698748541531e-01 + 1.72727272727273e+01 1.09038474770029e+00 1.41619143192006e-01 -1.22755992205202e-01 + 1.78787878787879e+01 1.08898921460796e+00 1.53914338613840e-01 -1.26805354000924e-01 + 1.84848484848485e+01 1.09852690400848e+00 1.67121306650109e-01 -1.30271150233030e-01 + 1.90909090909091e+01 1.10900797848342e+00 1.80185918785840e-01 -1.33848294218024e-01 + 1.96969696969697e+01 1.10934527307501e+00 1.91151684117947e-01 -1.38883475019382e-01 + 2.03030303030303e+01 1.10872617200819e+00 2.02082800980853e-01 -1.43953835687333e-01 + 2.09090909090909e+01 1.10715062117621e+00 2.12979267414367e-01 -1.49203757196069e-01 + 2.15151515151515e+01 1.10557507034423e+00 2.23875733847882e-01 -1.54503423314042e-01 + 2.21212121212121e+01 1.10260124642550e+00 2.34778135695999e-01 -1.59652147931712e-01 + 2.27272727272727e+01 1.09403576887978e+00 2.45704273095417e-01 -1.64232639974624e-01 + 2.33333333333333e+01 1.08547029133405e+00 2.56630410494836e-01 -1.68847929010858e-01 + 2.39393939393939e+01 1.07690481378832e+00 2.67556547894255e-01 -1.73665468151725e-01 + 2.45454545454545e+01 1.07004041681628e+00 2.79119118191653e-01 -1.77890036537271e-01 + 2.51515151515151e+01 1.06336502473105e+00 2.90752401734336e-01 -1.82048720700615e-01 + 2.57575757575758e+01 1.05668963264583e+00 3.02385685277020e-01 -1.86207404863960e-01 + 2.63636363636364e+01 1.05078168869387e+00 3.14409261973987e-01 -1.90102460494435e-01 + 2.69696969696970e+01 1.04538545633799e+00 3.26693074541322e-01 -1.93821736457880e-01 + 2.75757575757576e+01 1.03998922398212e+00 3.38976887108657e-01 -1.97541012421324e-01 + 2.81818181818182e+01 1.03484090277918e+00 3.51437477732768e-01 -2.01170473836824e-01 + 2.87878787878788e+01 1.03027099131248e+00 3.64310515106369e-01 -2.04590385950606e-01 + 2.93939393939394e+01 1.02570107984578e+00 3.77183552479970e-01 -2.08010298064387e-01 + 3.00000000000000e+01 1.02113116837907e+00 3.90056589853572e-01 -2.11430210178169e-01 + 3.30000000000000e+01 1.00119460561295e+00 4.57145854597991e-01 -2.27086388641851e-01 + 3.60000000000000e+01 9.81921720811872e-01 5.27047589477837e-01 -2.41904140621254e-01 + 3.90000000000000e+01 9.61260291943995e-01 5.99606299882174e-01 -2.56159440416738e-01 + 4.20000000000000e+01 9.36935736815422e-01 6.73802755955525e-01 -2.70019544874094e-01 + 4.50000000000000e+01 9.11289556833257e-01 7.48405461801475e-01 -2.83768812367968e-01 + 4.80000000000000e+01 8.78369078677083e-01 8.22907477862781e-01 -2.97042946965006e-01 + 5.10000000000000e+01 8.41242012973183e-01 8.95844198388958e-01 -3.10074656049880e-01 + 5.40000000000000e+01 7.95701501741868e-01 9.65650227215581e-01 -3.22614713534726e-01 + 5.70000000000000e+01 7.50161338413173e-01 1.03545572276536e+00 -3.35153534620333e-01 + 6.00000000000000e+01 7.04621349034462e-01 1.10526095167874e+00 -3.47689985564868e-01 + 6.30000000000000e+01 6.43094140155942e-01 1.16178264450123e+00 -3.58895514925207e-01 + 6.60000000000000e+01 5.81566794241577e-01 1.21830422346273e+00 -3.70096619015063e-01 + 6.90000000000000e+01 5.20039448327212e-01 1.27482580242423e+00 -3.81292926550571e-01 + 7.20000000000000e+01 4.50922061318250e-01 1.31785610107633e+00 -3.91197073364813e-01 + 7.50000000000000e+01 3.78009809140240e-01 1.35414103575821e+00 -4.00450410082631e-01 + 7.80000000000000e+01 3.05096426319516e-01 1.39042638623652e+00 -4.09696121786907e-01 + 8.10000000000000e+01 2.30838925091062e-01 1.41846077220858e+00 -4.18058441063076e-01 + 8.40000000000000e+01 1.53893279831030e-01 1.42999379871131e+00 -4.24659851438870e-01 + 8.70000000000000e+01 7.69466467481749e-02 1.44152691331999e+00 -4.31250229720335e-01 + 9.00000000000000e+01 -3.36172637530740e-07 1.45305992801866e+00 -4.37829850424638e-01 + 9.30000000000000e+01 -5.38627383393683e-02 1.44152690151593e+00 -4.40933372026436e-01 + 9.60000000000000e+01 -1.07725146245282e-01 1.42999383096059e+00 -4.44037873446937e-01 + 9.90000000000000e+01 -1.61587565629768e-01 1.41846067229841e+00 -4.47143282683005e-01 + 1.02000000000000e+02 -2.13567566267535e-01 1.39042621049931e+00 -4.46986201155388e-01 + 1.05000000000000e+02 -2.64606377915867e-01 1.35414127581743e+00 -4.45198189623654e-01 + 1.08000000000000e+02 -3.15645479300682e-01 1.31785592534089e+00 -4.43410060853994e-01 + 1.11000000000000e+02 -3.64027804983567e-01 1.27482531278278e+00 -4.40372525830713e-01 + 1.14000000000000e+02 -4.07096660176995e-01 1.21830438150688e+00 -4.34835474017044e-01 + 1.17000000000000e+02 -4.50165647641462e-01 1.16178301844503e+00 -4.29298134131730e-01 + 1.20000000000000e+02 -4.93234679359343e-01 1.10526141350648e+00 -4.23760689165608e-01 + 1.23000000000000e+02 -5.25113031922223e-01 1.03545618459309e+00 -4.16386674177567e-01 + 1.26000000000000e+02 -5.56991306252975e-01 9.65650689048611e-01 -4.09012018270847e-01 + 1.29000000000000e+02 -5.88869424113624e-01 8.95844660221987e-01 -4.01636451380112e-01 + 1.32000000000000e+02 -6.13161255971681e-01 8.22874224418486e-01 -3.94888279932588e-01 + 1.35000000000000e+02 -6.33659953815723e-01 7.48321588883743e-01 -3.88452749684788e-01 + 1.38000000000000e+02 -6.54157816774948e-01 6.73769502775918e-01 -3.82015808693097e-01 + 1.41000000000000e+02 -6.72519858324716e-01 6.00666916692205e-01 -3.77450446527224e-01 + 1.44000000000000e+02 -6.86610239724511e-01 5.30463342418639e-01 -3.76628216553060e-01 + 1.47000000000000e+02 -7.00700113478808e-01 4.60260101212902e-01 -3.75801923510001e-01 + 1.50000000000000e+02 -7.14789733419415e-01 3.90057026535133e-01 -3.74971722702591e-01 + 1.53000000000000e+02 -7.26083351466705e-01 3.34899268561139e-01 -3.90699237662118e-01 + 1.56000000000000e+02 -7.37376919859767e-01 2.79741654709182e-01 -4.06434613881277e-01 + 1.59000000000000e+02 -7.49369636696621e-01 2.24584258977831e-01 -4.22178074951782e-01 + 1.62000000000000e+02 -6.78487565748514e-01 1.85578685533409e-01 -4.41942545112509e-01 + 1.65000000000000e+02 -5.65406079877361e-01 1.54649159831924e-01 -4.63714630913619e-01 + 1.68000000000000e+02 -4.44894229884888e-01 1.23719388559455e-01 -4.85485784604534e-01 + 1.71000000000000e+02 -3.31496503011607e-01 9.27895975192221e-02 -4.50000513056908e-01 + 1.74000000000000e+02 -2.20997628314192e-01 6.18597669425397e-02 -2.99999717902353e-01 + 1.77000000000000e+02 -1.09575522573893e-01 5.10040358195194e-02 -1.48718747985670e-01 + 1.80000000000000e+02 0.00000000000000e+00 5.02017886725028e-02 0.00000000000000e+00 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_13.dat b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_13.dat new file mode 100644 index 000000000..92b13a2b9 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_13.dat @@ -0,0 +1,254 @@ +! ------------ AirfoilInfo v1.01.x Input File ---------------------------------- +! AeroElasticSE FAST driver +! line +! line +! ------------------------------------------------------------------------------ +DEFAULT InterpOrd ! Interpolation order to use for quasi-steady table lookup {1=linear; 3=cubic spline; "default"} [default=3] +1 NonDimArea ! The non-dimensional area of the airfoil (area/chord^2) (set to 1.0 if unsure or unneeded) +@"NREL-2p8-127_AF13_Coords.txt" NumCoords ! The number of coordinates in the airfoil shape file. Set to zero if coordinates not included. +AF13_BL.txt BL_file ! The file name including the boundary layer characteristics of the profile. Ignored if the aeroacoustic module is not called. +1 NumTabs ! Number of airfoil tables in this file. Each table must have lines for Re and Ctrl. +! ------------------------------------------------------------------------------ +! data for table 1 +! ------------------------------------------------------------------------------ +6.000000 Re ! Reynolds number in millions +0 Ctrl ! Control setting (must be 0 for current AirfoilInfo) +True InclUAdata ! Is unsteady aerodynamics data included in this table? If TRUE, then include 30 UA coefficients below this line +!........................................ +-2.132099 alpha0 ! 0-lift angle of attack, depends on airfoil. +11.682019 alpha1 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA>alpha0. (deg) +-9.246885 alpha2 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA1] +0.000000 S2 ! Constant in the f curve best-fit for AOA> alpha1; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S3 ! Constant in the f curve best-fit for alpha2<=AOA< alpha0; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S4 ! Constant in the f curve best-fit for AOA< alpha2; by definition it depends on the airfoil. [ignored if UAMod<>1] +1.467246 Cn1 ! Critical value of C0n at leading edge separation. It should be extracted from airfoil data at a given Mach and Reynolds number. It can be calculated from the static value of Cn at either the break in the pitching moment or the loss of chord force at the onset of stall. It is close to the condition of maximum lift of the airfoil at low Mach numbers. +-1.116975 Cn2 ! As Cn1 for negative AOAs. +Default St_sh ! Strouhal's shedding frequency constant. [default = 0.19] +0.010706 Cd0 ! 2D drag coefficient value at 0-lift. +-0.078417 Cm0 ! 2D pitching moment coefficient about 1/4-chord location, at 0-lift, positive if nose up. [If the aerodynamics coefficients table does not include a column for Cm, this needs to be set to 0.0] +0.000000 k0 ! Constant in the \hat(x)_cp curve best-fit; = (\hat(x)_AC-0.25). [ignored if UAMod<>1] +0.000000 k1 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k2 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k3 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k1_hat ! Constant in the expression of Cc due to leading edge vortex effects. [ignored if UAMod<>1] +Default x_cp_bar ! Constant in the expression of \hat(x)_cp^v. [ignored if UAMod<>1, default = 0.2] +Default UACutout ! Angle of attack above which unsteady aerodynamics are disabled (deg). [Specifying the string "Default" sets UACutout to 45 degrees] +Default filtCutOff ! Cut-off frequency (-3 dB corner frequency) for low-pass filtering the AoA input to UA, as well as the 1st and 2nd derivatives (Hz) [default = 20] +!........................................ +! Table of aerodynamics coefficients +200 NumAlf ! Number of data lines in the following table +! Alpha Cl Cd Cm +! (deg) (-) (-) (-) +-1.80000000000000e+02 0.00000000000000e+00 4.87439042124992e-02 0.00000000000000e+00 +-1.77000000000000e+02 1.13601999469549e-01 4.87439042124992e-02 1.19176415715757e-01 +-1.74000000000000e+02 2.28858413112315e-01 5.84925712756744e-02 2.39999774321882e-01 +-1.71000000000000e+02 3.43288316600078e-01 8.77388925055090e-02 3.60000410445527e-01 +-1.68000000000000e+02 4.57070767928178e-01 1.17275421818159e-01 3.18708357160145e-01 +-1.65000000000000e+02 5.71129134749526e-01 1.46957051785061e-01 1.96771841693633e-01 +-1.62000000000000e+02 6.81811167127312e-01 1.76639445546079e-01 7.48344304685462e-02 +-1.59000000000000e+02 7.50644491717964e-01 2.14984200570790e-01 -5.07801650458084e-03 +-1.56000000000000e+02 7.37523770619090e-01 2.70653385079522e-01 1.06132839067504e-03 +-1.53000000000000e+02 7.25223845001242e-01 3.26322594869384e-01 8.04336961373999e-03 +-1.50000000000000e+02 7.12923727515902e-01 3.81991851817702e-01 1.50360358377684e-02 +-1.47000000000000e+02 6.99053142386901e-01 4.52474247296891e-01 2.96995895978959e-02 +-1.44000000000000e+02 6.85182304280847e-01 5.22956853217613e-01 4.43686473866053e-02 +-1.41000000000000e+02 6.71310960202625e-01 5.93439880036427e-01 5.90442691380621e-02 +-1.38000000000000e+02 6.53114909413893e-01 6.66865106551800e-01 7.40923427363092e-02 +-1.35000000000000e+02 6.32756514043044e-01 7.41761426946880e-01 8.93274281204840e-02 +-1.32000000000000e+02 6.12397285385553e-01 8.16658429255323e-01 1.04567050663022e-01 +-1.29000000000000e+02 5.88229626117782e-01 8.89991527762646e-01 1.19947402883451e-01 +-1.26000000000000e+02 5.56445087582313e-01 9.60196811237631e-01 1.35603342201244e-01 +-1.23000000000000e+02 5.24660391861842e-01 1.03040155838038e+00 1.51263206732352e-01 +-1.20000000000000e+02 4.92875617551808e-01 1.10060603736703e+00 1.66927716624602e-01 +-1.17000000000000e+02 4.49867900921898e-01 1.15756854481392e+00 1.81710954488631e-01 +-1.14000000000000e+02 4.06860185400029e-01 1.21453080878140e+00 1.96498840434726e-01 +-1.11000000000000e+02 3.63852515987308e-01 1.27149263759476e+00 2.11292122383483e-01 +-1.08000000000000e+02 3.15513980484258e-01 1.31498386088960e+00 2.24396145865201e-01 +-1.05000000000000e+02 2.64509971345682e-01 1.35173967885259e+00 2.36659399343987e-01 +-1.02000000000000e+02 2.13506123000612e-01 1.38849507562982e+00 2.48931685712608e-01 +-9.90000000000000e+01 1.61553244788091e-01 1.41700492873292e+00 2.59841073682875e-01 +-9.60000000000000e+01 1.07702265733195e-01 1.42902333732993e+00 2.68014448982559e-01 +-9.30000000000000e+01 5.38512980694728e-02 1.44104165411306e+00 2.76206223274710e-01 +-9.00000000000000e+01 3.36101235326894e-07 1.45305992499009e+00 2.84424528048508e-01 +-8.70000000000000e+01 -5.38512429529903e-02 1.44104166641377e+00 2.88179235636605e-01 +-8.40000000000000e+01 -1.07702416312529e-01 1.42902330372378e+00 2.92116238002531e-01 +-8.10000000000000e+01 -1.61552778284462e-01 1.41700503284675e+00 2.96384910251329e-01 +-7.80000000000000e+01 -2.13505875975934e-01 1.38849525364560e+00 2.96589518980285e-01 +-7.50000000000000e+01 -2.64510308783977e-01 1.35173943568081e+00 2.94839423717641e-01 +-7.20000000000000e+01 -3.15513733464136e-01 1.31498403890358e+00 2.93086106067290e-01 +-6.90000000000000e+01 -3.63852143411397e-01 1.27149313105570e+00 2.90081406410839e-01 +-6.60000000000000e+01 -4.06860305658320e-01 1.21453064950441e+00 2.84576673209790e-01 +-6.30000000000000e+01 -4.49868185458844e-01 1.15756816795312e+00 2.79066340953731e-01 +-6.00000000000000e+01 -4.92875827838210e-01 1.10060557289787e+00 2.73549730680385e-01 +-5.70000000000000e+01 -5.24660602148244e-01 1.03040109391122e+00 2.66198212861305e-01 +-5.40000000000000e+01 -5.56445297867155e-01 9.60196346763153e-01 2.58837329083779e-01 +-5.10000000000000e+01 -5.88229836402624e-01 8.89991063288168e-01 2.51465219825159e-01 +-4.80000000000000e+01 -6.14103823719259e-01 8.16681742398572e-01 2.44260248495120e-01 +-4.50000000000000e+01 -6.37022630417404e-01 7.41820452687947e-01 2.37125494405563e-01 +-4.20000000000000e+01 -6.54821434392937e-01 6.66888419508008e-01 2.31318374407913e-01 +-3.90000000000000e+01 -6.71686771395590e-01 5.92370007881034e-01 2.26128186404354e-01 +-3.60000000000000e+01 -6.85959395421995e-01 5.19513505734105e-01 2.23293038777573e-01 +-3.30000000000000e+01 -6.99228262265746e-01 4.49336693515259e-01 2.23281989121863e-01 +-3.00000000000000e+01 -7.12923826438148e-01 3.81991413473000e-01 2.26408555434034e-01 +-2.93939393939394e+01 -7.16063242755988e-01 3.69070660189083e-01 2.27884386933293e-01 +-2.87878787878788e+01 -7.19202659073829e-01 3.56149906905165e-01 2.29360218432552e-01 +-2.81818181818182e+01 -7.22342075391669e-01 3.43229153621248e-01 2.30836049931811e-01 +-2.75757575757576e+01 -7.25879646593120e-01 3.30722936547354e-01 2.32910797277799e-01 +-2.69696969696970e+01 -7.29587870240511e-01 3.18394393090142e-01 2.35242244863728e-01 +-2.63636363636364e+01 -7.33296093887901e-01 3.06065849632931e-01 2.37573692449656e-01 +-2.57575757575758e+01 -7.37358552649944e-01 2.93998789131352e-01 2.40351599308823e-01 +-2.51515151515151e+01 -7.41952281524987e-01 2.82323892121304e-01 2.43799091024856e-01 +-2.45454545454545e+01 -7.46546010400030e-01 2.70648995111257e-01 2.47246582740888e-01 +-2.39393939393939e+01 -7.51270810440089e-01 2.59045122954569e-01 2.50842931746802e-01 +-2.33333333333333e+01 -7.57175276341296e-01 2.48080488228869e-01 2.55779025181128e-01 +-2.27272727272727e+01 -7.63079742242504e-01 2.37115853503168e-01 2.61669103088351e-01 +-2.21212121212121e+01 -7.68984208143711e-01 2.26151218777467e-01 2.66787136053718e-01 +-2.15151515151515e+01 -7.98558741205574e-01 2.18978684775324e-01 2.59268734046189e-01 +-2.09090909090909e+01 -8.39976990506764e-01 2.12754419878834e-01 2.46412877782449e-01 +-2.03030303030303e+01 -8.77626065799621e-01 2.06530154982344e-01 2.32873392185209e-01 +-1.96969696969697e+01 -9.12482277726115e-01 2.00406617873157e-01 2.16079231533506e-01 +-1.90909090909091e+01 -9.44653374099275e-01 1.94383802853063e-01 1.96196944890485e-01 +-1.84848484848485e+01 -9.76556738297402e-01 1.88868061750279e-01 1.76251855690617e-01 +-1.78787878787879e+01 -1.00830988060465e+00 1.83317104202353e-01 1.56918611734039e-01 +-1.72727272727273e+01 -1.03997095936839e+00 1.76526361566991e-01 1.37892024373634e-01 +-1.66666666666667e+01 -1.07157049021422e+00 1.70932183497624e-01 1.18865299601930e-01 +-1.60606060606061e+01 -1.10312717894668e+00 1.65593044673498e-01 9.98384624039651e-02 +-1.54545454545455e+01 -1.11507119669234e+00 1.58446673227857e-01 8.41684149093784e-02 +-1.48484848484848e+01 -1.11477271836942e+00 1.50207476871942e-01 7.03417694480957e-02 +-1.42424242424242e+01 -1.08423257216199e+00 1.39348090503607e-01 6.20173634895011e-02 +-1.36363636363636e+01 -1.04896032877406e+00 1.28119902100447e-01 5.40305604199166e-02 +-1.30303030303030e+01 -1.01046372636334e+00 1.16637431776633e-01 4.49260984726437e-02 +-1.24242424242424e+01 -9.69201936614847e-01 1.05499178414566e-01 3.32219061711730e-02 +-1.18181818181818e+01 -9.27767400425763e-01 9.49119646912448e-02 2.16483145014490e-02 +-1.12121212121212e+01 -8.86480598336731e-01 8.55891565143775e-02 1.06380104995937e-02 +-1.06060606060606e+01 -8.43514329482308e-01 7.70087578463476e-02 1.14934323347435e-03 +-1.00000000000000e+01 -7.98856262424989e-01 6.88029421594717e-02 -7.48514667045178e-03 +-9.39393939393939e+00 -7.63413220908471e-01 5.72619896948118e-02 -1.75515357315967e-02 +-8.78787878787879e+00 -7.36855164567028e-01 4.49241428048966e-02 -2.67299768784618e-02 +-8.18181818181818e+00 -7.21915221248136e-01 3.22666539335863e-02 -3.43270785756021e-02 +-7.57575757575758e+00 -6.80107790322963e-01 2.47696277944221e-02 -3.79455763749705e-02 +-6.96969696969697e+00 -6.25477329057538e-01 2.00640152396707e-02 -4.00917938604969e-02 +-6.36363636363636e+00 -5.45385415536934e-01 1.76703500104717e-02 -4.47595761821227e-02 +-5.75757575757576e+00 -4.65240863542729e-01 1.56676325439870e-02 -4.94624634693340e-02 +-5.15151515151515e+00 -3.85177304810552e-01 1.41170830647471e-02 -5.47806233959061e-02 +-4.54545454545454e+00 -3.05186013364708e-01 1.29299720858053e-02 -6.00838561640560e-02 +-3.93939393939394e+00 -2.25496618815856e-01 1.19194070246950e-02 -6.52622261528225e-02 +-3.33333333333333e+00 -1.50095854632385e-01 1.14661881877472e-02 -7.00888229733615e-02 +-2.72727272727273e+00 -7.44807687769198e-02 1.10712748312864e-02 -7.44803490024561e-02 +-2.12121212121212e+00 1.36241455738510e-03 1.06994983826237e-02 -7.84888091237353e-02 +-1.51515151515152e+00 7.79762724684800e-02 1.04764559842521e-02 -8.22769309796209e-02 +-9.09090909090912e-01 1.55093196357546e-01 1.03282187235360e-02 -8.59707384355398e-02 +-3.03030303030302e-01 2.33690956667381e-01 1.03497391513504e-02 -8.95788413712978e-02 + 3.03030303030302e-01 3.12230375322369e-01 1.03960832854878e-02 -9.29631294177707e-02 + 9.09090909090912e-01 3.90723642801794e-01 1.04626363547074e-02 -9.61417302922719e-02 + 1.51515151515152e+00 4.69223374488536e-01 1.05181765096339e-02 -9.91269841658500e-02 + 2.12121212121212e+00 5.47419021984281e-01 1.05986866302366e-02 -1.01951326898863e-01 + 2.72727272727273e+00 6.24353465324347e-01 1.07913520395363e-02 -1.04285374966365e-01 + 3.33333333333333e+00 7.00719049213690e-01 1.09882631518878e-02 -1.06367221462522e-01 + 3.93939393939394e+00 7.76662113860127e-01 1.11995924883540e-02 -1.08233532083904e-01 + 4.54545454545455e+00 8.51062527788879e-01 1.14677130840408e-02 -1.09981051673887e-01 + 5.15151515151515e+00 9.24618318776539e-01 1.17484143214346e-02 -1.11607861589439e-01 + 5.75757575757576e+00 9.96131045922850e-01 1.20661413484365e-02 -1.12922063002211e-01 + 6.36363636363637e+00 1.06530124476682e+00 1.24411013682114e-02 -1.13971538180268e-01 + 6.96969696969697e+00 1.13294924210721e+00 1.28499924886479e-02 -1.14845663241843e-01 + 7.57575757575757e+00 1.19647826401428e+00 1.33185723521347e-02 -1.15548552499834e-01 + 8.18181818181818e+00 1.25852214595514e+00 1.37822042010170e-02 -1.16225412192196e-01 + 8.78787878787879e+00 1.31953258382690e+00 1.42014660644829e-02 -1.16973536925898e-01 + 9.39393939393939e+00 1.37722282574832e+00 1.52499336492677e-02 -1.16582058795787e-01 + 1.00000000000000e+01 1.42782587729733e+00 1.66203055937069e-02 -1.15506211836930e-01 + 1.06060606060606e+01 1.46349417020859e+00 1.89049864855517e-02 -1.13428166197566e-01 + 1.12121212121212e+01 1.48851533807067e+00 2.17360570752516e-02 -1.11086533657004e-01 + 1.18181818181818e+01 1.49375899629952e+00 2.51530002017571e-02 -1.08182154414350e-01 + 1.24242424242424e+01 1.39019183027460e+00 4.01241150571406e-02 -1.10396226977541e-01 + 1.30303030303030e+01 1.23558289690220e+00 5.95330302498055e-02 -1.14566124306707e-01 + 1.36363636363636e+01 1.17983620766855e+00 6.99436564860179e-02 -1.13107355391663e-01 + 1.42424242424242e+01 1.13261025086269e+00 8.02708219712224e-02 -1.11811426810697e-01 + 1.48484848484848e+01 1.10434568242928e+00 9.05273912159466e-02 -1.10627750277284e-01 + 1.54545454545455e+01 1.08509274406338e+00 1.01044358671353e-01 -1.11196367879537e-01 + 1.60606060606061e+01 1.06957515718470e+00 1.11649937873699e-01 -1.12390832093296e-01 + 1.66666666666667e+01 1.06064834245443e+00 1.22271986435775e-01 -1.14792794654718e-01 + 1.72727272727273e+01 1.05566858193663e+00 1.33123890508199e-01 -1.17423076146692e-01 + 1.78787878787879e+01 1.05551304883942e+00 1.44256732007905e-01 -1.20332417004491e-01 + 1.84848484848485e+01 1.06725149416938e+00 1.56758954022331e-01 -1.23671200892881e-01 + 1.90909090909091e+01 1.08077437232159e+00 1.69418290548337e-01 -1.27335467738334e-01 + 1.96969696969697e+01 1.08755966688782e+00 1.81027946977387e-01 -1.32236261105666e-01 + 2.03030303030303e+01 1.09235894047421e+00 1.92457859565650e-01 -1.37361247840428e-01 + 2.09090909090909e+01 1.09517208072444e+00 2.03708018144370e-01 -1.42882710356362e-01 + 2.15151515151515e+01 1.09798522097467e+00 2.14958176723090e-01 -1.48463527012242e-01 + 2.21212121212121e+01 1.09854840217806e+00 2.26151218777467e-01 -1.53912838053508e-01 + 2.27272727272727e+01 1.09011406223620e+00 2.37115853503168e-01 -1.58878474315141e-01 + 2.33333333333333e+01 1.08167972229433e+00 2.48080488228869e-01 -1.63885629560299e-01 + 2.39393939393939e+01 1.07324538235247e+00 2.59045122954570e-01 -1.69134105044946e-01 + 2.45454545454545e+01 1.06649517893070e+00 2.70648995111257e-01 -1.73708687311479e-01 + 2.51515151515151e+01 1.05993209776363e+00 2.82323892121304e-01 -1.78208394164471e-01 + 2.57575757575758e+01 1.05336901659657e+00 2.93998789131352e-01 -1.82708101017462e-01 + 2.63636363636364e+01 1.04756481639234e+00 3.06065849632931e-01 -1.86905429493079e-01 + 2.69696969696970e+01 1.04226661544969e+00 3.18394393090142e-01 -1.90901141057530e-01 + 2.75757575757576e+01 1.03696841450705e+00 3.30722936547354e-01 -1.94896852621981e-01 + 2.81818181818182e+01 1.03191481277606e+00 3.43229153621248e-01 -1.98788509538092e-01 + 2.87878787878788e+01 1.02743189358122e+00 3.56149906905165e-01 -2.02437393101785e-01 + 2.93939393939394e+01 1.02294897438639e+00 3.69070660189083e-01 -2.06086276665478e-01 + 3.00000000000000e+01 1.01846605519156e+00 3.81991413473000e-01 -2.09735160229171e-01 + 3.30000000000000e+01 9.98896269436472e-01 4.49336693515259e-01 -2.26306031891365e-01 + 3.60000000000000e+01 9.79942808607176e-01 5.19513505734105e-01 -2.41883781570832e-01 + 3.90000000000000e+01 9.59552820645265e-01 5.92370007881034e-01 -2.56418564967551e-01 + 4.20000000000000e+01 9.35459598863631e-01 6.66888419508008e-01 -2.70550711580551e-01 + 4.50000000000000e+01 9.10032841705360e-01 7.41820452687947e-01 -2.84583661386136e-01 + 4.80000000000000e+01 8.77291164853731e-01 8.16681742398572e-01 -2.98125199456282e-01 + 5.10000000000000e+01 8.40327861925211e-01 8.89991063288168e-01 -3.11430203584398e-01 + 5.40000000000000e+01 7.94921035444153e-01 9.60196346763153e-01 -3.24242564733735e-01 + 5.70000000000000e+01 7.49514555844441e-01 1.03040109391122e+00 -3.37060914767786e-01 + 6.00000000000000e+01 7.04108249684082e-01 1.10060557289787e+00 -3.49883096668555e-01 + 6.30000000000000e+01 6.42668579003910e-01 1.15756816795312e+00 -3.61391087463078e-01 + 6.60000000000000e+01 5.81228770892357e-01 1.21453064950441e+00 -3.72900577797390e-01 + 6.90000000000000e+01 5.19788962780805e-01 1.27149313105570e+00 -3.84410594625320e-01 + 7.20000000000000e+01 4.50734175503690e-01 1.31498403890358e+00 -3.94650756300015e-01 + 7.50000000000000e+01 3.77872054532562e-01 1.35173943568081e+00 -4.04254594429255e-01 + 7.80000000000000e+01 3.05008674950305e-01 1.38849525364560e+00 -4.13856378244412e-01 + 8.10000000000000e+01 2.30789950548293e-01 1.41700503284675e+00 -4.22588303462247e-01 + 8.40000000000000e+01 1.53860630065887e-01 1.42902330372378e+00 -4.29581922692123e-01 + 8.70000000000000e+01 7.69303218853695e-02 1.44104166641377e+00 -4.36570514980957e-01 + 9.00000000000000e+01 -3.36101235559296e-07 1.45305992499009e+00 -4.43554018258070e-01 + 9.30000000000000e+01 -5.38512980694728e-02 1.44104165411306e+00 -4.46821429870465e-01 + 9.60000000000000e+01 -1.07702265733195e-01 1.42902333732993e+00 -4.50090063193436e-01 + 9.90000000000000e+01 -1.61553244788092e-01 1.41700492873292e+00 -4.53359826724784e-01 + 1.02000000000000e+02 -2.13506123000612e-01 1.38849507562982e+00 -4.53358356880233e-01 + 1.05000000000000e+02 -2.64509971345682e-01 1.35173967885259e+00 -4.51721761227933e-01 + 1.08000000000000e+02 -3.15513980484258e-01 1.31498386088960e+00 -4.50085315220303e-01 + 1.11000000000000e+02 -3.63852515987308e-01 1.27149263759476e+00 -4.47194708590916e-01 + 1.14000000000000e+02 -4.06860185400029e-01 1.21453080878140e+00 -4.41794921939120e-01 + 1.17000000000000e+02 -4.49867900921898e-01 1.15756854481392e+00 -4.36395234719870e-01 + 1.20000000000000e+02 -4.92875617551808e-01 1.10060603736703e+00 -4.30995807908883e-01 + 1.23000000000000e+02 -5.24660391861842e-01 1.03040155838038e+00 -4.23756434063717e-01 + 1.26000000000000e+02 -5.56445087582313e-01 9.60196811237631e-01 -4.16516996565852e-01 + 1.29000000000000e+02 -5.88229626117782e-01 8.89991527762645e-01 -4.09277210165741e-01 + 1.32000000000000e+02 -6.12397285385553e-01 8.16658429255322e-01 -4.02686723110960e-01 + 1.35000000000000e+02 -6.32756514043044e-01 7.41761426946880e-01 -3.96420479648652e-01 + 1.38000000000000e+02 -6.53114909413893e-01 6.66865106551800e-01 -3.90153798231996e-01 + 1.41000000000000e+02 -6.71310960202625e-01 5.93439880036427e-01 -3.85803144277468e-01 + 1.44000000000000e+02 -6.85182304280847e-01 5.22956853217613e-01 -3.85284327936909e-01 + 1.47000000000000e+02 -6.99053142386901e-01 4.52474247296891e-01 -3.84763389697547e-01 + 1.50000000000000e+02 -7.12923727515902e-01 3.81991851817701e-01 -3.84240435098614e-01 + 1.53000000000000e+02 -7.17713468565102e-01 3.27562673383999e-01 -4.00044506289342e-01 + 1.56000000000000e+02 -7.22503170158526e-01 2.73133681485946e-01 -4.15858223301289e-01 + 1.59000000000000e+02 -7.28127146175927e-01 2.18704987836167e-01 -4.31681847835051e-01 + 1.62000000000000e+02 -6.57546925365099e-01 1.80505932981753e-01 -4.49567289106761e-01 + 1.65000000000000e+02 -5.47955571734396e-01 1.50421834782562e-01 -4.68480081499263e-01 + 1.68000000000000e+02 -4.33508829076636e-01 1.20337481324609e-01 -4.87391973738006e-01 + 1.71000000000000e+02 -3.23710952534405e-01 9.02531541751285e-02 -4.50000513056908e-01 + 1.74000000000000e+02 -2.15807282191796e-01 6.01688796438182e-02 -2.99999717902353e-01 + 1.77000000000000e+02 -1.07173368611120e-01 4.95765701106933e-02 -1.48970519644697e-01 + 1.80000000000000e+02 0.00000000000000e+00 4.87439042124992e-02 0.00000000000000e+00 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_14.dat b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_14.dat new file mode 100644 index 000000000..229833e5a --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_14.dat @@ -0,0 +1,254 @@ +! ------------ AirfoilInfo v1.01.x Input File ---------------------------------- +! AeroElasticSE FAST driver +! line +! line +! ------------------------------------------------------------------------------ +DEFAULT InterpOrd ! Interpolation order to use for quasi-steady table lookup {1=linear; 3=cubic spline; "default"} [default=3] +1 NonDimArea ! The non-dimensional area of the airfoil (area/chord^2) (set to 1.0 if unsure or unneeded) +@"NREL-2p8-127_AF14_Coords.txt" NumCoords ! The number of coordinates in the airfoil shape file. Set to zero if coordinates not included. +AF14_BL.txt BL_file ! The file name including the boundary layer characteristics of the profile. Ignored if the aeroacoustic module is not called. +1 NumTabs ! Number of airfoil tables in this file. Each table must have lines for Re and Ctrl. +! ------------------------------------------------------------------------------ +! data for table 1 +! ------------------------------------------------------------------------------ +6.000000 Re ! Reynolds number in millions +0 Ctrl ! Control setting (must be 0 for current AirfoilInfo) +True InclUAdata ! Is unsteady aerodynamics data included in this table? If TRUE, then include 30 UA coefficients below this line +!........................................ +-2.166094 alpha0 ! 0-lift angle of attack, depends on airfoil. +11.851014 alpha1 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA>alpha0. (deg) +-9.637248 alpha2 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA1] +0.000000 S2 ! Constant in the f curve best-fit for AOA> alpha1; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S3 ! Constant in the f curve best-fit for alpha2<=AOA< alpha0; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S4 ! Constant in the f curve best-fit for AOA< alpha2; by definition it depends on the airfoil. [ignored if UAMod<>1] +1.502705 Cn1 ! Critical value of C0n at leading edge separation. It should be extracted from airfoil data at a given Mach and Reynolds number. It can be calculated from the static value of Cn at either the break in the pitching moment or the loss of chord force at the onset of stall. It is close to the condition of maximum lift of the airfoil at low Mach numbers. +-1.198117 Cn2 ! As Cn1 for negative AOAs. +Default St_sh ! Strouhal's shedding frequency constant. [default = 0.19] +0.010692 Cd0 ! 2D drag coefficient value at 0-lift. +-0.084655 Cm0 ! 2D pitching moment coefficient about 1/4-chord location, at 0-lift, positive if nose up. [If the aerodynamics coefficients table does not include a column for Cm, this needs to be set to 0.0] +0.000000 k0 ! Constant in the \hat(x)_cp curve best-fit; = (\hat(x)_AC-0.25). [ignored if UAMod<>1] +0.000000 k1 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k2 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k3 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k1_hat ! Constant in the expression of Cc due to leading edge vortex effects. [ignored if UAMod<>1] +Default x_cp_bar ! Constant in the expression of \hat(x)_cp^v. [ignored if UAMod<>1, default = 0.2] +Default UACutout ! Angle of attack above which unsteady aerodynamics are disabled (deg). [Specifying the string "Default" sets UACutout to 45 degrees] +Default filtCutOff ! Cut-off frequency (-3 dB corner frequency) for low-pass filtering the AoA input to UA, as well as the 1st and 2nd derivatives (Hz) [default = 20] +!........................................ +! Table of aerodynamics coefficients +200 NumAlf ! Number of data lines in the following table +! Alpha Cl Cd Cm +! (deg) (-) (-) (-) +-1.80000000000000e+02 0.00000000000000e+00 4.74971586892991e-02 0.00000000000000e+00 +-1.77000000000000e+02 1.11000230721027e-01 4.74971586892991e-02 1.19348662665291e-01 +-1.74000000000000e+02 2.23249498352695e-01 5.69965146964868e-02 2.39999774321882e-01 +-1.71000000000000e+02 3.34875005612777e-01 8.54948945736924e-02 3.60000410445527e-01 +-1.68000000000000e+02 4.46351865610983e-01 1.14102183123101e-01 3.18009867522619e-01 +-1.65000000000000e+02 5.57999076618718e-01 1.42763924737488e-01 1.95025625752222e-01 +-1.62000000000000e+02 6.68256570415867e-01 1.71426528385083e-01 7.20405402903902e-02 +-1.59000000000000e+02 7.38112012967269e-01 2.08990990812950e-01 -9.03147344265643e-03 +-1.56000000000000e+02 7.28701413125268e-01 2.64358869655133e-01 -4.58368783527860e-03 +-1.53000000000000e+02 7.20014801391652e-01 3.19726771476650e-01 4.84852864421045e-04 +-1.50000000000000e+02 7.11327966966767e-01 3.75094720564407e-01 5.41799540089436e-03 +-1.47000000000000e+02 6.97644694809602e-01 4.45815984052867e-01 2.02835508949186e-02 +-1.44000000000000e+02 6.83961170390853e-01 5.16537495536617e-01 3.51512653382985e-02 +-1.41000000000000e+02 6.70277141430926e-01 5.87259503028655e-01 5.00215815438595e-02 +-1.38000000000000e+02 6.52223041697912e-01 6.60960643393727e-01 6.52179053138514e-02 +-1.35000000000000e+02 6.31983915443519e-01 7.36151344151820e-01 8.05776041224766e-02 +-1.32000000000000e+02 6.11743957269201e-01 8.11342840122296e-01 9.59393162430393e-02 +-1.29000000000000e+02 5.87682487226497e-01 8.84986078503406e-01 1.11444964032245e-01 +-1.26000000000000e+02 5.55977975337812e-01 9.55532794347773e-01 1.27236023845822e-01 +-1.23000000000000e+02 5.24273305652762e-01 1.02607897125153e+00 1.43028582986147e-01 +-1.20000000000000e+02 4.92568557072479e-01 1.09662487869506e+00 1.58822953785748e-01 +-1.17000000000000e+02 4.49613275538441e-01 1.15396443469656e+00 1.73777165711677e-01 +-1.14000000000000e+02 4.06657958215625e-01 1.21130374584807e+00 1.88732854747424e-01 +-1.11000000000000e+02 3.63702613318511e-01 1.26864261896506e+00 2.03690155444885e-01 +-1.08000000000000e+02 3.15401526057875e-01 1.31252774478765e+00 2.16985072342206e-01 +-1.05000000000000e+02 2.64427526911241e-01 1.34968589451878e+00 2.29449925939083e-01 +-1.02000000000000e+02 2.13453578289375e-01 1.38684361845383e+00 2.41917717292569e-01 +-9.90000000000000e+01 1.61523894481612e-01 1.41576001404799e+00 2.53026853626378e-01 +-9.60000000000000e+01 1.07682698904138e-01 1.42819339598511e+00 2.61414906151363e-01 +-9.30000000000000e+01 5.38415146430987e-02 1.44062668293820e+00 2.69809084986757e-01 +-9.00000000000000e+01 3.36040174186750e-07 1.45305992240014e+00 2.78212559061635e-01 +-8.70000000000000e+01 -5.38414595366295e-02 1.44062669566363e+00 2.81853755036713e-01 +-8.40000000000000e+01 -1.07682849456116e-01 1.42819336121861e+00 2.85569122512613e-01 +-8.10000000000000e+01 -1.61523428062735e-01 1.41576012175667e+00 2.89419982005163e-01 +-7.80000000000000e+01 -2.13453331409509e-01 1.38684379841819e+00 2.89665265635515e-01 +-7.50000000000000e+01 -2.64427864151593e-01 1.34968564868523e+00 2.88138738774038e-01 +-7.20000000000000e+01 -3.15401279183096e-01 1.31252792475019e+00 2.86609458179388e-01 +-6.90000000000000e+01 -3.63702241195888e-01 1.26864311569235e+00 2.83820667109906e-01 +-6.60000000000000e+01 -4.06658078327606e-01 1.21130358551679e+00 2.78515251076842e-01 +-6.30000000000000e+01 -4.49613559728479e-01 1.15396405534123e+00 2.73204848612241e-01 +-6.00000000000000e+01 -4.92568766829435e-01 1.09662441196703e+00 2.67888882389067e-01 +-5.70000000000000e+01 -5.24273515409718e-01 1.02607850452350e+00 2.60728337244673e-01 +-5.40000000000000e+01 -5.55978185093202e-01 9.55532327614396e-01 2.53559556903730e-01 +-5.10000000000000e+01 -5.87682696981887e-01 8.84985611770030e-01 2.46380928095060e-01 +-4.80000000000000e+01 -6.13458630295659e-01 8.11357652574190e-01 2.39383508326475e-01 +-4.50000000000000e+01 -6.36270369602626e-01 7.36189121222556e-01 2.32464914094013e-01 +-4.20000000000000e+01 -6.53937701306032e-01 6.60975455724981e-01 2.26919127213316e-01 +-3.90000000000000e+01 -6.70664549725515e-01 5.86181715938499e-01 2.21997712524231e-01 +-3.60000000000000e+01 -6.84774756509486e-01 5.13070549905569e-01 2.19442879100228e-01 +-3.30000000000000e+01 -6.97852537348206e-01 4.42658498578043e-01 2.19788443952018e-01 +-3.00000000000000e+01 -7.11328064353672e-01 3.75094280797430e-01 2.23361039140397e-01 +-2.93939393939394e+01 -7.14415682762428e-01 3.62132722086743e-01 2.24952236186361e-01 +-2.87878787878788e+01 -7.17503301171185e-01 3.49171163376055e-01 2.26543433232325e-01 +-2.81818181818182e+01 -7.20590919579942e-01 3.36209604665368e-01 2.28134630278289e-01 +-2.75757575757576e+01 -7.24071834030542e-01 3.23664369017940e-01 2.30343477172995e-01 +-2.69696969696970e+01 -7.27721318387681e-01 3.11297572847134e-01 2.32817053854427e-01 +-2.63636363636364e+01 -7.31370802744820e-01 2.98930776676328e-01 2.35290630535858e-01 +-2.57575757575758e+01 -7.35371080478430e-01 2.86826529936594e-01 2.38225234034872e-01 +-2.51515151515151e+01 -7.39897466519906e-01 2.75116046152996e-01 2.41851270312120e-01 +-2.45454545454545e+01 -7.44423852561381e-01 2.63405562369399e-01 2.45477306589367e-01 +-2.39393939393939e+01 -7.49080204989271e-01 2.51766369918421e-01 2.49257235504190e-01 +-2.33333333333333e+01 -7.54906280057009e-01 2.40768813263367e-01 2.54422227951541e-01 +-2.27272727272727e+01 -7.60732355124748e-01 2.29771256608312e-01 2.60428793385145e-01 +-2.21212121212121e+01 -7.66558430192487e-01 2.18773699953258e-01 2.65754286761814e-01 +-2.15151515151515e+01 -8.00687554276612e-01 2.12395791755905e-01 2.54131477053226e-01 +-2.09090909090909e+01 -8.47011591503202e-01 2.07173092829286e-01 2.36349555357985e-01 +-2.03030303030303e+01 -8.90594276628836e-01 2.01950393902668e-01 2.17964558879003e-01 +-1.96969696969697e+01 -9.33116480486079e-01 1.96765628796972e-01 1.98214287245217e-01 +-1.90909090909091e+01 -9.74622494568323e-01 1.91618795366269e-01 1.77245579244523e-01 +-1.84848484848485e+01 -1.01601768577475e+00 1.86919414620951e-01 1.56221773196698e-01 +-1.78787878787879e+01 -1.05735116332665e+00 1.82188959514290e-01 1.35737748819307e-01 +-1.72727272727273e+01 -1.09864750288064e+00 1.76364686193561e-01 1.15524161434742e-01 +-1.66666666666667e+01 -1.13991853932663e+00 1.71295280735592e-01 9.53103144961163e-02 +-1.60606060606061e+01 -1.18117196285153e+00 1.66429521167139e-01 7.50962551972795e-02 +-1.54545454545455e+01 -1.19791272454831e+00 1.59575377638483e-01 5.91097556474128e-02 +-1.48484848484848e+01 -1.19934186806973e+00 1.51502853954205e-01 4.54449853411950e-02 +-1.42424242424242e+01 -1.16297897530355e+00 1.40460445425891e-01 3.82990945588821e-02 +-1.36363636363636e+01 -1.12077036373998e+00 1.29002431424042e-01 3.11065404436185e-02 +-1.30303030303030e+01 -1.07463320183473e+00 1.17263267706531e-01 2.26980761363050e-02 +-1.24242424242424e+01 -1.02518157920182e+00 1.05918643160515e-01 1.17933498379386e-02 +-1.18181818181818e+01 -9.75681942398755e-01 9.51959685529269e-02 1.19873623725293e-03 +-1.12121212121212e+01 -9.26571076805030e-01 8.58848934178665e-02 -8.41861521656647e-03 +-1.06060606060606e+01 -8.75664896114804e-01 7.74090431182947e-02 -1.63777998285526e-02 +-1.00000000000000e+01 -8.23237071758609e-01 6.93728235267388e-02 -2.34138528773980e-02 +-9.39393939393939e+00 -7.82111343672048e-01 5.75636308912248e-02 -3.21020160083091e-02 +-8.78787878787879e+00 -7.51375159974407e-01 4.47516034625548e-02 -3.98906956582438e-02 +-8.18181818181818e+00 -7.35088054943470e-01 3.08041630438302e-02 -4.60682064471990e-02 +-7.57575757575758e+00 -6.92836122752420e-01 2.31579933295670e-02 -4.89829934537834e-02 +-6.96969696969697e+00 -6.37949933369482e-01 1.87032507714761e-02 -5.07384454242695e-02 +-6.36363636363636e+00 -5.54161342148495e-01 1.67784052774049e-02 -5.53503816254145e-02 +-5.75757575757576e+00 -4.70840124165288e-01 1.50845427200835e-02 -5.98951476736281e-02 +-5.15151515151515e+00 -3.88292011066822e-01 1.36982538638481e-02 -6.45572843794330e-02 +-4.54545454545454e+00 -3.06502440552051e-01 1.26562227449715e-02 -6.91008881961310e-02 +-3.93939393939394e+00 -2.25310842700356e-01 1.17673191515673e-02 -7.35346491057446e-02 +-3.33333333333333e+00 -1.47988215381915e-01 1.13325276777439e-02 -7.76194041395815e-02 +-2.72727272727273e+00 -7.09984158942061e-02 1.09783067702849e-02 -8.14085077704442e-02 +-2.12121212121212e+00 5.67824274921396e-03 1.06696224794102e-02 -8.49142606714796e-02 +-1.51515151515152e+00 8.26102586756291e-02 1.04667274124626e-02 -8.82711832196438e-02 +-9.09090909090912e-01 1.59969016769918e-01 1.03323320303745e-02 -9.15655050496302e-02 +-3.03030303030302e-01 2.38974448513455e-01 1.03900461416016e-02 -9.47661275562079e-02 + 3.03030303030302e-01 3.17646859605712e-01 1.04649254982203e-02 -9.77901212356652e-02 + 9.09090909090912e-01 3.96007393557534e-01 1.05511605199152e-02 -1.00651121145792e-01 + 1.51515151515152e+00 4.74169429973799e-01 1.05752495413395e-02 -1.03293525376690e-01 + 2.12121212121212e+00 5.51911940760023e-01 1.06224929903068e-02 -1.05813765929291e-01 + 2.72727272727273e+00 6.28056580841275e-01 1.08108555850528e-02 -1.07977517357485e-01 + 3.33333333333333e+00 7.03798053899655e-01 1.09879017716880e-02 -1.09916646422344e-01 + 3.93939393939394e+00 7.79276493869128e-01 1.11758838962833e-02 -1.11658275595353e-01 + 4.54545454545455e+00 8.53499796067138e-01 1.14129478363666e-02 -1.13253311951308e-01 + 5.15151515151515e+00 9.26946560290491e-01 1.16638391697767e-02 -1.14737019623995e-01 + 5.75757575757576e+00 9.98458448466187e-01 1.19568385022413e-02 -1.15939256762654e-01 + 6.36363636363637e+00 1.06804425733062e+00 1.22991453288649e-02 -1.16892495532205e-01 + 6.96969696969697e+00 1.13638020854557e+00 1.26698916273089e-02 -1.17681562497719e-01 + 7.57575757575757e+00 1.20139147533564e+00 1.30839223585554e-02 -1.18207998448365e-01 + 8.18181818181818e+00 1.26525870625966e+00 1.34927417386065e-02 -1.18675618171796e-01 + 8.78787878787879e+00 1.32856174203142e+00 1.38637786532075e-02 -1.19120015634172e-01 + 9.39393939393939e+00 1.38894849360344e+00 1.46729594502212e-02 -1.18422993276735e-01 + 1.00000000000000e+01 1.44308909541765e+00 1.56494510556849e-02 -1.17051335409731e-01 + 1.06060606060606e+01 1.48423802370368e+00 1.71908084497653e-02 -1.14598756389549e-01 + 1.12121212121212e+01 1.51610502455934e+00 1.91222908592098e-02 -1.11779817617528e-01 + 1.18181818181818e+01 1.53072866564893e+00 2.16025680835697e-02 -1.08254794802547e-01 + 1.24242424242424e+01 1.39977849156389e+00 3.79528706066007e-02 -1.10603299151591e-01 + 1.30303030303030e+01 1.21617535220138e+00 5.95675147584135e-02 -1.15202550970118e-01 + 1.36363636363636e+01 1.15533504132719e+00 6.93992690943369e-02 -1.13563572716609e-01 + 1.42424242424242e+01 1.10480169457590e+00 7.89367459341939e-02 -1.12086468683529e-01 + 1.48484848484848e+01 1.07517912705030e+00 8.81134671681645e-02 -1.10736245553130e-01 + 1.54545454545455e+01 1.05513703714054e+00 9.73441034120854e-02 -1.10445332098790e-01 + 1.60606060606061e+01 1.03909979751391e+00 1.06615031950527e-01 -1.10471629053083e-01 + 1.66666666666667e+01 1.03037285182419e+00 1.16086945222589e-01 -1.11452522736188e-01 + 1.72727272727273e+01 1.02598020440334e+00 1.25858967571876e-01 -1.12862502655475e-01 + 1.78787878787879e+01 1.02688508760461e+00 1.35997793709910e-01 -1.14796926748810e-01 + 1.84848484848485e+01 1.04050556314885e+00 1.47897334941441e-01 -1.18027092927592e-01 + 1.90909090909091e+01 1.05662971405014e+00 1.60210090125818e-01 -1.21765865016242e-01 + 1.96969696969697e+01 1.06892917336845e+00 1.72370385761586e-01 -1.26551733685257e-01 + 2.03030303030303e+01 1.07836210245173e+00 1.84226855703769e-01 -1.31723435235985e-01 + 2.09090909090909e+01 1.08492833913008e+00 1.95779482763855e-01 -1.37432962053028e-01 + 2.15151515151515e+01 1.09149457580843e+00 2.07332109823942e-01 -1.43194849094184e-01 + 2.21212121212121e+01 1.09508251337799e+00 2.18773699953258e-01 -1.48870391290255e-01 + 2.27272727272727e+01 1.08676031896276e+00 2.29771256608312e-01 -1.54237881279540e-01 + 2.33333333333333e+01 1.07843812454753e+00 2.40768813263367e-01 -1.59641997918361e-01 + 2.39393939393939e+01 1.07011593013229e+00 2.51766369918421e-01 -1.65258999148450e-01 + 2.45454545454545e+01 1.06346338211567e+00 2.63405562369399e-01 -1.70132904338816e-01 + 2.51515151515151e+01 1.05699634637488e+00 2.75116046152996e-01 -1.74924245078642e-01 + 2.57575757575758e+01 1.05052931063409e+00 2.86826529936594e-01 -1.79715585818468e-01 + 2.63636363636364e+01 1.04481382943098e+00 2.98930776676328e-01 -1.84171410304438e-01 + 2.69696969696970e+01 1.03959946244701e+00 3.11297572847134e-01 -1.88403522528518e-01 + 2.75757575757576e+01 1.03438509546304e+00 3.23664369017940e-01 -1.92635634752598e-01 + 2.81818181818182e+01 1.02941249540321e+00 3.36209604665368e-01 -1.96751514558490e-01 + 2.87878787878788e+01 1.02500396977555e+00 3.49171163376055e-01 -2.00596208653092e-01 + 2.93939393939394e+01 1.02059544414789e+00 3.62132722086743e-01 -2.04440902747695e-01 + 3.00000000000000e+01 1.01618691852022e+00 3.75094280797430e-01 -2.08285596842297e-01 + 3.30000000000000e+01 9.96930791089291e-01 4.42658498578043e-01 -2.25638690746125e-01 + 3.60000000000000e+01 9.78250493475424e-01 5.13070549905569e-01 -2.41866371031337e-01 + 3.90000000000000e+01 9.58092634837620e-01 5.86181715938499e-01 -2.56756566563372e-01 + 4.20000000000000e+01 9.34197243420856e-01 6.60975455724981e-01 -2.71189386382951e-01 + 4.50000000000000e+01 9.08958131052610e-01 7.36189121222556e-01 -2.85513863759938e-01 + 4.80000000000000e+01 8.76369360506042e-01 8.11357652574190e-01 -2.99318564738472e-01 + 5.10000000000000e+01 8.39546103316861e-01 8.84985611770030e-01 -3.12885528690573e-01 + 5.40000000000000e+01 7.94253600616922e-01 9.55532327614396e-01 -3.25953209472103e-01 + 5.70000000000000e+01 7.48961443924963e-01 1.02607850452350e+00 -3.39030396022098e-01 + 6.00000000000000e+01 7.03669460235677e-01 1.09662441196703e+00 -3.52114744115643e-01 + 6.30000000000000e+01 6.42304649985047e-01 1.15396405534123e+00 -3.63896004000846e-01 + 6.60000000000000e+01 5.80939701964786e-01 1.21130358551679e+00 -3.75682451037757e-01 + 6.90000000000000e+01 5.19574753944523e-01 1.26864311569235e+00 -3.87472927093907e-01 + 7.20000000000000e+01 4.50573500357888e-01 1.31252792475019e+00 -3.98011457008727e-01 + 7.50000000000000e+01 3.77754250313412e-01 1.34968564868523e+00 -4.07925210836086e-01 + 7.80000000000000e+01 3.04933632222489e-01 1.38684379841819e+00 -4.17841195787456e-01 + 8.10000000000000e+01 2.30748068771223e-01 1.41576012175667e+00 -4.26898468755288e-01 + 8.40000000000000e+01 1.53832708821342e-01 1.42819336121861e+00 -4.34236382280660e-01 + 8.70000000000000e+01 7.69163612800006e-02 1.44062669566363e+00 -4.41574423427714e-01 + 9.00000000000000e+01 -3.36040174418520e-07 1.45305992240014e+00 -4.48912349036806e-01 + 9.30000000000000e+01 -5.38415146430987e-02 1.44062668293820e+00 -4.52353830558963e-01 + 9.60000000000000e+01 -1.07682698904138e-01 1.42819339598511e+00 -4.55796422926281e-01 + 9.90000000000000e+01 -1.61523894481612e-01 1.41576001404799e+00 -4.59240045315168e-01 + 1.02000000000000e+02 -2.13453578289375e-01 1.38684361845383e+00 -4.59405772291525e-01 + 1.05000000000000e+02 -2.64427526911242e-01 1.34968589451878e+00 -4.57933058035756e-01 + 1.08000000000000e+02 -3.15401526057875e-01 1.31252774478765e+00 -4.56460500541016e-01 + 1.11000000000000e+02 -3.63702613318511e-01 1.26864261896506e+00 -4.53729817735206e-01 + 1.14000000000000e+02 -4.06657958215626e-01 1.21130374584807e+00 -4.48482124934980e-01 + 1.17000000000000e+02 -4.49613275538441e-01 1.15396443469656e+00 -4.43234672446104e-01 + 1.20000000000000e+02 -4.92568557072479e-01 1.09662487869506e+00 -4.37987618819821e-01 + 1.23000000000000e+02 -5.24273305652762e-01 1.02607897125153e+00 -4.30899900449802e-01 + 1.26000000000000e+02 -5.55977975337812e-01 9.55532794347773e-01 -4.23812474118514e-01 + 1.29000000000000e+02 -5.87682487226498e-01 8.84986078503406e-01 -4.16725057602321e-01 + 1.32000000000000e+02 -6.11743957269202e-01 8.11342840122296e-01 -4.10311145379585e-01 + 1.35000000000000e+02 -6.31983915443519e-01 7.36151344151820e-01 -4.04234114284225e-01 + 1.38000000000000e+02 -6.52223041697912e-01 6.60960643393727e-01 -3.98157422646348e-01 + 1.41000000000000e+02 -6.70277141430926e-01 5.87259503028655e-01 -3.94043626890889e-01 + 1.44000000000000e+02 -6.83961170390853e-01 5.16537495536617e-01 -3.93855328257089e-01 + 1.47000000000000e+02 -6.97644694809602e-01 4.45815984052867e-01 -3.93666633192198e-01 + 1.50000000000000e+02 -7.11327966966768e-01 3.75094720564406e-01 -3.93477629010198e-01 + 1.53000000000000e+02 -7.10555758661770e-01 3.21288604729336e-01 -4.09291401293984e-01 + 1.56000000000000e+02 -7.09783519622452e-01 2.67482711700951e-01 -4.25113789480059e-01 + 1.59000000000000e+02 -7.09747287572277e-01 2.13677185443974e-01 -4.40944959963481e-01 + 1.62000000000000e+02 -6.39242744263654e-01 1.76167844671200e-01 -4.56979587409322e-01 + 1.65000000000000e+02 -5.32702098344237e-01 1.46806734460832e-01 -4.73112741890976e-01 + 1.68000000000000e+02 -4.24165693368368e-01 1.17445360706964e-01 -4.89245046545928e-01 + 1.71000000000000e+02 -3.17540377497210e-01 8.80840526647858e-02 -4.50000513056908e-01 + 1.74000000000000e+02 -2.11693558985589e-01 5.87228760490535e-02 -2.99999717902353e-01 + 1.77000000000000e+02 -1.05275486594639e-01 4.83558379259246e-02 -1.49185828331614e-01 + 1.80000000000000e+02 0.00000000000000e+00 4.74971586892991e-02 0.00000000000000e+00 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_15.dat b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_15.dat new file mode 100644 index 000000000..8a6d71edf --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_15.dat @@ -0,0 +1,254 @@ +! ------------ AirfoilInfo v1.01.x Input File ---------------------------------- +! AeroElasticSE FAST driver +! line +! line +! ------------------------------------------------------------------------------ +DEFAULT InterpOrd ! Interpolation order to use for quasi-steady table lookup {1=linear; 3=cubic spline; "default"} [default=3] +1 NonDimArea ! The non-dimensional area of the airfoil (area/chord^2) (set to 1.0 if unsure or unneeded) +@"NREL-2p8-127_AF15_Coords.txt" NumCoords ! The number of coordinates in the airfoil shape file. Set to zero if coordinates not included. +AF15_BL.txt BL_file ! The file name including the boundary layer characteristics of the profile. Ignored if the aeroacoustic module is not called. +1 NumTabs ! Number of airfoil tables in this file. Each table must have lines for Re and Ctrl. +! ------------------------------------------------------------------------------ +! data for table 1 +! ------------------------------------------------------------------------------ +6.000000 Re ! Reynolds number in millions +0 Ctrl ! Control setting (must be 0 for current AirfoilInfo) +True InclUAdata ! Is unsteady aerodynamics data included in this table? If TRUE, then include 30 UA coefficients below this line +!........................................ +-2.208961 alpha0 ! 0-lift angle of attack, depends on airfoil. +11.877956 alpha1 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA>alpha0. (deg) +-10.077196 alpha2 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA1] +0.000000 S2 ! Constant in the f curve best-fit for AOA> alpha1; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S3 ! Constant in the f curve best-fit for alpha2<=AOA< alpha0; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S4 ! Constant in the f curve best-fit for AOA< alpha2; by definition it depends on the airfoil. [ignored if UAMod<>1] +1.523431 Cn1 ! Critical value of C0n at leading edge separation. It should be extracted from airfoil data at a given Mach and Reynolds number. It can be calculated from the static value of Cn at either the break in the pitching moment or the loss of chord force at the onset of stall. It is close to the condition of maximum lift of the airfoil at low Mach numbers. +-1.245136 Cn2 ! As Cn1 for negative AOAs. +Default St_sh ! Strouhal's shedding frequency constant. [default = 0.19] +0.010644 Cd0 ! 2D drag coefficient value at 0-lift. +-0.090826 Cm0 ! 2D pitching moment coefficient about 1/4-chord location, at 0-lift, positive if nose up. [If the aerodynamics coefficients table does not include a column for Cm, this needs to be set to 0.0] +0.000000 k0 ! Constant in the \hat(x)_cp curve best-fit; = (\hat(x)_AC-0.25). [ignored if UAMod<>1] +0.000000 k1 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k2 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k3 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k1_hat ! Constant in the expression of Cc due to leading edge vortex effects. [ignored if UAMod<>1] +Default x_cp_bar ! Constant in the expression of \hat(x)_cp^v. [ignored if UAMod<>1, default = 0.2] +Default UACutout ! Angle of attack above which unsteady aerodynamics are disabled (deg). [Specifying the string "Default" sets UACutout to 45 degrees] +Default filtCutOff ! Cut-off frequency (-3 dB corner frequency) for low-pass filtering the AoA input to UA, as well as the 1st and 2nd derivatives (Hz) [default = 20] +!........................................ +! Table of aerodynamics coefficients +200 NumAlf ! Number of data lines in the following table +! Alpha Cl Cd Cm +! (deg) (-) (-) (-) +-1.80000000000000e+02 0.00000000000000e+00 4.67684423893836e-02 0.00000000000000e+00 +-1.77000000000000e+02 1.09408903050313e-01 4.67684423893836e-02 1.19449340115019e-01 +-1.74000000000000e+02 2.19827919665962e-01 5.61220773758285e-02 2.39999774321882e-01 +-1.71000000000000e+02 3.29742593401240e-01 8.41832894069106e-02 3.60000410445527e-01 +-1.68000000000000e+02 4.39652946023446e-01 1.12247441543861e-01 3.17657026395814e-01 +-1.65000000000000e+02 5.49568920893405e-01 1.40313063699431e-01 1.94143527053385e-01 +-1.62000000000000e+02 6.59436266220261e-01 1.68379605308450e-01 7.06292113109056e-02 +-1.59000000000000e+02 7.30300487636504e-01 2.05487990755536e-01 -1.10385648721879e-02 +-1.56000000000000e+02 7.23544790871733e-01 2.60679757996445e-01 -8.60356910819995e-03 +-1.53000000000000e+02 7.16970142385750e-01 3.15871546871301e-01 -6.03641287104454e-03 +-1.50000000000000e+02 7.10395253192162e-01 3.71063383075396e-01 -3.53054989193793e-03 +-1.47000000000000e+02 6.96821464496714e-01 4.41924263677891e-01 1.15622643794935e-02 +-1.44000000000000e+02 6.83247423957872e-01 5.12785414225651e-01 2.66551539940038e-02 +-1.41000000000000e+02 6.69672879714259e-01 5.83647104683221e-01 4.17481792755350e-02 +-1.38000000000000e+02 6.51701749637977e-01 6.57509515264151e-01 5.71032192754300e-02 +-1.35000000000000e+02 6.31532335564314e-01 7.32872279819475e-01 7.25892986682547e-02 +-1.32000000000000e+02 6.11362090369567e-01 8.08235905809873e-01 8.80756349445296e-02 +-1.29000000000000e+02 5.87362687378832e-01 8.82060419340625e-01 1.03702753521495e-01 +-1.26000000000000e+02 5.55704950650637e-01 9.52806700636205e-01 1.19611333221862e-01 +-1.23000000000000e+02 5.24047055768739e-01 1.02355244146660e+00 1.35519828983413e-01 +-1.20000000000000e+02 4.92389081812946e-01 1.09429791207450e+00 1.51428303263083e-01 +-1.17000000000000e+02 4.49464448320822e-01 1.15185785100299e+00 1.66519076342545e-01 +-1.14000000000000e+02 4.06539757473919e-01 1.20941754428038e+00 1.81609537109452e-01 +-1.11000000000000e+02 3.63614995985125e-01 1.26697679783968e+00 1.96699434164473e-01 +-1.08000000000000e+02 3.15335797028190e-01 1.31109215764924e+00 2.10144017964703e-01 +-1.05000000000000e+02 2.64379338566390e-01 1.34848546821470e+00 2.22765790368656e-01 +-1.02000000000000e+02 2.13422866177849e-01 1.38587835028935e+00 2.35387244205176e-01 +-9.90000000000000e+01 1.61506739379516e-01 1.41503236786356e+00 2.46653165683191e-01 +-9.60000000000000e+01 1.07671262193915e-01 1.42770829956833e+00 2.55208020338782e-01 +-9.30000000000000e+01 5.38357962810632e-02 1.44038413443613e+00 2.63762460154027e-01 +-9.00000000000000e+01 3.36004484266645e-07 1.45305992088633e+00 2.72316549083834e-01 +-8.70000000000000e+01 -5.38357411804466e-02 1.44038414740981e+00 2.75975908689839e-01 +-8.40000000000000e+01 -1.07671412729903e-01 1.42770826412360e+00 2.79637509125723e-01 +-8.10000000000000e+01 -1.61506273010176e-01 1.41503247767341e+00 2.83303463358523e-01 +-7.80000000000000e+01 -2.13422619382625e-01 1.38587853139263e+00 2.83673895090911e-01 +-7.50000000000000e+01 -2.64379675691045e-01 1.34848522082535e+00 2.82397275634580e-01 +-7.20000000000000e+01 -3.15335550238364e-01 1.31109233875070e+00 2.81119990974020e-01 +-6.90000000000000e+01 -3.63614624127447e-01 1.26697729647612e+00 2.78579207220845e-01 +-6.60000000000000e+01 -4.06539877500383e-01 1.20941738333287e+00 2.73511947958626e-01 +-6.30000000000000e+01 -4.49464732308094e-01 1.15185747018962e+00 2.68443139589274e-01 +-6.00000000000000e+01 -4.92389291260444e-01 1.09429744402618e+00 2.63372775517188e-01 +-5.70000000000000e+01 -5.24047265216237e-01 1.02355197341827e+00 2.56458829905844e-01 +-5.40000000000000e+01 -5.55705160096565e-01 9.52806232582514e-01 2.49542806281396e-01 +-5.10000000000000e+01 -5.87362896824760e-01 8.82059951286934e-01 2.42624285718169e-01 +-4.80000000000000e+01 -6.13081518081798e-01 8.08245749651705e-01 2.35914730168143e-01 +-4.50000000000000e+01 -6.35830677053252e-01 7.32897637152475e-01 2.29306703335177e-01 +-4.20000000000000e+01 -6.53421163894653e-01 6.57519359024154e-01 2.24147571871917e-01 +-3.90000000000000e+01 -6.70067066454672e-01 5.82564691354695e-01 2.19583471937992e-01 +-3.60000000000000e+01 -6.84082341201795e-01 5.09304675599610e-01 2.17192480713428e-01 +-3.30000000000000e+01 -6.97048433260438e-01 4.38755128231645e-01 2.17746484897517e-01 +-3.00000000000000e+01 -7.10395349681667e-01 3.71062942477108e-01 2.21579781653519e-01 +-2.93939393939394e+01 -7.13452692480888e-01 3.58077533205854e-01 2.23238409263915e-01 +-2.87878787878788e+01 -7.16510035280109e-01 3.45092123934599e-01 2.24897036874312e-01 +-2.81818181818182e+01 -7.19567378079330e-01 3.32106714663345e-01 2.26555664484708e-01 +-2.75757575757576e+01 -7.23015176952550e-01 3.19538672861810e-01 2.28842891870977e-01 +-2.69696969696970e+01 -7.26630328498820e-01 3.07149518178065e-01 2.31399542272472e-01 +-2.63636363636364e+01 -7.30245480045089e-01 2.94760363494321e-01 2.33956192673967e-01 +-2.57575757575758e+01 -7.34209413289690e-01 2.82634381591017e-01 2.36982384547252e-01 +-2.51515151515151e+01 -7.38696437793794e-01 2.70903097522626e-01 2.40712779195633e-01 +-2.45454545454545e+01 -7.43183462297898e-01 2.59171813454235e-01 2.44443173844013e-01 +-2.39393939393939e+01 -7.47799807451049e-01 2.47511976474211e-01 2.48330404264612e-01 +-2.33333333333333e+01 -7.53580063482705e-01 2.36495177121992e-01 2.53629186999333e-01 +-2.27272727272727e+01 -7.59360319514362e-01 2.25478377769773e-01 2.59138821302601e-01 +-2.21212121212121e+01 -7.65140575546019e-01 2.14461578417554e-01 2.64477816678713e-01 +-2.15151515151515e+01 -8.03302749793657e-01 2.08548124886777e-01 2.49301560239203e-01 +-2.09090909090909e+01 -8.50824045909576e-01 2.03910836081233e-01 2.28513888557106e-01 +-2.03030303030303e+01 -8.97768386898726e-01 1.99273547275689e-01 2.07575119743590e-01 +-1.96969696969697e+01 -9.44678207213724e-01 1.94637489543005e-01 1.86538818608059e-01 +-1.90909090909091e+01 -9.91555050415259e-01 1.90002662813539e-01 1.65441760982968e-01 +-1.84848484848485e+01 -1.03842681336623e+00 1.85480504382984e-01 1.44332068966338e-01 +-1.78787878787879e+01 -1.08529649705215e+00 1.80950527403410e-01 1.23357644166816e-01 +-1.72727272727273e+01 -1.13216603243267e+00 1.76145971766597e-01 1.02450261417032e-01 +-1.66666666666667e+01 -1.17903468591979e+00 1.71473937535991e-01 8.15425477213738e-02 +-1.60606060606061e+01 -1.22590272554085e+00 1.66848907281323e-01 6.06345632546291e-02 +-1.54545454545455e+01 -1.24540579219954e+00 1.60147463320380e-01 4.44630991177370e-02 +-1.48484848484848e+01 -1.24781000746850e+00 1.52164045091083e-01 3.08929440011085e-02 +-1.42424242424242e+01 -1.20802738977228e+00 1.41026803742556e-01 2.37904766410137e-02 +-1.36363636363636e+01 -1.16175523534967e+00 1.29449635840845e-01 1.56762299252564e-02 +-1.30303030303030e+01 -1.11115112057063e+00 1.17578013100753e-01 6.58924652136504e-03 +-1.24242424242424e+01 -1.05692194409935e+00 1.06127950509725e-01 -3.71182830764803e-03 +-1.18181818181818e+01 -1.00272814309195e+00 9.53368098006124e-02 -1.33696206088078e-02 +-1.12121212121212e+01 -9.49076573968545e-01 8.60321040274192e-02 -2.13872923605838e-02 +-1.06060606060606e+01 -8.93581807311589e-01 7.76106753832643e-02 -2.80731947658556e-02 +-1.00000000000000e+01 -8.36985941927378e-01 6.96649134803325e-02 -3.40347701647619e-02 +-9.39393939393939e+00 -7.93166380537571e-01 5.77167470270437e-02 -4.15395521632745e-02 +-8.78787878787879e+00 -7.59169809540880e-01 4.45159809940110e-02 -4.84819804761218e-02 +-8.18181818181818e+00 -7.42105465881365e-01 2.91170572332394e-02 -5.43926186316557e-02 +-7.57575757575758e+00 -6.99614592258827e-01 2.14382481096017e-02 -5.74658684394408e-02 +-6.96969696969697e+00 -6.44608817122756e-01 1.72874428994890e-02 -5.94924254124929e-02 +-6.36363636363636e+00 -5.58802274186132e-01 1.57551020164310e-02 -6.43044689253696e-02 +-5.75757575757576e+00 -4.73764998472755e-01 1.43502448275924e-02 -6.89249208066366e-02 +-5.15151515151515e+00 -3.89894394333158e-01 1.31419672724884e-02 -7.32603190020164e-02 +-4.54545454545454e+00 -3.07166264437107e-01 1.22637086666309e-02 -7.73190401255010e-02 +-3.93939393939394e+00 -2.25054198114775e-01 1.15266148059250e-02 -8.12466599743608e-02 +-3.33333333333333e+00 -1.45172725478899e-01 1.11181586895799e-02 -8.48048561058059e-02 +-2.72727272727273e+00 -6.64481817059381e-02 1.08213328544847e-02 -8.81461929096935e-02 +-2.12121212121212e+00 1.12495325557481e-02 1.06139900247299e-02 -9.12799422030186e-02 +-1.51515151515152e+00 8.85670296087496e-02 1.04479884948180e-02 -9.42942439451978e-02 +-9.09090909090912e-01 1.66213270670549e-01 1.03347362369138e-02 -9.72595244702951e-02 +-3.03030303030302e-01 2.45681839335204e-01 1.04136053686051e-02 -1.00116736668253e-01 + 3.03030303030302e-01 3.24493811021227e-01 1.05051634149457e-02 -1.02832528533338e-01 + 9.09090909090912e-01 4.02689577361445e-01 1.06029024359060e-02 -1.05409582524880e-01 + 1.51515151515152e+00 4.80450558739067e-01 1.06086084327215e-02 -1.07756982884227e-01 + 2.12121212121212e+00 5.57655020416299e-01 1.06364076844461e-02 -1.10007533488911e-01 + 2.72727272727273e+00 6.32854110854688e-01 1.08222553063749e-02 -1.12010805967812e-01 + 3.33333333333333e+00 7.07829104208440e-01 1.09871939917408e-02 -1.13813398304224e-01 + 3.93939393939394e+00 7.82726097125106e-01 1.11313590740197e-02 -1.15433563257352e-01 + 4.54545454545455e+00 8.56725036367504e-01 1.13155452275198e-02 -1.16880352315399e-01 + 5.15151515151515e+00 9.30032793828029e-01 1.15208350124478e-02 -1.18219662619805e-01 + 5.75757575757576e+00 1.00154268140207e+00 1.17795522060827e-02 -1.19293155287934e-01 + 6.36363636363637e+00 1.07164671957996e+00 1.20808443869704e-02 -1.20114824732784e-01 + 6.96969696969697e+00 1.14081776942528e+00 1.24089124959070e-02 -1.20769509296104e-01 + 7.57575757575757e+00 1.20747309170393e+00 1.27841449542467e-02 -1.20984177116947e-01 + 8.18181818181818e+00 1.27293094202657e+00 1.31971119963991e-02 -1.21040387776290e-01 + 8.78787878787879e+00 1.33631723158136e+00 1.36879819805424e-02 -1.20797951715922e-01 + 9.39393939393939e+00 1.39580208572342e+00 1.43634591973061e-02 -1.19814227819290e-01 + 1.00000000000000e+01 1.45201036734241e+00 1.51114679774447e-02 -1.18417062091605e-01 + 1.06060606060606e+01 1.49636269861419e+00 1.62052841025846e-02 -1.15842476045504e-01 + 1.12121212121212e+01 1.53223105339179e+00 1.75945580457730e-02 -1.12669856479682e-01 + 1.18181818181818e+01 1.55233724587327e+00 1.95273589024484e-02 -1.08387441695462e-01 + 1.24242424242424e+01 1.40485306788269e+00 3.66837894727473e-02 -1.10705453199216e-01 + 1.30303030303030e+01 1.19641936134212e+00 5.96341107919704e-02 -1.15524471863464e-01 + 1.36363636363636e+01 1.13694346952033e+00 6.90810774839366e-02 -1.13792452322283e-01 + 1.42424242424242e+01 1.08854773748024e+00 7.81569854013355e-02 -1.12222962444976e-01 + 1.48484848484848e+01 1.05813142651997e+00 8.67025410668526e-02 -1.10869165205536e-01 + 1.54545454545455e+01 1.03762808162079e+00 9.51813233811173e-02 -1.10006355575461e-01 + 1.60606060606061e+01 1.02128710765488e+00 1.03672155520267e-01 -1.09349864817940e-01 + 1.66666666666667e+01 1.01267698438400e+00 1.12471820673251e-01 -1.09500151103095e-01 + 1.72727272727273e+01 1.00862750152695e+00 1.21612657749372e-01 -1.10196871074556e-01 + 1.78787878787879e+01 1.01015219256151e+00 1.31170487057709e-01 -1.11561461369328e-01 + 1.84848484848485e+01 1.02487270501671e+00 1.42717764493646e-01 -1.14728141059506e-01 + 1.90909090909091e+01 1.04251728636470e+00 1.54827944679204e-01 -1.18510461076852e-01 + 1.96969696969697e+01 1.05803974641611e+00 1.67310086078875e-01 -1.23229156855034e-01 + 2.03030303030303e+01 1.07018102313405e+00 1.79415876584770e-01 -1.28428162973701e-01 + 2.09090909090909e+01 1.07894092523283e+00 1.91145294905368e-01 -1.34145582008302e-01 + 2.15151515151515e+01 1.08770082733162e+00 2.02874713225965e-01 -1.39876119614393e-01 + 2.21212121212121e+01 1.09305671932835e+00 2.14461578417554e-01 -1.45612662747519e-01 + 2.27272727272727e+01 1.08480007339250e+00 2.25478377769773e-01 -1.51382551672362e-01 + 2.33333333333333e+01 1.07654342745665e+00 2.36495177121992e-01 -1.57161617206521e-01 + 2.39393939393939e+01 1.06828678152080e+00 2.47511976474211e-01 -1.62994019825784e-01 + 2.45454545454545e+01 1.06169131258261e+00 2.59171813454235e-01 -1.68042877714576e-01 + 2.51515151515151e+01 1.05528041489594e+00 2.70903097522626e-01 -1.73004676950534e-01 + 2.57575757575758e+01 1.04886951720927e+00 2.82634381591017e-01 -1.77966476186493e-01 + 2.63636363636364e+01 1.04320589180274e+00 2.94760363494321e-01 -1.82573390251451e-01 + 2.69696969696970e+01 1.03804052533334e+00 3.07149518178065e-01 -1.86943677436481e-01 + 2.75757575757576e+01 1.03287515886394e+00 3.19538672861810e-01 -1.91313964621511e-01 + 2.81818181818182e+01 1.02794990386129e+00 3.32106714663345e-01 -1.95560901544960e-01 + 2.87878787878788e+01 1.02358486088827e+00 3.45092123934599e-01 -1.99520045880541e-01 + 2.93939393939394e+01 1.01921981791524e+00 3.58077533205854e-01 -2.03479190216121e-01 + 3.00000000000000e+01 1.01485477494222e+00 3.71062942477108e-01 -2.07438334551702e-01 + 3.30000000000000e+01 9.95781979176941e-01 4.38755128231646e-01 -2.25248633303694e-01 + 3.60000000000000e+01 9.77261344047451e-01 5.09304675599610e-01 -2.41856194661193e-01 + 3.90000000000000e+01 9.57239163797111e-01 5.82564691354695e-01 -2.57340269463326e-01 + 4.20000000000000e+01 9.33459403203811e-01 6.57519359024154e-01 -2.72202941735538e-01 + 4.50000000000000e+01 9.08329968243298e-01 7.32897637152475e-01 -2.86898149313765e-01 + 4.80000000000000e+01 8.75830570639952e-01 8.08245749651705e-01 -3.01010122893952e-01 + 5.10000000000000e+01 8.39089169459949e-01 8.82059951286934e-01 -3.14864677792113e-01 + 5.40000000000000e+01 7.93863488417853e-01 9.52806232582514e-01 -3.28197186474091e-01 + 5.70000000000000e+01 7.48638152873260e-01 1.02355197341827e+00 -3.41532795817309e-01 + 6.00000000000000e+01 7.03412990076103e-01 1.09429744402618e+00 -3.54870873320022e-01 + 6.30000000000000e+01 6.42091935358749e-01 1.15185747018962e+00 -3.66903187497261e-01 + 6.60000000000000e+01 5.80770742674055e-01 1.20941738333287e+00 -3.78937520560764e-01 + 6.90000000000000e+01 5.19449549989362e-01 1.26697729647612e+00 -3.90973534083543e-01 + 7.20000000000000e+01 4.50479586567496e-01 1.31109233875070e+00 -4.01764478228043e-01 + 7.50000000000000e+01 3.77685394357568e-01 1.34848522082535e+00 -4.11933663285151e-01 + 7.80000000000000e+01 3.04889770136817e-01 1.38587853139263e+00 -4.22104253439653e-01 + 8.10000000000000e+01 2.30723589089482e-01 1.41503247767341e+00 -4.31419619766910e-01 + 8.40000000000000e+01 1.53816388998543e-01 1.42770826412360e+00 -4.39023497820268e-01 + 8.70000000000000e+01 7.69082013784813e-02 1.44038414740981e+00 -4.46628018116478e-01 + 9.00000000000000e+01 -3.36004484498046e-07 1.45305992088633e+00 -4.54233190688659e-01 + 9.30000000000000e+01 -5.38357962810632e-02 1.44038413443613e+00 -4.57885786719435e-01 + 9.60000000000000e+01 -1.07671262193915e-01 1.42770829956833e+00 -4.61538677552376e-01 + 9.90000000000000e+01 -1.61506739379516e-01 1.41503236786356e+00 -4.65191853174755e-01 + 1.02000000000000e+02 -2.13422866177849e-01 1.38587835028935e+00 -4.65561570743231e-01 + 1.05000000000000e+02 -2.64379338566390e-01 1.34848546821470e+00 -4.64289725865889e-01 + 1.08000000000000e+02 -3.15335797028190e-01 1.31109215764924e+00 -4.63017478275328e-01 + 1.11000000000000e+02 -3.63614995985125e-01 1.26697679783968e+00 -4.60482928481624e-01 + 1.14000000000000e+02 -4.06539757473920e-01 1.20941754428038e+00 -4.55423611669011e-01 + 1.17000000000000e+02 -4.49464448320822e-01 1.15185785100299e+00 -4.50364064972578e-01 + 1.20000000000000e+02 -4.92389081812947e-01 1.09429791207450e+00 -4.45304488017237e-01 + 1.23000000000000e+02 -5.24047055768740e-01 1.02355244146660e+00 -4.38404309098436e-01 + 1.26000000000000e+02 -5.55704950650637e-01 9.52806700636205e-01 -4.31504104372525e-01 + 1.29000000000000e+02 -5.87362687378832e-01 8.82060419340624e-01 -4.24603632838989e-01 + 1.32000000000000e+02 -6.11362090369567e-01 8.08235905809873e-01 -4.18403572366859e-01 + 1.35000000000000e+02 -6.31532335564314e-01 7.32872279819475e-01 -4.12553840848231e-01 + 1.38000000000000e+02 -6.51701749637977e-01 6.57509515264151e-01 -4.06704379408258e-01 + 1.41000000000000e+02 -6.69672879714259e-01 5.83647104683220e-01 -4.02869826230333e-01 + 1.44000000000000e+02 -6.83247423957872e-01 5.12785414225651e-01 -4.03065008320271e-01 + 1.47000000000000e+02 -6.96821464496714e-01 4.41924263677891e-01 -4.03260077987011e-01 + 1.50000000000000e+02 -7.10395253192162e-01 3.71063383075396e-01 -4.03455201443317e-01 + 1.53000000000000e+02 -7.06372114301663e-01 3.17621444101635e-01 -4.19162152168120e-01 + 1.56000000000000e+02 -7.02348949774489e-01 2.64179749134792e-01 -4.34871119537335e-01 + 1.59000000000000e+02 -6.98510217081455e-01 2.10738460990774e-01 -4.50581918807084e-01 + 1.62000000000000e+02 -6.27628255763012e-01 1.73632254525860e-01 -4.64655763669874e-01 + 1.65000000000000e+02 -5.23023338960169e-01 1.44693727049735e-01 -4.77910305590711e-01 + 1.68000000000000e+02 -4.18349440675210e-01 1.15754931187723e-01 -4.91164080985006e-01 + 1.71000000000000e+02 -3.13741957550692e-01 8.68162240683767e-02 -4.50000513056908e-01 + 1.74000000000000e+02 -2.09161222825938e-01 5.78776944385058e-02 -2.99999717902353e-01 + 1.77000000000000e+02 -1.04100854082611e-01 4.76423262875679e-02 -1.49311675143774e-01 + 1.80000000000000e+02 0.00000000000000e+00 4.67684423893836e-02 0.00000000000000e+00 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_16.dat b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_16.dat new file mode 100644 index 000000000..42e6caf11 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_16.dat @@ -0,0 +1,254 @@ +! ------------ AirfoilInfo v1.01.x Input File ---------------------------------- +! AeroElasticSE FAST driver +! line +! line +! ------------------------------------------------------------------------------ +DEFAULT InterpOrd ! Interpolation order to use for quasi-steady table lookup {1=linear; 3=cubic spline; "default"} [default=3] +1 NonDimArea ! The non-dimensional area of the airfoil (area/chord^2) (set to 1.0 if unsure or unneeded) +@"NREL-2p8-127_AF16_Coords.txt" NumCoords ! The number of coordinates in the airfoil shape file. Set to zero if coordinates not included. +AF16_BL.txt BL_file ! The file name including the boundary layer characteristics of the profile. Ignored if the aeroacoustic module is not called. +1 NumTabs ! Number of airfoil tables in this file. Each table must have lines for Re and Ctrl. +! ------------------------------------------------------------------------------ +! data for table 1 +! ------------------------------------------------------------------------------ +6.000000 Re ! Reynolds number in millions +0 Ctrl ! Control setting (must be 0 for current AirfoilInfo) +True InclUAdata ! Is unsteady aerodynamics data included in this table? If TRUE, then include 30 UA coefficients below this line +!........................................ +-2.302844 alpha0 ! 0-lift angle of attack, depends on airfoil. +11.519512 alpha1 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA>alpha0. (deg) +-10.603134 alpha2 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA1] +0.000000 S2 ! Constant in the f curve best-fit for AOA> alpha1; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S3 ! Constant in the f curve best-fit for alpha2<=AOA< alpha0; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S4 ! Constant in the f curve best-fit for AOA< alpha2; by definition it depends on the airfoil. [ignored if UAMod<>1] +1.490978 Cn1 ! Critical value of C0n at leading edge separation. It should be extracted from airfoil data at a given Mach and Reynolds number. It can be calculated from the static value of Cn at either the break in the pitching moment or the loss of chord force at the onset of stall. It is close to the condition of maximum lift of the airfoil at low Mach numbers. +-1.228842 Cn2 ! As Cn1 for negative AOAs. +Default St_sh ! Strouhal's shedding frequency constant. [default = 0.19] +0.010387 Cd0 ! 2D drag coefficient value at 0-lift. +-0.097277 Cm0 ! 2D pitching moment coefficient about 1/4-chord location, at 0-lift, positive if nose up. [If the aerodynamics coefficients table does not include a column for Cm, this needs to be set to 0.0] +0.000000 k0 ! Constant in the \hat(x)_cp curve best-fit; = (\hat(x)_AC-0.25). [ignored if UAMod<>1] +0.000000 k1 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k2 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k3 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k1_hat ! Constant in the expression of Cc due to leading edge vortex effects. [ignored if UAMod<>1] +Default x_cp_bar ! Constant in the expression of \hat(x)_cp^v. [ignored if UAMod<>1, default = 0.2] +Default UACutout ! Angle of attack above which unsteady aerodynamics are disabled (deg). [Specifying the string "Default" sets UACutout to 45 degrees] +Default filtCutOff ! Cut-off frequency (-3 dB corner frequency) for low-pass filtering the AoA input to UA, as well as the 1st and 2nd derivatives (Hz) [default = 20] +!........................................ +! Table of aerodynamics coefficients +200 NumAlf ! Number of data lines in the following table +! Alpha Cl Cd Cm +! (deg) (-) (-) (-) +-1.80000000000000e+02 0.00000000000000e+00 4.74945271221455e-02 0.00000000000000e+00 +-1.77000000000000e+02 1.09026165719319e-01 4.74945271221455e-02 1.19452717008645e-01 +-1.74000000000000e+02 2.19050122417552e-01 5.69933789541972e-02 2.39999774321882e-01 +-1.71000000000000e+02 3.28575719604901e-01 8.54902462894429e-02 3.60000410445527e-01 +-1.68000000000000e+02 4.38106914174825e-01 1.13986527655115e-01 3.17778142294727e-01 +-1.65000000000000e+02 5.47644046044007e-01 1.42482516042840e-01 1.94446315387067e-01 +-1.62000000000000e+02 6.57185375418956e-01 1.70979335776501e-01 7.11135800063474e-02 +-1.59000000000000e+02 7.28986558567270e-01 2.08325862036029e-01 -1.07467958526159e-02 +-1.56000000000000e+02 7.23604309898402e-01 2.63371501965611e-01 -1.08174141591834e-02 +-1.53000000000000e+02 7.17767305056863e-01 3.18417162412815e-01 -1.14148679848354e-02 +-1.50000000000000e+02 7.12445310173410e-01 3.73462869777982e-01 -1.26457400718686e-02 +-1.47000000000000e+02 6.98630831673898e-01 4.44240664843570e-01 2.75536840347873e-03 +-1.44000000000000e+02 6.84816100411641e-01 5.15018714390009e-01 1.81567857412231e-02 +-1.41000000000000e+02 6.71000863605846e-01 5.85797272916321e-01 3.36066126261243e-02 +-1.38000000000000e+02 6.52847363996135e-01 6.59563695332857e-01 4.92127237288619e-02 +-1.35000000000000e+02 6.32524741785104e-01 7.34824043633297e-01 6.48870780422191e-02 +-1.32000000000000e+02 6.12201334294277e-01 8.10085206753381e-01 8.05597032537663e-02 +-1.29000000000000e+02 5.88065552379780e-01 8.83801868347751e-01 9.63550603105852e-02 +-1.26000000000000e+02 5.56305003551198e-01 9.54429519550126e-01 1.12398380329180e-01 +-1.23000000000000e+02 5.24544329085952e-01 1.02505663119359e+00 1.28440896746455e-01 +-1.20000000000000e+02 4.92783591804722e-01 1.09568347306768e+00 1.44482743848553e-01 +-1.17000000000000e+02 4.49791636415260e-01 1.15311205772626e+00 1.59698551465877e-01 +-1.14000000000000e+02 4.06799639145038e-01 1.21054039721062e+00 1.74914207352244e-01 +-1.11000000000000e+02 3.63807602041395e-01 1.26796829798034e+00 1.90129494093679e-01 +-1.08000000000000e+02 3.15480318387913e-01 1.31194660547628e+00 2.03701386725598e-01 +-1.05000000000000e+02 2.64485370834833e-01 1.34920001392269e+00 2.16452268723353e-01 +-1.02000000000000e+02 2.13490407640989e-01 1.38645299548144e+00 2.29203915346582e-01 +-9.90000000000000e+01 1.61544432084705e-01 1.41546560806078e+00 2.40600993496564e-01 +-9.60000000000000e+01 1.07696390610193e-01 1.42799712574756e+00 2.49288387037645e-01 +-9.30000000000000e+01 5.38483605044154e-02 1.44052854770060e+00 2.57977933040283e-01 +-9.00000000000000e+01 3.36082901150735e-07 1.45305992178765e+00 2.66670007912819e-01 +-8.70000000000000e+01 -5.38483053909395e-02 1.44052856052647e+00 2.70653828346413e-01 +-8.40000000000000e+01 -1.07696541181314e-01 1.42799709070664e+00 2.74632091077504e-01 +-8.10000000000000e+01 -1.61543965606523e-01 1.41546571661960e+00 2.78605161493305e-01 +-7.80000000000000e+01 -2.13490160659344e-01 1.38645317590716e+00 2.79287028552001e-01 +-7.50000000000000e+01 -2.64485708214139e-01 1.34919976745892e+00 2.78321604655193e-01 +-7.20000000000000e+01 -3.15480071411678e-01 1.31194678590016e+00 2.77352606273105e-01 +-6.90000000000000e+01 -3.63807229600907e-01 1.26796879547887e+00 2.75114638009095e-01 +-6.60000000000000e+01 -4.06799759359618e-01 1.21054023663040e+00 2.70342633491159e-01 +-6.30000000000000e+01 -4.49791920847929e-01 1.15311167778193e+00 2.65569198485011e-01 +-6.00000000000000e+01 -4.92783801932097e-01 1.09568300580419e+00 2.60795303619874e-01 +-5.70000000000000e+01 -5.24544539213326e-01 1.02505616393010e+00 2.54185204039382e-01 +-5.40000000000000e+01 -5.56305213677325e-01 9.54429052281285e-01 2.47577553322180e-01 +-5.10000000000000e+01 -5.88065762505907e-01 8.83801401078910e-01 2.40973778659848e-01 +-4.80000000000000e+01 -6.13910354720703e-01 8.10097993520892e-01 2.34611596779972e-01 +-4.50000000000000e+01 -6.36797063706404e-01 7.34856757216810e-01 2.28377676012707e-01 +-4.20000000000000e+01 -6.54556371048421e-01 6.59576481995557e-01 2.23680283338938e-01 +-3.90000000000000e+01 -6.71380181626923e-01 5.84717599999870e-01 2.19536883348591e-01 +-3.60000000000000e+01 -6.85604200137604e-01 5.11546160178582e-01 2.17305088035508e-01 +-3.30000000000000e+01 -6.98815713908257e-01 4.41078428348352e-01 2.18054288333084e-01 +-3.00000000000000e+01 -7.12445408634725e-01 3.73462429674547e-01 2.22124678427173e-01 +-2.93939393939394e+01 -7.15569260532856e-01 3.60491220538288e-01 2.23842948054128e-01 +-2.87878787878788e+01 -7.18693112430987e-01 3.47520011402029e-01 2.25561217681083e-01 +-2.81818181818182e+01 -7.21816964329118e-01 3.34548802265771e-01 2.27279487308038e-01 +-2.75757575757576e+01 -7.25337539045798e-01 3.21994339673895e-01 2.29635020906344e-01 +-2.69696969696970e+01 -7.29028152413596e-01 3.09618498066121e-01 2.32263691065060e-01 +-2.63636363636364e+01 -7.32718765781393e-01 2.97242656458348e-01 2.34892361223777e-01 +-2.57575757575758e+01 -7.36762602567382e-01 2.85129614107284e-01 2.37997233303781e-01 +-2.51515151515151e+01 -7.41336192157463e-01 2.73410709392586e-01 2.41816297280826e-01 +-2.45454545454545e+01 -7.45909781747544e-01 2.61691804677889e-01 2.45635361257870e-01 +-2.39393939393939e+01 -7.50627141320397e-01 2.50043674398799e-01 2.49515043488697e-01 +-2.33333333333333e+01 -7.56638458572749e-01 2.39032527742441e-01 2.53940301739542e-01 +-2.27272727272727e+01 -7.62649775825102e-01 2.28021381086083e-01 2.57853785491344e-01 +-2.21212121212121e+01 -7.68661093077454e-01 2.17010234429726e-01 2.62068606039781e-01 +-2.15151515151515e+01 -8.07233018911813e-01 2.10719432824284e-01 2.44666939257051e-01 +-2.09090909090909e+01 -8.50063944721421e-01 2.05609021115132e-01 2.23825168737330e-01 +-2.03030303030303e+01 -8.94818933511164e-01 2.00498609405980e-01 2.03531509688972e-01 +-1.96969696969697e+01 -9.39301590592824e-01 1.95388221736857e-01 1.83458906167973e-01 +-1.90909090909091e+01 -9.83659564135496e-01 1.90277858106401e-01 1.63473959738679e-01 +-1.84848484848485e+01 -1.02835646060585e+00 1.84862741269290e-01 1.43541881926139e-01 +-1.78787878787879e+01 -1.07312022949524e+00 1.79623630734647e-01 1.23006204069627e-01 +-1.72727272727273e+01 -1.11789561032257e+00 1.75305320947758e-01 1.02174031312229e-01 +-1.66666666666667e+01 -1.16291637243167e+00 1.70479646552578e-01 8.13469192385163e-02 +-1.60606060606061e+01 -1.20810673312181e+00 1.65435507128552e-01 6.05261011893848e-02 +-1.54545454545455e+01 -1.22780192188674e+00 1.58414016648205e-01 4.42999154215266e-02 +-1.48484848484848e+01 -1.23148075482471e+00 1.50176007301149e-01 3.06001307793610e-02 +-1.42424242424242e+01 -1.19557688058349e+00 1.38991906593942e-01 2.19117759370747e-02 +-1.36363636363636e+01 -1.15320275631460e+00 1.27391804267069e-01 1.07082871223446e-02 +-1.30303030303030e+01 -1.10624218648539e+00 1.15510306693132e-01 -8.83566244868970e-04 +-1.24242424242424e+01 -1.05404262149901e+00 1.03763709632377e-01 -1.08587103233837e-02 +-1.18181818181818e+01 -1.00136072816888e+00 9.26167355272088e-02 -1.96543223095588e-02 +-1.12121212121212e+01 -9.48585842590762e-01 8.31140514128371e-02 -2.58402153588698e-02 +-1.06060606060606e+01 -8.93667893889375e-01 7.46227143327008e-02 -3.16390840974881e-02 +-1.00000000000000e+01 -8.38065195025141e-01 6.66511845807474e-02 -3.72575661487416e-02 +-9.39393939393939e+00 -7.95410787978230e-01 5.51236226526759e-02 -4.38865668044484e-02 +-8.78787878787879e+00 -7.59114580119346e-01 4.22612717076337e-02 -5.05975414003474e-02 +-8.18181818181818e+00 -7.39908303358907e-01 2.65347518460736e-02 -5.75870121728342e-02 +-7.57575757575758e+00 -6.95515216031812e-01 1.93744036977655e-02 -6.18696615221871e-02 +-6.96969696969697e+00 -6.38970352980065e-01 1.56903682577269e-02 -6.50444957534814e-02 +-6.36363636363636e+00 -5.53050978116223e-01 1.44330515252630e-02 -7.04916309908320e-02 +-5.75757575757576e+00 -4.67855482297821e-01 1.32728500481496e-02 -7.56445389562658e-02 +-5.15151515151515e+00 -3.83761883334006e-01 1.22747621729221e-02 -8.03433974705679e-02 +-4.54545454545454e+00 -3.00853428667449e-01 1.15921315939537e-02 -8.44964464276008e-02 +-3.93939393939394e+00 -2.18316833870855e-01 1.10444241869388e-02 -8.84303296892449e-02 +-3.33333333333333e+00 -1.35802226396340e-01 1.06756393000342e-02 -9.19189227982073e-02 +-2.72727272727273e+00 -5.52401875853970e-02 1.04478510242675e-02 -9.51462086023917e-02 +-2.12121212121212e+00 2.36396912458736e-02 1.03604338233977e-02 -9.81888615779641e-02 +-1.51515151515152e+00 1.01484614889655e-01 1.02452048792184e-02 -1.01004246307992e-01 +-9.09090909090912e-01 1.79466580667274e-01 1.01619214134529e-02 -1.03750330378995e-01 +-3.03030303030302e-01 2.59087622411868e-01 1.02426571705537e-02 -1.06360316407136e-01 + 3.03030303030302e-01 3.37837592391149e-01 1.03303065575862e-02 -1.08843506321385e-01 + 9.09090909090912e-01 4.15789971549744e-01 1.04212147734708e-02 -1.11177829034995e-01 + 1.51515151515152e+00 4.93147895935465e-01 1.04236090925569e-02 -1.13298457665409e-01 + 2.12121212121212e+00 5.69859535842775e-01 1.04645134860512e-02 -1.15323446159398e-01 + 2.72727272727273e+00 6.44307642449725e-01 1.06495299479427e-02 -1.17170718042645e-01 + 3.33333333333333e+00 7.18600940028201e-01 1.08126791422125e-02 -1.18836030380812e-01 + 3.93939393939394e+00 7.92950170251859e-01 1.09043051654465e-02 -1.20329319459463e-01 + 4.54545454545455e+00 8.66750625755535e-01 1.10287283292864e-02 -1.21622097750385e-01 + 5.15151515151515e+00 9.39936884951220e-01 1.11859719302871e-02 -1.22800063053947e-01 + 5.75757575757576e+00 1.01143404956829e+00 1.14111475039848e-02 -1.23696733437718e-01 + 6.36363636363637e+00 1.08182810267221e+00 1.16720384522875e-02 -1.24300128967657e-01 + 6.96969696969697e+00 1.15154797840494e+00 1.19507072068761e-02 -1.24706383395138e-01 + 7.57575757575757e+00 1.21829984832910e+00 1.23111001660822e-02 -1.24318393141766e-01 + 8.18181818181818e+00 1.28284334003200e+00 1.28453551133823e-02 -1.23573477309161e-01 + 8.78787878787879e+00 1.34152950781049e+00 1.37024581751005e-02 -1.22008658301098e-01 + 9.39393939393939e+00 1.39175204718020e+00 1.50501911010927e-02 -1.20764566885121e-01 + 1.00000000000000e+01 1.44072055032551e+00 1.67619493434159e-02 -1.19700808310407e-01 + 1.06060606060606e+01 1.47445006881312e+00 1.86588668153617e-02 -1.17383563054315e-01 + 1.12121212121212e+01 1.50211111367966e+00 2.06442638039865e-02 -1.13986779446044e-01 + 1.18181818181818e+01 1.51849743382808e+00 2.27949008726186e-02 -1.08801154929910e-01 + 1.24242424242424e+01 1.38110104869832e+00 3.91932789258445e-02 -1.10609411291075e-01 + 1.30303030303030e+01 1.17394609485373e+00 6.11116586730917e-02 -1.14753045755195e-01 + 1.36363636363636e+01 1.12719502884985e+00 7.05126133472740e-02 -1.13285854419029e-01 + 1.42424242424242e+01 1.08888194901864e+00 7.96731387425781e-02 -1.11992721439345e-01 + 1.48484848484848e+01 1.06009153338648e+00 8.83736363016277e-02 -1.11029145646405e-01 + 1.54545454545455e+01 1.04088100180195e+00 9.68845274277538e-02 -1.10082901069663e-01 + 1.60606060606061e+01 1.02566184269085e+00 1.05353288508621e-01 -1.09447986832365e-01 + 1.66666666666667e+01 1.01747136523085e+00 1.14011650931451e-01 -1.09533721766659e-01 + 1.72727272727273e+01 1.01393796533581e+00 1.23111695493764e-01 -1.10194974676891e-01 + 1.78787878787879e+01 1.01620977550644e+00 1.32751579382771e-01 -1.11556728709361e-01 + 1.84848484848485e+01 1.03062727147662e+00 1.44357732350225e-01 -1.14737403733058e-01 + 1.90909090909091e+01 1.04771493788588e+00 1.56504624193137e-01 -1.18523866085458e-01 + 1.96969696969697e+01 1.06291878178938e+00 1.68930683382824e-01 -1.23167550096525e-01 + 2.03030303030303e+01 1.07502785257006e+00 1.81134979640342e-01 -1.28324656352032e-01 + 2.09090909090909e+01 1.08382115536938e+00 1.93117500419765e-01 -1.33815690623442e-01 + 2.15151515151515e+01 1.09214908926105e+00 2.05100021199187e-01 -1.39246581437727e-01 + 2.21212121212121e+01 1.09715356486127e+00 2.16895622980487e-01 -1.44828119061210e-01 + 2.27272727272727e+01 1.08886762688942e+00 2.27943741095172e-01 -1.50978244430421e-01 + 2.33333333333333e+01 1.08058168891757e+00 2.38991859209858e-01 -1.57084368281988e-01 + 2.39393939393939e+01 1.07229575094571e+00 2.50039977324543e-01 -1.62956004038701e-01 + 2.45454545454545e+01 1.06558611366856e+00 2.61691804677889e-01 -1.68040941931674e-01 + 2.51515151515151e+01 1.05905161714547e+00 2.73410709392586e-01 -1.73040662366437e-01 + 2.57575757575758e+01 1.05251712062237e+00 2.85129614107284e-01 -1.78042939631076e-01 + 2.63636363636364e+01 1.04673941380572e+00 2.97242656458348e-01 -1.82687214968074e-01 + 2.69696969696970e+01 1.04146631186305e+00 3.09618498066121e-01 -1.87092862759889e-01 + 2.75757575757576e+01 1.03619320992039e+00 3.21994339673895e-01 -1.91500121873642e-01 + 2.81818181818182e+01 1.03116398723408e+00 3.34548802265770e-01 -1.95783309953570e-01 + 2.87878787878788e+01 1.02670376733233e+00 3.47520011402030e-01 -1.99774488550039e-01 + 2.93939393939394e+01 1.02224354743058e+00 3.60491220538288e-01 -2.03766728259228e-01 + 3.00000000000000e+01 1.01778332752883e+00 3.73462429674547e-01 -2.07760038049125e-01 + 3.30000000000000e+01 9.98306668405358e-01 4.41078428348352e-01 -2.25710390737701e-01 + 3.60000000000000e+01 9.79435247436346e-01 5.11546160178582e-01 -2.42439672107783e-01 + 3.90000000000000e+01 9.59115016848787e-01 5.84717599999870e-01 -2.58725778460445e-01 + 4.20000000000000e+01 9.35081102871063e-01 6.59576481995558e-01 -2.74139975914325e-01 + 4.50000000000000e+01 9.09710553576705e-01 7.34856757216810e-01 -2.89288459990168e-01 + 4.80000000000000e+01 8.77014675428035e-01 8.10097993520892e-01 -3.03752712432158e-01 + 5.10000000000000e+01 8.40093342319397e-01 8.83801401078911e-01 -3.17922061767336e-01 + 5.40000000000000e+01 7.94720827645917e-01 9.54429052281285e-01 -3.31525536369943e-01 + 5.70000000000000e+01 7.49348627860369e-01 1.02505616393010e+00 -3.45117992160713e-01 + 6.00000000000000e+01 7.03976585517588e-01 1.09568300580419e+00 -3.58702045370939e-01 + 6.30000000000000e+01 6.42559375800653e-01 1.15311167778193e+00 -3.70952105943644e-01 + 6.60000000000000e+01 5.81142028551168e-01 1.21054023663040e+00 -3.83194946194241e-01 + 6.90000000000000e+01 5.19724681301684e-01 1.26796879547887e+00 -3.95431861953200e-01 + 7.20000000000000e+01 4.50686006342368e-01 1.31194678590016e+00 -4.06412636751425e-01 + 7.50000000000000e+01 3.77836823546866e-01 1.34919976745892e+00 -4.16762432040660e-01 + 7.80000000000000e+01 3.04986205955287e-01 1.38645317590716e+00 -4.27107489371432e-01 + 8.10000000000000e+01 2.30777377649507e-01 1.41546571661960e+00 -4.36589691718973e-01 + 8.40000000000000e+01 1.53852221672675e-01 1.42799709070664e+00 -4.44350170094074e-01 + 8.70000000000000e+01 7.69261097609987e-02 1.44052856052647e+00 -4.52106372914785e-01 + 9.00000000000000e+01 -3.36082901382020e-07 1.45305992178765e+00 -4.59858962710058e-01 + 9.30000000000000e+01 -5.38483605044154e-02 1.44052854770060e+00 -4.63848553313885e-01 + 9.60000000000000e+01 -1.07696390610194e-01 1.42799712574756e+00 -4.67844287195712e-01 + 9.90000000000000e+01 -1.61544432084705e-01 1.41546560806078e+00 -4.71846453257926e-01 + 1.02000000000000e+02 -2.13490407640989e-01 1.38645299548144e+00 -4.72567917825502e-01 + 1.05000000000000e+02 -2.64485370834833e-01 1.34920001392269e+00 -4.71652413145928e-01 + 1.08000000000000e+02 -3.15480318387913e-01 1.31194660547628e+00 -4.70694898637910e-01 + 1.11000000000000e+02 -3.63807602041395e-01 1.26796829798034e+00 -4.68443341138964e-01 + 1.14000000000000e+02 -4.06799639145038e-01 1.21054039721062e+00 -4.63658575489138e-01 + 1.17000000000000e+02 -4.49791636415260e-01 1.15311205772626e+00 -4.58872593540100e-01 + 1.20000000000000e+02 -4.92783591804723e-01 1.09568347306768e+00 -4.54085669273530e-01 + 1.23000000000000e+02 -5.24544329085952e-01 1.02505663119359e+00 -4.47459524176604e-01 + 1.26000000000000e+02 -5.56305003551198e-01 9.54429519550126e-01 -4.40832384971193e-01 + 1.29000000000000e+02 -5.88065552379780e-01 8.83801868347751e-01 -4.34204079889270e-01 + 1.32000000000000e+02 -6.12201334294277e-01 8.10085206753381e-01 -4.28311374168508e-01 + 1.35000000000000e+02 -6.32524741785104e-01 7.34824043633297e-01 -4.22785962751293e-01 + 1.38000000000000e+02 -6.52847363996135e-01 6.59563695332856e-01 -4.17259798695567e-01 + 1.41000000000000e+02 -6.71000863605846e-01 5.85797272916321e-01 -4.13816791549941e-01 + 1.44000000000000e+02 -6.84816100411641e-01 5.15018714390009e-01 -4.14540480801535e-01 + 1.47000000000000e+02 -6.98630831673898e-01 4.44240664843570e-01 -4.15262578060876e-01 + 1.50000000000000e+02 -7.12445310173410e-01 3.73462869777981e-01 -4.15983399559589e-01 + 1.53000000000000e+02 -7.07009533624438e-01 3.20145904015172e-01 -4.31332989170919e-01 + 1.56000000000000e+02 -7.02319196022267e-01 2.66829166731978e-01 -4.46674211305675e-01 + 1.59000000000000e+02 -6.97067607564390e-01 2.13512805022704e-01 -4.61700248148900e-01 + 1.62000000000000e+02 -6.25252484559990e-01 1.76166650176245e-01 -4.73355693794957e-01 + 1.65000000000000e+02 -5.21043473383171e-01 1.46805733824602e-01 -4.83347659534527e-01 + 1.68000000000000e+02 -4.16835056347187e-01 1.17444553927237e-01 -4.93339032716489e-01 + 1.71000000000000e+02 -3.12626441266809e-01 8.80834460119835e-02 -4.50000513056908e-01 + 1.74000000000000e+02 -2.08417430088600e-01 5.87224820643139e-02 -2.99999717902353e-01 + 1.77000000000000e+02 -1.03734285731640e-01 4.83552281802738e-02 -1.49315896260807e-01 + 1.80000000000000e+02 0.00000000000000e+00 4.74945271221455e-02 0.00000000000000e+00 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_17.dat b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_17.dat new file mode 100644 index 000000000..217af07d7 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_17.dat @@ -0,0 +1,254 @@ +! ------------ AirfoilInfo v1.01.x Input File ---------------------------------- +! AeroElasticSE FAST driver +! line +! line +! ------------------------------------------------------------------------------ +DEFAULT InterpOrd ! Interpolation order to use for quasi-steady table lookup {1=linear; 3=cubic spline; "default"} [default=3] +1 NonDimArea ! The non-dimensional area of the airfoil (area/chord^2) (set to 1.0 if unsure or unneeded) +@"NREL-2p8-127_AF17_Coords.txt" NumCoords ! The number of coordinates in the airfoil shape file. Set to zero if coordinates not included. +AF17_BL.txt BL_file ! The file name including the boundary layer characteristics of the profile. Ignored if the aeroacoustic module is not called. +1 NumTabs ! Number of airfoil tables in this file. Each table must have lines for Re and Ctrl. +! ------------------------------------------------------------------------------ +! data for table 1 +! ------------------------------------------------------------------------------ +6.000000 Re ! Reynolds number in millions +0 Ctrl ! Control setting (must be 0 for current AirfoilInfo) +True InclUAdata ! Is unsteady aerodynamics data included in this table? If TRUE, then include 30 UA coefficients below this line +!........................................ +-2.516492 alpha0 ! 0-lift angle of attack, depends on airfoil. +10.239483 alpha1 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA>alpha0. (deg) +-11.166956 alpha2 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA1] +0.000000 S2 ! Constant in the f curve best-fit for AOA> alpha1; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S3 ! Constant in the f curve best-fit for alpha2<=AOA< alpha0; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S4 ! Constant in the f curve best-fit for AOA< alpha2; by definition it depends on the airfoil. [ignored if UAMod<>1] +1.381088 Cn1 ! Critical value of C0n at leading edge separation. It should be extracted from airfoil data at a given Mach and Reynolds number. It can be calculated from the static value of Cn at either the break in the pitching moment or the loss of chord force at the onset of stall. It is close to the condition of maximum lift of the airfoil at low Mach numbers. +-1.159496 Cn2 ! As Cn1 for negative AOAs. +Default St_sh ! Strouhal's shedding frequency constant. [default = 0.19] +0.009688 Cd0 ! 2D drag coefficient value at 0-lift. +-0.104313 Cm0 ! 2D pitching moment coefficient about 1/4-chord location, at 0-lift, positive if nose up. [If the aerodynamics coefficients table does not include a column for Cm, this needs to be set to 0.0] +0.000000 k0 ! Constant in the \hat(x)_cp curve best-fit; = (\hat(x)_AC-0.25). [ignored if UAMod<>1] +0.000000 k1 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k2 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k3 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k1_hat ! Constant in the expression of Cc due to leading edge vortex effects. [ignored if UAMod<>1] +Default x_cp_bar ! Constant in the expression of \hat(x)_cp^v. [ignored if UAMod<>1, default = 0.2] +Default UACutout ! Angle of attack above which unsteady aerodynamics are disabled (deg). [Specifying the string "Default" sets UACutout to 45 degrees] +Default filtCutOff ! Cut-off frequency (-3 dB corner frequency) for low-pass filtering the AoA input to UA, as well as the 1st and 2nd derivatives (Hz) [default = 20] +!........................................ +! Table of aerodynamics coefficients +200 NumAlf ! Number of data lines in the following table +! Alpha Cl Cd Cm +! (deg) (-) (-) (-) +-1.80000000000000e+02 0.00000000000000e+00 5.02376982549728e-02 0.00000000000000e+00 +-1.77000000000000e+02 1.08718036745927e-01 5.02376982549728e-02 1.19452717008645e-01 +-1.74000000000000e+02 2.18430776525163e-01 6.02851812182215e-02 2.39999774321882e-01 +-1.71000000000000e+02 3.27646531789012e-01 9.04279599581437e-02 3.60000410445527e-01 +-1.68000000000000e+02 4.36869311875493e-01 1.20570256132886e-01 3.18260147906390e-01 +-1.65000000000000e+02 5.46099384730567e-01 1.50712311030671e-01 1.95651323790509e-01 +-1.62000000000000e+02 6.55334540103918e-01 1.80854868202663e-01 7.30412515523047e-02 +-1.59000000000000e+02 7.28010405538067e-01 2.19127710006320e-01 -9.45584975904147e-03 +-1.56000000000000e+02 7.24644310916020e-01 2.73660846032009e-01 -1.21837323981812e-02 +-1.53000000000000e+02 7.21308604937496e-01 3.28193998660095e-01 -1.57136492042310e-02 +-1.50000000000000e+02 7.20052599183224e-01 3.82727196695211e-01 -2.24733180893469e-02 +-1.47000000000000e+02 7.05344979121394e-01 4.53184198414303e-01 -6.72063266750436e-03 +-1.44000000000000e+02 6.90637102885333e-01 5.23641395400969e-01 9.03246882847654e-03 +-1.41000000000000e+02 6.75928714282518e-01 5.94098982936728e-01 2.49798597818277e-02 +-1.38000000000000e+02 6.57098483724279e-01 6.67494798442362e-01 4.09475868870872e-02 +-1.35000000000000e+02 6.36207340549935e-01 7.42359721972419e-01 5.68857580517079e-02 +-1.32000000000000e+02 6.15315579547438e-01 8.17225281824516e-01 7.28165592297191e-02 +-1.29000000000000e+02 5.90673724574305e-01 8.90525522009492e-01 8.88369855206700e-02 +-1.26000000000000e+02 5.58531663885406e-01 9.60695115424263e-01 1.05046529374471e-01 +-1.23000000000000e+02 5.26389596453192e-01 1.03086417277945e+00 1.21252954182462e-01 +-1.20000000000000e+02 4.94247525649446e-01 1.10103296211486e+00 1.37456542318889e-01 +-1.17000000000000e+02 4.51005751931015e-01 1.15795443010112e+00 1.52804706847535e-01 +-1.14000000000000e+02 4.07763995533133e-01 1.21487565475428e+00 1.68151691714967e-01 +-1.11000000000000e+02 3.64522317186419e-01 1.27179644456681e+00 1.83497290780899e-01 +-1.08000000000000e+02 3.16016600929376e-01 1.31524560139462e+00 1.97190287375102e-01 +-1.05000000000000e+02 2.64878825634709e-01 1.35195883914965e+00 2.10057619315569e-01 +-1.02000000000000e+02 2.13741036335945e-01 1.38867165620685e+00 2.22925091726200e-01 +-9.90000000000000e+01 1.61684301770569e-01 1.41713830337121e+00 2.34432883783133e-01 +-9.60000000000000e+01 1.07789636867620e-01 1.42911225356491e+00 2.43221503139034e-01 +-9.30000000000000e+01 5.38949836895802e-02 1.44108611228438e+00 2.52012246779875e-01 +-9.00000000000000e+01 3.36373889682523e-07 1.45305992526757e+00 2.60805612076082e-01 +-8.70000000000000e+01 -5.38949285283857e-02 1.44108612453959e+00 2.65268702964392e-01 +-8.40000000000000e+01 -1.07789787569110e-01 1.42911222008308e+00 2.69705899355330e-01 +-8.10000000000000e+01 -1.61683834888495e-01 1.41713840709990e+00 2.74118148425682e-01 +-7.80000000000000e+01 -2.13740788662556e-01 1.38867183401641e+00 2.75218906403952e-01 +-7.50000000000000e+01 -2.64879163958945e-01 1.35195859625958e+00 2.74653513726577e-01 +-7.20000000000000e+01 -3.16016353261405e-01 1.31524577920238e+00 2.74066661635360e-01 +-6.90000000000000e+01 -3.64521942583287e-01 1.27179693767224e+00 2.72190520318518e-01 +-6.60000000000000e+01 -4.07764116445761e-01 1.21487549559204e+00 2.67758304954097e-01 +-6.30000000000000e+01 -4.51006038016469e-01 1.15795405351184e+00 2.63309723707785e-01 +-6.00000000000000e+01 -4.94247738299703e-01 1.10103249788183e+00 2.58846174876524e-01 +-5.70000000000000e+01 -5.26389809103449e-01 1.03086370854641e+00 2.52537766967854e-01 +-5.40000000000000e+01 -5.58531876535596e-01 9.60694651185909e-01 2.46218241369695e-01 +-5.10000000000000e+01 -5.90673937224495e-01 8.90525057771137e-01 2.39889401901766e-01 +-4.80000000000000e+01 -6.16985978521229e-01 8.17249434089066e-01 2.33807907536728e-01 +-4.50000000000000e+01 -6.40383103818546e-01 7.42420845191650e-01 2.27849917319468e-01 +-4.20000000000000e+01 -6.58768869626067e-01 6.67518950513351e-01 2.23456296897971e-01 +-3.90000000000000e+01 -6.76252856241839e-01 5.93029893358622e-01 2.19662575489263e-01 +-3.60000000000000e+01 -6.91251469843313e-01 5.20200446113040e-01 2.17992553881491e-01 +-3.30000000000000e+01 -7.05373690625492e-01 4.50048605759265e-01 2.19429640986969e-01 +-3.00000000000000e+01 -7.20052704961507e-01 3.82726758502379e-01 2.24334644865001e-01 +-2.93939393939394e+01 -7.23423358758069e-01 3.69810374707743e-01 2.26262638995891e-01 +-2.87878787878788e+01 -7.26794012554631e-01 3.56893990913108e-01 2.28190633126782e-01 +-2.81818181818182e+01 -7.30164666351193e-01 3.43977607118473e-01 2.30118627257672e-01 +-2.75757575757576e+01 -7.33955296036718e-01 3.31475572351972e-01 2.32714210527911e-01 +-2.69696969696970e+01 -7.37925930829896e-01 3.19151130974461e-01 2.35595927974075e-01 +-2.63636363636364e+01 -7.41896565623074e-01 3.06826689596951e-01 2.38477645420239e-01 +-2.57575757575758e+01 -7.46236904909058e-01 2.94763605830315e-01 2.41858864830355e-01 +-2.51515151515151e+01 -7.51131714769935e-01 2.83092497567289e-01 2.45989220771138e-01 +-2.45454545454545e+01 -7.56026524630811e-01 2.71421389304264e-01 2.50119576711921e-01 +-2.39393939393939e+01 -7.61117995847343e-01 2.59818577841106e-01 2.53958515768821e-01 +-2.33333333333333e+01 -7.67979457339360e-01 2.48830450799340e-01 2.55174646451070e-01 +-2.27272727272727e+01 -7.74840918831377e-01 2.37842323757575e-01 2.56491201944605e-01 +-2.21212121212121e+01 -7.81702380323394e-01 2.26854196715809e-01 2.57271002838526e-01 +-2.15151515151515e+01 -8.12448284285856e-01 2.19127250982838e-01 2.39096729103820e-01 +-2.09090909090909e+01 -8.46418529847557e-01 2.12215810350734e-01 2.19171773544913e-01 +-2.03030303030303e+01 -8.82410390516615e-01 2.05304369718630e-01 1.99907002060488e-01 +-1.96969696969697e+01 -9.17302460891263e-01 1.98393040992681e-01 1.80908557885250e-01 +-1.90909090909091e+01 -9.51690757109299e-01 1.91481824166556e-01 1.62015766540326e-01 +-1.84848484848485e+01 -9.87451060932182e-01 1.84488095751064e-01 1.43186155335470e-01 +-1.78787878787879e+01 -1.02348107734750e+00 1.78125103821018e-01 1.23309320342863e-01 +-1.72727272727273e+01 -1.05955430524795e+00 1.72667345635547e-01 1.02937199694708e-01 +-1.66666666666667e+01 -1.09661808800758e+00 1.66429075696717e-01 8.25865362857696e-02 +-1.60606060606061e+01 -1.13436650818888e+00 1.59785188254103e-01 6.22621217533182e-02 +-1.54545454545455e+01 -1.15393444133063e+00 1.51574659183086e-01 4.58165236508863e-02 +-1.48484848484848e+01 -1.16179648627071e+00 1.42415253094923e-01 3.15133238851397e-02 +-1.42424242424242e+01 -1.14050675694352e+00 1.31113076076399e-01 2.06305497523611e-02 +-1.36363636363636e+01 -1.11318982416965e+00 1.19491463618837e-01 6.42328479698607e-03 +-1.30303030303030e+01 -1.08076735917766e+00 1.07643742796169e-01 -7.83926565619422e-03 +-1.24242424242424e+01 -1.03727303023693e+00 9.49346653316282e-02 -1.75014551808433e-02 +-1.18181818181818e+01 -9.91440219649850e-01 8.26304983608341e-02 -2.54111950263429e-02 +-1.12121212121212e+01 -9.43045452072816e-01 7.24323611406984e-02 -2.97310850160300e-02 +-1.06060606060606e+01 -8.91357118244056e-01 6.36793113860100e-02 -3.46811573258460e-02 +-1.00000000000000e+01 -8.38640919151541e-01 5.56031252905086e-02 -4.00042772613043e-02 +-9.39393939393939e+00 -7.97154810810589e-01 4.56286447472684e-02 -4.58057854493708e-02 +-8.78787878787879e+00 -7.57700218153473e-01 3.48441279722901e-02 -5.20559338844009e-02 +-8.18181818181818e+00 -7.29615756802838e-01 2.21903132460571e-02 -5.98183982708405e-02 +-7.57575757575758e+00 -6.77769009447363e-01 1.66725656645290e-02 -6.52314095706447e-02 +-6.96969696969697e+00 -6.15253643707113e-01 1.38193953292020e-02 -6.96903302338436e-02 +-6.36363636363636e+00 -5.29222888480069e-01 1.28208124258429e-02 -7.60443151485867e-02 +-5.75757575757576e+00 -4.43714189157886e-01 1.18605164320041e-02 -8.20746230823483e-02 +-5.15151515151515e+00 -3.59021198798114e-01 1.11014093554157e-02 -8.75040133661531e-02 +-4.54545454545454e+00 -2.75625966933364e-01 1.06136414059815e-02 -9.20337243383322e-02 +-3.93939393939394e+00 -1.92587400034749e-01 1.02273414896665e-02 -9.62397074831400e-02 +-3.33333333333333e+00 -1.09292475701538e-01 9.90518405717358e-03 -9.99005436593104e-02 +-2.72727272727273e+00 -2.77772625212584e-02 9.71093449432091e-03 -1.03217781859456e-01 +-2.12121212121212e+00 5.20911798292055e-02 9.64590630058275e-03 -1.06366269240076e-01 +-1.51515151515152e+00 1.30586446388122e-01 9.55659941113129e-03 -1.09005739501319e-01 +-9.09090909090912e-01 2.08840498658564e-01 9.49982823781086e-03 -1.11539847170668e-01 +-3.03030303030302e-01 2.87578475260949e-01 9.58414006664110e-03 -1.13902065395105e-01 + 3.03030303030302e-01 3.65664552744906e-01 9.65560539372337e-03 -1.16149780563894e-01 + 9.09090909090912e-01 4.43204973276288e-01 9.71978591639622e-03 -1.18219507269873e-01 + 1.51515151515152e+00 5.20281024804697e-01 9.71394548831763e-03 -1.20121864462230e-01 + 2.12121212121212e+00 5.96811467615798e-01 9.80332128304454e-03 -1.21920157367353e-01 + 2.72727272727273e+00 6.71434914937960e-01 9.98488831915120e-03 -1.23594864438980e-01 + 3.33333333333333e+00 7.45656831699806e-01 1.01455835290262e-02 -1.25107525282158e-01 + 3.93939393939394e+00 8.19857800959508e-01 1.02378295152185e-02 -1.26457757043226e-01 + 4.54545454545455e+00 8.93627925198807e-01 1.03669090136902e-02 -1.27577353045154e-01 + 5.15151515151515e+00 9.66788832639503e-01 1.05314448784099e-02 -1.28565417198802e-01 + 5.75757575757576e+00 1.03821639854981e+00 1.07650302198420e-02 -1.29227175957820e-01 + 6.36363636363637e+00 1.10795832677679e+00 1.10272583218359e-02 -1.29514536462203e-01 + 6.96969696969697e+00 1.17694418225097e+00 1.12742209874335e-02 -1.29549901025754e-01 + 7.57575757575757e+00 1.23921531344826e+00 1.16670639800197e-02 -1.28261266809327e-01 + 8.18181818181818e+00 1.29706014706839e+00 1.24490049337565e-02 -1.26386684375794e-01 + 8.78787878787879e+00 1.34554047570179e+00 1.37772189838099e-02 -1.23143424626972e-01 + 9.39393939393939e+00 1.37610897192605e+00 1.75961680761005e-02 -1.21674324726306e-01 + 1.00000000000000e+01 1.39836265121160e+00 2.28583111147752e-02 -1.21039639768622e-01 + 1.06060606060606e+01 1.39287314658036e+00 2.77463509449118e-02 -1.19204194226554e-01 + 1.12121212121212e+01 1.39004598907911e+00 3.19782079487326e-02 -1.15663804195089e-01 + 1.18181818181818e+01 1.39216407137552e+00 3.49921524756390e-02 -1.09850755288886e-01 + 1.24242424242424e+01 1.29370295829420e+00 4.85210271088614e-02 -1.10247193463411e-01 + 1.30303030303030e+01 1.14384582375774e+00 6.62157966012066e-02 -1.11897572147813e-01 + 1.36363636363636e+01 1.11782919778447e+00 7.57838750439830e-02 -1.11408861155646e-01 + 1.42424242424242e+01 1.09289947478728e+00 8.53102626033743e-02 -1.11136178965314e-01 + 1.48484848484848e+01 1.07102348419001e+00 9.46544491998690e-02 -1.11159785150535e-01 + 1.54545454545455e+01 1.05696164008760e+00 1.03374871102944e-01 -1.10493943921915e-01 + 1.60606060606061e+01 1.04604302431932e+00 1.11858598309336e-01 -1.10049366517221e-01 + 1.66666666666667e+01 1.03932307570257e+00 1.20082914343280e-01 -1.09980310610667e-01 + 1.72727272727273e+01 1.03747930790449e+00 1.29111242533919e-01 -1.10591886748552e-01 + 1.78787878787879e+01 1.04205220466167e+00 1.39122262444516e-01 -1.12023579838031e-01 + 1.84848484848485e+01 1.05490344379951e+00 1.50986790721675e-01 -1.15270449343547e-01 + 1.90909090909091e+01 1.06946548085938e+00 1.63292698023894e-01 -1.19065362073820e-01 + 1.96969696969697e+01 1.08276085154215e+00 1.75474320562998e-01 -1.23397138492291e-01 + 2.03030303030303e+01 1.09403365481318e+00 1.88008089241998e-01 -1.28358085737133e-01 + 2.09090909090909e+01 1.10239238595793e+00 2.00894023983065e-01 -1.33614744559156e-01 + 2.15151515151515e+01 1.10887254746938e+00 2.13779958724133e-01 -1.38763402571504e-01 + 2.21212121212121e+01 1.11237585687728e+00 2.26320681259285e-01 -1.44191042062497e-01 + 2.27272727272727e+01 1.10397482083247e+00 2.37480910168700e-01 -1.50693555732446e-01 + 2.33333333333333e+01 1.09557378478766e+00 2.48641139078116e-01 -1.57112728954266e-01 + 2.39393939393939e+01 1.08717274874285e+00 2.59801367987532e-01 -1.63133329944962e-01 + 2.45454545454545e+01 1.08003882943089e+00 2.71421389304264e-01 -1.68354300674623e-01 + 2.51515151515151e+01 1.07304569783844e+00 2.83092497567289e-01 -1.73495272149449e-01 + 2.57575757575758e+01 1.06605256624600e+00 2.94763605830315e-01 -1.78646564861648e-01 + 2.63636363636364e+01 1.05985153546545e+00 3.06826689596951e-01 -1.83426648708445e-01 + 2.69696969696970e+01 1.05417865395407e+00 3.19151130974461e-01 -1.87959534349431e-01 + 2.75757575757576e+01 1.04850577244270e+00 3.31475572351972e-01 -1.92498924465493e-01 + 2.81818181818182e+01 1.04309074438137e+00 3.43977607118473e-01 -1.96910710531247e-01 + 2.87878787878788e+01 1.03827732275955e+00 3.56893990913108e-01 -2.01014545276943e-01 + 2.93939393939394e+01 1.03346390113772e+00 3.69810374707743e-01 -2.05122663450476e-01 + 3.00000000000000e+01 1.02865047951590e+00 3.82726758502379e-01 -2.09235101253211e-01 + 3.30000000000000e+01 1.00767522728702e+00 4.50048605759265e-01 -2.27666231032229e-01 + 3.60000000000000e+01 9.87502112870606e-01 5.20200446113040e-01 -2.44805976520978e-01 + 3.90000000000000e+01 9.66075877033301e-01 5.93029893358622e-01 -2.61539856917676e-01 + 4.20000000000000e+01 9.41098858571731e-01 6.67518950513352e-01 -2.77304866762762e-01 + 4.50000000000000e+01 9.14833592285066e-01 7.42420845191650e-01 -2.92778427054725e-01 + 4.80000000000000e+01 8.81408622533811e-01 8.17249434089067e-01 -3.07497585034756e-01 + 5.10000000000000e+01 8.43819604431597e-01 8.90525057771138e-01 -3.21903684993278e-01 + 5.40000000000000e+01 7.97902221930250e-01 9.60694651185909e-01 -3.35704391970839e-01 + 5.70000000000000e+01 7.51985042501660e-01 1.03086370854641e+00 -3.49495136575764e-01 + 6.00000000000000e+01 7.06067964608676e-01 1.10103249788183e+00 -3.63279172814127e-01 + 6.30000000000000e+01 6.44293944876385e-01 1.15795405351184e+00 -3.75684064171539e-01 + 6.60000000000000e+01 5.82519789224936e-01 1.21487549559204e+00 -3.88081898949555e-01 + 6.90000000000000e+01 5.20745633573486e-01 1.27179693767224e+00 -4.00474177818223e-01 + 7.20000000000000e+01 4.51451982439921e-01 1.31524577920238e+00 -4.11592132530663e-01 + 7.50000000000000e+01 3.78398737499386e-01 1.35195859625958e+00 -4.22069569360111e-01 + 7.80000000000000e+01 3.05344055424385e-01 1.38867183401641e+00 -4.32541989601588e-01 + 8.10000000000000e+01 2.30976975521496e-01 1.41713840709990e+00 -4.42143819760501e-01 + 8.40000000000000e+01 1.53985190557838e-01 1.42911222008308e+00 -4.50008085895448e-01 + 8.70000000000000e+01 7.69925651285527e-02 1.44108612453959e+00 -4.57867677290619e-01 + 9.00000000000000e+01 -3.36373889913427e-07 1.45305992526757e+00 -4.65723360969959e-01 + 9.30000000000000e+01 -5.38949836895802e-02 1.44108611228438e+00 -4.70213156857291e-01 + 9.60000000000000e+01 -1.07789636867620e-01 1.42911225356491e+00 -4.74730592511974e-01 + 9.90000000000000e+01 -1.61684301770570e-01 1.41713830337121e+00 -4.79276533058230e-01 + 1.02000000000000e+02 -2.13741036335945e-01 1.38867165620685e+00 -4.80562246931058e-01 + 1.05000000000000e+02 -2.64878825634710e-01 1.35195883914965e+00 -4.80232757378909e-01 + 1.08000000000000e+02 -3.16016600929376e-01 1.31524560139462e+00 -4.79737782066907e-01 + 1.11000000000000e+02 -3.64522317186419e-01 1.27179644456681e+00 -4.77863421662414e-01 + 1.14000000000000e+02 -4.07763995533133e-01 1.21487565475428e+00 -4.73449633291489e-01 + 1.17000000000000e+02 -4.51005751931015e-01 1.15795443010112e+00 -4.69034472019867e-01 + 1.20000000000000e+02 -4.94247525649446e-01 1.10103296211486e+00 -4.64618222554077e-01 + 1.23000000000000e+02 -5.26389596453192e-01 1.03086417277945e+00 -4.58370282910620e-01 + 1.26000000000000e+02 -5.58531663885406e-01 9.60695115424263e-01 -4.52121193405810e-01 + 1.29000000000000e+02 -5.90673724574306e-01 8.90525522009491e-01 -4.45870794666629e-01 + 1.32000000000000e+02 -6.15315579547438e-01 8.17225281824516e-01 -4.40405924630618e-01 + 1.35000000000000e+02 -6.36207340549935e-01 7.42359721972419e-01 -4.35333210353452e-01 + 1.38000000000000e+02 -6.57098483724280e-01 6.67494798442361e-01 -4.30259571411825e-01 + 1.41000000000000e+02 -6.75928714282518e-01 5.94098982936727e-01 -4.27362077072584e-01 + 1.44000000000000e+02 -6.90637102885333e-01 5.23641395400969e-01 -4.28817330039073e-01 + 1.47000000000000e+02 -7.05344979121394e-01 4.53184198414303e-01 -4.30270852318803e-01 + 1.50000000000000e+02 -7.20052599183224e-01 3.82727196695211e-01 -4.31722931389651e-01 + 1.53000000000000e+02 -7.10181631872742e-01 3.29822360950801e-01 -4.46423672577750e-01 + 1.56000000000000e+02 -7.03319879618389e-01 2.76917694334790e-01 -4.61114380563247e-01 + 1.59000000000000e+02 -6.96086980977297e-01 2.24013284168088e-01 -4.74558545497368e-01 + 1.62000000000000e+02 -6.23394384096259e-01 1.85740697616627e-01 -4.83189489859145e-01 + 1.65000000000000e+02 -5.19495002406176e-01 1.54784146617186e-01 -4.89493605397558e-01 + 1.68000000000000e+02 -4.15596211308916e-01 1.23827350356444e-01 -4.95797422538914e-01 + 1.71000000000000e+02 -3.11697223350018e-01 9.28705619946343e-02 -4.50000513056908e-01 + 1.74000000000000e+02 -2.07797841658894e-01 6.19137894310576e-02 -2.99999717902353e-01 + 1.77000000000000e+02 -1.03426007186958e-01 5.10483521183991e-02 -1.49315896260807e-01 + 1.80000000000000e+02 0.00000000000000e+00 5.02376982549728e-02 0.00000000000000e+00 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_18.dat b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_18.dat new file mode 100644 index 000000000..2754301ac --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_18.dat @@ -0,0 +1,254 @@ +! ------------ AirfoilInfo v1.01.x Input File ---------------------------------- +! AeroElasticSE FAST driver +! line +! line +! ------------------------------------------------------------------------------ +DEFAULT InterpOrd ! Interpolation order to use for quasi-steady table lookup {1=linear; 3=cubic spline; "default"} [default=3] +1 NonDimArea ! The non-dimensional area of the airfoil (area/chord^2) (set to 1.0 if unsure or unneeded) +@"NREL-2p8-127_AF18_Coords.txt" NumCoords ! The number of coordinates in the airfoil shape file. Set to zero if coordinates not included. +AF18_BL.txt BL_file ! The file name including the boundary layer characteristics of the profile. Ignored if the aeroacoustic module is not called. +1 NumTabs ! Number of airfoil tables in this file. Each table must have lines for Re and Ctrl. +! ------------------------------------------------------------------------------ +! data for table 1 +! ------------------------------------------------------------------------------ +6.000000 Re ! Reynolds number in millions +0 Ctrl ! Control setting (must be 0 for current AirfoilInfo) +True InclUAdata ! Is unsteady aerodynamics data included in this table? If TRUE, then include 30 UA coefficients below this line +!........................................ +-2.792370 alpha0 ! 0-lift angle of attack, depends on airfoil. +9.587807 alpha1 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA>alpha0. (deg) +-11.610700 alpha2 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA1] +0.000000 S2 ! Constant in the f curve best-fit for AOA> alpha1; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S3 ! Constant in the f curve best-fit for alpha2<=AOA< alpha0; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S4 ! Constant in the f curve best-fit for AOA< alpha2; by definition it depends on the airfoil. [ignored if UAMod<>1] +1.342044 Cn1 ! Critical value of C0n at leading edge separation. It should be extracted from airfoil data at a given Mach and Reynolds number. It can be calculated from the static value of Cn at either the break in the pitching moment or the loss of chord force at the onset of stall. It is close to the condition of maximum lift of the airfoil at low Mach numbers. +-1.062317 Cn2 ! As Cn1 for negative AOAs. +Default St_sh ! Strouhal's shedding frequency constant. [default = 0.19] +0.008843 Cd0 ! 2D drag coefficient value at 0-lift. +-0.109829 Cm0 ! 2D pitching moment coefficient about 1/4-chord location, at 0-lift, positive if nose up. [If the aerodynamics coefficients table does not include a column for Cm, this needs to be set to 0.0] +0.000000 k0 ! Constant in the \hat(x)_cp curve best-fit; = (\hat(x)_AC-0.25). [ignored if UAMod<>1] +0.000000 k1 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k2 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k3 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k1_hat ! Constant in the expression of Cc due to leading edge vortex effects. [ignored if UAMod<>1] +Default x_cp_bar ! Constant in the expression of \hat(x)_cp^v. [ignored if UAMod<>1, default = 0.2] +Default UACutout ! Angle of attack above which unsteady aerodynamics are disabled (deg). [Specifying the string "Default" sets UACutout to 45 degrees] +Default filtCutOff ! Cut-off frequency (-3 dB corner frequency) for low-pass filtering the AoA input to UA, as well as the 1st and 2nd derivatives (Hz) [default = 20] +!........................................ +! Table of aerodynamics coefficients +200 NumAlf ! Number of data lines in the following table +! Alpha Cl Cd Cm +! (deg) (-) (-) (-) +-1.80000000000000e+02 0.00000000000000e+00 5.36137248474854e-02 0.00000000000000e+00 +-1.77000000000000e+02 1.08504173136844e-01 5.36137248474854e-02 1.19452717008645e-01 +-1.74000000000000e+02 2.18001573212032e-01 6.43364093197600e-02 2.39999774321882e-01 +-1.71000000000000e+02 3.27002606158882e-01 9.65048147530414e-02 3.60000410445527e-01 +-1.68000000000000e+02 4.36007303027872e-01 1.28672864881152e-01 3.18853353245729e-01 +-1.65000000000000e+02 5.45015893840642e-01 1.60840737360825e-01 1.97134330215277e-01 +-1.62000000000000e+02 6.54027865395150e-01 1.93008707125421e-01 7.54136410554247e-02 +-1.59000000000000e+02 7.27335195948828e-01 2.32421567454577e-01 -7.86707963484010e-03 +-1.56000000000000e+02 7.26473886558584e-01 2.86323963827313e-01 -1.32688253981472e-02 +-1.53000000000000e+02 7.26401782562124e-01 3.40226371983972e-01 -1.93321617932501e-02 +-1.50000000000000e+02 7.29414906072036e-01 3.94128823688151e-01 -3.04550520731389e-02 +-1.47000000000000e+02 7.13608094775223e-01 4.64191024348164e-01 -1.44069907171891e-02 +-1.44000000000000e+02 6.97801023105656e-01 5.34253347401846e-01 1.64143099960009e-03 +-1.41000000000000e+02 6.81993430671987e-01 6.04315915251604e-01 1.79777655646737e-02 +-1.38000000000000e+02 6.62330345884982e-01 6.77255624037684e-01 3.42196692787287e-02 +-1.35000000000000e+02 6.40739522742596e-01 7.51633897455329e-01 5.03555236432470e-02 +-1.32000000000000e+02 6.19148287855155e-01 8.26012587517633e-01 6.64803246966578e-02 +-1.29000000000000e+02 5.93883607684111e-01 8.98800336981566e-01 8.26682061752675e-02 +-1.26000000000000e+02 5.61272019531039e-01 9.68406197695395e-01 9.89967979935854e-02 +-1.23000000000000e+02 5.28660570956951e-01 1.03801152665627e+00 1.15320660255902e-01 +-1.20000000000000e+02 4.96049192169745e-01 1.10761658975060e+00 1.31640184505148e-01 +-1.17000000000000e+02 4.52499966498427e-01 1.16391394816134e+00 1.47076828299769e-01 +-1.14000000000000e+02 4.08950831006833e-01 1.22021106550486e+00 1.62511306961593e-01 +-1.11000000000000e+02 3.65401918647224e-01 1.27650775277552e+00 1.77943395962959e-01 +-1.08000000000000e+02 3.16676605002551e-01 1.31930568274196e+00 1.91712305326037e-01 +-1.05000000000000e+02 2.65363051300195e-01 1.35535413126937e+00 2.04649708702310e-01 +-1.02000000000000e+02 2.14049485607990e-01 1.39140216671678e+00 2.17585944039292e-01 +-9.90000000000000e+01 1.61856439692740e-01 1.41919689307479e+00 2.29156194914714e-01 +-9.60000000000000e+01 1.07904395236486e-01 1.43048464375975e+00 2.37995669823376e-01 +-9.30000000000000e+01 5.39523629434884e-02 1.44177230821265e+00 2.46835565853370e-01 +-9.00000000000000e+01 3.36732009892260e-07 1.45305992955031e+00 2.55676268872361e-01 +-8.70000000000000e+01 -5.39523077235666e-02 1.44177231976554e+00 2.60546156064344e-01 +-8.40000000000000e+01 -1.07904546098422e-01 1.43048461219668e+00 2.65376218554658e-01 +-8.10000000000000e+01 -1.61855972313595e-01 1.41919699085902e+00 2.70167661087483e-01 +-7.80000000000000e+01 -2.14049237083272e-01 1.39140234130663e+00 2.71634637929492e-01 +-7.50000000000000e+01 -2.65363390787359e-01 1.35535389277745e+00 2.71422475089917e-01 +-7.20000000000000e+01 -3.16676356483258e-01 1.31930585733004e+00 2.71175587395195e-01 +-6.90000000000000e+01 -3.65401541382520e-01 1.27650824047434e+00 2.69624220790176e-01 +-6.60000000000000e+01 -4.08950952778550e-01 1.22021090808774e+00 2.65499895797782e-01 +-6.30000000000000e+01 -4.52500254617964e-01 1.16391357570114e+00 2.61346777314543e-01 +-6.00000000000000e+01 -4.96049407924919e-01 1.10761612924714e+00 2.57166068579216e-01 +-5.70000000000000e+01 -5.28660786712125e-01 1.03801106615281e+00 2.51133429071216e-01 +-5.40000000000000e+01 -5.61272235287598e-01 9.68405737186667e-01 2.45075869286174e-01 +-5.10000000000000e+01 -5.93883823440670e-01 8.98799876472838e-01 2.38994436395362e-01 +-4.80000000000000e+01 -6.20771155324413e-01 8.26050727323750e-01 2.33161030617360e-01 +-4.50000000000000e+01 -6.44796451070394e-01 7.51729984474128e-01 2.27439298824510e-01 +-4.20000000000000e+01 -6.63953200654077e-01 6.77293763541013e-01 2.23291102757799e-01 +-3.90000000000000e+01 -6.82249667333847e-01 6.03259850610683e-01 2.19817265076178e-01 +-3.60000000000000e+01 -6.98201576773723e-01 5.30851294361004e-01 2.18838619571564e-01 +-3.30000000000000e+01 -7.13444606626873e-01 4.61088222324340e-01 2.21122290445851e-01 +-3.00000000000000e+01 -7.29415020855328e-01 3.94128387846700e-01 2.27054455296579e-01 +-2.93939393939394e+01 -7.33089414277251e-01 3.81279477717506e-01 2.29240557823958e-01 +-2.87878787878788e+01 -7.36763807699173e-01 3.68430567588313e-01 2.31426660351336e-01 +-2.81818181818182e+01 -7.40438201121096e-01 3.55581657459119e-01 2.33612762878715e-01 +-2.75757575757576e+01 -7.44561188035578e-01 3.43144145729673e-01 2.36503775794692e-01 +-2.69696969696970e+01 -7.48876445797132e-01 3.30882962725711e-01 2.39696919079866e-01 +-2.63636363636364e+01 -7.53191703558686e-01 3.18621779721749e-01 2.42890062365039e-01 +-2.57575757575758e+01 -7.57896949106898e-01 3.06620180092045e-01 2.46611383026609e-01 +-2.51515151515151e+01 -7.63187085443502e-01 2.95007895024532e-01 2.51124846654346e-01 +-2.45454545454545e+01 -7.68477221780106e-01 2.83395609957020e-01 2.55638310282083e-01 +-2.39393939393939e+01 -7.74029112998335e-01 2.71848572457760e-01 2.59427106627508e-01 +-2.33333333333333e+01 -7.81936848828191e-01 2.60888775705009e-01 2.56693757133074e-01 +-2.27272727272727e+01 -7.89844584658047e-01 2.49928978952259e-01 2.54973507041906e-01 +-2.21212121212121e+01 -7.97752320487903e-01 2.38969182199509e-01 2.51757698493230e-01 +-2.15151515151515e+01 -8.17245649453576e-01 2.29474770810752e-01 2.34218156316905e-01 +-2.09090909090909e+01 -8.40715821523898e-01 2.20346800023089e-01 2.15558365010287e-01 +-2.03030303030303e+01 -8.64893147204684e-01 2.11218829235425e-01 1.97258668465790e-01 +-1.96969696969697e+01 -8.87438946084652e-01 2.02091078490948e-01 1.79104249713839e-01 +-1.90909090909091e+01 -9.09237361854086e-01 1.92963547777208e-01 1.61007469502170e-01 +-1.84848484848485e+01 -9.33071785400616e-01 1.84171846523930e-01 1.42945493987761e-01 +-1.78787878787879e+01 -9.57306241435504e-01 1.76283936647877e-01 1.23884251763747e-01 +-1.72727272727273e+01 -9.81604014520295e-01 1.68616795799771e-01 1.04367473421751e-01 +-1.66666666666667e+01 -1.00737125830751e+00 1.60297507335738e-01 8.48827458147722e-02 +-1.60606060606061e+01 -1.03415415721149e+00 1.51566539016137e-01 6.54371368564537e-02 +-1.54545454545455e+01 -1.05213926667993e+00 1.41887359500634e-01 4.85999555851204e-02 +-1.48484848484848e+01 -1.06411426754698e+00 1.31650218002569e-01 3.32132244253039e-02 +-1.42424242424242e+01 -1.06085920517278e+00 1.20325281854275e-01 1.97519541398105e-02 +-1.36363636363636e+01 -1.05297179510023e+00 1.08818108910721e-01 3.34724170517964e-03 +-1.30303030303030e+01 -1.04038617850512e+00 9.71704693558744e-02 -1.30280274230778e-02 +-1.24242424242424e+01 -1.00963309974379e+00 8.35931628390448e-02 -2.24525867458495e-02 +-1.18181818181818e+01 -9.74392976542105e-01 7.02569290424257e-02 -2.96665236814477e-02 +-1.12121212121212e+01 -9.33183989496999e-01 5.92863820290872e-02 -3.25396861725729e-02 +-1.06060606060606e+01 -8.87095198505282e-01 5.02112419249079e-02 -3.68554806252278e-02 +-1.00000000000000e+01 -8.39030346732209e-01 4.20062550430957e-02 -4.19667667411679e-02 +-9.39393939393939e+00 -7.98355307687373e-01 3.39431550888320e-02 -4.71586015184073e-02 +-8.78787878787879e+00 -7.55075718086549e-01 2.58616329336961e-02 -5.31128483759924e-02 +-8.18181818181818e+00 -7.12760376198709e-01 1.76807004789459e-02 -6.15557949547917e-02 +-7.57575757575758e+00 -6.50212657860430e-01 1.40779977251651e-02 -6.80037285779409e-02 +-6.96969696969697e+00 -5.79316182872428e-01 1.20930353131595e-02 -7.36947785344258e-02 +-6.36363636363636e+00 -4.93332487227875e-01 1.12571113999265e-02 -8.08636763018482e-02 +-5.75757575757576e+00 -4.07625165812638e-01 1.04386697349651e-02 -8.76670243494600e-02 +-5.15151515151515e+00 -3.22375665042248e-01 9.89046924180047e-03 -9.37249643058138e-02 +-4.54545454545454e+00 -2.38569752393226e-01 9.55568172944726e-03 -9.85721042394988e-02 +-3.93939393939394e+00 -1.55278792252772e-01 9.28231334429143e-03 -1.03000270064649e-01 +-3.33333333333333e+00 -7.27588785201134e-02 9.00905966504459e-03 -1.06804167238102e-01 +-2.72727272727273e+00 8.75545142458852e-03 8.82260921114890e-03 -1.10193484668354e-01 +-2.12121212121212e+00 8.90951677107422e-02 8.71711984822585e-03 -1.13439603715240e-01 +-1.51515151515152e+00 1.68020877233593e-01 8.63506810960759e-03 -1.15955900231793e-01 +-9.09090909090912e-01 2.46284645308487e-01 8.59786619783916e-03 -1.18329762049110e-01 +-3.03030303030302e-01 3.23526927130680e-01 8.68469307519355e-03 -1.20499605866875e-01 + 3.03030303030302e-01 4.00568746060339e-01 8.73666462420641e-03 -1.22563336532720e-01 + 9.09090909090912e-01 4.77532382355605e-01 8.76693795829447e-03 -1.24415248851028e-01 + 1.51515151515152e+00 5.54310964834009e-01 8.75563015487188e-03 -1.26154371277845e-01 + 2.12121212121212e+00 6.30748642497307e-01 8.89942708059405e-03 -1.27777288327563e-01 + 2.72727272727273e+00 7.05967166479233e-01 9.07466954914071e-03 -1.29308981144731e-01 + 3.33333333333333e+00 7.80411644410489e-01 9.23152948118853e-03 -1.30694777177827e-01 + 3.93939393939394e+00 8.54634907157449e-01 9.35773501083766e-03 -1.31925075915747e-01 + 4.54545454545455e+00 9.28368090200400e-01 9.52948973845109e-03 -1.32899735261145e-01 + 5.15151515151515e+00 1.00145694605734e+00 9.73306782417346e-03 -1.33724225695198e-01 + 5.75757575757576e+00 1.07270733762567e+00 1.00006966462114e-02 -1.34169484840169e-01 + 6.36363636363637e+00 1.14127724503204e+00 1.02973665103093e-02 -1.34153350705440e-01 + 6.96969696969697e+00 1.20864942903410e+00 1.05582170564899e-02 -1.33827802118801e-01 + 7.57575757575757e+00 1.26443440681650e+00 1.10668993698580e-02 -1.31662626204201e-01 + 8.18181818181818e+00 1.31327712628436e+00 1.21179224024120e-02 -1.28718467346890e-01 + 8.78787878787879e+00 1.34931677106702e+00 1.38745085223537e-02 -1.24009773357878e-01 + 9.39393939393939e+00 1.35685700568352e+00 2.07295073959453e-02 -1.22353831339396e-01 + 1.00000000000000e+01 1.34623269398792e+00 3.03611166129043e-02 -1.22101994507537e-01 + 1.06060606060606e+01 1.29247625354756e+00 3.89303371400334e-02 -1.20772828739056e-01 + 1.12121212121212e+01 1.25212720004798e+00 4.59269172993146e-02 -1.17349872385937e-01 + 1.18181818181818e+01 1.23668533143930e+00 5.00033361654154e-02 -1.11373005101486e-01 + 1.24242424242424e+01 1.18614194111661e+00 6.00007067895342e-02 -1.09801411206576e-01 + 1.30303030303030e+01 1.11590193321859e+00 7.24445919904755e-02 -1.08383334659172e-01 + 1.36363636363636e+01 1.11070643578549e+00 8.22712281118321e-02 -1.09098841523507e-01 + 1.42424242424242e+01 1.10016431536211e+00 9.22478830207050e-02 -1.10082030306725e-01 + 1.48484848484848e+01 1.08932388927719e+00 1.02384259095179e-01 -1.11305168394289e-01 + 1.54545454545455e+01 1.08265839747059e+00 1.11362550974526e-01 -1.11223542069270e-01 + 1.60606060606061e+01 1.07750353752455e+00 1.19864697023678e-01 -1.11093423299158e-01 + 1.66666666666667e+01 1.07245197326073e+00 1.27554831236544e-01 -1.10774119006494e-01 + 1.72727272727273e+01 1.07224113795030e+00 1.36494897934856e-01 -1.11302931932702e-01 + 1.78787878787879e+01 1.07862447668773e+00 1.46962675742666e-01 -1.12850875597998e-01 + 1.84848484848485e+01 1.08861259617754e+00 1.59145187067245e-01 -1.16200177309305e-01 + 1.90909090909091e+01 1.09918905179666e+00 1.71646795036045e-01 -1.20001587294594e-01 + 1.96969696969697e+01 1.10912810899916e+00 1.83527588865384e-01 -1.23816697554203e-01 + 2.03030303030303e+01 1.11825522290028e+00 1.96466839959649e-01 -1.28421649372128e-01 + 2.09090909090909e+01 1.12524803924632e+00 2.10464608199569e-01 -1.33477817053054e-01 + 2.15151515151515e+01 1.12945414332918e+00 2.24462376439488e-01 -1.38427537382908e-01 + 2.21212121212121e+01 1.13110996428679e+00 2.37920120683396e-01 -1.43742831263358e-01 + 2.27272727272727e+01 1.12256727679690e+00 2.49218324588170e-01 -1.50497808264014e-01 + 2.33333333333333e+01 1.11402458930701e+00 2.60516528492943e-01 -1.57166764414652e-01 + 2.39393939393939e+01 1.10548190181713e+00 2.71814732397717e-01 -1.63463059451524e-01 + 2.45454545454545e+01 1.09782581769558e+00 2.83395609957020e-01 -1.68925418413166e-01 + 2.51515151515151e+01 1.09026824294031e+00 2.95007895024532e-01 -1.74308243109077e-01 + 2.57575757575758e+01 1.08271066818504e+00 3.06620180092045e-01 -1.79706378559642e-01 + 2.63636363636364e+01 1.07598865169483e+00 3.18621779721749e-01 -1.84704949130393e-01 + 2.69696969696970e+01 1.06982376061140e+00 3.30882962725711e-01 -1.89437565776199e-01 + 2.75757575757576e+01 1.06365886952798e+00 3.43144145729673e-01 -1.94179831305997e-01 + 2.81818181818182e+01 1.05776902996474e+00 3.55581657459119e-01 -1.98785028498289e-01 + 2.87878787878788e+01 1.05252092222901e+00 3.68430567588313e-01 -2.03055245546250e-01 + 2.93939393939394e+01 1.04727281449329e+00 3.81279477717506e-01 -2.07331816726986e-01 + 3.00000000000000e+01 1.04202470675756e+00 3.94128387846700e-01 -2.11614795742417e-01 + 3.30000000000000e+01 1.01920513278199e+00 4.61088222324340e-01 -2.30709635446696e-01 + 3.60000000000000e+01 9.97430021449977e-01 5.30851294361004e-01 -2.48389635018723e-01 + 3.90000000000000e+01 9.74642622581348e-01 6.03259850610683e-01 -2.65244377392235e-01 + 4.20000000000000e+01 9.48504923410187e-01 6.77293763541014e-01 -2.81146520062724e-01 + 4.50000000000000e+01 9.21138527003474e-01 7.51729984474128e-01 -2.96778859241448e-01 + 4.80000000000000e+01 8.86816262654281e-01 8.26050727323750e-01 -3.11620664341732e-01 + 5.10000000000000e+01 8.48405523199447e-01 8.98799876472838e-01 -3.26146108681646e-01 + 5.40000000000000e+01 8.01817570694549e-01 9.68405737186667e-01 -3.40039290927774e-01 + 5.70000000000000e+01 7.55229683651232e-01 1.03801106615281e+00 -3.53931325023812e-01 + 6.00000000000000e+01 7.08641829338459e-01 1.10761612924715e+00 -3.67824192591327e-01 + 6.30000000000000e+01 6.46428682755529e-01 1.16391357570114e+00 -3.80297188353490e-01 + 6.60000000000000e+01 5.84215402239047e-01 1.22021090808774e+00 -3.92768487627463e-01 + 6.90000000000000e+01 5.22002121722564e-01 1.27650824047434e+00 -4.05238805155188e-01 + 7.20000000000000e+01 4.52394670864868e-01 1.31930585733004e+00 -4.16419077136110e-01 + 7.50000000000000e+01 3.79090286205083e-01 1.35535389277745e+00 -4.26952712546759e-01 + 7.80000000000000e+01 3.05784461532969e-01 1.39140234130664e+00 -4.37484524738100e-01 + 8.10000000000000e+01 2.31222621050345e-01 1.41919699085902e+00 -4.47140901263708e-01 + 8.40000000000000e+01 1.54148835649795e-01 1.43048461219668e+00 -4.55046838069807e-01 + 8.70000000000000e+01 7.70743518918329e-02 1.44177231976554e+00 -4.62950611733494e-01 + 9.00000000000000e+01 -3.36732010122695e-07 1.45305992955031e+00 -4.70852706467098e-01 + 9.30000000000000e+01 -5.39523629434884e-02 1.44177230821265e+00 -4.75763515343477e-01 + 9.60000000000000e+01 -1.07904395236486e-01 1.43048464375975e+00 -4.80716438183718e-01 + 9.90000000000000e+01 -1.61856439692741e-01 1.41919689307479e+00 -4.85712617490280e-01 + 1.02000000000000e+02 -2.14049485607990e-01 1.39140216671678e+00 -4.87463918618097e-01 + 1.05000000000000e+02 -2.65363051300195e-01 1.35535413126937e+00 -4.87615426725982e-01 + 1.08000000000000e+02 -3.16676605002551e-01 1.31930568274196e+00 -4.87522734138826e-01 + 1.11000000000000e+02 -3.65401918647224e-01 1.27650775277552e+00 -4.85996410622861e-01 + 1.14000000000000e+02 -4.08950831006833e-01 1.22021106550486e+00 -4.81927358927190e-01 + 1.17000000000000e+02 -4.52499966498427e-01 1.16391394816134e+00 -4.77857363874255e-01 + 1.20000000000000e+02 -4.96049192169745e-01 1.10761658975060e+00 -4.73786676400946e-01 + 1.23000000000000e+02 -5.28660570956951e-01 1.03801152665627e+00 -4.67894035404986e-01 + 1.26000000000000e+02 -5.61272019531039e-01 9.68406197695395e-01 -4.62000666821961e-01 + 1.29000000000000e+02 -5.93883607684111e-01 8.98800336981565e-01 -4.56106383315202e-01 + 1.32000000000000e+02 -6.19148287855155e-01 8.26012587517633e-01 -4.51045249617514e-01 + 1.35000000000000e+02 -6.40739522742596e-01 7.51633897455329e-01 -4.46400358390250e-01 + 1.38000000000000e+02 -6.62330345884983e-01 6.77255624037683e-01 -4.41754984328411e-01 + 1.41000000000000e+02 -6.81993430671987e-01 6.04315915251604e-01 -4.39372656415041e-01 + 1.44000000000000e+02 -6.97801023105656e-01 5.34253347401846e-01 -4.41516679399736e-01 + 1.47000000000000e+02 -7.13608094775223e-01 4.64191024348164e-01 -4.43659776127911e-01 + 1.50000000000000e+02 -7.29414906072037e-01 3.94128823688151e-01 -4.45802094533083e-01 + 1.53000000000000e+02 -7.15037146111127e-01 3.41731197240688e-01 -4.59822411066617e-01 + 1.56000000000000e+02 -7.05123336765058e-01 2.89333666877955e-01 -4.73837152031237e-01 + 1.59000000000000e+02 -6.95414684317536e-01 2.36936246357618e-01 -4.86012649076484e-01 + 1.62000000000000e+02 -6.22098323807239e-01 1.97523498321224e-01 -4.91995579783009e-01 + 1.65000000000000e+02 -5.18414913187139e-01 1.64603196340870e-01 -4.94997251401146e-01 + 1.68000000000000e+02 -4.14732090684931e-01 1.31682671601892e-01 -4.97998891218103e-01 + 1.71000000000000e+02 -3.11049072145794e-01 9.87620758945397e-02 -4.50000513056908e-01 + 1.74000000000000e+02 -2.07365661523777e-01 6.58413382471257e-02 -2.99999717902353e-01 + 1.77000000000000e+02 -1.03210513612473e-01 5.43627855211274e-02 -1.49315896260807e-01 + 1.80000000000000e+02 0.00000000000000e+00 5.36137248474854e-02 0.00000000000000e+00 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_19.dat b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_19.dat new file mode 100644 index 000000000..de96b588f --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_19.dat @@ -0,0 +1,254 @@ +! ------------ AirfoilInfo v1.01.x Input File ---------------------------------- +! AeroElasticSE FAST driver +! line +! line +! ------------------------------------------------------------------------------ +DEFAULT InterpOrd ! Interpolation order to use for quasi-steady table lookup {1=linear; 3=cubic spline; "default"} [default=3] +1 NonDimArea ! The non-dimensional area of the airfoil (area/chord^2) (set to 1.0 if unsure or unneeded) +@"NREL-2p8-127_AF19_Coords.txt" NumCoords ! The number of coordinates in the airfoil shape file. Set to zero if coordinates not included. +AF19_BL.txt BL_file ! The file name including the boundary layer characteristics of the profile. Ignored if the aeroacoustic module is not called. +1 NumTabs ! Number of airfoil tables in this file. Each table must have lines for Re and Ctrl. +! ------------------------------------------------------------------------------ +! data for table 1 +! ------------------------------------------------------------------------------ +6.000000 Re ! Reynolds number in millions +0 Ctrl ! Control setting (must be 0 for current AirfoilInfo) +True InclUAdata ! Is unsteady aerodynamics data included in this table? If TRUE, then include 30 UA coefficients below this line +!........................................ +-3.045221 alpha0 ! 0-lift angle of attack, depends on airfoil. +9.266236 alpha1 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA>alpha0. (deg) +-11.753418 alpha2 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA1] +0.000000 S2 ! Constant in the f curve best-fit for AOA> alpha1; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S3 ! Constant in the f curve best-fit for alpha2<=AOA< alpha0; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S4 ! Constant in the f curve best-fit for AOA< alpha2; by definition it depends on the airfoil. [ignored if UAMod<>1] +1.340318 Cn1 ! Critical value of C0n at leading edge separation. It should be extracted from airfoil data at a given Mach and Reynolds number. It can be calculated from the static value of Cn at either the break in the pitching moment or the loss of chord force at the onset of stall. It is close to the condition of maximum lift of the airfoil at low Mach numbers. +-0.990977 Cn2 ! As Cn1 for negative AOAs. +Default St_sh ! Strouhal's shedding frequency constant. [default = 0.19] +0.008173 Cd0 ! 2D drag coefficient value at 0-lift. +-0.112549 Cm0 ! 2D pitching moment coefficient about 1/4-chord location, at 0-lift, positive if nose up. [If the aerodynamics coefficients table does not include a column for Cm, this needs to be set to 0.0] +0.000000 k0 ! Constant in the \hat(x)_cp curve best-fit; = (\hat(x)_AC-0.25). [ignored if UAMod<>1] +0.000000 k1 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k2 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k3 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k1_hat ! Constant in the expression of Cc due to leading edge vortex effects. [ignored if UAMod<>1] +Default x_cp_bar ! Constant in the expression of \hat(x)_cp^v. [ignored if UAMod<>1, default = 0.2] +Default UACutout ! Angle of attack above which unsteady aerodynamics are disabled (deg). [Specifying the string "Default" sets UACutout to 45 degrees] +Default filtCutOff ! Cut-off frequency (-3 dB corner frequency) for low-pass filtering the AoA input to UA, as well as the 1st and 2nd derivatives (Hz) [default = 20] +!........................................ +! Table of aerodynamics coefficients +200 NumAlf ! Number of data lines in the following table +! Alpha Cl Cd Cm +! (deg) (-) (-) (-) +-1.80000000000000e+02 0.00000000000000e+00 5.58151028351338e-02 0.00000000000000e+00 +-1.77000000000000e+02 1.08403822920070e-01 5.58151028351338e-02 1.19452717008645e-01 +-1.74000000000000e+02 2.17800459908011e-01 6.69780604209238e-02 2.39999774321882e-01 +-1.71000000000000e+02 3.26700878169450e-01 1.00467299648537e-01 3.60000410445527e-01 +-1.68000000000000e+02 4.35601558622185e-01 1.33956266552371e-01 3.19240159788981e-01 +-1.65000000000000e+02 5.44502718536549e-01 1.67445097297493e-01 1.98101342058805e-01 +-1.62000000000000e+02 6.53405489525881e-01 2.00933761249497e-01 7.69605856327805e-02 +-1.59000000000000e+02 7.27019339407255e-01 2.41089984114099e-01 -6.83110332274381e-03 +-1.56000000000000e+02 7.28728560841196e-01 2.94581099251365e-01 -1.48336824338646e-02 +-1.53000000000000e+02 7.31142347309657e-01 3.48072223030611e-01 -2.31137907275188e-02 +-1.50000000000000e+02 7.35519708784298e-01 4.01563389144863e-01 -3.46869785111124e-02 +-1.47000000000000e+02 7.18996156868714e-01 4.71368155114379e-01 -1.84787848110211e-02 +-1.44000000000000e+02 7.02472341842677e-01 5.41172995959272e-01 -2.27031145595949e-03 +-1.41000000000000e+02 6.85948000576950e-01 6.10977986560267e-01 1.41215595154545e-02 +-1.38000000000000e+02 6.65741843359713e-01 6.83620285576331e-01 3.03710500677338e-02 +-1.35000000000000e+02 6.43694785635686e-01 7.57681233044139e-01 4.65119317299114e-02 +-1.32000000000000e+02 6.21647450545519e-01 8.31742453913374e-01 6.26455676270925e-02 +-1.29000000000000e+02 5.95976649852831e-01 9.04196027753608e-01 7.88432528643242e-02 +-1.26000000000000e+02 5.63058900774808e-01 9.73434299905923e-01 9.51782729473790e-02 +-1.23000000000000e+02 5.30141386686949e-01 1.04267204311347e+00 1.11510014334606e-01 +-1.20000000000000e+02 4.97223990089781e-01 1.11190952185851e+00 1.27838839143617e-01 +-1.17000000000000e+02 4.53474286743658e-01 1.16779992225404e+00 1.43283454610664e-01 +-1.14000000000000e+02 4.09724721085944e-01 1.22369008305982e+00 1.58726450315576e-01 +-1.11000000000000e+02 3.65975473161876e-01 1.27957981690164e+00 1.74167578217843e-01 +-1.08000000000000e+02 3.17106968448641e-01 1.32195310670654e+00 1.87944896444489e-01 +-1.05000000000000e+02 2.65678796360799e-01 1.35756807157142e+00 2.00890123017622e-01 +-1.02000000000000e+02 2.14250613596524e-01 1.39318262832361e+00 2.13833889964470e-01 +-9.90000000000000e+01 1.61968684256675e-01 1.42053922078900e+00 2.25410295218944e-01 +-9.60000000000000e+01 1.07979224785424e-01 1.43137952698492e+00 2.34252955588311e-01 +-9.30000000000000e+01 5.39897777632595e-02 1.44221975036700e+00 2.43094929221455e-01 +-9.00000000000000e+01 3.36965526401992e-07 1.45305993234293e+00 2.51936472308407e-01 +-8.70000000000000e+01 -5.39897225050438e-02 1.44221976146193e+00 2.56931622255970e-01 +-8.40000000000000e+01 -1.07979375751980e-01 1.43137949667301e+00 2.61901020827721e-01 +-8.10000000000000e+01 -1.61968216553408e-01 1.42053931469708e+00 2.66845383648936e-01 +-7.80000000000000e+01 -2.14250364516685e-01 1.39318280081402e+00 2.68479729146681e-01 +-7.50000000000000e+01 -2.65679136606263e-01 1.35756783594738e+00 2.68447877672478e-01 +-7.20000000000000e+01 -3.17106719374234e-01 1.32195327919519e+00 2.68392871736955e-01 +-6.90000000000000e+01 -3.65975094161662e-01 1.27958030107501e+00 2.67043843374306e-01 +-6.60000000000000e+01 -4.09724843417841e-01 1.22368992678063e+00 2.63130341234035e-01 +-6.30000000000000e+01 -4.53474576189544e-01 1.16779955248625e+00 2.59197088106754e-01 +-6.00000000000000e+01 -4.97224207869552e-01 1.11190906378698e+00 2.55244704276654e-01 +-5.70000000000000e+01 -5.30141604466721e-01 1.04267158504194e+00 2.49454887071623e-01 +-5.40000000000000e+01 -5.63059118556911e-01 9.73433841829142e-01 2.43646817884402e-01 +-5.10000000000000e+01 -5.95976867634935e-01 9.04195569676826e-01 2.37820619877023e-01 +-4.80000000000000e+01 -6.23239324536221e-01 8.31789714461067e-01 2.32266352846812e-01 +-4.50000000000000e+01 -6.47674226237690e-01 7.57800118621131e-01 2.26836908914070e-01 +-4.20000000000000e+01 -6.67333704892715e-01 6.83667545750015e-01 2.23029606785968e-01 +-3.90000000000000e+01 -6.86159958788100e-01 6.09930414983374e-01 2.19918132247163e-01 +-3.60000000000000e+01 -7.02733476031370e-01 5.37796305675443e-01 2.19390306691080e-01 +-3.30000000000000e+01 -7.18707342668409e-01 4.68286734608672e-01 2.22226002504236e-01 +-3.00000000000000e+01 -7.35519829439412e-01 4.01562954836658e-01 2.28827939791023e-01 +-2.93939393939394e+01 -7.39392279869158e-01 3.88758041707422e-01 2.31182344944843e-01 +-2.87878787878788e+01 -7.43264730298904e-01 3.75953128578187e-01 2.33536750098664e-01 +-2.81818181818182e+01 -7.47137180728651e-01 3.63148215448951e-01 2.35891155252484e-01 +-2.75757575757576e+01 -7.51476885097161e-01 3.50752776727396e-01 2.38974806555987e-01 +-2.69696969696970e+01 -7.56016858332907e-01 3.38532842092560e-01 2.42371018735316e-01 +-2.63636363636364e+01 -7.60556831568653e-01 3.26312907457723e-01 2.45767230914644e-01 +-2.57575757575758e+01 -7.65500018552221e-01 3.14351399285216e-01 2.49710318611517e-01 +-2.51515151515151e+01 -7.71047932183450e-01 3.02777470576641e-01 2.54473592128438e-01 +-2.45454545454545e+01 -7.76595845814680e-01 2.91203541868066e-01 2.59236865645359e-01 +-2.39393939393939e+01 -7.82447959329456e-01 2.79692872440278e-01 2.62992965843921e-01 +-2.33333333333333e+01 -7.91037930690711e-01 2.68751548786870e-01 2.57684311183680e-01 +-2.27272727272727e+01 -7.99627902051967e-01 2.57810225133461e-01 2.53255349257629e-01 +-2.21212121212121e+01 -8.08217873413222e-01 2.46868901480052e-01 2.47684440936497e-01 +-2.15151515151515e+01 -8.19990478826953e-01 2.36221993248645e-01 2.31504471971342e-01 +-2.09090909090909e+01 -8.34647953216695e-01 2.25648707810846e-01 2.13702005243607e-01 +-2.03030303030303e+01 -8.49132464561041e-01 2.15075422373046e-01 1.95960374750995e-01 +-1.96969696969697e+01 -8.62578663351143e-01 2.04502427490460e-01 1.78243288992263e-01 +-1.90909090909091e+01 -8.75549253302963e-01 1.93929723146649e-01 1.60535941747677e-01 +-1.84848484848485e+01 -8.89815545281606e-01 1.83695365421934e-01 1.42835185458870e-01 +-1.78787878787879e+01 -9.04336378911458e-01 1.74027498768236e-01 1.24649099331343e-01 +-1.72727272727273e+01 -9.18897356865547e-01 1.64194842338135e-01 1.06248581428441e-01 +-1.66666666666667e+01 -9.34393729163051e-01 1.54084754485664e-01 8.78685062390541e-02 +-1.60606060606061e+01 -9.50536639664486e-01 1.43764438001973e-01 6.95133639931887e-02 +-1.54545454545455e+01 -9.64734821551149e-01 1.33117373956884e-01 5.21860598369796e-02 +-1.48484848484848e+01 -9.77391904313972e-01 1.22286093821075e-01 3.54343122342188e-02 +-1.42424242424242e+01 -9.85991220935185e-01 1.11183046356548e-01 1.93441677911052e-02 +-1.36363636363636e+01 -9.92508781462450e-01 1.00022677031595e-01 1.86113773658177e-03 +-1.30303030303030e+01 -9.96614484588265e-01 8.88116806333893e-02 -1.56141016371839e-02 +-1.24242424242424e+01 -9.78086134430020e-01 7.52791871427589e-02 -2.49185975754885e-02 +-1.18181818181818e+01 -9.53932069219898e-01 6.20273381259160e-02 -3.17721050900264e-02 +-1.12121212121212e+01 -9.20876137842797e-01 5.07143911844155e-02 -3.39028634816218e-02 +-1.06060606060606e+01 -8.81577109301206e-01 4.14292282661460e-02 -3.79021056900473e-02 +-1.00000000000000e+01 -8.39208813140256e-01 3.31402553113552e-02 -4.29111295394993e-02 +-9.39393939393939e+00 -7.98914426405686e-01 2.63234936305883e-02 -4.78020739246981e-02 +-8.78787878787879e+00 -7.51657176842035e-01 2.00389695291873e-02 -5.40250476091291e-02 +-8.18181818181818e+00 -6.93679577084241e-01 1.48308481680817e-02 -6.34207316233908e-02 +-7.57575757575758e+00 -6.21203231263108e-01 1.23436646598620e-02 -7.09002799417693e-02 +-6.96969696969697e+00 -5.42846056045475e-01 1.08867824056562e-02 -7.76381592574485e-02 +-6.36363636363636e+00 -4.57248717599494e-01 1.00699499146877e-02 -8.51835466097516e-02 +-5.75757575757576e+00 -3.71772773815341e-01 9.34966265890492e-03 -9.22149694821789e-02 +-5.15151515151515e+00 -2.86510321252854e-01 8.93727471505472e-03 -9.83419419547575e-02 +-4.54545454545454e+00 -2.02800521849721e-01 8.69069179286290e-03 -1.03107031002192e-01 +-3.93939393939394e+00 -1.19779247070242e-01 8.48574750992013e-03 -1.07388031434577e-01 +-3.33333333333333e+00 -3.84842209773342e-02 8.25863893989330e-03 -1.11024512192661e-01 +-2.72727272727273e+00 4.24696095161102e-02 8.07912598948857e-03 -1.14232025558283e-01 +-2.12121212121212e+00 1.22655957049352e-01 7.94212397685742e-03 -1.17344637430821e-01 +-1.51515151515152e+00 2.01513656509836e-01 7.86589688092029e-03 -1.19802686323078e-01 +-9.09090909090912e-01 2.79423697181455e-01 7.84144762810594e-03 -1.22095855725919e-01 +-3.03030303030302e-01 3.55313195985403e-01 7.92627146648238e-03 -1.24166876151792e-01 + 3.03030303030302e-01 4.31348608046625e-01 7.96635081424009e-03 -1.26135660486964e-01 + 9.09090909090912e-01 5.07641470964623e-01 7.97255718827600e-03 -1.27871042553699e-01 + 1.51515151515152e+00 5.83948077422797e-01 7.96669925131739e-03 -1.29528648870106e-01 + 2.12121212121212e+00 6.60075851841618e-01 8.13587472418758e-03 -1.31061713680780e-01 + 2.72727272727273e+00 7.35527633751173e-01 8.30297676364884e-03 -1.32516554910940e-01 + 3.33333333333333e+00 8.09980208614822e-01 8.45480310834448e-03 -1.33834053323750e-01 + 3.93939393939394e+00 8.84045273581437e-01 8.60887609936009e-03 -1.34999421375079e-01 + 4.54545454545455e+00 9.57533521208408e-01 8.81210276724078e-03 -1.35895700708834e-01 + 5.15151515151515e+00 1.03035843997482e+00 9.04375918791339e-03 -1.36630117116849e-01 + 5.75757575757576e+00 1.10131375775296e+00 9.33994000860195e-03 -1.36951375051287e-01 + 6.36363636363637e+00 1.16891066608882e+00 9.67833808285477e-03 -1.36757550838472e-01 + 6.96969696969697e+00 1.23465262669807e+00 1.00087887591604e-02 -1.36219258169966e-01 + 7.57575757575757e+00 1.28575742789560e+00 1.07210657691971e-02 -1.33537358220650e-01 + 8.18181818181818e+00 1.32822847132065e+00 1.19390938706417e-02 -1.29971609720980e-01 + 8.78787878787879e+00 1.35408256195699e+00 1.39481484368526e-02 -1.24516098191203e-01 + 9.39393939393939e+00 1.34430353385980e+00 2.27726382829582e-02 -1.22692829271057e-01 + 1.00000000000000e+01 1.31224074007862e+00 3.52534094952587e-02 -1.22656293137505e-01 + 1.06060606060606e+01 1.22701127443843e+00 4.62229873456646e-02 -1.21636756952509e-01 + 1.12121212121212e+01 1.16219562577377e+00 5.50223378711124e-02 -1.18681954879612e-01 + 1.18181818181818e+01 1.13530358391339e+00 5.97915556707085e-02 -1.12985606092307e-01 + 1.24242424242424e+01 1.11600551029910e+00 6.74861674225558e-02 -1.09510733624339e-01 + 1.30303030303030e+01 1.09983288203511e+00 7.64936470016543e-02 -1.06091834625369e-01 + 1.36363636363636e+01 1.10710335628616e+00 8.65013832514091e-02 -1.07592565956690e-01 + 1.42424242424242e+01 1.10938358437695e+00 9.67716403001183e-02 -1.09394660231539e-01 + 1.48484848484848e+01 1.11061811797752e+00 1.07424572874100e-01 -1.11514011821931e-01 + 1.54545454545455e+01 1.11082268580784e+00 1.16571011915171e-01 -1.12131429881359e-01 + 1.60606060606061e+01 1.11033605299743e+00 1.25085168188146e-01 -1.12361290382414e-01 + 1.66666666666667e+01 1.10609925661839e+00 1.32426982839510e-01 -1.11763403041033e-01 + 1.72727272727273e+01 1.10609074419205e+00 1.41309497589980e-01 -1.12196477228094e-01 + 1.78787878787879e+01 1.11168148131629e+00 1.52075109775884e-01 -1.13878511431696e-01 + 1.84848484848485e+01 1.11799563681487e+00 1.64464965699760e-01 -1.17335103628994e-01 + 1.90909090909091e+01 1.12427870883996e+00 1.77094182598103e-01 -1.21133211985493e-01 + 1.96969696969697e+01 1.13008308302165e+00 1.88778817516490e-01 -1.24354909490447e-01 + 2.03030303030303e+01 1.13565448667379e+00 2.01982468205630e-01 -1.28506406560087e-01 + 2.09090909090909e+01 1.14015133774343e+00 2.16705220601696e-01 -1.33414633720588e-01 + 2.15151515151515e+01 1.14287461583876e+00 2.31427972997762e-01 -1.38269729436345e-01 + 2.21212121212121e+01 1.14332576014604e+00 2.45483672070678e-01 -1.43529989407809e-01 + 2.27272727272727e+01 1.13469070715944e+00 2.56871844199725e-01 -1.50406733035442e-01 + 2.33333333333333e+01 1.12605565417285e+00 2.68260016328771e-01 -1.57238953577331e-01 + 2.39393939393939e+01 1.11742060118626e+00 2.79648188457818e-01 -1.63893422540327e-01 + 2.45454545454545e+01 1.10942403333740e+00 2.91203541868066e-01 -1.69656064509149e-01 + 2.51515151515151e+01 1.10149840675555e+00 3.02777470576641e-01 -1.75327968907266e-01 + 2.57575757575758e+01 1.09357278017371e+00 3.14351399285216e-01 -1.81009617670108e-01 + 2.63636363636364e+01 1.08651104880220e+00 3.26312907457723e-01 -1.86249835379891e-01 + 2.69696969696970e+01 1.08002533707003e+00 3.38532842092560e-01 -1.91196015332576e-01 + 2.75757575757576e+01 1.07353962533786e+00 3.50752776727396e-01 -1.96148336213444e-01 + 2.81818181818182e+01 1.06734017933048e+00 3.63148215448951e-01 -2.00947535149472e-01 + 2.87878787878788e+01 1.06180862938348e+00 3.75953128578187e-01 -2.05379818120139e-01 + 2.93939393939394e+01 1.05627707943649e+00 3.88758041707422e-01 -2.09816145110101e-01 + 3.00000000000000e+01 1.05074552948950e+00 4.01562954836658e-01 -2.14256550297368e-01 + 3.30000000000000e+01 1.02672334375004e+00 4.68286734608673e-01 -2.33923275085492e-01 + 3.60000000000000e+01 1.00390363142049e+00 5.37796305675443e-01 -2.52023342292616e-01 + 3.90000000000000e+01 9.80228670131175e-01 6.09930414983374e-01 -2.68877380086188e-01 + 4.20000000000000e+01 9.53334135403550e-01 6.83667545750015e-01 -2.84801740802117e-01 + 4.50000000000000e+01 9.25249734105174e-01 7.57800118621131e-01 -3.00471220322711e-01 + 4.80000000000000e+01 8.90342378222425e-01 8.31789714461067e-01 -3.15332659299714e-01 + 5.10000000000000e+01 8.51395825660653e-01 9.04195569676826e-01 -3.29875873212572e-01 + 5.40000000000000e+01 8.04370620070051e-01 9.73433841829142e-01 -3.43774687106004e-01 + 5.70000000000000e+01 7.57345390210040e-01 1.04267158504194e+00 -3.57676244146600e-01 + 6.00000000000000e+01 7.10320148215417e-01 1.11190906378698e+00 -3.71581147754796e-01 + 6.30000000000000e+01 6.47820663786416e-01 1.16779955248625e+00 -3.84050834181803e-01 + 6.60000000000000e+01 5.85321046718599e-01 1.22368992678063e+00 -3.96521729786065e-01 + 6.90000000000000e+01 5.22821429650782e-01 1.27958030107501e+00 -4.08993794958095e-01 + 7.20000000000000e+01 4.53009361979119e-01 1.32195327919519e+00 -4.20171504341749e-01 + 7.50000000000000e+01 3.79541218701137e-01 1.35756783594738e+00 -4.30701936371378e-01 + 7.80000000000000e+01 3.06071633534284e-01 1.39318280081402e+00 -4.41232525983427e-01 + 8.10000000000000e+01 2.31382797116840e-01 1.42053931469708e+00 -4.50887242301039e-01 + 8.40000000000000e+01 1.54255542363546e-01 1.43137949667301e+00 -4.58789175569348e-01 + 8.70000000000000e+01 7.71276819161773e-02 1.44221976146193e+00 -4.66690861017101e-01 + 9.00000000000000e+01 -3.36965526632122e-07 1.45305993234293e+00 -4.74592503766813e-01 + 9.30000000000000e+01 -5.39897777632595e-02 1.44221975036700e+00 -4.79614013589955e-01 + 9.60000000000000e+01 -1.07979224785424e-01 1.43137952698492e+00 -4.84662548255213e-01 + 9.90000000000000e+01 -1.61968684256675e-01 1.42053922078900e+00 -4.89738716026789e-01 + 1.02000000000000e+02 -2.14250613596524e-01 1.39318262832361e+00 -4.91556612878414e-01 + 1.05000000000000e+02 -2.65678796360800e-01 1.35756807157142e+00 -4.91759948361478e-01 + 1.08000000000000e+02 -3.17106968448641e-01 1.32195310670654e+00 -4.91808185319412e-01 + 1.11000000000000e+02 -3.65975473161876e-01 1.27957981690164e+00 -4.90481329182113e-01 + 1.14000000000000e+02 -4.09724721085945e-01 1.22369008305982e+00 -4.86610622674850e-01 + 1.17000000000000e+02 -4.53474286743658e-01 1.16779992225404e+00 -4.82739400053527e-01 + 1.20000000000000e+02 -4.97223990089781e-01 1.11190952185851e+00 -4.78867879128044e-01 + 1.23000000000000e+02 -5.30141386686949e-01 1.04267204311347e+00 -4.73180864409918e-01 + 1.26000000000000e+02 -5.63058900774808e-01 9.73434299905923e-01 -4.67493542642030e-01 + 1.29000000000000e+02 -5.95976649852831e-01 9.04196027753607e-01 -4.61805698033490e-01 + 1.32000000000000e+02 -6.21647450545520e-01 8.31742453913373e-01 -4.56978785337660e-01 + 1.35000000000000e+02 -6.43694785635686e-01 7.57681233044139e-01 -4.52582281581552e-01 + 1.38000000000000e+02 -6.65741843359713e-01 6.83620285576330e-01 -4.48185737640142e-01 + 1.41000000000000e+02 -6.85948000576951e-01 6.10977986560267e-01 -4.46102392733155e-01 + 1.44000000000000e+02 -7.02472341842677e-01 5.41172995959272e-01 -4.48645505252371e-01 + 1.47000000000000e+02 -7.18996156868714e-01 4.71368155114379e-01 -4.51188446648819e-01 + 1.50000000000000e+02 -7.35519708784299e-01 4.01563389144863e-01 -4.53731249233545e-01 + 1.53000000000000e+02 -7.20041338298566e-01 3.49496494506179e-01 -4.67335818397252e-01 + 1.56000000000000e+02 -7.07403995417188e-01 2.97429648323240e-01 -4.80939257564229e-01 + 1.59000000000000e+02 -6.95102717992735e-01 2.45362816385929e-01 -4.93374572820376e-01 + 1.62000000000000e+02 -6.21487493690614e-01 2.05206612595701e-01 -4.97977180373460e-01 + 1.65000000000000e+02 -5.17905869149982e-01 1.71005823609649e-01 -4.98735700762325e-01 + 1.68000000000000e+02 -4.14324831560763e-01 1.36804826538108e-01 -4.99494277943921e-01 + 1.71000000000000e+02 -3.10743598323177e-01 1.02603707071835e-01 -4.50000513056908e-01 + 1.74000000000000e+02 -2.07161973779746e-01 6.84023428103841e-02 -2.99999717902353e-01 + 1.77000000000000e+02 -1.03108758635925e-01 5.65240009423786e-02 -1.49315896260807e-01 + 1.80000000000000e+02 0.00000000000000e+00 5.58151028351338e-02 0.00000000000000e+00 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_20.dat b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_20.dat new file mode 100644 index 000000000..b86dcd632 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_20.dat @@ -0,0 +1,254 @@ +! ------------ AirfoilInfo v1.01.x Input File ---------------------------------- +! AeroElasticSE FAST driver +! line +! line +! ------------------------------------------------------------------------------ +DEFAULT InterpOrd ! Interpolation order to use for quasi-steady table lookup {1=linear; 3=cubic spline; "default"} [default=3] +1 NonDimArea ! The non-dimensional area of the airfoil (area/chord^2) (set to 1.0 if unsure or unneeded) +@"NREL-2p8-127_AF20_Coords.txt" NumCoords ! The number of coordinates in the airfoil shape file. Set to zero if coordinates not included. +AF20_BL.txt BL_file ! The file name including the boundary layer characteristics of the profile. Ignored if the aeroacoustic module is not called. +1 NumTabs ! Number of airfoil tables in this file. Each table must have lines for Re and Ctrl. +! ------------------------------------------------------------------------------ +! data for table 1 +! ------------------------------------------------------------------------------ +6.000000 Re ! Reynolds number in millions +0 Ctrl ! Control setting (must be 0 for current AirfoilInfo) +True InclUAdata ! Is unsteady aerodynamics data included in this table? If TRUE, then include 30 UA coefficients below this line +!........................................ +-3.223506 alpha0 ! 0-lift angle of attack, depends on airfoil. +9.164046 alpha1 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA>alpha0. (deg) +-11.802083 alpha2 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA1] +0.000000 S2 ! Constant in the f curve best-fit for AOA> alpha1; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S3 ! Constant in the f curve best-fit for alpha2<=AOA< alpha0; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S4 ! Constant in the f curve best-fit for AOA< alpha2; by definition it depends on the airfoil. [ignored if UAMod<>1] +1.346223 Cn1 ! Critical value of C0n at leading edge separation. It should be extracted from airfoil data at a given Mach and Reynolds number. It can be calculated from the static value of Cn at either the break in the pitching moment or the loss of chord force at the onset of stall. It is close to the condition of maximum lift of the airfoil at low Mach numbers. +-0.953798 Cn2 ! As Cn1 for negative AOAs. +Default St_sh ! Strouhal's shedding frequency constant. [default = 0.19] +0.007766 Cd0 ! 2D drag coefficient value at 0-lift. +-0.112979 Cm0 ! 2D pitching moment coefficient about 1/4-chord location, at 0-lift, positive if nose up. [If the aerodynamics coefficients table does not include a column for Cm, this needs to be set to 0.0] +0.000000 k0 ! Constant in the \hat(x)_cp curve best-fit; = (\hat(x)_AC-0.25). [ignored if UAMod<>1] +0.000000 k1 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k2 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k3 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k1_hat ! Constant in the expression of Cc due to leading edge vortex effects. [ignored if UAMod<>1] +Default x_cp_bar ! Constant in the expression of \hat(x)_cp^v. [ignored if UAMod<>1, default = 0.2] +Default UACutout ! Angle of attack above which unsteady aerodynamics are disabled (deg). [Specifying the string "Default" sets UACutout to 45 degrees] +Default filtCutOff ! Cut-off frequency (-3 dB corner frequency) for low-pass filtering the AoA input to UA, as well as the 1st and 2nd derivatives (Hz) [default = 20] +!........................................ +! Table of aerodynamics coefficients +200 NumAlf ! Number of data lines in the following table +! Alpha Cl Cd Cm +! (deg) (-) (-) (-) +-1.80000000000000e+02 0.00000000000000e+00 5.60839860376548e-02 1.47167178040004e-03 +-1.77000000000000e+02 1.08689836995157e-01 5.60839860376548e-02 1.20045412825477e-01 +-1.74000000000000e+02 2.18375213642741e-01 6.73007199605437e-02 2.39999774321882e-01 +-1.71000000000000e+02 3.27563004817197e-01 1.00951289964885e-01 3.60000410445527e-01 +-1.68000000000000e+02 4.36467171182598e-01 1.34633335777690e-01 3.19169994146170e-01 +-1.65000000000000e+02 5.45229528453792e-01 1.68331119127359e-01 1.97925928770713e-01 +-1.62000000000000e+02 6.53993133012884e-01 2.02028691114530e-01 7.66798765295578e-02 +-1.59000000000000e+02 7.27503940714938e-01 2.42310026594573e-01 -7.27450282376270e-03 +-1.56000000000000e+02 7.31110795820098e-01 2.95758666342963e-01 -1.72902036375927e-02 +-1.53000000000000e+02 7.34319596822270e-01 3.49207314408847e-01 -2.71905033085442e-02 +-1.50000000000000e+02 7.36523173539597e-01 4.02656004658303e-01 -3.53620431597287e-02 +-1.47000000000000e+02 7.19881808024148e-01 4.72422936035072e-01 -1.91283433052972e-02 +-1.44000000000000e+02 7.03240180419886e-01 5.42189935051373e-01 -2.89438151512004e-03 +-1.41000000000000e+02 6.86598028619283e-01 6.11957069351567e-01 1.32352052371265e-02 +-1.38000000000000e+02 6.66302604968628e-01 6.84555659899671e-01 2.92408808365066e-02 +-1.35000000000000e+02 6.44180552804007e-01 7.58569972827814e-01 4.52061276876922e-02 +-1.32000000000000e+02 6.22058248103176e-01 8.32584537348692e-01 6.11744715260335e-02 +-1.29000000000000e+02 5.96320693031764e-01 9.04989003183199e-01 7.72346550841547e-02 +-1.26000000000000e+02 5.63352620077395e-01 9.74173264003827e-01 9.34737950291405e-02 +-1.23000000000000e+02 5.30384796680654e-01 1.04335699334894e+00 1.09713844738546e-01 +-1.20000000000000e+02 4.97417098058063e-01 1.11254045696623e+00 1.25955007125395e-01 +-1.17000000000000e+02 4.53634438299479e-01 1.16837104972410e+00 1.41339031769430e-01 +-1.14000000000000e+02 4.09851924952369e-01 1.22420140310934e+00 1.56723518860802e-01 +-1.11000000000000e+02 3.66069746716654e-01 1.28003132998751e+00 1.72108208755073e-01 +-1.08000000000000e+02 3.17177705557324e-01 1.32234220591584e+00 1.85841350669341e-01 +-1.05000000000000e+02 2.65730694027691e-01 1.35789345342785e+00 1.98749244923706e-01 +-1.02000000000000e+02 2.14283672037506e-01 1.39344429355730e+00 2.11656834470358e-01 +-9.90000000000000e+01 1.61987132519313e-01 1.42073648944996e+00 2.23201790003783e-01 +-9.60000000000000e+01 1.07991521148030e-01 1.43151103914374e+00 2.32020842715942e-01 +-9.30000000000000e+01 5.39959252161754e-02 1.44228550652603e+00 2.40839683380319e-01 +-9.00000000000000e+01 3.37003894400466e-07 1.45305993275333e+00 2.49658549004585e-01 +-8.70000000000000e+01 -5.39958699516678e-02 1.44228551755366e+00 2.54494482776028e-01 +-8.40000000000000e+01 -1.07991672131789e-01 1.43151100901570e+00 2.59343605608854e-01 +-8.10000000000000e+01 -1.61986664762753e-01 1.42073658278841e+00 2.64205569719769e-01 +-7.80000000000000e+01 -2.14283422866425e-01 1.39344446573911e+00 2.65795815265371e-01 +-7.50000000000000e+01 -2.65731034397795e-01 1.35789321822535e+00 2.65755918593268e-01 +-7.20000000000000e+01 -3.17177456391675e-01 1.32234237809590e+00 2.65727119737369e-01 +-6.90000000000000e+01 -3.66069367431166e-01 1.28003181364278e+00 2.64438345067420e-01 +-6.60000000000000e+01 -4.09852047376346e-01 1.22420124699738e+00 2.60617266085316e-01 +-6.30000000000000e+01 -4.53634727963402e-01 1.16837068035199e+00 2.56805932797703e-01 +-6.00000000000000e+01 -4.97417316170630e-01 1.11253999925206e+00 2.53004344403069e-01 +-5.70000000000000e+01 -5.30385014793222e-01 1.04335653563477e+00 2.47400711870632e-01 +-5.40000000000000e+01 -5.63352838192439e-01 9.74172806284381e-01 2.41806514160262e-01 +-5.10000000000000e+01 -5.96320911146808e-01 9.04988545463753e-01 2.36221437763850e-01 +-4.80000000000000e+01 -6.23645028218618e-01 8.32633137744547e-01 2.30956513607567e-01 +-4.50000000000000e+01 -6.48147258055512e-01 7.58692207540872e-01 2.25857970172168e-01 +-4.20000000000000e+01 -6.67889372666217e-01 6.84604259911055e-01 2.22474982226598e-01 +-3.90000000000000e+01 -6.86802709568193e-01 6.10910749328229e-01 2.19736387390917e-01 +-3.60000000000000e+01 -7.03478405910380e-01 5.38816968440485e-01 2.19280528126823e-01 +-3.30000000000000e+01 -7.19572395319055e-01 4.69344655336830e-01 2.22204576432948e-01 +-3.00000000000000e+01 -7.36523295159899e-01 4.02655570575433e-01 2.28913832317185e-01 +-2.93939393939394e+01 -7.40428301639941e-01 3.89857123435579e-01 2.31295215800378e-01 +-2.87878787878788e+01 -7.44333308119982e-01 3.77058676295725e-01 2.33676599283572e-01 +-2.81818181818182e+01 -7.48238314600024e-01 3.64260229155871e-01 2.36057982766765e-01 +-2.75757575757576e+01 -7.52613641879506e-01 3.51870974153269e-01 2.39172506623836e-01 +-2.69696969696970e+01 -7.57190552507842e-01 3.39657102253967e-01 2.42601260453133e-01 +-2.63636363636364e+01 -7.61767463136177e-01 3.27443230354664e-01 2.46030014282430e-01 +-2.57575757575758e+01 -7.66749761722573e-01 3.15487613973748e-01 2.50008630333910e-01 +-2.51515151515151e+01 -7.72340047765258e-01 3.03919320680690e-01 2.54811911566304e-01 +-2.45454545454545e+01 -7.77930333807944e-01 2.92351027387632e-01 2.59615192798699e-01 +-2.39393939393939e+01 -7.83831337974498e-01 2.80845692169765e-01 2.63368296589326e-01 +-2.33333333333333e+01 -7.92528865412384e-01 2.69906991817601e-01 2.57669600084677e-01 +-2.27272727272727e+01 -8.01226392850269e-01 2.58968291465437e-01 2.51477123925418e-01 +-2.21212121212121e+01 -8.09923920288154e-01 2.48029591113273e-01 2.45907124300863e-01 +-2.15151515151515e+01 -8.20235783478513e-01 2.37173728120076e-01 2.31168860674295e-01 +-2.09090909090909e+01 -8.29622622700524e-01 2.26338579795089e-01 2.13713746850245e-01 +-2.03030303030303e+01 -8.39213259378848e-01 2.15503431470102e-01 1.96258633026194e-01 +-1.96969696969697e+01 -8.49342921178197e-01 2.04670828846016e-01 1.78811743339257e-01 +-1.90909090909091e+01 -8.59723555494070e-01 1.93840771778819e-01 1.61373077324190e-01 +-1.84848484848485e+01 -8.69355568885329e-01 1.82817117288920e-01 1.43848790063230e-01 +-1.78787878787879e+01 -8.78841519111643e-01 1.71507191312464e-01 1.26522966331281e-01 +-1.72727272727273e+01 -8.88304094365764e-01 1.60344653968440e-01 1.09264562513686e-01 +-1.66666666666667e+01 -8.97226846531499e-01 1.49299202250655e-01 9.19320215375475e-02 +-1.60606060606061e+01 -9.05768732409721e-01 1.38352219033920e-01 7.45346221583764e-02 +-1.54545454545455e+01 -9.14769264432095e-01 1.27532003288276e-01 5.67050762225817e-02 +-1.48484848484848e+01 -9.24224518221895e-01 1.16781059230677e-01 3.86315588318540e-02 +-1.42424242424242e+01 -9.34933174803990e-01 1.06107627638312e-01 2.02903974043766e-02 +-1.36363636363636e+01 -9.46580047643885e-01 9.54549647670512e-02 2.58155653624406e-03 +-1.30303030303030e+01 -9.59376519315215e-01 8.48210475936575e-02 -1.51277660357559e-02 +-1.24242424242424e+01 -9.49137204600254e-01 7.23014208476810e-02 -2.45207730999593e-02 +-1.18181818181818e+01 -9.33511315858133e-01 6.03072372984705e-02 -3.14401400294280e-02 +-1.12121212121212e+01 -9.07412559417457e-01 4.91969779770790e-02 -3.36076468476470e-02 +-1.06060606060606e+01 -8.74358654564795e-01 3.98750651939524e-02 -3.77019772884650e-02 +-1.00000000000000e+01 -8.37436227745362e-01 3.15713217351823e-02 -4.28344259088231e-02 +-9.39393939393939e+00 -7.97360016762257e-01 2.49748326421447e-02 -4.78167321636766e-02 +-8.78787878787879e+00 -7.46918091090845e-01 1.90106766562991e-02 -5.49142422548264e-02 +-8.18181818181818e+00 -6.76385235190348e-01 1.41430349552736e-02 -6.55740988464556e-02 +-7.57575757575758e+00 -5.97548773054335e-01 1.16500159105889e-02 -7.40578404001251e-02 +-6.96969696969697e+00 -5.14687150181851e-01 1.02794635432385e-02 -8.15694642369420e-02 +-6.36363636363636e+00 -4.29783331561822e-01 9.37100611916169e-03 -8.89972589526919e-02 +-5.75757575757576e+00 -3.44985681028980e-01 8.72254512466363e-03 -9.56743162334849e-02 +-5.15151515151515e+00 -2.60342088083212e-01 8.36628808560654e-03 -1.01294050980689e-01 +-4.54545454545454e+00 -1.77283987129221e-01 8.15049198443473e-03 -1.05574157964945e-01 +-3.93939393939394e+00 -9.49967516754283e-02 7.98399273984275e-03 -1.09327817332233e-01 +-3.33333333333333e+00 -1.45488178579448e-02 7.79517199106549e-03 -1.12477093218156e-01 +-2.72727272727273e+00 6.57363122021591e-02 7.63446498473685e-03 -1.15244192981836e-01 +-2.12121212121212e+00 1.45332789615814e-01 7.51105279420149e-03 -1.17982678474176e-01 +-1.51515151515152e+00 2.23672723468766e-01 7.44827862315605e-03 -1.20431702659156e-01 +-9.09090909090912e-01 3.00978847690010e-01 7.43157561421629e-03 -1.22712093550068e-01 +-3.03030303030302e-01 3.76098908531403e-01 7.51006367733051e-03 -1.24767379670863e-01 + 3.03030303030302e-01 4.51444826699281e-01 7.54938811200737e-03 -1.26721030186769e-01 + 9.09090909090912e-01 5.27096787476172e-01 7.54812362715996e-03 -1.28437544066459e-01 + 1.51515151515152e+00 6.02777798759360e-01 7.55798597733358e-03 -1.30082417308287e-01 + 2.12121212121212e+00 6.78328119290960e-01 7.71509624311103e-03 -1.31599798151816e-01 + 2.72727272727273e+00 7.53369580256120e-01 7.87416012848208e-03 -1.33039382183475e-01 + 3.33333333333333e+00 8.27436011075852e-01 8.02072404030208e-03 -1.34343039337526e-01 + 3.93939393939394e+00 9.01064324481151e-01 8.17634754573474e-03 -1.35496483033582e-01 + 4.54545454545455e+00 9.74097640300264e-01 8.37626659639857e-03 -1.36379157527485e-01 + 5.15151515151515e+00 1.04648944718360e+00 8.60497543451105e-03 -1.37098870871982e-01 + 5.75757575757576e+00 1.11709742972339e+00 8.90798254151872e-03 -1.37401161602970e-01 + 6.36363636363637e+00 1.18428988344244e+00 9.27589711393541e-03 -1.37179374672226e-01 + 6.96969696969697e+00 1.24896889274954e+00 9.70884746672005e-03 -1.36604163101376e-01 + 7.57575757575757e+00 1.29881944271375e+00 1.06632766664296e-02 -1.33835538319740e-01 + 8.18181818181818e+00 1.33958725078695e+00 1.19126582890210e-02 -1.30168176642310e-01 + 8.78787878787879e+00 1.36005346559897e+00 1.39779508814557e-02 -1.24720046583824e-01 + 9.39393939393939e+00 1.34301374720075e+00 2.30914396203260e-02 -1.22744826084420e-01 + 1.00000000000000e+01 1.30753093113672e+00 3.60092777128439e-02 -1.22742898670035e-01 + 1.06060606060606e+01 1.21740138674990e+00 4.73489216901772e-02 -1.21777727655646e-01 + 1.12121212121212e+01 1.14876626618267e+00 5.64290043026546e-02 -1.19509336453563e-01 + 1.18181818181818e+01 1.12008684609046e+00 6.13613926416215e-02 -1.14351014023090e-01 + 1.24242424242424e+01 1.10641679635825e+00 6.86990657706108e-02 -1.09572759572039e-01 + 1.30303030303030e+01 1.10001146588234e+00 7.71321227342433e-02 -1.05827721623316e-01 + 1.36363636363636e+01 1.10899885123525e+00 8.72204117979317e-02 -1.07475148520177e-01 + 1.42424242424242e+01 1.12008882355609e+00 9.75650647021123e-02 -1.09425019423431e-01 + 1.48484848484848e+01 1.13075597639677e+00 1.08294194106513e-01 -1.11906001460801e-01 + 1.54545454545455e+01 1.13516931068150e+00 1.17464255427677e-01 -1.13115892870182e-01 + 1.60606060606061e+01 1.13676837338324e+00 1.25978158509963e-01 -1.13656640925689e-01 + 1.66666666666667e+01 1.13211072570407e+00 1.33262514337462e-01 -1.12840862880448e-01 + 1.72727272727273e+01 1.13058655438625e+00 1.42129358900706e-01 -1.13195774561728e-01 + 1.78787878787879e+01 1.13267144501086e+00 1.52930376429612e-01 -1.14987235036101e-01 + 1.84848484848485e+01 1.13534488348534e+00 1.65326800303123e-01 -1.18507779175190e-01 + 1.90909090909091e+01 1.13808110384824e+00 1.77947867911582e-01 -1.22278286215279e-01 + 1.96969696969697e+01 1.13996942404966e+00 1.89581788465173e-01 -1.25014693335627e-01 + 2.03030303030303e+01 1.14136257005177e+00 2.02809939468738e-01 -1.28759059263829e-01 + 2.09090909090909e+01 1.14278916134738e+00 2.17632411113615e-01 -1.33592215797638e-01 + 2.15151515151515e+01 1.14520088380394e+00 2.32454882758493e-01 -1.38449866850649e-01 + 2.21212121212121e+01 1.14534623034980e+00 2.46593134049512e-01 -1.43713984431992e-01 + 2.27272727272727e+01 1.13669195126191e+00 2.57995207937436e-01 -1.50603549902548e-01 + 2.33333333333333e+01 1.12803767217403e+00 2.69397281825361e-01 -1.57514015684770e-01 + 2.39393939393939e+01 1.11938339308615e+00 2.80799355713285e-01 -1.64504480543572e-01 + 2.45454545454545e+01 1.11133045136127e+00 2.92351027387632e-01 -1.70538137552357e-01 + 2.51515151515151e+01 1.10334432346167e+00 3.03919320680690e-01 -1.76461209319149e-01 + 2.57575757575758e+01 1.09535819556207e+00 3.15487613973748e-01 -1.82379292873812e-01 + 2.63636363636364e+01 1.08824062881607e+00 3.27443230354664e-01 -1.87812657912168e-01 + 2.69696969696970e+01 1.08170219282164e+00 3.39657102253967e-01 -1.92922675867797e-01 + 2.75757575757576e+01 1.07516375682721e+00 3.51870974153269e-01 -1.98029550237023e-01 + 2.81818181818182e+01 1.06891342259585e+00 3.64260229155871e-01 -2.02965263331226e-01 + 2.87878787878788e+01 1.06333526814667e+00 3.77058676295725e-01 -2.07506580463469e-01 + 2.93939393939394e+01 1.05775711369748e+00 3.89857123435579e-01 -2.12045827432426e-01 + 3.00000000000000e+01 1.05217895924830e+00 4.02655570575433e-01 -2.16582986742122e-01 + 3.30000000000000e+01 1.02795917310136e+00 4.69344655336830e-01 -2.36555351110227e-01 + 3.60000000000000e+01 1.00496772750934e+00 5.38816968440485e-01 -2.54825361123685e-01 + 3.90000000000000e+01 9.81146869188920e-01 6.10910749328229e-01 -2.71702784264139e-01 + 4.20000000000000e+01 9.54127928885481e-01 6.84604259911056e-01 -2.87623690411183e-01 + 4.50000000000000e+01 9.25925507989752e-01 7.58692207540872e-01 -3.03272921560484e-01 + 4.80000000000000e+01 8.90921980696787e-01 8.32633137744547e-01 -3.18102995823141e-01 + 5.10000000000000e+01 8.51887356225999e-01 9.04988545463753e-01 -3.32607858873096e-01 + 5.40000000000000e+01 8.04790278249480e-01 9.74172806284381e-01 -3.46467861120541e-01 + 5.70000000000000e+01 7.57693159426409e-01 1.04335653563477e+00 -3.60325018324970e-01 + 6.00000000000000e+01 7.10596020180217e-01 1.11253999925206e+00 -3.74179542354393e-01 + 6.30000000000000e+01 6.48049471053151e-01 1.16837068035199e+00 -3.86611182558364e-01 + 6.60000000000000e+01 5.85502788028442e-01 1.22420124699738e+00 -3.99041445615547e-01 + 6.90000000000000e+01 5.22956102060375e-01 1.28003181364278e+00 -4.11470147230388e-01 + 7.20000000000000e+01 4.53110398690217e-01 1.32234237809590e+00 -4.22612100063294e-01 + 7.50000000000000e+01 3.79615336039622e-01 1.35789321822535e+00 -4.33110599511480e-01 + 7.80000000000000e+01 3.06118835606714e-01 1.39344446573911e+00 -4.43608014083683e-01 + 8.10000000000000e+01 2.31409126413095e-01 1.42073658278841e+00 -4.53232613764225e-01 + 8.40000000000000e+01 1.54273083446276e-01 1.43151100901570e+00 -4.61112452060330e-01 + 8.70000000000000e+01 7.71364489011903e-02 1.44228551755366e+00 -4.68991671868026e-01 + 9.00000000000000e+01 -3.37003894630567e-07 1.45305993275333e+00 -4.76870426093284e-01 + 9.30000000000000e+01 -5.39959252161754e-02 1.44228550652603e+00 -4.81692680238558e-01 + 9.60000000000000e+01 -1.07991521148031e-01 1.43151103914374e+00 -4.86490823116468e-01 + 9.90000000000000e+01 -1.61987132519313e-01 1.42073648944996e+00 -4.91273974428200e-01 + 1.02000000000000e+02 -2.14283672037506e-01 1.39344429355730e+00 -4.92759271498875e-01 + 1.05000000000000e+02 -2.65730694027692e-01 1.35789345342785e+00 -4.92588207197183e-01 + 1.08000000000000e+02 -3.17177705557324e-01 1.32234220591584e+00 -4.92507133962652e-01 + 1.11000000000000e+02 -3.66069746716655e-01 1.28003132998751e+00 -4.91213114955779e-01 + 1.14000000000000e+02 -4.09851924952369e-01 1.22420140310934e+00 -4.87375141860954e-01 + 1.17000000000000e+02 -4.53634438299479e-01 1.16837104972410e+00 -4.83536739448328e-01 + 1.20000000000000e+02 -4.97417098058063e-01 1.11254045696623e+00 -4.79698118822128e-01 + 1.23000000000000e+02 -5.30384796680655e-01 1.04335699334894e+00 -4.74045178392828e-01 + 1.26000000000000e+02 -5.63352620077395e-01 9.74173264003827e-01 -4.68392016442808e-01 + 1.29000000000000e+02 -5.96320693031764e-01 9.04989003183198e-01 -4.62734898551017e-01 + 1.32000000000000e+02 -6.22058248103176e-01 8.32584537348691e-01 -4.57940896727791e-01 + 1.35000000000000e+02 -6.44180552804007e-01 7.58569972827814e-01 -4.53579623270348e-01 + 1.38000000000000e+02 -6.66302604968628e-01 6.84555659899671e-01 -4.49218395373695e-01 + 1.41000000000000e+02 -6.86598028619283e-01 6.11957069351566e-01 -4.47177800534488e-01 + 1.44000000000000e+02 -7.03240180419886e-01 5.42189935051373e-01 -4.49778490640875e-01 + 1.47000000000000e+02 -7.19881808024148e-01 4.72422936035072e-01 -4.52379161521216e-01 + 1.50000000000000e+02 -7.36523173539597e-01 4.02656004658303e-01 -4.54979822788877e-01 + 1.53000000000000e+02 -7.23995989268374e-01 3.50606387738054e-01 -4.68570401665813e-01 + 1.56000000000000e+02 -7.10014434000594e-01 2.98556810596401e-01 -4.82106047676863e-01 + 1.59000000000000e+02 -6.95822993804938e-01 2.46507230442391e-01 -4.96319099842072e-01 + 1.62000000000000e+02 -6.22266685072149e-01 2.06230353085240e-01 -5.00873829028078e-01 + 1.65000000000000e+02 -5.18715046462665e-01 1.71839926690689e-01 -5.00546173646419e-01 + 1.68000000000000e+02 -4.15163994460962e-01 1.37449294383709e-01 -5.00218470478517e-01 + 1.71000000000000e+02 -3.11516836116274e-01 1.03069943092153e-01 -4.50000513056908e-01 + 1.74000000000000e+02 -2.07677460598702e-01 6.87131543581221e-02 -2.99999717902353e-01 + 1.77000000000000e+02 -1.03365251644600e-01 5.67869836313884e-02 -1.48723200443975e-01 + 1.80000000000000e+02 0.00000000000000e+00 5.60839860376548e-02 1.47167178040004e-03 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_21.dat b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_21.dat new file mode 100644 index 000000000..b3de07d87 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_21.dat @@ -0,0 +1,254 @@ +! ------------ AirfoilInfo v1.01.x Input File ---------------------------------- +! AeroElasticSE FAST driver +! line +! line +! ------------------------------------------------------------------------------ +DEFAULT InterpOrd ! Interpolation order to use for quasi-steady table lookup {1=linear; 3=cubic spline; "default"} [default=3] +1 NonDimArea ! The non-dimensional area of the airfoil (area/chord^2) (set to 1.0 if unsure or unneeded) +@"NREL-2p8-127_AF21_Coords.txt" NumCoords ! The number of coordinates in the airfoil shape file. Set to zero if coordinates not included. +AF21_BL.txt BL_file ! The file name including the boundary layer characteristics of the profile. Ignored if the aeroacoustic module is not called. +1 NumTabs ! Number of airfoil tables in this file. Each table must have lines for Re and Ctrl. +! ------------------------------------------------------------------------------ +! data for table 1 +! ------------------------------------------------------------------------------ +6.000000 Re ! Reynolds number in millions +0 Ctrl ! Control setting (must be 0 for current AirfoilInfo) +True InclUAdata ! Is unsteady aerodynamics data included in this table? If TRUE, then include 30 UA coefficients below this line +!........................................ +-3.391748 alpha0 ! 0-lift angle of attack, depends on airfoil. +9.217593 alpha1 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA>alpha0. (deg) +-11.634112 alpha2 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA1] +0.000000 S2 ! Constant in the f curve best-fit for AOA> alpha1; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S3 ! Constant in the f curve best-fit for alpha2<=AOA< alpha0; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S4 ! Constant in the f curve best-fit for AOA< alpha2; by definition it depends on the airfoil. [ignored if UAMod<>1] +1.356958 Cn1 ! Critical value of C0n at leading edge separation. It should be extracted from airfoil data at a given Mach and Reynolds number. It can be calculated from the static value of Cn at either the break in the pitching moment or the loss of chord force at the onset of stall. It is close to the condition of maximum lift of the airfoil at low Mach numbers. +-0.907795 Cn2 ! As Cn1 for negative AOAs. +Default St_sh ! Strouhal's shedding frequency constant. [default = 0.19] +0.007422 Cd0 ! 2D drag coefficient value at 0-lift. +-0.113062 Cm0 ! 2D pitching moment coefficient about 1/4-chord location, at 0-lift, positive if nose up. [If the aerodynamics coefficients table does not include a column for Cm, this needs to be set to 0.0] +0.000000 k0 ! Constant in the \hat(x)_cp curve best-fit; = (\hat(x)_AC-0.25). [ignored if UAMod<>1] +0.000000 k1 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k2 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k3 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k1_hat ! Constant in the expression of Cc due to leading edge vortex effects. [ignored if UAMod<>1] +Default x_cp_bar ! Constant in the expression of \hat(x)_cp^v. [ignored if UAMod<>1, default = 0.2] +Default UACutout ! Angle of attack above which unsteady aerodynamics are disabled (deg). [Specifying the string "Default" sets UACutout to 45 degrees] +Default filtCutOff ! Cut-off frequency (-3 dB corner frequency) for low-pass filtering the AoA input to UA, as well as the 1st and 2nd derivatives (Hz) [default = 20] +!........................................ +! Table of aerodynamics coefficients +200 NumAlf ! Number of data lines in the following table +! Alpha Cl Cd Cm +! (deg) (-) (-) (-) +-1.80000000000000e+02 0.00000000000000e+00 5.43028798119170e-02 2.26615932282131e-02 +-1.77000000000000e+02 1.13025106629939e-01 5.43028798119170e-02 1.28579365822585e-01 +-1.74000000000000e+02 2.27085486936604e-01 6.51633944994418e-02 2.39999774321882e-01 +-1.71000000000000e+02 3.40628485406802e-01 9.77452951033210e-02 3.60000410445527e-01 +-1.68000000000000e+02 4.49810292581463e-01 1.30815585114068e-01 3.17166481479515e-01 +-1.65000000000000e+02 5.56811555009885e-01 1.64130064128025e-01 1.92917170488019e-01 +-1.62000000000000e+02 6.63814055955440e-01 1.97444368137118e-01 6.86658789432206e-02 +-1.59000000000000e+02 7.35163378078923e-01 2.37618358711485e-01 -1.63189555213320e-02 +-1.56000000000000e+02 7.36658480852925e-01 2.91511490364540e-01 -2.43269386035842e-02 +-1.53000000000000e+02 7.37191671747579e-01 3.45404633730741e-01 -3.20559725750530e-02 +-1.50000000000000e+02 7.35295872691298e-01 3.99297820213560e-01 -3.53001565756154e-02 +-1.47000000000000e+02 7.18798588287585e-01 4.69181021715765e-01 -1.90934045495720e-02 +-1.44000000000000e+02 7.02301063534926e-01 5.39064308687913e-01 -2.88639524111870e-03 +-1.41000000000000e+02 6.85803058067216e-01 6.08947766606052e-01 1.29498269612823e-02 +-1.38000000000000e+02 6.65616813110053e-01 6.81680698854136e-01 2.86882702662571e-02 +-1.35000000000000e+02 6.43586455890160e-01 7.55838362486724e-01 4.44546354620422e-02 +-1.32000000000000e+02 6.21555858594649e-01 8.29996331514374e-01 6.02291708250731e-02 +-1.29000000000000e+02 5.95899961956707e-01 9.02551799836887e-01 7.61226856194456e-02 +-1.26000000000000e+02 5.62993449444218e-01 9.71902259143020e-01 9.22427459258282e-02 +-1.23000000000000e+02 5.30087151245601e-01 1.04125214332386e+00 1.08365878635908e-01 +-1.20000000000000e+02 4.97180960199916e-01 1.11060173995280e+00 1.24492137036960e-01 +-1.17000000000000e+02 4.53438556744641e-01 1.16661616454686e+00 1.39794623246837e-01 +-1.14000000000000e+02 4.09696303308865e-01 1.22263034910072e+00 1.55098596191987e-01 +-1.11000000000000e+02 3.65954392283428e-01 1.27864410574316e+00 1.70403792833604e-01 +-1.08000000000000e+02 3.17091142370324e-01 1.32114669115373e+00 1.84082975431326e-01 +-1.05000000000000e+02 2.65667184017510e-01 1.35689358806697e+00 1.96954679095920e-01 +-1.02000000000000e+02 2.14243214939976e-01 1.39264007535569e+00 2.09826696172051e-01 +-9.90000000000000e+01 1.61964542361192e-01 1.42013008159586e+00 2.21340640675138e-01 +-9.60000000000000e+01 1.07976425758201e-01 1.43110676810732e+00 2.30136989903572e-01 +-9.30000000000000e+01 5.39883669172201e-02 1.44208337076307e+00 2.38933482205731e-01 +-9.00000000000000e+01 3.36956720911094e-07 1.45305993149174e+00 2.47730362549832e-01 +-8.70000000000000e+01 -5.39883116604485e-02 1.44208338199759e+00 2.52366652228794e-01 +-8.40000000000000e+01 -1.07976576721003e-01 1.43110673741406e+00 2.57034873165347e-01 +-8.10000000000000e+01 -1.61964074669558e-01 1.42013017668539e+00 2.61734177795205e-01 +-7.80000000000000e+01 -2.14242965880546e-01 1.39264024848507e+00 2.63181349488851e-01 +-7.50000000000000e+01 -2.65667524235096e-01 1.35689335157008e+00 2.63016349820918e-01 +-7.20000000000000e+01 -3.17090893316325e-01 1.32114686428136e+00 2.62879007650853e-01 +-6.90000000000000e+01 -3.65954013346774e-01 1.27864459099094e+00 2.61500645209288e-01 +-6.60000000000000e+01 -4.09696425620247e-01 1.22263019247474e+00 2.57610540723508e-01 +-6.30000000000000e+01 -4.53438846142231e-01 1.16661579395854e+00 2.53744590647427e-01 +-6.00000000000000e+01 -4.97181177905552e-01 1.11060128113950e+00 2.49902512739027e-01 +-5.70000000000000e+01 -5.30087368951238e-01 1.04125168451056e+00 2.44282377435672e-01 +-5.40000000000000e+01 -5.62993667151980e-01 9.71901800324015e-01 2.38685350754697e-01 +-5.10000000000000e+01 -5.95900179664471e-01 9.02551341017881e-01 2.33110985323929e-01 +-4.80000000000000e+01 -6.23148878462794e-01 8.30040803802850e-01 2.27879411582758e-01 +-4.50000000000000e+01 -6.47568761333111e-01 7.55950278420295e-01 2.22834475134647e-01 +-4.20000000000000e+01 -6.67209820511491e-01 6.81725170790388e-01 2.19541528712913e-01 +-3.90000000000000e+01 -6.86016653934843e-01 6.07897658893372e-01 2.16860523607545e-01 +-3.60000000000000e+01 -7.02567434351865e-01 5.35679831809432e-01 2.16283272016665e-01 +-3.30000000000000e+01 -7.18514395643352e-01 4.66093046844495e-01 2.19061994245276e-01 +-3.00000000000000e+01 -7.35295993131416e-01 3.99297385438155e-01 2.25596659795295e-01 +-2.93939393939394e+01 -7.39161194393161e-01 3.86479064937486e-01 2.27934329427074e-01 +-2.87878787878788e+01 -7.43026395654906e-01 3.73660744436817e-01 2.30271999058854e-01 +-2.81818181818182e+01 -7.46891596916650e-01 3.60842423936148e-01 2.32609668690633e-01 +-2.75757575757576e+01 -7.51223361563041e-01 3.48434171659383e-01 2.35674061206088e-01 +-2.69696969696970e+01 -7.55755099099513e-01 3.36201677983836e-01 2.39049933104880e-01 +-2.63636363636364e+01 -7.60286836635986e-01 3.23969184308288e-01 2.42425805003671e-01 +-2.57575757575758e+01 -7.65221306359447e-01 3.11995455491433e-01 2.46346530788199e-01 +-2.51515151515151e+01 -7.70759780501553e-01 3.00409813654186e-01 2.51084410416232e-01 +-2.45454545454545e+01 -7.76298254643659e-01 2.88824171816938e-01 2.55822290044264e-01 +-2.39393939393939e+01 -7.82132311059061e-01 2.77302256598583e-01 2.59616206109365e-01 +-2.33333333333333e+01 -7.90626665160274e-01 2.66353893288030e-01 2.54914267352217e-01 +-2.27272727272727e+01 -7.99121019261486e-01 2.55405529977478e-01 2.49019152637843e-01 +-2.21212121212121e+01 -8.07615373362699e-01 2.44457166666925e-01 2.44656741536136e-01 +-2.15151515151515e+01 -8.17117669056492e-01 2.33552006854907e-01 2.32819418554197e-01 +-2.09090909090909e+01 -8.23661297618886e-01 2.22657650696563e-01 2.18130675248769e-01 +-2.03030303030303e+01 -8.30697385161204e-01 2.11763294538219e-01 2.03441931943341e-01 +-1.96969696969697e+01 -8.39130226130645e-01 2.00903773822104e-01 1.88879827702874e-01 +-1.90909090909091e+01 -8.48263760915409e-01 1.90079086577562e-01 1.74444355363349e-01 +-1.84848484848485e+01 -8.54491663822831e-01 1.78820853261852e-01 1.58678068289752e-01 +-1.78787878787879e+01 -8.60163856305434e-01 1.66900896684023e-01 1.43105400370003e-01 +-1.72727272727273e+01 -8.65742368749698e-01 1.55433036053471e-01 1.27344882544298e-01 +-1.66666666666667e+01 -8.69217768752512e-01 1.44247604332767e-01 1.10578705840612e-01 +-1.60606060606061e+01 -8.71119382404463e-01 1.33299705468418e-01 9.29795736467647e-02 +-1.54545454545455e+01 -8.74590802382996e-01 1.22693011692481e-01 7.42553100122313e-02 +-1.48484848484848e+01 -8.79448011540517e-01 1.12275192353923e-01 5.48980138044471e-02 +-1.42424242424242e+01 -8.88041287646387e-01 1.02097518094139e-01 3.47904219734257e-02 +-1.36363636363636e+01 -8.99011386472906e-01 9.19774216439529e-02 1.62310520565996e-02 +-1.30303030303030e+01 -9.12832326690409e-01 8.19089384860160e-02 -2.31248158698626e-03 +-1.24242424242424e+01 -9.05837733998151e-01 7.05955147275284e-02 -1.32519999298020e-02 +-1.18181818181818e+01 -8.94149738372733e-01 6.00304976315857e-02 -2.19483169052786e-02 +-1.12121212121212e+01 -8.72289143999857e-01 4.92518839816106e-02 -2.63426664394142e-02 +-1.06060606060606e+01 -8.43836935503105e-01 3.99601622843484e-02 -3.25182305032108e-02 +-1.00000000000000e+01 -8.11533667684698e-01 3.16634689071838e-02 -3.96531690559947e-02 +-9.39393939393939e+00 -7.73775299793918e-01 2.50351497976403e-02 -4.66232350387770e-02 +-8.78787878787879e+00 -7.24386153510650e-01 1.90363399048990e-02 -5.58158243641951e-02 +-8.18181818181818e+00 -6.51350581746786e-01 1.39307768873385e-02 -6.82565719779272e-02 +-7.57575757575758e+00 -5.70259292800422e-01 1.11966451026731e-02 -7.78318201646995e-02 +-6.96969696969697e+00 -4.84863483201162e-01 9.80210985000549e-03 -8.59002125918137e-02 +-6.36363636363636e+00 -4.01260274507495e-01 8.79364513160939e-03 -9.27920938216900e-02 +-5.75757575757576e+00 -3.17829037962407e-01 8.21072836680058e-03 -9.88413955927494e-02 +-5.15151515151515e+00 -2.34560631356565e-01 7.89417831655769e-03 -1.03830189790787e-01 +-4.54545454545454e+00 -1.52768219821946e-01 7.69629272463115e-03 -1.07609067491263e-01 +-3.93939393939394e+00 -7.17446885276158e-02 7.55980850277901e-03 -1.10714124632562e-01 +-3.33333333333333e+00 7.65266106535894e-03 7.40740590680152e-03 -1.13312526310592e-01 +-2.72727272727273e+00 8.69540435134952e-02 7.26852935125166e-03 -1.15619076304701e-01 +-2.12121212121212e+00 1.65602650506344e-01 7.16999070079818e-03 -1.17974728073125e-01 +-1.51515151515152e+00 2.43153008832856e-01 7.12240036540634e-03 -1.20398358450422e-01 +-9.09090909090912e-01 3.19690083645440e-01 7.11221121992558e-03 -1.22659469489510e-01 +-3.03030303030302e-01 3.94185583692908e-01 7.18341302084739e-03 -1.24698324985504e-01 + 3.03030303030302e-01 4.68902411410735e-01 7.22469085552886e-03 -1.26637855769298e-01 + 9.09090909090912e-01 5.43881635947123e-01 7.21999237311871e-03 -1.28343787287290e-01 + 1.51515151515152e+00 6.18852988644897e-01 7.24722163406657e-03 -1.29976534377553e-01 + 2.12121212121212e+00 6.93718405482782e-01 7.38406188230317e-03 -1.31468930098195e-01 + 2.72727272727273e+00 7.68149611769229e-01 7.53516389223080e-03 -1.32869142821252e-01 + 3.33333333333333e+00 8.41715172859199e-01 7.67641621971856e-03 -1.34133903242727e-01 + 3.93939393939394e+00 9.14829634658937e-01 7.82676312299375e-03 -1.35268602227928e-01 + 4.54545454545455e+00 9.87354918951398e-01 8.01392970071129e-03 -1.36139906970678e-01 + 5.15151515151515e+00 1.05927746446687e+00 8.23073134973320e-03 -1.36861989320736e-01 + 5.75757575757576e+00 1.12953343156332e+00 8.53450625263956e-03 -1.37191762867414e-01 + 6.36363636363637e+00 1.19646607280768e+00 8.93008691845142e-03 -1.37002644214539e-01 + 6.96969696969697e+00 1.26024731016983e+00 9.47027625942907e-03 -1.36418678279720e-01 + 7.57575757575757e+00 1.30971003050197e+00 1.06647324108263e-02 -1.33671247589578e-01 + 8.18181818181818e+00 1.35040217332210e+00 1.19527461931973e-02 -1.30058175517731e-01 + 8.78787878787879e+00 1.37091316495312e+00 1.39974785904022e-02 -1.24857926363025e-01 + 9.39393939393939e+00 1.35667712683307e+00 2.24354236046123e-02 -1.22733114545900e-01 + 1.00000000000000e+01 1.32700007053080e+00 3.43303944973221e-02 -1.22710273741457e-01 + 1.06060606060606e+01 1.24713203043916e+00 4.48348853319247e-02 -1.21775958563809e-01 + 1.12121212121212e+01 1.18632667549810e+00 5.33280007969130e-02 -1.20204637608153e-01 + 1.18181818181818e+01 1.16131302771668e+00 5.88308583503445e-02 -1.15957794313766e-01 + 1.24242424242424e+01 1.14844752198994e+00 6.69420911628980e-02 -1.11212235524214e-01 + 1.30303030303030e+01 1.14161039119524e+00 7.59411805359307e-02 -1.07908924395850e-01 + 1.36363636363636e+01 1.14446202808895e+00 8.67113082553106e-02 -1.09652277516758e-01 + 1.42424242424242e+01 1.15360925201834e+00 9.73732500785179e-02 -1.11627155262551e-01 + 1.48484848484848e+01 1.16355448827020e+00 1.07873104416001e-01 -1.14134059252607e-01 + 1.54545454545455e+01 1.16664773714290e+00 1.16951528881583e-01 -1.15612411766512e-01 + 1.60606060606061e+01 1.16661013255713e+00 1.25430946902501e-01 -1.16354027535650e-01 + 1.66666666666667e+01 1.15970818612903e+00 1.32782384020419e-01 -1.15612441871561e-01 + 1.72727272727273e+01 1.15449556243335e+00 1.41571380936791e-01 -1.15991269265136e-01 + 1.78787878787879e+01 1.15081418671560e+00 1.52117413613284e-01 -1.17753256291338e-01 + 1.84848484848485e+01 1.14958568526759e+00 1.64075993230739e-01 -1.21043159594879e-01 + 1.90909090909091e+01 1.14892881211198e+00 1.76252052672837e-01 -1.24587774021336e-01 + 1.96969696969697e+01 1.14714298858187e+00 1.87659451395701e-01 -1.27408729102206e-01 + 2.03030303030303e+01 1.14429050732898e+00 2.00561453897594e-01 -1.31242484394764e-01 + 2.09090909090909e+01 1.14266964540886e+00 2.14958144733618e-01 -1.36284282472763e-01 + 2.15151515151515e+01 1.14423506135131e+00 2.29354835569642e-01 -1.41385269444278e-01 + 2.21212121212121e+01 1.14307069922354e+00 2.43146307939168e-01 -1.46827329115247e-01 + 2.27272727272727e+01 1.13437676569340e+00 2.54517529167918e-01 -1.53633328645347e-01 + 2.33333333333333e+01 1.12568283216327e+00 2.65888750396669e-01 -1.60489831976375e-01 + 2.39393939393939e+01 1.11698889863313e+00 2.77259971625421e-01 -1.67539646177715e-01 + 2.45454545454545e+01 1.10899853924541e+00 2.88824171816938e-01 -1.73613983027854e-01 + 2.51515151515151e+01 1.10108635308077e+00 3.00409813654186e-01 -1.79569604350001e-01 + 2.57575757575758e+01 1.09317416691613e+00 3.11995455491433e-01 -1.85513172087669e-01 + 2.63636363636364e+01 1.08612496192253e+00 3.23969184308288e-01 -1.90961864811472e-01 + 2.69696969696970e+01 1.07965116711405e+00 3.36201677983836e-01 -1.96080224256372e-01 + 2.75757575757576e+01 1.07317737230558e+00 3.48434171659383e-01 -2.01190987495797e-01 + 2.81818181818182e+01 1.06698932003423e+00 3.60842423936148e-01 -2.06125820524907e-01 + 2.87878787878788e+01 1.06146794315678e+00 3.73660744436817e-01 -2.10662136737585e-01 + 2.93939393939394e+01 1.05594656627932e+00 3.86479064937486e-01 -2.15193450579188e-01 + 3.00000000000000e+01 1.05042518940186e+00 3.99297385438155e-01 -2.19719719772206e-01 + 3.30000000000000e+01 1.02644827609649e+00 4.66093046844495e-01 -2.39615606337711e-01 + 3.60000000000000e+01 1.00366641718899e+00 5.35679831809432e-01 -2.57787676201759e-01 + 3.90000000000000e+01 9.80023910642716e-01 6.07897658893372e-01 -2.74564735422046e-01 + 4.20000000000000e+01 9.53157091193240e-01 6.81725170790389e-01 -2.90390686664731e-01 + 4.50000000000000e+01 9.25099031707945e-01 7.55950278420295e-01 -3.05940905817259e-01 + 4.80000000000000e+01 8.90213156909925e-01 8.30040803802850e-01 -3.20687232891725e-01 + 5.10000000000000e+01 8.51286270268613e-01 9.02551341017882e-01 -3.35111108629908e-01 + 5.40000000000000e+01 8.04277100153241e-01 9.71901800324015e-01 -3.48903550668194e-01 + 5.70000000000000e+01 7.57267880913182e-01 1.04125168451056e+00 -3.62689866471288e-01 + 6.00000000000000e+01 7.10258637110966e-01 1.11060128113950e+00 -3.76470193714150e-01 + 6.30000000000000e+01 6.47769674730578e-01 1.16661579395854e+00 -3.88852281816777e-01 + 6.60000000000000e+01 5.85280557002702e-01 1.22263019247474e+00 -4.01231358690575e-01 + 6.90000000000000e+01 5.22791393951418e-01 1.27864459099094e+00 -4.13607260555449e-01 + 7.20000000000000e+01 4.52986794514127e-01 1.32114686428136e+00 -4.24708378476078e-01 + 7.50000000000000e+01 3.79524626640559e-01 1.35689335157008e+00 -4.35171875987646e-01 + 7.80000000000000e+01 3.06061084931655e-01 1.39264024848507e+00 -4.45633420993565e-01 + 8.10000000000000e+01 2.31376934566227e-01 1.42013017668539e+00 -4.55226551749704e-01 + 8.40000000000000e+01 1.54251651146622e-01 1.43110673741406e+00 -4.63084866775445e-01 + 8.70000000000000e+01 7.71257414576533e-02 1.44208338199759e+00 -4.70942168414430e-01 + 9.00000000000000e+01 -3.36956721141558e-07 1.45305993149174e+00 -4.78798611378502e-01 + 9.30000000000000e+01 -5.39883669172201e-02 1.44208337076307e+00 -4.83401960300538e-01 + 9.60000000000000e+01 -1.07976425758202e-01 1.43110676810732e+00 -4.87843492281115e-01 + 9.90000000000000e+01 -1.61964542361192e-01 1.42013008159586e+00 -4.92246671349029e-01 + 1.02000000000000e+02 -2.14243214939976e-01 1.39264007535569e+00 -4.93334961576679e-01 + 1.05000000000000e+02 -2.65667184017510e-01 1.35689358806697e+00 -4.92747792758473e-01 + 1.08000000000000e+02 -3.17091142370324e-01 1.32114669115373e+00 -4.92489218692733e-01 + 1.11000000000000e+02 -3.65954392283428e-01 1.27864410574316e+00 -4.91167327902475e-01 + 1.14000000000000e+02 -4.09696303308866e-01 1.22263034910072e+00 -4.87302639052758e-01 + 1.17000000000000e+02 -4.53438556744641e-01 1.16661616454686e+00 -4.83437520681149e-01 + 1.20000000000000e+02 -4.97180960199916e-01 1.11060173995280e+00 -4.79572183996746e-01 + 1.23000000000000e+02 -5.30087151245601e-01 1.04125214332386e+00 -4.73893974859065e-01 + 1.26000000000000e+02 -5.62993449444218e-01 9.71902259143020e-01 -4.68215548654545e-01 + 1.29000000000000e+02 -5.95899961956708e-01 9.02551799836887e-01 -4.62491545543420e-01 + 1.32000000000000e+02 -6.21555858594649e-01 8.29996331514373e-01 -4.57600132450428e-01 + 1.35000000000000e+02 -6.43586455890160e-01 7.55838362486724e-01 -4.53140066017817e-01 + 1.38000000000000e+02 -6.65616813110053e-01 6.81680698854136e-01 -4.48679982709285e-01 + 1.41000000000000e+02 -6.85803058067216e-01 6.08947766606052e-01 -4.46525550737110e-01 + 1.44000000000000e+02 -7.02301063534926e-01 5.39064308687913e-01 -4.48982440146784e-01 + 1.47000000000000e+02 -7.18798588287585e-01 4.69181021715765e-01 -4.51439319035616e-01 + 1.50000000000000e+02 -7.35295872691298e-01 3.99297820213560e-01 -4.53896192664215e-01 + 1.53000000000000e+02 -7.28330506319376e-01 3.46647734139971e-01 -4.68325381164791e-01 + 1.56000000000000e+02 -7.17850798388541e-01 2.93997685207009e-01 -4.82051328896962e-01 + 1.59000000000000e+02 -7.06863743588803e-01 2.41347630242394e-01 -4.98256732246163e-01 + 1.62000000000000e+02 -6.34811170157550e-01 2.01242252961188e-01 -5.03086039127970e-01 + 1.65000000000000e+02 -5.31470448900505e-01 1.67409320614642e-01 -5.01928907588892e-01 + 1.68000000000000e+02 -4.28130311834334e-01 1.33576175967328e-01 -5.00771566637685e-01 + 1.71000000000000e+02 -3.23313093840734e-01 9.99186368162403e-02 -4.50000513056908e-01 + 1.74000000000000e+02 -2.15541645031820e-01 6.66123168560943e-02 -2.99999717902353e-01 + 1.77000000000000e+02 -1.07279423135448e-01 5.50240468507236e-02 -1.40189247446868e-01 + 1.80000000000000e+02 0.00000000000000e+00 5.43028798119170e-02 2.26615932282131e-02 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_22.dat b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_22.dat new file mode 100644 index 000000000..c21897483 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_22.dat @@ -0,0 +1,254 @@ +! ------------ AirfoilInfo v1.01.x Input File ---------------------------------- +! AeroElasticSE FAST driver +! line +! line +! ------------------------------------------------------------------------------ +DEFAULT InterpOrd ! Interpolation order to use for quasi-steady table lookup {1=linear; 3=cubic spline; "default"} [default=3] +1 NonDimArea ! The non-dimensional area of the airfoil (area/chord^2) (set to 1.0 if unsure or unneeded) +@"NREL-2p8-127_AF22_Coords.txt" NumCoords ! The number of coordinates in the airfoil shape file. Set to zero if coordinates not included. +AF22_BL.txt BL_file ! The file name including the boundary layer characteristics of the profile. Ignored if the aeroacoustic module is not called. +1 NumTabs ! Number of airfoil tables in this file. Each table must have lines for Re and Ctrl. +! ------------------------------------------------------------------------------ +! data for table 1 +! ------------------------------------------------------------------------------ +6.000000 Re ! Reynolds number in millions +0 Ctrl ! Control setting (must be 0 for current AirfoilInfo) +True InclUAdata ! Is unsteady aerodynamics data included in this table? If TRUE, then include 30 UA coefficients below this line +!........................................ +-3.566308 alpha0 ! 0-lift angle of attack, depends on airfoil. +9.412539 alpha1 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA>alpha0. (deg) +-11.254245 alpha2 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA1] +0.000000 S2 ! Constant in the f curve best-fit for AOA> alpha1; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S3 ! Constant in the f curve best-fit for alpha2<=AOA< alpha0; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S4 ! Constant in the f curve best-fit for AOA< alpha2; by definition it depends on the airfoil. [ignored if UAMod<>1] +1.372317 Cn1 ! Critical value of C0n at leading edge separation. It should be extracted from airfoil data at a given Mach and Reynolds number. It can be calculated from the static value of Cn at either the break in the pitching moment or the loss of chord force at the onset of stall. It is close to the condition of maximum lift of the airfoil at low Mach numbers. +-0.851187 Cn2 ! As Cn1 for negative AOAs. +Default St_sh ! Strouhal's shedding frequency constant. [default = 0.19] +0.007099 Cd0 ! 2D drag coefficient value at 0-lift. +-0.113167 Cm0 ! 2D pitching moment coefficient about 1/4-chord location, at 0-lift, positive if nose up. [If the aerodynamics coefficients table does not include a column for Cm, this needs to be set to 0.0] +0.000000 k0 ! Constant in the \hat(x)_cp curve best-fit; = (\hat(x)_AC-0.25). [ignored if UAMod<>1] +0.000000 k1 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k2 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k3 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k1_hat ! Constant in the expression of Cc due to leading edge vortex effects. [ignored if UAMod<>1] +Default x_cp_bar ! Constant in the expression of \hat(x)_cp^v. [ignored if UAMod<>1, default = 0.2] +Default UACutout ! Angle of attack above which unsteady aerodynamics are disabled (deg). [Specifying the string "Default" sets UACutout to 45 degrees] +Default filtCutOff ! Cut-off frequency (-3 dB corner frequency) for low-pass filtering the AoA input to UA, as well as the 1st and 2nd derivatives (Hz) [default = 20] +!........................................ +! Table of aerodynamics coefficients +200 NumAlf ! Number of data lines in the following table +! Alpha Cl Cd Cm +! (deg) (-) (-) (-) +-1.80000000000000e+02 0.00000000000000e+00 5.07556742159798e-02 6.34072788301272e-02 +-1.77000000000000e+02 1.21373168046836e-01 5.07556742159798e-02 1.44989137166855e-01 +-1.74000000000000e+02 2.43858124753276e-01 6.09067517869507e-02 2.39999774321882e-01 +-1.71000000000000e+02 3.65787584521499e-01 9.13603177509608e-02 3.60000410445527e-01 +-1.68000000000000e+02 4.75515174866590e-01 1.23180858733612e-01 3.13292467675056e-01 +-1.65000000000000e+02 5.79141972913914e-01 1.55684871270972e-01 1.83232181192322e-01 +-1.62000000000000e+02 6.82769984990416e-01 1.88188793392151e-01 5.31699414433441e-02 +-1.59000000000000e+02 7.49929094529181e-01 2.28115056904519e-01 -3.37679356965932e-02 +-1.56000000000000e+02 7.45401898546715e-01 2.82885752112716e-01 -3.57982585441417e-02 +-1.53000000000000e+02 7.40045790863415e-01 3.37656465738121e-01 -3.75882513662505e-02 +-1.50000000000000e+02 7.32596618631745e-01 3.92427224341668e-01 -3.50272634037363e-02 +-1.47000000000000e+02 7.16416220992227e-01 4.62548307459531e-01 -1.89393396903141e-02 +-1.44000000000000e+02 7.00235624959091e-01 5.32669512974126e-01 -2.85117921368804e-03 +-1.41000000000000e+02 6.84054632124555e-01 6.02790963290924e-01 1.27311247792732e-02 +-1.38000000000000e+02 6.64108508380734e-01 6.75798748422820e-01 2.82558445968883e-02 +-1.35000000000000e+02 6.42279826820249e-01 7.50249695107020e-01 4.38571814291932e-02 +-1.32000000000000e+02 6.20450921675678e-01 8.24701058603098e-01 5.94656947948800e-02 +-1.29000000000000e+02 5.94974616376641e-01 8.97565459936934e-01 7.52120953201059e-02 +-1.26000000000000e+02 5.62203493473854e-01 9.67255929411789e-01 9.12244354642672e-02 +-1.23000000000000e+02 5.29432511812518e-01 1.03694573967196e+00 1.07239613164941e-01 +-1.20000000000000e+02 4.96661600769268e-01 1.10663522033711e+00 1.23257579300455e-01 +-1.17000000000000e+02 4.53007747800845e-01 1.16302575005567e+00 1.38481557370608e-01 +-1.14000000000000e+02 4.09354049149219e-01 1.21941603836822e+00 1.53706780948661e-01 +-1.11000000000000e+02 3.65700701685022e-01 1.27580589589615e+00 1.68932988096397e-01 +-1.08000000000000e+02 3.16900772369631e-01 1.31870071696580e+00 1.82560097851392e-01 +-1.05000000000000e+02 2.65527512940554e-01 1.35484791704772e+00 1.95399125304991e-01 +-1.02000000000000e+02 2.14154242205798e-01 1.39099470291805e+00 2.08238303928547e-01 +-9.90000000000000e+01 1.61914865702625e-01 1.41888942602526e+00 2.19722912577175e-01 +-9.60000000000000e+01 1.07943240147024e-01 1.43027966616597e+00 2.28497123718656e-01 +-9.30000000000000e+01 5.39717537188113e-02 1.44166981929167e+00 2.37271383106753e-01 +-9.00000000000000e+01 3.36853033223878e-07 1.45305992891065e+00 2.46045939350736e-01 +-8.70000000000000e+01 -5.39716984790431e-02 1.44166983094945e+00 2.50473302115734e-01 +-8.40000000000000e+01 -1.07943391063713e-01 1.43027963431632e+00 2.54928173585132e-01 +-8.10000000000000e+01 -1.61914398153851e-01 1.41888952469734e+00 2.59409826519098e-01 +-7.80000000000000e+01 -2.14153993391912e-01 1.39099487798618e+00 2.60637456906859e-01 +-7.50000000000000e+01 -2.65527852822723e-01 1.35484767790248e+00 2.60250041617006e-01 +-7.20000000000000e+01 -3.16900523561175e-01 1.31870089203215e+00 2.59886362685276e-01 +-6.90000000000000e+01 -3.65700323515595e-01 1.27580638440210e+00 2.58282671903770e-01 +-6.60000000000000e+01 -4.09354171212959e-01 1.21941588069058e+00 2.54173349716066e-01 +-6.30000000000000e+01 -4.53008036612590e-01 1.16302537697905e+00 2.50084873782204e-01 +-6.00000000000000e+01 -4.96661817579899e-01 1.10663475927516e+00 2.46016982651216e-01 +-5.70000000000000e+01 -5.29432728623149e-01 1.03694527861001e+00 2.40180820587871e-01 +-5.40000000000000e+01 -5.62203710285886e-01 9.67255468343294e-01 2.34364534434322e-01 +-5.10000000000000e+01 -5.94974833188673e-01 8.97564998868439e-01 2.28567701938433e-01 +-4.80000000000000e+01 -6.22057662441151e-01 8.24737086109294e-01 2.23106850479156e-01 +-4.50000000000000e+01 -6.46296436287407e-01 7.50340502131161e-01 2.17827122416360e-01 +-4.20000000000000e+01 -6.65715236572083e-01 6.75834775642757e-01 2.14270938724142e-01 +-3.90000000000000e+01 -6.84287831284676e-01 6.01733100265088e-01 2.11324975236861e-01 +-3.60000000000000e+01 -7.00563864724568e-01 5.29261493580405e-01 2.10489244413362e-01 +-3.30000000000000e+01 -7.16187489056336e-01 4.59440503480610e-01 2.12957840755690e-01 +-3.00000000000000e+01 -7.32596736476158e-01 3.92426788149384e-01 2.19119564417483e-01 +-2.93939393939394e+01 -7.36374389172812e-01 3.79567808225057e-01 2.21363823380573e-01 +-2.87878787878788e+01 -7.40152041869467e-01 3.66708828300729e-01 2.23608082343664e-01 +-2.81818181818182e+01 -7.43929694566121e-01 3.53849848376402e-01 2.25852341306755e-01 +-2.75757575757576e+01 -7.48165648451628e-01 3.41402728220191e-01 2.28809630520161e-01 +-2.69696969696970e+01 -7.52598033982392e-01 3.29132134535727e-01 2.32072530342035e-01 +-2.63636363636364e+01 -7.57030419513156e-01 3.16861540851264e-01 2.35335430163909e-01 +-2.57575757575758e+01 -7.61859695409693e-01 3.04850755726473e-01 2.39132514207883e-01 +-2.51515151515151e+01 -7.67284214354563e-01 2.93229622889516e-01 2.43730750086607e-01 +-2.45454545454545e+01 -7.72708733299433e-01 2.81608490052560e-01 2.48328985965330e-01 +-2.39393939393939e+01 -7.78397371018865e-01 2.70052672159968e-01 2.52203196387113e-01 +-2.33333333333333e+01 -7.86463128844015e-01 2.59084701411948e-01 2.49561037521642e-01 +-2.27272727272727e+01 -7.94528886669166e-01 2.48116730663927e-01 2.45890720916381e-01 +-2.21212121212121e+01 -8.02594644494317e-01 2.37148759915907e-01 2.43586283408853e-01 +-2.15151515151515e+01 -8.10907795657620e-01 2.26212863295167e-01 2.36219129070528e-01 +-2.09090909090909e+01 -8.16516141250483e-01 2.15284987269397e-01 2.26807332042050e-01 +-2.03030303030303e+01 -8.22548837928087e-01 2.04357111243626e-01 2.17395535013573e-01 +-1.96969696969697e+01 -8.30002084619816e-01 1.93526156053271e-01 2.08338072839810e-01 +-1.90909090909091e+01 -8.38276075640665e-01 1.82792116215481e-01 1.99634925475900e-01 +-1.84848484848485e+01 -8.41525789425216e-01 1.71763238665119e-01 1.87206613897995e-01 +-1.78787878787879e+01 -8.43830658066113e-01 1.60232706599968e-01 1.74288223907780e-01 +-1.72727272727273e+01 -8.45969420405482e-01 1.49310415673877e-01 1.60399611180235e-01 +-1.66666666666667e+01 -8.44462724081164e-01 1.38631475065992e-01 1.43746150937375e-01 +-1.60606060606061e+01 -8.40100015006392e-01 1.28157201231612e-01 1.24821818047702e-01 +-1.54545454545455e+01 -8.37817603025782e-01 1.18032218056081e-01 1.04802159358542e-01 +-1.48484848484848e+01 -8.37183712471984e-01 1.08103958885772e-01 8.41678532118364e-02 +-1.42424242424242e+01 -8.40890120256044e-01 9.84661435612030e-02 6.27214130589554e-02 +-1.36363636363636e+01 -8.46817406852861e-01 8.88896748069138e-02 4.26434421043484e-02 +-1.30303030303030e+01 -8.55315988459211e-01 7.93654273525520e-02 2.26015400198430e-02 +-1.24242424242424e+01 -8.47245180473497e-01 6.91820678235402e-02 8.67599048926910e-03 +-1.18181818181818e+01 -8.35432683112564e-01 5.98195535661050e-02 -3.47219937244458e-03 +-1.12121212121212e+01 -8.15393459831635e-01 4.94939958051427e-02 -1.22220313441137e-02 +-1.06060606060606e+01 -7.90094798205374e-01 4.03354037886031e-02 -2.24327341739879e-02 +-1.00000000000000e+01 -7.61704104709643e-01 3.20697982337656e-02 -3.34296643848299e-02 +-9.39393939393939e+00 -7.28357715972300e-01 2.53011224655095e-02 -4.42541982301917e-02 +-8.78787878787879e+00 -6.84142454187570e-01 1.91495037741205e-02 -5.66943316671589e-02 +-8.18181818181818e+00 -6.17979429458198e-01 1.37667951514698e-02 -7.13770363239650e-02 +-7.57575757575758e+00 -5.38103979710377e-01 1.08227708003567e-02 -8.21189162256499e-02 +-6.96969696969697e+00 -4.51631211888217e-01 9.39164055487013e-03 -9.05502975056676e-02 +-6.36363636363636e+00 -3.69904831929908e-01 8.28680451711851e-03 -9.65427316699646e-02 +-5.75757575757576e+00 -2.88476726756192e-01 7.76135087915599e-03 -1.01757959286034e-01 +-5.15151515151515e+00 -2.07260475931238e-01 7.47535721667608e-03 -1.06060127684791e-01 +-4.54545454545454e+00 -1.27279930853378e-01 7.28615916745306e-03 -1.09371226057769e-01 +-3.93939393939394e+00 -4.80058499406509e-02 7.17092890724474e-03 -1.11865483581015e-01 +-3.33333333333333e+00 2.99773467049867e-02 7.05390574872594e-03 -1.13980246411455e-01 +-2.72727272727273e+00 1.07925041765181e-01 6.93627094208034e-03 -1.15908672907983e-01 +-2.12121212121212e+00 1.85286698580458e-01 6.86333451961630e-03 -1.17939670229949e-01 +-1.51515151515152e+00 2.61818679801486e-01 6.83016135377631e-03 -1.20251324856380e-01 +-9.09090909090912e-01 3.37437336745196e-01 6.82527631097856e-03 -1.22427420055716e-01 +-3.03030303030302e-01 4.11339964275432e-01 6.88875118426107e-03 -1.24393823575531e-01 + 3.03030303030302e-01 4.85425194785723e-01 6.93305859100922e-03 -1.26271092424251e-01 + 9.09090909090912e-01 5.59688748393245e-01 6.92641095940415e-03 -1.27930360286602e-01 + 1.51515151515152e+00 6.33889422008781e-01 6.97145778583218e-03 -1.29509636273062e-01 + 2.12121212121212e+00 7.08007295477312e-01 7.08503567582370e-03 -1.30948866987131e-01 + 2.72727272727273e+00 7.81743944095907e-01 7.22808542364998e-03 -1.32280278589569e-01 + 3.33333333333333e+00 8.54768718499635e-01 7.36394317569994e-03 -1.33476357648126e-01 + 3.93939393939394e+00 9.27343605653137e-01 7.50800878324420e-03 -1.34580752920963e-01 + 4.54545454545455e+00 9.99337144270299e-01 7.68025178023798e-03 -1.35437140997352e-01 + 5.15151515151515e+00 1.07077533588784e+00 7.88250770331053e-03 -1.36171448237875e-01 + 5.75757575757576e+00 1.14067573993544e+00 8.18560595986809e-03 -1.36563716920552e-01 + 6.36363636363637e+00 1.20738594989603e+00 8.61082274432950e-03 -1.36450536130407e-01 + 6.96969696969697e+00 1.27030534457503e+00 9.26154940433015e-03 -1.35865188748459e-01 + 7.57575757575757e+00 1.31967720204744e+00 1.06711516164033e-02 -1.33196036139163e-01 + 8.18181818181818e+00 1.36117901696138e+00 1.20457201580521e-02 -1.29734082098160e-01 + 8.78787878787879e+00 1.38645164475349e+00 1.40141299367242e-02 -1.24969368476653e-01 + 9.39393939393939e+00 1.38364788675440e+00 2.10604272519143e-02 -1.22681471706985e-01 + 1.00000000000000e+01 1.36632615029107e+00 3.08301921000425e-02 -1.22594505197778e-01 + 1.06060606060606e+01 1.30793900793488e+00 3.95953728731437e-02 -1.21768157631026e-01 + 1.12121212121212e+01 1.26354919483254e+00 4.68596237969062e-02 -1.20824315241689e-01 + 1.18181818181818e+01 1.24622078267823e+00 5.34209201004403e-02 -1.17862121865541e-01 + 1.24242424242424e+01 1.23316572300737e+00 6.31476016531568e-02 -1.14380907459069e-01 + 1.30303030303030e+01 1.22283883104523e+00 7.34240891191203e-02 -1.12038188702533e-01 + 1.36363636363636e+01 1.21302095714098e+00 8.54972535339130e-02 -1.13922354181064e-01 + 1.42424242424242e+01 1.20995851746224e+00 9.67529857851515e-02 -1.15899802821485e-01 + 1.48484848484848e+01 1.20957781975123e+00 1.06783261680667e-01 -1.18176308348192e-01 + 1.54545454545455e+01 1.20628232400092e+00 1.15676133910572e-01 -1.19630275206793e-01 + 1.60606060606061e+01 1.20129649682940e+00 1.24088573760305e-01 -1.20475625038284e-01 + 1.66666666666667e+01 1.19049649901642e+00 1.31588359571251e-01 -1.20087718033958e-01 + 1.72727272727273e+01 1.17964142895866e+00 1.40230863472286e-01 -1.20588628022729e-01 + 1.78787878787879e+01 1.16825933056011e+00 1.50270037306760e-01 -1.22187730969383e-01 + 1.84848484848485e+01 1.16279372315999e+00 1.61375170677979e-01 -1.24959559895277e-01 + 1.90909090909091e+01 1.15872202145603e+00 1.72688440191291e-01 -1.28082765397647e-01 + 1.96969696969697e+01 1.15339844517572e+00 1.83671166909384e-01 -1.31533890864235e-01 + 2.03030303030303e+01 1.14667353640152e+00 1.95931329664752e-01 -1.35939723395958e-01 + 2.09090909090909e+01 1.14214263161388e+00 2.09469000726538e-01 -1.41468507832042e-01 + 2.15151515151515e+01 1.14163199846552e+00 2.23006671788323e-01 -1.47048295239323e-01 + 2.21212121212121e+01 1.13801617834194e+00 2.36098095781483e-01 -1.52838501078495e-01 + 2.27272727272727e+01 1.12925112767887e+00 2.47404990655498e-01 -1.59470164140170e-01 + 2.33333333333333e+01 1.12048607701580e+00 2.58711885529513e-01 -1.66145346243189e-01 + 2.39393939393939e+01 1.11172102635272e+00 2.70018780403529e-01 -1.72987104001955e-01 + 2.45454545454545e+01 1.10386992919784e+00 2.81608490052560e-01 -1.78880886757862e-01 + 2.51515151515151e+01 1.09612038024829e+00 2.93229622889516e-01 -1.84660438598366e-01 + 2.57575757575758e+01 1.08837083129873e+00 3.04850755726473e-01 -1.90429603885151e-01 + 2.63636363636364e+01 1.08147195893053e+00 3.16861540851264e-01 -1.95726297856203e-01 + 2.69696969696970e+01 1.07514029241291e+00 3.29132134535727e-01 -2.00707647194441e-01 + 2.75757575757576e+01 1.06880862589528e+00 3.41402728220191e-01 -2.05682450895045e-01 + 2.81818181818182e+01 1.06275754212664e+00 3.53849848376402e-01 -2.10489790164498e-01 + 2.87878787878788e+01 1.05736109527898e+00 3.66708828300730e-01 -2.14916711454757e-01 + 2.93939393939394e+01 1.05196464843131e+00 3.79567808225057e-01 -2.19339322210173e-01 + 3.00000000000000e+01 1.04656820158365e+00 3.92426788149384e-01 -2.23757586000285e-01 + 3.30000000000000e+01 1.02312514415356e+00 4.59440503480610e-01 -2.43238943532748e-01 + 3.60000000000000e+01 1.00080435367758e+00 5.29261493580405e-01 -2.61084484698553e-01 + 3.90000000000000e+01 9.77554126454961e-01 6.01733100265088e-01 -2.77608856801414e-01 + 4.20000000000000e+01 9.51021881685284e-01 6.75834775642758e-01 -2.93234977723852e-01 + 4.50000000000000e+01 9.23281318212600e-01 7.50340502131161e-01 -3.08601809213403e-01 + 4.80000000000000e+01 8.88654194131487e-01 8.24737086109295e-01 -3.23208356054975e-01 + 5.10000000000000e+01 8.49964254625460e-01 8.97564998868439e-01 -3.37506814180089e-01 + 5.40000000000000e+01 8.03148423080423e-01 9.67255468343294e-01 -3.51200699120049e-01 + 5.70000000000000e+01 7.56332531480030e-01 1.03694527861001e+00 -3.64889313118346e-01 + 6.00000000000000e+01 7.09516609852189e-01 1.10663475927516e+00 -3.78572770796720e-01 + 6.30000000000000e+01 6.47154294385920e-01 1.16302537697905e+00 -3.90891753454121e-01 + 6.60000000000000e+01 5.84791782254718e-01 1.21941588069058e+00 -4.03208150894803e-01 + 6.90000000000000e+01 5.22429143308335e-01 1.27580638440210e+00 -4.15521834280170e-01 + 7.20000000000000e+01 4.52714954299060e-01 1.31870089203215e+00 -4.26575704118960e-01 + 7.50000000000000e+01 3.79325140754361e-01 1.35484767790248e+00 -4.36999473643461e-01 + 7.80000000000000e+01 3.05934076441010e-01 1.39099487798618e+00 -4.47421477951532e-01 + 8.10000000000000e+01 2.31306131004083e-01 1.41888952469734e+00 -4.56980574222415e-01 + 8.40000000000000e+01 1.54204508701838e-01 1.43027963431632e+00 -4.64815596729305e-01 + 8.70000000000000e+01 7.71021882732242e-02 1.44166983094945e+00 -4.72649698806517e-01 + 9.00000000000000e+01 -3.36853033455059e-07 1.45305992891065e+00 -4.80483033427282e-01 + 9.30000000000000e+01 -5.39717537188113e-02 1.44166981929167e+00 -4.84882001487256e-01 + 9.60000000000000e+01 -1.07943240147024e-01 1.43027966616597e+00 -4.88977291312720e-01 + 9.90000000000000e+01 -1.61914865702625e-01 1.41888942602526e+00 -4.93035304646623e-01 + 1.02000000000000e+02 -2.14154242205798e-01 1.39099470291805e+00 -4.93786567296916e-01 + 1.05000000000000e+02 -2.65527512940555e-01 1.35484791704772e+00 -4.92868936308638e-01 + 1.08000000000000e+02 -3.16900772369631e-01 1.31870071696580e+00 -4.92410220071252e-01 + 1.11000000000000e+02 -3.65700701685022e-01 1.27580589589615e+00 -4.90965426724924e-01 + 1.14000000000000e+02 -4.09354049149220e-01 1.21941603836822e+00 -4.86982932906717e-01 + 1.17000000000000e+02 -4.53007747800845e-01 1.16302575005567e+00 -4.83000008666658e-01 + 1.20000000000000e+02 -4.96661600769268e-01 1.10663522033711e+00 -4.79016865676293e-01 + 1.23000000000000e+02 -5.29432511812518e-01 1.03694573967196e+00 -4.73227232421762e-01 + 1.26000000000000e+02 -5.62203493473854e-01 9.67255929411789e-01 -4.67437401740092e-01 + 1.29000000000000e+02 -5.94974616376641e-01 8.97565459936934e-01 -4.61550294565979e-01 + 1.32000000000000e+02 -6.20450921675679e-01 8.24701058603098e-01 -4.56453890288661e-01 + 1.35000000000000e+02 -6.42279826820249e-01 7.50249695107020e-01 -4.51785141239963e-01 + 1.38000000000000e+02 -6.64108508380734e-01 6.75798748422819e-01 -4.47116255471473e-01 + 1.41000000000000e+02 -6.84054632124555e-01 6.02790963290923e-01 -4.44720379804122e-01 + 1.44000000000000e+02 -7.00235624959091e-01 5.32669512974126e-01 -4.46870542783319e-01 + 1.47000000000000e+02 -7.16416220992227e-01 4.62548307459531e-01 -4.49020707038669e-01 + 1.50000000000000e+02 -7.32596618631745e-01 3.92427224341668e-01 -4.51170871932074e-01 + 1.53000000000000e+02 -7.33272841626932e-01 3.38604126000068e-01 -4.67244946323259e-01 + 1.56000000000000e+02 -7.30920747814166e-01 2.84781062373784e-01 -4.81810042653382e-01 + 1.59000000000000e+02 -7.28131423029985e-01 2.30957992223316e-01 -4.99843304573404e-01 + 1.62000000000000e+02 -6.59004284451097e-01 1.91223709907543e-01 -5.04964107373118e-01 + 1.65000000000000e+02 -5.56057205936165e-01 1.58533940661002e-01 -5.03102799944957e-01 + 1.68000000000000e+02 -4.53110707101343e-01 1.25843946014156e-01 -5.01241125772289e-01 + 1.71000000000000e+02 -3.46031678268841e-01 9.36455360526948e-02 -4.50000513056908e-01 + 1.74000000000000e+02 -2.30687396505613e-01 6.24303184126113e-02 -2.99999717902353e-01 + 1.77000000000000e+02 -1.14817786337317e-01 5.15140111366759e-02 -1.23779476102597e-01 + 1.80000000000000e+02 0.00000000000000e+00 5.07556742159798e-02 6.34072788301272e-02 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_23.dat b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_23.dat new file mode 100644 index 000000000..1d9534a48 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_23.dat @@ -0,0 +1,254 @@ +! ------------ AirfoilInfo v1.01.x Input File ---------------------------------- +! AeroElasticSE FAST driver +! line +! line +! ------------------------------------------------------------------------------ +DEFAULT InterpOrd ! Interpolation order to use for quasi-steady table lookup {1=linear; 3=cubic spline; "default"} [default=3] +1 NonDimArea ! The non-dimensional area of the airfoil (area/chord^2) (set to 1.0 if unsure or unneeded) +@"NREL-2p8-127_AF23_Coords.txt" NumCoords ! The number of coordinates in the airfoil shape file. Set to zero if coordinates not included. +AF23_BL.txt BL_file ! The file name including the boundary layer characteristics of the profile. Ignored if the aeroacoustic module is not called. +1 NumTabs ! Number of airfoil tables in this file. Each table must have lines for Re and Ctrl. +! ------------------------------------------------------------------------------ +! data for table 1 +! ------------------------------------------------------------------------------ +6.000000 Re ! Reynolds number in millions +0 Ctrl ! Control setting (must be 0 for current AirfoilInfo) +True InclUAdata ! Is unsteady aerodynamics data included in this table? If TRUE, then include 30 UA coefficients below this line +!........................................ +-3.734961 alpha0 ! 0-lift angle of attack, depends on airfoil. +9.697795 alpha1 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA>alpha0. (deg) +-10.684389 alpha2 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA1] +0.000000 S2 ! Constant in the f curve best-fit for AOA> alpha1; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S3 ! Constant in the f curve best-fit for alpha2<=AOA< alpha0; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S4 ! Constant in the f curve best-fit for AOA< alpha2; by definition it depends on the airfoil. [ignored if UAMod<>1] +1.401232 Cn1 ! Critical value of C0n at leading edge separation. It should be extracted from airfoil data at a given Mach and Reynolds number. It can be calculated from the static value of Cn at either the break in the pitching moment or the loss of chord force at the onset of stall. It is close to the condition of maximum lift of the airfoil at low Mach numbers. +-0.842106 Cn2 ! As Cn1 for negative AOAs. +Default St_sh ! Strouhal's shedding frequency constant. [default = 0.19] +0.006818 Cd0 ! 2D drag coefficient value at 0-lift. +-0.113242 Cm0 ! 2D pitching moment coefficient about 1/4-chord location, at 0-lift, positive if nose up. [If the aerodynamics coefficients table does not include a column for Cm, this needs to be set to 0.0] +0.000000 k0 ! Constant in the \hat(x)_cp curve best-fit; = (\hat(x)_AC-0.25). [ignored if UAMod<>1] +0.000000 k1 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k2 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k3 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k1_hat ! Constant in the expression of Cc due to leading edge vortex effects. [ignored if UAMod<>1] +Default x_cp_bar ! Constant in the expression of \hat(x)_cp^v. [ignored if UAMod<>1, default = 0.2] +Default UACutout ! Angle of attack above which unsteady aerodynamics are disabled (deg). [Specifying the string "Default" sets UACutout to 45 degrees] +Default filtCutOff ! Cut-off frequency (-3 dB corner frequency) for low-pass filtering the AoA input to UA, as well as the 1st and 2nd derivatives (Hz) [default = 20] +!........................................ +! Table of aerodynamics coefficients +200 NumAlf ! Number of data lines in the following table +! Alpha Cl Cd Cm +! (deg) (-) (-) (-) +-1.80000000000000e+02 0.00000000000000e+00 4.63087218239101e-02 1.12294918356446e-01 +-1.77000000000000e+02 1.31407871834538e-01 4.63087218239101e-02 1.64677969845384e-01 +-1.74000000000000e+02 2.64019510355404e-01 5.55704139343663e-02 2.39999774321882e-01 +-1.71000000000000e+02 3.96029843973720e-01 8.33557943190768e-02 3.60000410445527e-01 +-1.68000000000000e+02 5.06430868461261e-01 1.13562290370517e-01 3.08610785372619e-01 +-1.65000000000000e+02 6.06027490595898e-01 1.44979315997335e-01 1.71528030078362e-01 +-1.62000000000000e+02 7.05625285482958e-01 1.76396375603631e-01 3.44433778978911e-02 +-1.59000000000000e+02 7.67703923736826e-01 2.15960936619897e-01 -5.47934885866511e-02 +-1.56000000000000e+02 7.55397723550236e-01 2.71820224837142e-01 -4.90352678454869e-02 +-1.53000000000000e+02 7.42659054409641e-01 3.27679539787795e-01 -4.31517727134676e-02 +-1.50000000000000e+02 7.28828504793094e-01 3.83538902055256e-01 -3.44596878302946e-02 +-1.47000000000000e+02 7.13090480114408e-01 4.53967729130364e-01 -1.86189086211220e-02 +-1.44000000000000e+02 6.97352307618548e-01 5.24396727029221e-01 -2.77793532551869e-03 +-1.41000000000000e+02 6.81613839477788e-01 5.94826066587771e-01 1.25927965767874e-02 +-1.38000000000000e+02 6.62002920890116e-01 6.68189421819665e-01 2.79774029417006e-02 +-1.35000000000000e+02 6.40455784934676e-01 7.43019778936259e-01 4.34673885521046e-02 +-1.32000000000000e+02 6.18908433527060e-01 8.17850698969113e-01 5.89612242447798e-02 +-1.29000000000000e+02 5.93682830023854e-01 8.91114749342423e-01 7.46038609930899e-02 +-1.26000000000000e+02 5.61100704888174e-01 9.61245052954708e-01 9.05389699091404e-02 +-1.23000000000000e+02 5.28518625044670e-01 1.03137459621631e+00 1.06475722031366e-01 +-1.20000000000000e+02 4.95936567846408e-01 1.10150375931678e+00 1.22414010239834e-01 +-1.17000000000000e+02 4.52406347782145e-01 1.15838084536770e+00 1.37579477845402e-01 +-1.14000000000000e+02 4.08876283070132e-01 1.21525768824574e+00 1.52745471209185e-01 +-1.11000000000000e+02 3.65346571871469e-01 1.27213409662221e+00 1.67911731135092e-01 +-1.08000000000000e+02 3.16635035430310e-01 1.31553636143885e+00 1.81492961378994e-01 +-1.05000000000000e+02 2.65332546911451e-01 1.35220145187604e+00 1.94295080678717e-01 +-1.02000000000000e+02 2.14030046275947e-01 1.38886612216712e+00 2.07096904272415e-01 +-9.90000000000000e+01 1.61845527217881e-01 1.41728443461560e+00 2.18547504691698e-01 +-9.60000000000000e+01 1.07896933109836e-01 1.42920967418575e+00 2.27294974831625e-01 +-9.30000000000000e+01 5.39485757284989e-02 1.44113482265378e+00 2.36042235203500e-01 +-9.00000000000000e+01 3.36708372806976e-07 1.45305992557158e+00 2.44789532965389e-01 +-8.70000000000000e+01 -5.39485205124533e-02 1.44113483485913e+00 2.48978944307922e-01 +-8.40000000000000e+01 -1.07897083962124e-01 1.42920964084012e+00 2.53182684189232e-01 +-8.10000000000000e+01 -1.61845059868626e-01 1.41728453792232e+00 2.57400380355460e-01 +-7.80000000000000e+01 -2.14029797804819e-01 1.38886629974350e+00 2.58354097127670e-01 +-7.50000000000000e+01 -2.65332886325409e-01 1.35220120930450e+00 2.57682039063764e-01 +-7.20000000000000e+01 -3.16634786964608e-01 1.31553653901342e+00 2.57022063927401e-01 +-6.90000000000000e+01 -3.65346194773105e-01 1.27213458934316e+00 2.55116538347366e-01 +-6.60000000000000e+01 -4.08876404788159e-01 1.21525752920760e+00 2.50706504502961e-01 +-6.30000000000000e+01 -4.52406635775942e-01 1.15838046907205e+00 2.46307312278457e-01 +-6.00000000000000e+01 -4.95936783407592e-01 1.10150329534591e+00 2.41918834523807e-01 +-5.70000000000000e+01 -5.28518840605854e-01 1.03137413224544e+00 2.35766279929407e-01 +-5.40000000000000e+01 -5.61100920449807e-01 9.61244588976293e-01 2.29623980263181e-01 +-5.10000000000000e+01 -5.93683045585487e-01 8.91114285364008e-01 2.23491601843586e-01 +-4.80000000000000e+01 -6.20534325092436e-01 8.17875803160575e-01 2.17675688732665e-01 +-4.50000000000000e+01 -6.44520273887822e-01 7.43083281614397e-01 2.12024856819171e-01 +-4.20000000000000e+01 -6.63628799731457e-01 6.68214525810191e-01 2.08040444001537e-01 +-3.90000000000000e+01 -6.81874399513891e-01 5.93758161928647e-01 2.04674544610408e-01 +-3.60000000000000e+01 -6.97766871415788e-01 5.20958260992169e-01 2.03489583532797e-01 +-3.30000000000000e+01 -7.12939161093519e-01 4.50834279245390e-01 2.05538204979316e-01 +-3.00000000000000e+01 -7.28828619013840e-01 3.83538464029985e-01 2.11194373081700e-01 +-2.93939393939394e+01 -7.32484050886326e-01 3.70626883995265e-01 2.13311958401767e-01 +-2.87878787878788e+01 -7.36139482758811e-01 3.57715303960545e-01 2.15429543721834e-01 +-2.81818181818182e+01 -7.39794914631297e-01 3.44803723925826e-01 2.17547129041902e-01 +-2.75757575757576e+01 -7.43897116047021e-01 3.32306320069088e-01 2.20359205164668e-01 +-2.69696969696970e+01 -7.48190806550193e-01 3.19986435516351e-01 2.23468945736725e-01 +-2.63636363636364e+01 -7.52484497053364e-01 3.07666550963613e-01 2.26578686308783e-01 +-2.57575757575758e+01 -7.57166921645990e-01 2.95607827569598e-01 2.30208187650959e-01 +-2.51515151515151e+01 -7.62432356773396e-01 2.83940785046750e-01 2.34617209011481e-01 +-2.45454545454545e+01 -7.67697791900801e-01 2.72273742523902e-01 2.39026230372002e-01 +-2.39393939393939e+01 -7.73185913789781e-01 2.60674093105127e-01 2.42999615685138e-01 +-2.33333333333333e+01 -7.80678259646152e-01 2.49680994670638e-01 2.43052192230589e-01 +-2.27272727272727e+01 -7.88170605502522e-01 2.38687896236150e-01 2.42568426653275e-01 +-2.21212121212121e+01 -7.95662951358893e-01 2.27694797801661e-01 2.42847201975787e-01 +-2.15151515151515e+01 -8.03122917039084e-01 2.16821981366589e-01 2.40650679427694e-01 +-2.09090909090909e+01 -8.09131542492648e-01 2.05979243168443e-01 2.37504038302243e-01 +-2.03030303030303e+01 -8.15361532190997e-01 1.95136504970297e-01 2.34357397176791e-01 +-1.96969696969697e+01 -8.22724297362875e-01 1.84465173018459e-01 2.31838282654647e-01 +-1.90909090909091e+01 -8.30906925089566e-01 1.73965237616411e-01 2.29946659236386e-01 +-1.84848484848485e+01 -8.31918112583414e-01 1.63453683142057e-01 2.21457087959307e-01 +-1.78787878787879e+01 -8.31595126485506e-01 1.52804171278659e-01 2.11525887706305e-01 +-1.72727272727273e+01 -8.31031369674327e-01 1.42866609967544e-01 1.99629022620351e-01 +-1.66666666666667e+01 -8.25256436764452e-01 1.33056030411927e-01 1.82862818294272e-01 +-1.60606060606061e+01 -8.15283902136340e-01 1.23352246439714e-01 1.62108086965354e-01 +-1.54545454545455e+01 -8.07202667770935e-01 1.13892061964644e-01 1.40642855087825e-01 +-1.48484848484848e+01 -8.00484816929381e-01 1.04572113067813e-01 1.18780315352772e-01 +-1.42424242424242e+01 -7.97273008609856e-01 9.54960779870226e-02 9.63104203643558e-02 +-1.36363636363636e+01 -7.95411303466245e-01 8.64650864864851e-02 7.45927649489055e-02 +-1.30303030303030e+01 -7.95017738651442e-01 7.74696737429739e-02 5.29180621304360e-02 +-1.24242424242424e+01 -7.83491668219477e-01 6.82294219737490e-02 3.53906464364337e-02 +-1.18181818181818e+01 -7.69390633326341e-01 5.96867612177415e-02 1.90461834027338e-02 +-1.12121212121212e+01 -7.49852461255598e-01 4.99975509367422e-02 4.95579546151236e-03 +-1.06060606060606e+01 -7.26864172133525e-01 4.11158480572885e-02 -1.01481331303818e-02 +-1.00000000000000e+01 -7.01883025098080e-01 3.29149003627515e-02 -2.57966293458753e-02 +-9.39393939393939e+00 -6.73760079004400e-01 2.58543044614024e-02 -4.12961616654669e-02 +-8.78787878787879e+00 -6.36634699427489e-01 1.93848671125434e-02 -5.74839914192587e-02 +-8.18181818181818e+00 -5.81874634591272e-01 1.36623501221776e-02 -7.45539130446945e-02 +-7.57575757575758e+00 -5.05150686435173e-01 1.05716894357738e-02 -8.64279283248293e-02 +-6.96969696969697e+00 -4.18595232643061e-01 9.10734541656171e-03 -9.50674159963851e-02 +-6.36363636363636e+00 -3.38986978205484e-01 7.90162668231047e-03 -9.99599652998083e-02 +-5.75757575757576e+00 -2.59840510197803e-01 7.41964713494604e-03 -1.04208933106189e-01 +-5.15151515151515e+00 -1.80988998184422e-01 7.14720887337387e-03 -1.07763832355698e-01 +-4.54545454545454e+00 -1.03071489415176e-01 6.95243839815077e-03 -1.10602747534693e-01 +-3.93939393939394e+00 -2.57708400834061e-02 6.84633480589618e-03 -1.12642875373749e-01 +-3.33333333333333e+00 5.06291120206322e-02 6.76146535162503e-03 -1.14417763754454e-01 +-2.72727272727273e+00 1.27032191349935e-01 6.66325312920406e-03 -1.16093113518882e-01 +-2.12121212121212e+00 2.02920139434825e-01 6.61583701230752e-03 -1.17866755340555e-01 +-1.51515151515152e+00 2.78307232368702e-01 6.59553135545088e-03 -1.19945517730907e-01 +-9.09090909090912e-01 3.52936192696077e-01 6.59403346409144e-03 -1.21944793137844e-01 +-3.03030303030302e-01 4.26320562661541e-01 6.64943771563519e-03 -1.23760507757517e-01 + 3.03030303030302e-01 4.99818577478435e-01 6.69818073560818e-03 -1.25508281414915e-01 + 9.09090909090912e-01 5.73376543665411e-01 6.69183344611623e-03 -1.27070496093681e-01 + 1.51515151515152e+00 6.46799556143286e-01 6.75524511750563e-03 -1.28538560457679e-01 + 2.12121212121212e+00 7.20154880913483e-01 6.84155940142869e-03 -1.29906010197320e-01 + 2.72727272727273e+00 7.93147472633957e-01 6.97678572298154e-03 -1.31165648253112e-01 + 3.33333333333333e+00 8.65616018748002e-01 7.10739240893340e-03 -1.32288860283965e-01 + 3.93939393939394e+00 9.37648112828365e-01 7.24422887006074e-03 -1.33365853998558e-01 + 4.54545454545455e+00 1.00910358732349e+00 7.39983874217581e-03 -1.34215184053867e-01 + 5.15151515151515e+00 1.08005492256340e+00 7.58558750578516e-03 -1.34976127499023e-01 + 5.75757575757576e+00 1.14960510771521e+00 7.88653428093343e-03 -1.35458436688932e-01 + 6.36363636363637e+00 1.21615416551218e+00 8.34153340579227e-03 -1.35456842953982e-01 + 6.96969696969697e+00 1.27828480587284e+00 9.10488091440775e-03 -1.34893951393780e-01 + 7.57575757575757e+00 1.32797468584652e+00 1.06845025707761e-02 -1.32377276048360e-01 + 8.18181818181818e+00 1.37107050025369e+00 1.21820686740787e-02 -1.29169553035756e-01 + 8.78787878787879e+00 1.40369513738070e+00 1.40255937471439e-02 -1.25043047898281e-01 + 9.39393939393939e+00 1.41709683794245e+00 1.92334681728973e-02 -1.22574062592608e-01 + 1.00000000000000e+01 1.41645872036543e+00 2.62062454721527e-02 -1.22372841879845e-01 + 1.06060606060606e+01 1.38657460264657e+00 3.26763717983368e-02 -1.21751932897855e-01 + 1.12121212121212e+01 1.36400259487080e+00 3.83098431246971e-02 -1.21315233753301e-01 + 1.18181818181818e+01 1.35688821281416e+00 4.60809911460502e-02 -1.19819418114883e-01 + 1.24242424242424e+01 1.34089573725963e+00 5.79456504379348e-02 -1.18207966359576e-01 + 1.30303030303030e+01 1.32223161769021e+00 7.00497051047743e-02 -1.17191325445144e-01 + 1.36363636363636e+01 1.29585304328532e+00 8.36737099489719e-02 -1.19176336444020e-01 + 1.42424242424242e+01 1.27550502164861e+00 9.56164211836313e-02 -1.21085843980632e-01 + 1.48484848484848e+01 1.26031280258829e+00 1.05038483493522e-01 -1.22965364533929e-01 + 1.54545454545455e+01 1.24817918569169e+00 1.13694141927813e-01 -1.24250481062770e-01 + 1.60606060606061e+01 1.23659506592632e+00 1.22025178103146e-01 -1.25145411447740e-01 + 1.66666666666667e+01 1.22112439263804e+00 1.29733166820717e-01 -1.25238540045732e-01 + 1.72727272727273e+01 1.20372487247866e+00 1.38204896553668e-01 -1.25906002656970e-01 + 1.78787878787879e+01 1.18372803528903e+00 1.47610097212096e-01 -1.27281617838633e-01 + 1.84848484848485e+01 1.17400652248468e+00 1.57673262028419e-01 -1.29411130817857e-01 + 1.90909090909091e+01 1.16668752601417e+00 1.67940267889330e-01 -1.32031130540839e-01 + 1.96969696969697e+01 1.15802631000889e+00 1.78430476422176e-01 -1.36362103439965e-01 + 2.03030303030303e+01 1.14825771518914e+00 1.89897612594817e-01 -1.41556026190695e-01 + 2.09090909090909e+01 1.14104652446381e+00 2.02341731675555e-01 -1.47700684953726e-01 + 2.15151515151515e+01 1.13734479071489e+00 2.14785850756294e-01 -1.53871949597139e-01 + 2.21212121212121e+01 1.13089213779505e+00 2.26985477991913e-01 -1.60089208840245e-01 + 2.27272727272727e+01 1.12204977020079e+00 2.38207389411154e-01 -1.66490399157068e-01 + 2.33333333333333e+01 1.11320740260652e+00 2.49429300830395e-01 -1.72914291335786e-01 + 2.39393939393939e+01 1.10436503501225e+00 2.60651212249636e-01 -1.79425078294699e-01 + 2.45454545454545e+01 1.09671055899213e+00 2.72273742523902e-01 -1.85035919192311e-01 + 2.51515151515151e+01 1.08918806808547e+00 2.83940785046750e-01 -1.90542124148107e-01 + 2.57575757575758e+01 1.08166557717880e+00 2.95607827569598e-01 -1.96042910921405e-01 + 2.63636363636364e+01 1.07497654178085e+00 3.07666550963613e-01 -2.01108325476125e-01 + 2.69696969696970e+01 1.06884322973428e+00 3.19986435516351e-01 -2.05883282560142e-01 + 2.75757575757576e+01 1.06270991768772e+00 3.32306320069088e-01 -2.10654825089128e-01 + 2.81818181818182e+01 1.05685002491795e+00 3.44803723925826e-01 -2.15273237837376e-01 + 2.87878787878788e+01 1.05162805573452e+00 3.57715303960546e-01 -2.19539750840593e-01 + 2.93939393939394e+01 1.04640608655109e+00 3.70626883995265e-01 -2.23804015238057e-01 + 3.00000000000000e+01 1.04118411736767e+00 3.83538464029985e-01 -2.28066012025690e-01 + 3.30000000000000e+01 1.01848589840269e+00 4.50834279245390e-01 -2.46961206869889e-01 + 3.60000000000000e+01 9.96808909621796e-01 5.20958260992169e-01 -2.64359434793424e-01 + 3.90000000000000e+01 9.74106328942832e-01 5.93758161928647e-01 -2.80547282143363e-01 + 4.20000000000000e+01 9.48041157048807e-01 6.68214525810192e-01 -2.95913378121082e-01 + 4.50000000000000e+01 9.20743807181201e-01 7.43083281614397e-01 -3.11045980331182e-01 + 4.80000000000000e+01 8.86477884798320e-01 8.17875803160575e-01 -3.25477187585035e-01 + 5.10000000000000e+01 8.48118712495052e-01 8.91114285364008e-01 -3.39620328980538e-01 + 5.40000000000000e+01 8.01572777205266e-01 9.61244588976293e-01 -3.53193383869185e-01 + 5.70000000000000e+01 7.55026776527843e-01 1.03137413224544e+00 -3.66763595394112e-01 + 6.00000000000000e+01 7.08480743156850e-01 1.10150329534591e+00 -3.80331070227688e-01 + 6.30000000000000e+01 6.46295216458993e-01 1.15838046907205e+00 -3.92574049260776e-01 + 6.60000000000000e+01 5.84109443410254e-01 1.21525752920760e+00 -4.04815652134246e-01 + 6.90000000000000e+01 5.21923445770576e-01 1.27213458934316e+00 -4.17055794570706e-01 + 7.20000000000000e+01 4.52335480264868e-01 1.31553653901342e+00 -4.28053298659701e-01 + 7.50000000000000e+01 3.79046682354287e-01 1.35220120930450e+00 -4.38429394598601e-01 + 7.80000000000000e+01 3.05756781496138e-01 1.38886629974350e+00 -4.48804321680909e-01 + 8.10000000000000e+01 2.31207286740326e-01 1.41728453792232e+00 -4.58322686478495e-01 + 8.40000000000000e+01 1.54138691138483e-01 1.42920964084012e+00 -4.66128863644011e-01 + 8.70000000000000e+01 7.70693031576111e-02 1.44113483485913e+00 -4.73934397736458e-01 + 9.00000000000000e+01 -3.36708373039042e-07 1.45305992557158e+00 -4.81739438540332e-01 + 9.30000000000000e+01 -5.39485757284989e-02 1.44113482265378e+00 -4.85914001849487e-01 + 9.60000000000000e+01 -1.07896933109837e-01 1.42920967418575e+00 -4.89748119107250e-01 + 9.90000000000000e+01 -1.61845527217882e-01 1.41728443461560e+00 -4.93557987335880e-01 + 1.02000000000000e+02 -2.14030046275947e-01 1.38886612216712e+00 -4.94077965350438e-01 + 1.05000000000000e+02 -2.65332546911451e-01 1.35220145187604e+00 -4.92944920029321e-01 + 1.08000000000000e+02 -3.16635035430310e-01 1.31553636143885e+00 -4.92245915161826e-01 + 1.11000000000000e+02 -3.65346571871470e-01 1.27213409662221e+00 -4.90545503515274e-01 + 1.14000000000000e+02 -4.08876283070132e-01 1.21525768824574e+00 -4.86317993590270e-01 + 1.17000000000000e+02 -4.52406347782145e-01 1.15838084536770e+00 -4.82090051371639e-01 + 1.20000000000000e+02 -4.95936567846409e-01 1.10150375931678e+00 -4.77861889492743e-01 + 1.23000000000000e+02 -5.28518625044671e-01 1.03137459621631e+00 -4.71840511315534e-01 + 1.26000000000000e+02 -5.61100704888174e-01 9.61245052954708e-01 -4.65818976558725e-01 + 1.29000000000000e+02 -5.93682830023854e-01 8.91114749342422e-01 -4.59682348306178e-01 + 1.32000000000000e+02 -6.18908433527060e-01 8.17850698969113e-01 -4.54312399338742e-01 + 1.35000000000000e+02 -6.40455784934676e-01 7.43019778936259e-01 -4.49364062058548e-01 + 1.38000000000000e+02 -6.62002920890116e-01 6.68189421819664e-01 -4.44415444601716e-01 + 1.41000000000000e+02 -6.81613839477788e-01 5.94826066587770e-01 -4.41694691787043e-01 + 1.44000000000000e+02 -6.97352307618548e-01 5.24396727029221e-01 -4.43429686334623e-01 + 1.47000000000000e+02 -7.13090480114408e-01 4.53967729130364e-01 -4.45164688600493e-01 + 1.50000000000000e+02 -7.28828504793094e-01 3.83538902055256e-01 -4.46899694725369e-01 + 1.53000000000000e+02 -7.38250770119389e-01 3.28279710588330e-01 -4.64997809025810e-01 + 1.56000000000000e+02 -7.46093272753856e-01 2.73020555057756e-01 -4.81308204600343e-01 + 1.59000000000000e+02 -7.53707623020192e-01 2.17761400703393e-01 -5.00902986460923e-01 + 1.62000000000000e+02 -6.88143441383303e-01 1.78536848703957e-01 -5.06252966573203e-01 + 1.65000000000000e+02 -5.85650053883360e-01 1.47329733490110e-01 -5.03908411641623e-01 + 1.68000000000000e+02 -4.83157240864670e-01 1.16122375886185e-01 -5.01563371955391e-01 + 1.71000000000000e+02 -3.73345827031091e-01 8.57857267499245e-02 -4.50000513056908e-01 + 1.74000000000000e+02 -2.48896869884329e-01 5.71905351997449e-02 -2.99999717902353e-01 + 1.77000000000000e+02 -1.23881031171309e-01 4.71151394500337e-02 -1.04090643424068e-01 + 1.80000000000000e+02 0.00000000000000e+00 4.63087218239101e-02 1.12294918356446e-01 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_24.dat b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_24.dat new file mode 100644 index 000000000..593060584 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_24.dat @@ -0,0 +1,254 @@ +! ------------ AirfoilInfo v1.01.x Input File ---------------------------------- +! AeroElasticSE FAST driver +! line +! line +! ------------------------------------------------------------------------------ +DEFAULT InterpOrd ! Interpolation order to use for quasi-steady table lookup {1=linear; 3=cubic spline; "default"} [default=3] +1 NonDimArea ! The non-dimensional area of the airfoil (area/chord^2) (set to 1.0 if unsure or unneeded) +@"NREL-2p8-127_AF24_Coords.txt" NumCoords ! The number of coordinates in the airfoil shape file. Set to zero if coordinates not included. +AF24_BL.txt BL_file ! The file name including the boundary layer characteristics of the profile. Ignored if the aeroacoustic module is not called. +1 NumTabs ! Number of airfoil tables in this file. Each table must have lines for Re and Ctrl. +! ------------------------------------------------------------------------------ +! data for table 1 +! ------------------------------------------------------------------------------ +6.000000 Re ! Reynolds number in millions +0 Ctrl ! Control setting (must be 0 for current AirfoilInfo) +True InclUAdata ! Is unsteady aerodynamics data included in this table? If TRUE, then include 30 UA coefficients below this line +!........................................ +-3.881348 alpha0 ! 0-lift angle of attack, depends on airfoil. +10.220205 alpha1 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA>alpha0. (deg) +-10.228661 alpha2 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA1] +0.000000 S2 ! Constant in the f curve best-fit for AOA> alpha1; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S3 ! Constant in the f curve best-fit for alpha2<=AOA< alpha0; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S4 ! Constant in the f curve best-fit for AOA< alpha2; by definition it depends on the airfoil. [ignored if UAMod<>1] +1.447089 Cn1 ! Critical value of C0n at leading edge separation. It should be extracted from airfoil data at a given Mach and Reynolds number. It can be calculated from the static value of Cn at either the break in the pitching moment or the loss of chord force at the onset of stall. It is close to the condition of maximum lift of the airfoil at low Mach numbers. +-0.835242 Cn2 ! As Cn1 for negative AOAs. +Default St_sh ! Strouhal's shedding frequency constant. [default = 0.19] +0.006598 Cd0 ! 2D drag coefficient value at 0-lift. +-0.113186 Cm0 ! 2D pitching moment coefficient about 1/4-chord location, at 0-lift, positive if nose up. [If the aerodynamics coefficients table does not include a column for Cm, this needs to be set to 0.0] +0.000000 k0 ! Constant in the \hat(x)_cp curve best-fit; = (\hat(x)_AC-0.25). [ignored if UAMod<>1] +0.000000 k1 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k2 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k3 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k1_hat ! Constant in the expression of Cc due to leading edge vortex effects. [ignored if UAMod<>1] +Default x_cp_bar ! Constant in the expression of \hat(x)_cp^v. [ignored if UAMod<>1, default = 0.2] +Default UACutout ! Angle of attack above which unsteady aerodynamics are disabled (deg). [Specifying the string "Default" sets UACutout to 45 degrees] +Default filtCutOff ! Cut-off frequency (-3 dB corner frequency) for low-pass filtering the AoA input to UA, as well as the 1st and 2nd derivatives (Hz) [default = 20] +!........................................ +! Table of aerodynamics coefficients +200 NumAlf ! Number of data lines in the following table +! Alpha Cl Cd Cm +! (deg) (-) (-) (-) +-1.80000000000000e+02 0.00000000000000e+00 4.20239297897650e-02 1.57138208863316e-01 +-1.77000000000000e+02 1.40632365655801e-01 4.20239297897650e-02 1.82737995898986e-01 +-1.74000000000000e+02 2.82553053900608e-01 5.04286683283111e-02 2.39999774321882e-01 +-1.71000000000000e+02 4.23830336360153e-01 7.56431598642469e-02 3.60000410445527e-01 +-1.68000000000000e+02 5.34869114486967e-01 1.04245693608263e-01 3.04280258541825e-01 +-1.65000000000000e+02 6.30788993375323e-01 1.34542208912873e-01 1.60701763545007e-01 +-1.62000000000000e+02 7.26709994336859e-01 1.64838896980479e-01 1.71214488498863e-02 +-1.59000000000000e+02 7.84071397760670e-01 2.04002209021424e-01 -7.41764661492530e-02 +-1.56000000000000e+02 7.64500626823811e-01 2.60898469061760e-01 -6.11103531608993e-02 +-1.53000000000000e+02 7.44806596412559e-01 3.17794763757350e-01 -4.80087218730144e-02 +-1.50000000000000e+02 7.24801607355001e-01 3.74691108028256e-01 -3.36803071761103e-02 +-1.47000000000000e+02 7.09536340567078e-01 4.45426278146463e-01 -1.81789006503532e-02 +-1.44000000000000e+02 6.94270972610212e-01 5.16161667949901e-01 -2.67735864084869e-03 +-1.41000000000000e+02 6.79005402308234e-01 5.86897497139490e-01 1.25267866649444e-02 +-1.38000000000000e+02 6.59752709771772e-01 6.60614800800240e-01 2.78426345762092e-02 +-1.35000000000000e+02 6.38506464206380e-01 7.35822835648326e-01 4.32768039375504e-02 +-1.32000000000000e+02 6.17259998089925e-01 8.11031580816670e-01 5.87121989579576e-02 +-1.29000000000000e+02 5.92302309505059e-01 8.84693447887175e-01 7.43012013825991e-02 +-1.26000000000000e+02 5.59922158385802e-01 9.55261551412121e-01 9.01959583834699e-02 +-1.23000000000000e+02 5.27541955630656e-01 1.02582880155467e+00 1.06091386661389e-01 +-1.20000000000000e+02 4.95161727058530e-01 1.09639562502197e+00 1.21987354023941e-01 +-1.17000000000000e+02 4.51763647235390e-01 1.15375704715292e+00 1.37121497118599e-01 +-1.14000000000000e+02 4.08365719274480e-01 1.21111822435222e+00 1.52255604498479e-01 +-1.11000000000000e+02 3.64968138119650e-01 1.26847896334996e+00 1.67389419062474e-01 +-1.08000000000000e+02 3.16351063621799e-01 1.31238637614246e+00 1.80934520183943e-01 +-1.05000000000000e+02 2.65124202709162e-01 1.34956702339128e+00 1.93694959616565e-01 +-1.02000000000000e+02 2.13897328813262e-01 1.38674724458622e+00 2.06454767299050e-01 +-9.90000000000000e+01 1.61771435376163e-01 1.41568677594618e+00 2.17866871578471e-01 +-9.60000000000000e+01 1.07847463915400e-01 1.42814457068853e+00 2.26583332591711e-01 +-9.30000000000000e+01 5.39238186798111e-02 1.44060227026035e+00 2.35299390910874e-01 +-9.00000000000000e+01 3.36553857038623e-07 1.45305992224777e+00 2.44015288398801e-01 +-8.70000000000000e+01 -5.39237634891041e-02 1.44060228301076e+00 2.47951662237116e-01 +-8.40000000000000e+01 -1.07847614698837e-01 1.42814453585376e+00 2.51892083934148e-01 +-8.10000000000000e+01 -1.61770968240210e-01 1.41568688386634e+00 2.55836458741642e-01 +-7.80000000000000e+01 -2.13897080708414e-01 1.38674742465954e+00 2.56509498151152e-01 +-7.50000000000000e+01 -2.65124541622777e-01 1.34956677740889e+00 2.55548599134485e-01 +-7.20000000000000e+01 -3.16350815522372e-01 1.31238655621395e+00 2.54590706463430e-01 +-6.90000000000000e+01 -3.64967762165930e-01 1.26847946026667e+00 2.52383955015723e-01 +-6.60000000000000e+01 -4.08365840623045e-01 1.21111806395980e+00 2.47675595024712e-01 +-6.30000000000000e+01 -4.51763934354955e-01 1.15375666765293e+00 2.42970286422080e-01 +-6.00000000000000e+01 -4.95161941284426e-01 1.09639515815556e+00 2.38268000115941e-01 +-5.70000000000000e+01 -5.27542169856552e-01 1.02582833468826e+00 2.31806506435537e-01 +-5.40000000000000e+01 -5.59922372611185e-01 9.55261084537245e-01 2.25347767167551e-01 +-5.10000000000000e+01 -5.92302523730443e-01 8.84692981012299e-01 2.18891521602934e-01 +-4.80000000000000e+01 -6.18906352581358e-01 8.11045812993734e-01 2.12734135842278e-01 +-4.50000000000000e+01 -6.42622113131780e-01 7.35859162213287e-01 2.06728126759377e-01 +-4.20000000000000e+01 -6.61399051379004e-01 6.60629032861292e-01 2.02335706314512e-01 +-3.90000000000000e+01 -6.79295197663792e-01 5.85819587866301e-01 1.98564860746646e-01 +-3.60000000000000e+01 -6.94777748193317e-01 5.12692903825368e-01 1.97017430019138e-01 +-3.30000000000000e+01 -7.09467742340985e-01 4.42267305815927e-01 1.98629231822253e-01 +-3.00000000000000e+01 -7.24801717703120e-01 3.74690668178350e-01 2.03759075670758e-01 +-2.93939393939394e+01 -7.28326530814462e-01 3.61726727869206e-01 2.05744738406902e-01 +-2.87878787878788e+01 -7.31851343925804e-01 3.48762787560061e-01 2.07730401143047e-01 +-2.81818181818182e+01 -7.35376157037146e-01 3.35798847250917e-01 2.09716063879191e-01 +-2.75757575757576e+01 -7.39335418161425e-01 3.23251387701133e-01 2.12376937449998e-01 +-2.69696969696970e+01 -7.43480887264291e-01 3.10882435217812e-01 2.15327211917801e-01 +-2.63636363636364e+01 -7.47626356367156e-01 2.98513482734492e-01 2.18277486385603e-01 +-2.57575757575758e+01 -7.52151842029857e-01 2.86407040228379e-01 2.21732543995886e-01 +-2.51515151515151e+01 -7.57247263964635e-01 2.74694301506801e-01 2.25944658673781e-01 +-2.45454545454545e+01 -7.62342685899414e-01 2.62981562785224e-01 2.30156773351676e-01 +-2.39393939393939e+01 -7.67618823549025e-01 2.51338309217338e-01 2.34224184613365e-01 +-2.33333333333333e+01 -7.74521437619550e-01 2.40320435485340e-01 2.36989237113918e-01 +-2.27272727272727e+01 -7.81424051690076e-01 2.29302561753342e-01 2.39601565570627e-01 +-2.21212121212121e+01 -7.88326665760601e-01 2.18284688021344e-01 2.42470674291164e-01 +-2.15151515151515e+01 -7.95622047703425e-01 2.07577437194191e-01 2.45095428001552e-01 +-2.09090909090909e+01 -8.02604681726082e-01 1.96947862073894e-01 2.47624260079401e-01 +-2.03030303030303e+01 -8.09650349475145e-01 1.86318286953598e-01 2.50153092157250e-01 +-1.96969696969697e+01 -8.17637506447164e-01 1.75928434913981e-01 2.53560038839616e-01 +-1.90909090909091e+01 -8.26477015311138e-01 1.65778292393816e-01 2.57845050451215e-01 +-1.84848484848485e+01 -8.26084809962742e-01 1.55849503459699e-01 2.52897003259897e-01 +-1.78787878787879e+01 -8.23983493243247e-01 1.46076930679257e-01 2.45664651306383e-01 +-1.72727272727273e+01 -8.21570138202451e-01 1.37130650088349e-01 2.35566574130545e-01 +-1.66666666666667e+01 -8.12443964880370e-01 1.28220565266013e-01 2.18667326209765e-01 +-1.60606060606061e+01 -7.97844348659724e-01 1.19340921345769e-01 1.96202242311259e-01 +-1.54545454545455e+01 -7.84422413764076e-01 1.10579594948523e-01 1.73424826407758e-01 +-1.48484848484848e+01 -7.71787584327422e-01 1.01887960544163e-01 1.50473470711618e-01 +-1.42424242424242e+01 -7.61134965931686e-01 9.33387624500803e-02 1.27203383377638e-01 +-1.36363636363636e+01 -7.51019037969479e-01 8.48128124492238e-02 1.04178189645314e-01 +-1.30303030303030e+01 -7.41421130409000e-01 7.63034135314191e-02 8.11835234005733e-02 +-1.24242424242424e+01 -7.26117069582958e-01 6.77522789215004e-02 6.03315753701249e-02 +-1.18181818181818e+01 -7.09450417189115e-01 5.96236347309660e-02 4.00791186975229e-02 +-1.12121212121212e+01 -6.90082557893989e-01 5.06890203132416e-02 2.09663498148639e-02 +-1.06060606060606e+01 -6.69006785525034e-01 4.21875347068638e-02 1.31821761243166e-03 +-1.00000000000000e+01 -6.46973736816406e-01 3.40753735771777e-02 -1.86162729145852e-02 +-9.39393939393939e+00 -6.23566521153584e-01 2.66139202130595e-02 -3.84582682239768e-02 +-8.78787878787879e+00 -5.93143909692991e-01 1.97080621922025e-02 -5.81227331911647e-02 +-8.18181818181818e+00 -5.49437129950642e-01 1.36122296354314e-02 -7.73434792653389e-02 +-7.57575757575758e+00 -4.76129595933123e-01 1.04462591632936e-02 -9.01887084685705e-02 +-6.96969696969697e+00 -3.89923494054396e-01 8.96219583042148e-03 -9.89373513292037e-02 +-6.36363636363636e+00 -3.12270511910677e-01 7.65469409261513e-03 -1.02756750711562e-01 +-5.75757575757576e+00 -2.35244495718475e-01 7.20033215041447e-03 -1.06054556847806e-01 +-5.15151515151515e+00 -1.58611001142337e-01 6.92443690785538e-03 -1.08867710719892e-01 +-4.54545454545454e+00 -8.26264788487249e-02 6.71182503055839e-03 -1.11241902473054e-01 +-3.93939393939394e+00 -7.17505732470964e-03 6.60399736858371e-03 -1.13032741919541e-01 +-3.33333333333333e+00 6.77399244143484e-02 6.54568110870987e-03 -1.14632383709498e-01 +-2.72727272727273e+00 1.42670380661859e-01 6.46364824529083e-03 -1.16181617095474e-01 +-2.12121212121212e+00 2.17139817585866e-01 6.43953237954945e-03 -1.17766630428816e-01 +-1.51515151515152e+00 2.91428740135327e-01 6.42972618595009e-03 -1.19525590995757e-01 +-9.09090909090912e-01 3.65128859297927e-01 6.42967209033216e-03 -1.21282061863669e-01 +-3.03030303030302e-01 4.38105121735726e-01 6.47736400956553e-03 -1.22890854235333e-01 + 3.03030303030302e-01 5.11112071056141e-01 6.53139868052610e-03 -1.24460808318302e-01 + 9.09090909090912e-01 5.84048322897008e-01 6.52730920651946e-03 -1.25889751980391e-01 + 1.51515151515152e+00 6.56771187401434e-01 6.60828592671719e-03 -1.27205103311759e-01 + 2.12121212121212e+00 7.29431355319300e-01 6.66584266708599e-03 -1.28498098736987e-01 + 2.72727272727273e+00 8.01715099938977e-01 6.79410605892685e-03 -1.29703511469116e-01 + 3.33333333333333e+00 8.73667737101458e-01 6.92003913189438e-03 -1.30770162129486e-01 + 3.93939393939394e+00 9.45203779381055e-01 7.04950954145510e-03 -1.31831672743512e-01 + 4.54545454545455e+00 1.01616262246952e+00 7.18868096099871e-03 -1.32686207865223e-01 + 5.15151515151515e+00 1.08666504585964e+00 7.35805565558534e-03 -1.33484479795433e-01 + 5.75757575757576e+00 1.15589713891403e+00 7.65596176371924e-03 -1.34065604697579e-01 + 6.36363636363637e+00 1.22235143346160e+00 8.13782849850763e-03 -1.34188428144082e-01 + 6.96969696969697e+00 1.28381732514628e+00 9.00700508163636e-03 -1.33672116338428e-01 + 7.57575757575757e+00 1.33414824858160e+00 1.07028357691023e-02 -1.31358398670661e-01 + 8.18181818181818e+00 1.37921530349790e+00 1.23338548134546e-02 -1.28462440465876e-01 + 8.78787878787879e+00 1.41929596248767e+00 1.40314224567824e-02 -1.25079434784614e-01 + 9.39393939393939e+00 1.44895179840671e+00 1.73667127363230e-02 -1.22426571069460e-01 + 1.00000000000000e+01 1.46562058968523e+00 2.15076283531428e-02 -1.22080342259589e-01 + 1.06060606060606e+01 1.46482275209920e+00 2.56482444467929e-02 -1.21729653497994e-01 + 1.12121212121212e+01 1.46455008673655e+00 2.96173727205461e-02 -1.21654814919871e-01 + 1.18181818181818e+01 1.46787480330173e+00 3.84335406340759e-02 -1.21545340375698e-01 + 1.24242424242424e+01 1.44626795909455e+00 5.24745071699755e-02 -1.21745587084181e-01 + 1.30303030303030e+01 1.41548464258938e+00 6.65727041455837e-02 -1.22132303153946e-01 + 1.36363636363636e+01 1.37245053342376e+00 8.16057042391146e-02 -1.24136435674557e-01 + 1.42424242424242e+01 1.33537840735922e+00 9.41511245499718e-02 -1.25907093812210e-01 + 1.48484848484848e+01 1.30613659580939e+00 1.02967015650268e-01 -1.27351580700688e-01 + 1.54545454545455e+01 1.28553302955425e+00 1.11389370579920e-01 -1.28462528314075e-01 + 1.60606060606061e+01 1.26758424346921e+00 1.19644615010785e-01 -1.29390414755028e-01 + 1.66666666666667e+01 1.24771591748635e+00 1.27576133928679e-01 -1.29935088016977e-01 + 1.72727272727273e+01 1.22417688851766e+00 1.35896595584476e-01 -1.30758578064231e-01 + 1.78787878787879e+01 1.19608311119412e+00 1.44692436629616e-01 -1.31924607905431e-01 + 1.84848484848485e+01 1.18255480628068e+00 1.53780455374608e-01 -1.33460435656660e-01 + 1.90909090909091e+01 1.17242740863741e+00 1.63075826898732e-01 -1.35618139566060e-01 + 1.96969696969697e+01 1.16082579219221e+00 1.73132593582544e-01 -1.40776664039364e-01 + 2.03030303030303e+01 1.14904324940101e+00 1.83847599384671e-01 -1.46705689236554e-01 + 2.09090909090909e+01 1.13954137740033e+00 1.95220881544062e-01 -1.53430242057478e-01 + 2.15151515151515e+01 1.13215807394264e+00 2.06594163703453e-01 -1.60162370933814e-01 + 2.21212121212121e+01 1.12321585235273e+00 2.17919889776365e-01 -1.66781417553110e-01 + 2.27272727272727e+01 1.11431119585911e+00 2.29055440435074e-01 -1.72948251497559e-01 + 2.33333333333333e+01 1.10540653936549e+00 2.40190991093782e-01 -1.79121549823611e-01 + 2.39393939393939e+01 1.09650188287188e+00 2.51326541752491e-01 -1.85319591539483e-01 + 2.45454545454545e+01 1.08905958113101e+00 2.62981562785224e-01 -1.90662311121533e-01 + 2.51515151515151e+01 1.08177975975634e+00 2.74694301506801e-01 -1.95908674546375e-01 + 2.57575757575758e+01 1.07449993838168e+00 2.86407040228379e-01 -2.01153495137443e-01 + 2.63636363636364e+01 1.06803512793561e+00 2.98513482734492e-01 -2.05997699680956e-01 + 2.69696969696970e+01 1.06211374254334e+00 3.10882435217812e-01 -2.10574738593792e-01 + 2.75757575757576e+01 1.05619235715106e+00 3.23251387701133e-01 -2.15150805208106e-01 + 2.81818181818182e+01 1.05053677218194e+00 3.35798847250917e-01 -2.19587044062714e-01 + 2.87878787878788e+01 1.04550133499893e+00 3.48762787560062e-01 -2.23698575936724e-01 + 2.93939393939394e+01 1.04046589781592e+00 3.61726727869206e-01 -2.27809467517628e-01 + 3.00000000000000e+01 1.03543046063291e+00 3.74690668178350e-01 -2.31919713393992e-01 + 3.30000000000000e+01 1.01352784881378e+00 4.42267305815928e-01 -2.50242753909780e-01 + 3.60000000000000e+01 9.92539022396652e-01 5.12692903825368e-01 -2.67200657190209e-01 + 3.90000000000000e+01 9.70421727927888e-01 5.85819587866301e-01 -2.83055031736328e-01 + 4.20000000000000e+01 9.44855717457034e-01 6.60629032861292e-01 -2.98162017656836e-01 + 4.50000000000000e+01 9.18032014729747e-01 7.35859162213287e-01 -3.13059792814360e-01 + 4.80000000000000e+01 8.84152091109475e-01 8.11045812993735e-01 -3.27314348631916e-01 + 5.10000000000000e+01 8.46146395641528e-01 8.84692981012299e-01 -3.41300099207024e-01 + 5.40000000000000e+01 7.99888891241725e-01 9.55261084537245e-01 -3.54749948670230e-01 + 5.70000000000000e+01 7.53631324948729e-01 1.02582833468826e+00 -3.68198870181370e-01 + 6.00000000000000e+01 7.07373727709371e-01 1.09639515815556e+00 -3.81646953266444e-01 + 6.30000000000000e+01 6.45377123529131e-01 1.15375666765293e+00 -3.93810500184529e-01 + 6.60000000000000e+01 5.83380227301456e-01 1.21111806395980e+00 -4.05973624922660e-01 + 6.90000000000000e+01 5.21383016795821e-01 1.26847946026667e+00 -4.18136288721357e-01 + 7.20000000000000e+01 4.51929954630524e-01 1.31238655621395e+00 -4.29073410119878e-01 + 7.50000000000000e+01 3.78749119266611e-01 1.34956677740889e+00 -4.39397752827040e-01 + 7.80000000000000e+01 3.05567316722722e-01 1.38674742465954e+00 -4.49721404047000e-01 + 8.10000000000000e+01 2.31101650731069e-01 1.41568688386634e+00 -4.59194843301813e-01 + 8.40000000000000e+01 1.54068346468134e-01 1.42814453585376e+00 -4.66968167272936e-01 + 8.70000000000000e+01 7.70341547111549e-02 1.44060228301076e+00 -4.74741064431118e-01 + 9.00000000000000e+01 -3.36553857271529e-07 1.45305992224777e+00 -4.82513681756923e-01 + 9.30000000000000e+01 -5.39238186798111e-02 1.44060227026035e+00 -4.86445774433152e-01 + 9.60000000000000e+01 -1.07847463915400e-01 1.42814457068853e+00 -4.90136599398835e-01 + 9.90000000000000e+01 -1.61771435376163e-01 1.41568677594618e+00 -4.93816587592719e-01 + 1.02000000000000e+02 -2.13897328813262e-01 1.38674724458622e+00 -4.94219233630832e-01 + 1.05000000000000e+02 -2.65124202709163e-01 1.34956702339128e+00 -4.92980933650800e-01 + 1.08000000000000e+02 -3.16351063621799e-01 1.31238637614246e+00 -4.92020295748683e-01 + 1.11000000000000e+02 -3.64968138119650e-01 1.26847896334996e+00 -4.89968875412941e-01 + 1.14000000000000e+02 -4.08365719274481e-01 1.21111822435222e+00 -4.85404915466942e-01 + 1.17000000000000e+02 -4.51763647235390e-01 1.15375704715292e+00 -4.80840520657040e-01 + 1.20000000000000e+02 -4.95161727058530e-01 1.09639562502197e+00 -4.76275904937341e-01 + 1.23000000000000e+02 -5.27541955630656e-01 1.02582880155467e+00 -4.69936300398934e-01 + 1.26000000000000e+02 -5.59922158385802e-01 9.55261551412121e-01 -4.63596595371752e-01 + 1.29000000000000e+02 -5.92302309505059e-01 8.84693447887175e-01 -4.57173092895786e-01 + 1.32000000000000e+02 -6.17259998089925e-01 8.11031580816670e-01 -4.51522499663600e-01 + 1.35000000000000e+02 -6.38506464206380e-01 7.35822835648326e-01 -4.46286234978398e-01 + 1.38000000000000e+02 -6.59752709771772e-01 6.60614800800239e-01 -4.41049558888129e-01 + 1.41000000000000e+02 -6.79005402308234e-01 5.86897497139489e-01 -4.37992891545696e-01 + 1.44000000000000e+02 -6.94270972610212e-01 5.16161667949901e-01 -4.39296259388551e-01 + 1.47000000000000e+02 -7.09536340567078e-01 4.45426278146463e-01 -4.40599632549160e-01 + 1.50000000000000e+02 -7.24801607355002e-01 3.74691108028256e-01 -4.41903008368551e-01 + 1.53000000000000e+02 -7.42599775012969e-01 3.18083719972620e-01 -4.61912096005589e-01 + 1.56000000000000e+02 -7.59948055761679e-01 2.61476373424413e-01 -4.80619093073397e-01 + 1.59000000000000e+02 -7.77231254388352e-01 2.04869044049550e-01 -5.01430259356238e-01 + 1.62000000000000e+02 -7.14992328958953e-01 1.66181531595306e-01 -5.06906825399297e-01 + 1.65000000000000e+02 -6.12895046906355e-01 1.36454079153225e-01 -5.04317113525236e-01 + 1.68000000000000e+02 -5.10798334796026e-01 1.06726367365571e-01 -5.01726853472064e-01 + 1.71000000000000e+02 -3.98460526443325e-01 7.82171286957471e-02 -4.50000513056908e-01 + 1.74000000000000e+02 -2.65640047479978e-01 5.21448931484207e-02 -2.99999717902353e-01 + 1.77000000000000e+02 -1.32214471307849e-01 4.28782038261505e-02 -8.60306173704663e-02 + 1.80000000000000e+02 0.00000000000000e+00 4.20239297897650e-02 1.57138208863316e-01 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_25.dat b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_25.dat new file mode 100644 index 000000000..5afdaa9e6 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_25.dat @@ -0,0 +1,254 @@ +! ------------ AirfoilInfo v1.01.x Input File ---------------------------------- +! AeroElasticSE FAST driver +! line +! line +! ------------------------------------------------------------------------------ +DEFAULT InterpOrd ! Interpolation order to use for quasi-steady table lookup {1=linear; 3=cubic spline; "default"} [default=3] +1 NonDimArea ! The non-dimensional area of the airfoil (area/chord^2) (set to 1.0 if unsure or unneeded) +@"NREL-2p8-127_AF25_Coords.txt" NumCoords ! The number of coordinates in the airfoil shape file. Set to zero if coordinates not included. +AF25_BL.txt BL_file ! The file name including the boundary layer characteristics of the profile. Ignored if the aeroacoustic module is not called. +1 NumTabs ! Number of airfoil tables in this file. Each table must have lines for Re and Ctrl. +! ------------------------------------------------------------------------------ +! data for table 1 +! ------------------------------------------------------------------------------ +6.000000 Re ! Reynolds number in millions +0 Ctrl ! Control setting (must be 0 for current AirfoilInfo) +True InclUAdata ! Is unsteady aerodynamics data included in this table? If TRUE, then include 30 UA coefficients below this line +!........................................ +-3.985066 alpha0 ! 0-lift angle of attack, depends on airfoil. +10.901847 alpha1 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA>alpha0. (deg) +-9.933710 alpha2 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA1] +0.000000 S2 ! Constant in the f curve best-fit for AOA> alpha1; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S3 ! Constant in the f curve best-fit for alpha2<=AOA< alpha0; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S4 ! Constant in the f curve best-fit for AOA< alpha2; by definition it depends on the airfoil. [ignored if UAMod<>1] +1.525701 Cn1 ! Critical value of C0n at leading edge separation. It should be extracted from airfoil data at a given Mach and Reynolds number. It can be calculated from the static value of Cn at either the break in the pitching moment or the loss of chord force at the onset of stall. It is close to the condition of maximum lift of the airfoil at low Mach numbers. +-0.831442 Cn2 ! As Cn1 for negative AOAs. +Default St_sh ! Strouhal's shedding frequency constant. [default = 0.19] +0.006462 Cd0 ! 2D drag coefficient value at 0-lift. +-0.113020 Cm0 ! 2D pitching moment coefficient about 1/4-chord location, at 0-lift, positive if nose up. [If the aerodynamics coefficients table does not include a column for Cm, this needs to be set to 0.0] +0.000000 k0 ! Constant in the \hat(x)_cp curve best-fit; = (\hat(x)_AC-0.25). [ignored if UAMod<>1] +0.000000 k1 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k2 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k3 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k1_hat ! Constant in the expression of Cc due to leading edge vortex effects. [ignored if UAMod<>1] +Default x_cp_bar ! Constant in the expression of \hat(x)_cp^v. [ignored if UAMod<>1, default = 0.2] +Default UACutout ! Angle of attack above which unsteady aerodynamics are disabled (deg). [Specifying the string "Default" sets UACutout to 45 degrees] +Default filtCutOff ! Cut-off frequency (-3 dB corner frequency) for low-pass filtering the AoA input to UA, as well as the 1st and 2nd derivatives (Hz) [default = 20] +!........................................ +! Table of aerodynamics coefficients +200 NumAlf ! Number of data lines in the following table +! Alpha Cl Cd Cm +! (deg) (-) (-) (-) +-1.80000000000000e+02 0.00000000000000e+00 3.88896555692602e-02 1.88439381768847e-01 +-1.77000000000000e+02 1.47085076149199e-01 3.88896555692602e-02 1.95344118058902e-01 +-1.74000000000000e+02 2.95517626324669e-01 4.66675428003909e-02 2.39999774321882e-01 +-1.71000000000000e+02 4.43277326259944e-01 7.00014598350941e-02 3.60000410445527e-01 +-1.68000000000000e+02 5.54775230424015e-01 9.73983403883863e-02 3.01232293768575e-01 +-1.65000000000000e+02 6.48142659931080e-01 1.26826655280201e-01 1.53081887186124e-01 +-1.62000000000000e+02 7.41511167200111e-01 1.56255257014288e-01 4.92973254323252e-03 +-1.59000000000000e+02 7.95540100041439e-01 1.95090056664802e-01 -8.77735264750430e-02 +-1.56000000000000e+02 7.70906453274779e-01 2.52736933946693e-01 -6.95971986266622e-02 +-1.53000000000000e+02 7.46262520842411e-01 3.10383851618106e-01 -5.14181728633164e-02 +-1.50000000000000e+02 7.21593009442639e-01 3.68030820520305e-01 -3.29558765859875e-02 +-1.47000000000000e+02 7.06704434537952e-01 4.38996595677444e-01 -1.77699153461743e-02 +-1.44000000000000e+02 6.91815791203747e-01 5.09962627721908e-01 -2.58387309352737e-03 +-1.41000000000000e+02 6.76927011005616e-01 5.80929173559367e-01 1.25078923479111e-02 +-1.38000000000000e+02 6.57959749926485e-01 6.54912916084138e-01 2.78036722103928e-02 +-1.35000000000000e+02 6.36953256680495e-01 7.30405250831853e-01 4.32213182447573e-02 +-1.32000000000000e+02 6.15946530568564e-01 8.05898408123014e-01 5.86392271290690e-02 +-1.29000000000000e+02 5.91202311709038e-01 8.79859730223254e-01 7.42120371863231e-02 +-1.26000000000000e+02 5.58983089632388e-01 9.50757374661013e-01 9.00945304458618e-02 +-1.23000000000000e+02 5.26763742046105e-01 1.02165410059611e+00 1.05977334757586e-01 +-1.20000000000000e+02 4.94544331707351e-01 1.09255036729705e+00 1.21860311283846e-01 +-1.17000000000000e+02 4.51251550031352e-01 1.15027637837716e+00 1.36984793751777e-01 +-1.14000000000000e+02 4.07958914685959e-01 1.20800214320170e+00 1.52109035307253e-01 +-1.11000000000000e+02 3.64666615300881e-01 1.26572746703947e+00 1.67232779609297e-01 +-1.08000000000000e+02 3.16124806380124e-01 1.31001514786660e+00 1.80754313543723e-01 +-1.05000000000000e+02 2.64958202719693e-01 1.34758390486677e+00 1.93478045106979e-01 +-1.02000000000000e+02 2.13791585385510e-01 1.38515223136569e+00 2.06201034298060e-01 +-9.90000000000000e+01 1.61712404778857e-01 1.41448412769015e+00 2.17579378110101e-01 +-9.60000000000000e+01 1.07808058099348e-01 1.42734280690261e+00 2.26268358308198e-01 +-9.30000000000000e+01 5.39041000974291e-02 1.44020138788200e+00 2.34956873390276e-01 +-9.00000000000000e+01 3.36430787768757e-07 1.45305991974575e+00 2.43645159242670e-01 +-8.70000000000000e+01 -5.39040449269041e-02 1.44020140104271e+00 2.47370504797659e-01 +-8.40000000000000e+01 -1.07808208827910e-01 1.42734277094688e+00 2.51096140965095e-01 +-8.10000000000000e+01 -1.61711937812911e-01 1.41448423908313e+00 2.54822075502831e-01 +-7.80000000000000e+01 -2.13791337572500e-01 1.38515241331870e+00 2.55274888244729e-01 +-7.50000000000000e+01 -2.64958541234654e-01 1.34758365631669e+00 2.54091230125327e-01 +-7.20000000000000e+01 -3.16124558572532e-01 1.31001532981777e+00 2.52907274609395e-01 +-6.90000000000000e+01 -3.64666240259218e-01 1.26572796711458e+00 2.50475282099874e-01 +-6.60000000000000e+01 -4.07959035740134e-01 1.20800198178982e+00 2.45546802529565e-01 +-6.30000000000000e+01 -4.51251836454270e-01 1.15027599646507e+00 2.40618557245280e-01 +-6.00000000000000e+01 -4.94544544869283e-01 1.09254989825106e+00 2.35690538113475e-01 +-5.70000000000000e+01 -5.26763955208036e-01 1.02165363155013e+00 2.29009342263561e-01 +-5.40000000000000e+01 -5.58983302793074e-01 9.50756905605912e-01 2.22328163344933e-01 +-5.10000000000000e+01 -5.91202524869724e-01 8.79859261168152e-01 2.15646770887959e-01 +-4.80000000000000e+01 -6.17609187893117e-01 8.05904457214662e-01 2.09254779518151e-01 +-4.50000000000000e+01 -6.41109664805937e-01 7.30421122636189e-01 2.03007644172430e-01 +-4.20000000000000e+01 -6.59622394239239e-01 6.54918965123690e-01 1.98342023604304e-01 +-3.90000000000000e+01 -6.77240098048986e-01 5.79843727554838e-01 1.94293653388780e-01 +-3.60000000000000e+01 -6.92396015978899e-01 5.06471062583234e-01 1.92463840058657e-01 +-3.30000000000000e+01 -7.06701742382219e-01 4.35818415197548e-01 1.93734767779497e-01 +-3.00000000000000e+01 -7.21593116705023e-01 3.68030379296879e-01 1.98453590087422e-01 +-2.93939393939394e+01 -7.25013851405679e-01 3.55027024133188e-01 2.00336203048920e-01 +-2.87878787878788e+01 -7.28434586106336e-01 3.42023668969498e-01 2.02218816010418e-01 +-2.81818181818182e+01 -7.31855320806992e-01 3.29020313805808e-01 2.04101428971916e-01 +-2.75757575757576e+01 -7.35700687071979e-01 3.16435173390334e-01 2.06644209454419e-01 +-2.69696969696970e+01 -7.39728053905235e-01 3.04029283243158e-01 2.09469943146406e-01 +-2.63636363636364e+01 -7.43755420738490e-01 2.91623393095983e-01 2.12295676838393e-01 +-2.57575757575758e+01 -7.48155857417494e-01 2.79481029799510e-01 2.15614520779263e-01 +-2.51515151515151e+01 -7.53115811916466e-01 2.67733895360822e-01 2.19672915167868e-01 +-2.45454545454545e+01 -7.58075766415437e-01 2.55986760922134e-01 2.23731309556473e-01 +-2.39393939393939e+01 -7.63184374708742e-01 2.44310701465517e-01 2.27866482494864e-01 +-2.33333333333333e+01 -7.69630895931130e-01 2.33274330608002e-01 2.32692677246016e-01 +-2.27272727272727e+01 -7.76077417153518e-01 2.22237959750487e-01 2.37506340633904e-01 +-2.21212121212121e+01 -7.82523938375906e-01 2.11201588892972e-01 2.42358034603878e-01 +-2.15151515151515e+01 -7.90135337461922e-01 2.00684998703353e-01 2.48462729786897e-01 +-2.09090909090909e+01 -7.98004310296648e-01 1.90298387115310e-01 2.54903342970304e-01 +-2.03030303030303e+01 -8.05878455195337e-01 1.79911775527268e-01 2.61343956153712e-01 +-1.96969696969697e+01 -8.14697917585567e-01 1.69812568423152e-01 2.68837595176999e-01 +-1.90909090909091e+01 -8.24455334435024e-01 1.60000749544382e-01 2.77384200470083e-01 +-1.84848484848485e+01 -8.23371484569383e-01 1.50522208073122e-01 2.74858417075755e-01 +-1.78787878787879e+01 -8.20283137594642e-01 1.41330694311538e-01 2.69517114356924e-01 +-1.72727272727273e+01 -8.16827722657021e-01 1.33081595034303e-01 2.60706462733926e-01 +-1.66666666666667e+01 -8.05487645465897e-01 1.24835482427222e-01 2.43743487370455e-01 +-1.60606060606061e+01 -7.87698090979399e-01 1.16591881249401e-01 2.20110391522602e-01 +-1.54545454545455e+01 -7.70279194203751e-01 1.08379515150144e-01 1.96405027014696e-01 +-1.48484848484848e+01 -7.53095337434051e-01 1.00185501796409e-01 1.72659305608295e-01 +-1.42424242424242e+01 -7.36494264951863e-01 9.20339115415058e-02 1.48824706874429e-01 +-1.36363636363636e+01 -7.20003204011376e-01 8.38888551728098e-02 1.25023839281306e-01 +-1.30303030303030e+01 -7.03596374099641e-01 7.57475802314855e-02 1.01231760751629e-01 +-1.24242424242424e+01 -6.85592076723291e-01 6.76111043119601e-02 7.80448576791677e-02 +-1.18181818181818e+01 -6.67194751585540e-01 5.96056150740760e-02 5.50235291976979e-02 +-1.12121212121212e+01 -6.48063815783503e-01 5.13317377912542e-02 3.23188744507143e-02 +-1.06060606060606e+01 -6.28468277340486e-01 4.31836623215413e-02 9.45993928821119e-03 +-1.00000000000000e+01 -6.08620538268602e-01 3.51540278791994e-02 -1.34796433221792e-02 +-9.39393939393939e+00 -5.88452257587033e-01 2.73199794208228e-02 -3.63905317831286e-02 +-8.78787878787879e+00 -5.62689873667493e-01 2.00084704728355e-02 -5.85506772245690e-02 +-8.18181818181818e+00 -5.26523769001160e-01 1.35978263788546e-02 -7.93058161363485e-02 +-7.57575757575758e+00 -4.55695305492732e-01 1.04092109922848e-02 -9.28284077848926e-02 +-6.96969696969697e+00 -3.69845487410935e-01 8.91871368739218e-03 -1.01630482628221e-01 +-6.36363636363636e+00 -2.93598733915834e-01 7.52845137064097e-03 -1.04647217860029e-01 +-5.75757575757576e+00 -2.18105319246992e-01 7.08800169590747e-03 -1.07214517170429e-01 +-5.15151515151515e+00 -1.43086395099137e-01 6.80050156749210e-03 -1.09441582594168e-01 +-4.54545454545454e+00 -6.85129984815250e-02 6.56750484797770e-03 -1.11442618030446e-01 +-3.93939393939394e+00 5.58385912432804e-03 6.45301670656877e-03 -1.13148191085356e-01 +-3.33333333333333e+00 7.94070262060676e-02 6.41289348325262e-03 -1.14695006520256e-01 +-2.72727272727273e+00 1.53241011838806e-01 6.34203948696765e-03 -1.16207049641120e-01 +-2.12121212121212e+00 2.26643908165568e-01 6.33526268400175e-03 -1.17673564802273e-01 +-1.51515151515152e+00 3.00105384199722e-01 6.33260375138770e-03 -1.19135271104034e-01 +-9.09090909090912e-01 3.73112750667490e-01 6.33272155108629e-03 -1.20666056314306e-01 +-3.03030303030302e-01 4.45821550130321e-01 6.37447853784405e-03 -1.22082515446199e-01 + 3.03030303030302e-01 5.18490342544224e-01 6.43313505799646e-03 -1.23487187085283e-01 + 9.09090909090912e-01 5.90981181373800e-01 6.43182319665414e-03 -1.24792255974836e-01 + 1.51515151515152e+00 6.63194082651710e-01 6.52639345810673e-03 -1.25965661272832e-01 + 2.12121212121212e+00 7.35342582721669e-01 6.56033089540737e-03 -1.27200682447364e-01 + 2.72727272727273e+00 8.07087488554538e-01 6.68351242329311e-03 -1.28376340413356e-01 + 3.33333333333333e+00 8.78653932202791e-01 6.80603711634661e-03 -1.29410676299065e-01 + 3.93939393939394e+00 9.49821767187520e-01 6.92963005547727e-03 -1.30468108847082e-01 + 4.54545454545455e+00 1.02040859265783e+00 7.05596856935910e-03 -1.31334420191275e-01 + 5.15151515151515e+00 1.09057426257294e+00 7.21258284329372e-03 -1.32167739152710e-01 + 5.75757575757576e+00 1.15956993076019e+00 7.50770133128459e-03 -1.32829150435812e-01 + 6.36363636363637e+00 1.22598231576016e+00 8.00921749308073e-03 -1.33054200393040e-01 + 6.96969696969697e+00 1.28698208452707e+00 8.95907167395873e-03 -1.32588516874154e-01 + 7.57575757575757e+00 1.33798080221868e+00 1.07198763892550e-02 -1.30460457192223e-01 + 8.18181818181818e+00 1.38474488602779e+00 1.24584314382430e-02 -1.27836892595172e-01 + 8.78787878787879e+00 1.43030567824273e+00 1.40331639261087e-02 -1.25090100383291e-01 + 9.39393939393939e+00 1.47200490845414e+00 1.59305690309036e-02 -1.22289478404177e-01 + 1.00000000000000e+01 1.50215101421504e+00 1.79091658579838e-02 -1.21813999638841e-01 + 1.06060606060606e+01 1.52370646388859e+00 2.02673536853439e-02 -1.21708944902389e-01 + 1.12121212121212e+01 1.54059319776331e+00 2.29572858937563e-02 -1.21848482617505e-01 + 1.18181818181818e+01 1.55195059906285e+00 3.24577496194005e-02 -1.22761051253168e-01 + 1.24242424242424e+01 1.52438898981163e+00 4.81678475665162e-02 -1.24233830041100e-01 + 1.30303030303030e+01 1.48202855383678e+00 6.38795341948320e-02 -1.25730475238576e-01 + 1.36363636363636e+01 1.42634733955077e+00 7.98865843582198e-02 -1.27696791571033e-01 + 1.42424242424242e+01 1.37740933666151e+00 9.28335727033232e-02 -1.29317173288097e-01 + 1.48484848484848e+01 1.33848755611934e+00 1.01192691262027e-01 -1.30420940714982e-01 + 1.54545454545455e+01 1.31190755280546e+00 1.09441241406769e-01 -1.31424351641477e-01 + 1.60606060606061e+01 1.28938235719693e+00 1.17642799704135e-01 -1.32380797174879e-01 + 1.66666666666667e+01 1.26634018563845e+00 1.25753041098846e-01 -1.33237196626024e-01 + 1.72727272727273e+01 1.23834102937778e+00 1.33971665700699e-01 -1.34168012171228e-01 + 1.78787878787879e+01 1.20427767029161e+00 1.42322760041168e-01 -1.35189926091386e-01 + 1.84848484848485e+01 1.18799320204888e+00 1.50716604683360e-01 -1.36311946607811e-01 + 1.90909090909091e+01 1.17586795447335e+00 1.59325448714249e-01 -1.38145765919180e-01 + 1.96969696969697e+01 1.16211889516567e+00 1.69092448832339e-01 -1.43872565373133e-01 + 2.03030303030303e+01 1.14927412966545e+00 1.79265230696872e-01 -1.50302804965374e-01 + 2.09090909090909e+01 1.13814235040425e+00 1.89843817264378e-01 -1.57438574430759e-01 + 2.15151515151515e+01 1.12766323714321e+00 2.00422403831884e-01 -1.64574965529124e-01 + 2.21212121212121e+01 1.11706175944146e+00 2.11099174825611e-01 -1.71481480893725e-01 + 2.27272727272727e+01 1.10811964282661e+00 2.22168582499681e-01 -1.77468729848466e-01 + 2.33333333333333e+01 1.09917752621176e+00 2.33237990173751e-01 -1.83456509220763e-01 + 2.39393939393939e+01 1.09023540959691e+00 2.44307397847821e-01 -1.89446318845786e-01 + 2.45454545454545e+01 1.08296339319592e+00 2.55986760922134e-01 -1.94609075142135e-01 + 2.51515151515151e+01 1.07587693949360e+00 2.67733895360822e-01 -1.99679830094226e-01 + 2.57575757575758e+01 1.06879048579128e+00 2.79481029799510e-01 -2.04750458453214e-01 + 2.63636363636364e+01 1.06250432210796e+00 2.91623393095983e-01 -2.09443081756152e-01 + 2.69696969696970e+01 1.05675176801362e+00 3.04029283243158e-01 -2.13883658690320e-01 + 2.75757575757576e+01 1.05099921391928e+00 3.16435173390334e-01 -2.18324155845132e-01 + 2.81818181818182e+01 1.04550641150444e+00 3.29020313805808e-01 -2.22633305796399e-01 + 2.87878787878788e+01 1.04061964435123e+00 3.42023668969498e-01 -2.26636130753221e-01 + 2.93939393939394e+01 1.03573287719801e+00 3.55027024133188e-01 -2.30638903172504e-01 + 3.00000000000000e+01 1.03084611004479e+00 3.68030379296879e-01 -2.34641622610226e-01 + 3.30000000000000e+01 1.00957720103222e+00 4.35818415197548e-01 -2.52554076744310e-01 + 3.60000000000000e+01 9.89136784047915e-01 5.06471062583234e-01 -2.69189950621486e-01 + 3.90000000000000e+01 9.67485857943026e-01 5.79843727554838e-01 -2.84796609339440e-01 + 4.20000000000000e+01 9.42317581833575e-01 6.54918965123690e-01 -2.99708632363911e-01 + 4.50000000000000e+01 9.15871274073578e-01 7.30421122636189e-01 -3.14427587661614e-01 + 4.80000000000000e+01 8.82298905466505e-01 8.05904457214662e-01 -3.28546217819211e-01 + 5.10000000000000e+01 8.44574853445087e-01 8.79859261168152e-01 -3.42409667613951e-01 + 5.40000000000000e+01 7.98547167692681e-01 9.50756905605912e-01 -3.55762881953981e-01 + 5.70000000000000e+01 7.52519428332893e-01 1.02165363155013e+00 -3.69115906506285e-01 + 6.00000000000000e+01 7.06491662169616e-01 1.09254989825106e+00 -3.82468805440661e-01 + 6.30000000000000e+01 6.44645585302091e-01 1.15027599646507e+00 -3.94568162072562e-01 + 6.60000000000000e+01 5.82799184406010e-01 1.20800198178982e+00 -4.06667464188502e-01 + 6.90000000000000e+01 5.20952406629315e-01 1.26572796711458e+00 -4.18766708415905e-01 + 7.20000000000000e+01 4.51606840984605e-01 1.31001532981777e+00 -4.29653737684229e-01 + 7.50000000000000e+01 3.78512034916063e-01 1.34758365631669e+00 -4.39934681615426e-01 + 7.80000000000000e+01 3.05416356557281e-01 1.38515241331870e+00 -4.50215120171697e-01 + 8.10000000000000e+01 2.31017478817704e-01 1.41448423908313e+00 -4.59650318443595e-01 + 8.40000000000000e+01 1.54012292275277e-01 1.42734277094688e+00 -4.67395115002369e-01 + 8.70000000000000e+01 7.70061458096371e-02 1.44020140104271e+00 -4.75139563653944e-01 + 9.00000000000000e+01 -3.36430788002270e-07 1.45305991974575e+00 -4.82883809780470e-01 + 9.30000000000000e+01 -5.39041000974291e-02 1.44020138788200e+00 -4.86608736540749e-01 + 9.60000000000000e+01 -1.07808058099348e-01 1.42734280690261e+00 -4.90252008054739e-01 + 9.90000000000000e+01 -1.61712404778857e-01 1.41448412769015e+00 -4.93892480524254e-01 + 1.02000000000000e+02 -2.13791585385510e-01 1.38515223136569e+00 -4.94260121211006e-01 + 1.05000000000000e+02 -2.64958202719694e-01 1.34758390486677e+00 -4.92991191870403e-01 + 1.08000000000000e+02 -3.16124806380124e-01 1.31001514786660e+00 -4.91810583583353e-01 + 1.11000000000000e+02 -3.64666615300881e-01 1.26572746703946e+00 -4.89432902349955e-01 + 1.14000000000000e+02 -4.07958914685959e-01 1.20800214320170e+00 -4.84556213718753e-01 + 1.17000000000000e+02 -4.51251550031352e-01 1.15027637837716e+00 -4.79679087834588e-01 + 1.20000000000000e+02 -4.94544331707352e-01 1.09255036729705e+00 -4.74801739879191e-01 + 1.23000000000000e+02 -5.26763742046105e-01 1.02165410059611e+00 -4.68166345460196e-01 + 1.26000000000000e+02 -5.58983089632388e-01 9.50757374661013e-01 -4.61530902688578e-01 + 1.29000000000000e+02 -5.91202311709038e-01 8.79859730223253e-01 -4.54866722642821e-01 + 1.32000000000000e+02 -6.15946530568564e-01 8.05898408123014e-01 -4.48999508288356e-01 + 1.35000000000000e+02 -6.36953256680495e-01 7.30405250831853e-01 -4.43540325890876e-01 + 1.38000000000000e+02 -6.57959749926485e-01 6.54912916084137e-01 -4.38080640740675e-01 + 1.41000000000000e+02 -6.76927011005616e-01 5.80929173559366e-01 -4.34763066576705e-01 + 1.44000000000000e+02 -6.91815791203747e-01 5.09962627721908e-01 -4.35729731767291e-01 + 1.47000000000000e+02 -7.06704434537952e-01 4.38996595677444e-01 -4.36696394806281e-01 + 1.50000000000000e+02 -7.21593009442639e-01 3.68030820520304e-01 -4.37663056769512e-01 + 1.53000000000000e+02 -7.45653551873146e-01 3.10460824874659e-01 -4.59043940512908e-01 + 1.56000000000000e+02 -7.69677114596338e-01 2.52890877728508e-01 -4.79978567205265e-01 + 1.59000000000000e+02 -7.93695164530012e-01 1.95320965150743e-01 -5.01585589518735e-01 + 1.62000000000000e+02 -7.33817088309609e-01 1.57056754662604e-01 -5.07101903167502e-01 + 1.65000000000000e+02 -6.31982311416204e-01 1.28445558491906e-01 -5.04439049525879e-01 + 1.68000000000000e+02 -5.30148101457015e-01 9.98340901844233e-02 -5.01775628100030e-01 + 1.71000000000000e+02 -4.16032857149841e-01 7.26838423842623e-02 -4.50000513056908e-01 + 1.74000000000000e+02 -2.77354970782234e-01 4.84561038187240e-02 -2.99999717902353e-01 + 1.77000000000000e+02 -1.38045242443721e-01 3.97799508651227e-02 -7.34244952105506e-02 + 1.80000000000000e+02 0.00000000000000e+00 3.88896555692602e-02 1.88439381768847e-01 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_26.dat b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_26.dat new file mode 100644 index 000000000..dbffc457b --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_26.dat @@ -0,0 +1,254 @@ +! ------------ AirfoilInfo v1.01.x Input File ---------------------------------- +! AeroElasticSE FAST driver +! line +! line +! ------------------------------------------------------------------------------ +DEFAULT InterpOrd ! Interpolation order to use for quasi-steady table lookup {1=linear; 3=cubic spline; "default"} [default=3] +1 NonDimArea ! The non-dimensional area of the airfoil (area/chord^2) (set to 1.0 if unsure or unneeded) +@"NREL-2p8-127_AF26_Coords.txt" NumCoords ! The number of coordinates in the airfoil shape file. Set to zero if coordinates not included. +AF26_BL.txt BL_file ! The file name including the boundary layer characteristics of the profile. Ignored if the aeroacoustic module is not called. +1 NumTabs ! Number of airfoil tables in this file. Each table must have lines for Re and Ctrl. +! ------------------------------------------------------------------------------ +! data for table 1 +! ------------------------------------------------------------------------------ +6.000000 Re ! Reynolds number in millions +0 Ctrl ! Control setting (must be 0 for current AirfoilInfo) +True InclUAdata ! Is unsteady aerodynamics data included in this table? If TRUE, then include 30 UA coefficients below this line +!........................................ +-4.024504 alpha0 ! 0-lift angle of attack, depends on airfoil. +11.306876 alpha1 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA>alpha0. (deg) +-9.832558 alpha2 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA1] +0.000000 S2 ! Constant in the f curve best-fit for AOA> alpha1; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S3 ! Constant in the f curve best-fit for alpha2<=AOA< alpha0; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S4 ! Constant in the f curve best-fit for AOA< alpha2; by definition it depends on the airfoil. [ignored if UAMod<>1] +1.557234 Cn1 ! Critical value of C0n at leading edge separation. It should be extracted from airfoil data at a given Mach and Reynolds number. It can be calculated from the static value of Cn at either the break in the pitching moment or the loss of chord force at the onset of stall. It is close to the condition of maximum lift of the airfoil at low Mach numbers. +-0.830241 Cn2 ! As Cn1 for negative AOAs. +Default St_sh ! Strouhal's shedding frequency constant. [default = 0.19] +0.006417 Cd0 ! 2D drag coefficient value at 0-lift. +-0.112920 Cm0 ! 2D pitching moment coefficient about 1/4-chord location, at 0-lift, positive if nose up. [If the aerodynamics coefficients table does not include a column for Cm, this needs to be set to 0.0] +0.000000 k0 ! Constant in the \hat(x)_cp curve best-fit; = (\hat(x)_AC-0.25). [ignored if UAMod<>1] +0.000000 k1 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k2 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k3 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k1_hat ! Constant in the expression of Cc due to leading edge vortex effects. [ignored if UAMod<>1] +Default x_cp_bar ! Constant in the expression of \hat(x)_cp^v. [ignored if UAMod<>1, default = 0.2] +Default UACutout ! Angle of attack above which unsteady aerodynamics are disabled (deg). [Specifying the string "Default" sets UACutout to 45 degrees] +Default filtCutOff ! Cut-off frequency (-3 dB corner frequency) for low-pass filtering the AoA input to UA, as well as the 1st and 2nd derivatives (Hz) [default = 20] +!........................................ +! Table of aerodynamics coefficients +200 NumAlf ! Number of data lines in the following table +! Alpha Cl Cd Cm +! (deg) (-) (-) (-) +-1.80000000000000e+02 0.00000000000000e+00 3.76960235595695e-02 1.99999773877240e-01 +-1.77000000000000e+02 1.49471735352601e-01 3.76960235595695e-02 1.99999908932130e-01 +-1.74000000000000e+02 3.00312823771888e-01 4.52351857356452e-02 2.39999774321882e-01 +-1.71000000000000e+02 4.50470172837611e-01 6.78529197680463e-02 3.60000410445527e-01 +-1.68000000000000e+02 5.62141155839517e-01 9.47828831363562e-02 3.00100260054970e-01 +-1.65000000000000e+02 6.54569405002126e-01 1.23868910842549e-01 1.50251816114612e-01 +-1.62000000000000e+02 7.46998713314856e-01 1.52955271849131e-01 4.01655036174478e-04 +-1.59000000000000e+02 7.99786871669241e-01 1.91656566827607e-01 -9.28122671239639e-02 +-1.56000000000000e+02 7.73294071101042e-01 2.49587404486670e-01 -7.27556273551054e-02 +-1.53000000000000e+02 7.46801068143765e-01 3.07518284704543e-01 -5.26992343631414e-02 +-1.50000000000000e+02 7.20307991381284e-01 3.65449216784473e-01 -3.26429713183966e-02 +-1.47000000000000e+02 7.05570279118452e-01 4.36504377442686e-01 -1.75932612156202e-02 +-1.44000000000000e+02 6.90832510562523e-01 5.07559809506317e-01 -2.54349362777964e-03 +-1.41000000000000e+02 6.76094629416376e-01 5.78615784400165e-01 1.25063869759018e-02 +-1.38000000000000e+02 6.57241681367617e-01 6.52702801625277e-01 2.78005506087723e-02 +-1.35000000000000e+02 6.36331208215415e-01 7.28305333867222e-01 4.32168556727977e-02 +-1.32000000000000e+02 6.15420495447980e-01 8.03908732446007e-01 5.86333373939491e-02 +-1.29000000000000e+02 5.90761768946044e-01 8.77986125240427e-01 7.42048196933668e-02 +-1.26000000000000e+02 5.58606997203396e-01 9.49011499212308e-01 9.00863038811510e-02 +-1.23000000000000e+02 5.26452071104699e-01 1.02003593058481e+00 1.05968066745090e-01 +-1.20000000000000e+02 4.94297067830864e-01 1.09105989067524e+00 1.21849968941896e-01 +-1.17000000000000e+02 4.51046459413193e-01 1.14892722035528e+00 1.36973650595313e-01 +-1.14000000000000e+02 4.07795994504977e-01 1.20679430326659e+00 1.52097072994041e-01 +-1.11000000000000e+02 3.64545860001903e-01 1.26466094411154e+00 1.67219979864857e-01 +-1.08000000000000e+02 3.16034194150131e-01 1.30909602388533e+00 1.80733002070115e-01 +-1.05000000000000e+02 2.64891722560637e-01 1.34681522084817e+00 1.93441069750703e-01 +-1.02000000000000e+02 2.13749237020859e-01 1.38453398558587e+00 2.06148391816051e-01 +-9.90000000000000e+01 1.61688764627702e-01 1.41401796960994e+00 2.17512374667702e-01 +-9.60000000000000e+01 1.07792278764948e-01 1.42703203551508e+00 2.26189620904871e-01 +-9.30000000000000e+01 5.38962046405121e-02 1.44004600200010e+00 2.34866400852709e-01 +-9.00000000000000e+01 3.36381509980986e-07 1.45305991877594e+00 2.43542947660101e-01 +-8.70000000000000e+01 -5.38961494780680e-02 1.44004601531985e+00 2.47180800161873e-01 +-8.40000000000000e+01 -1.07792429471529e-01 1.42703199912486e+00 2.50818607319856e-01 +-8.10000000000000e+01 -1.61688297729853e-01 1.41401808234901e+00 2.54456386687213e-01 +-7.80000000000000e+01 -2.13748989324725e-01 1.38453416826749e+00 2.54821414135407e-01 +-7.50000000000000e+01 -2.64892060915943e-01 1.34681497130280e+00 2.53550009143848e-01 +-7.20000000000000e+01 -3.16033946459415e-01 1.30909620656510e+00 2.52278018725637e-01 +-6.90000000000000e+01 -3.64545485325515e-01 1.26466144541088e+00 2.49759250841147e-01 +-6.60000000000000e+01 -4.07796115441250e-01 1.20679414145955e+00 2.44746825927138e-01 +-6.30000000000000e+01 -4.51046745557096e-01 1.14892683750823e+00 2.39734401012678e-01 +-6.00000000000000e+01 -4.94297280566681e-01 1.09105942078444e+00 2.34721961096712e-01 +-5.70000000000000e+01 -5.26452283840516e-01 1.02003546069401e+00 2.27959404332693e-01 +-5.40000000000000e+01 -5.58607209937681e-01 9.49011029312154e-01 2.21196621737505e-01 +-5.10000000000000e+01 -5.90761981680330e-01 8.77985655340273e-01 2.14433387476536e-01 +-4.80000000000000e+01 -6.17089681519895e-01 8.03911609903610e-01 2.07957006233653e-01 +-4.50000000000000e+01 -6.40503939057214e-01 7.28313277731023e-01 2.01624046889681e-01 +-4.20000000000000e+01 -6.58910854376636e-01 6.52705679055557e-01 1.96862418589880e-01 +-3.90000000000000e+01 -6.76417043986716e-01 5.77527415759156e-01 1.92714525781683e-01 +-3.60000000000000e+01 -6.91442145788392e-01 5.04059407890188e-01 1.90773036499847e-01 +-3.30000000000000e+01 -7.05593980685524e-01 4.33318752640849e-01 1.91909028051921e-01 +-3.00000000000000e+01 -7.20308097407842e-01 3.65448775028654e-01 1.96465078139101e-01 +-2.93939393939394e+01 -7.23687148982083e-01 3.52430142214952e-01 1.98306875240709e-01 +-2.87878787878788e+01 -7.27066200556324e-01 3.39411509401249e-01 2.00148672342317e-01 +-2.81818181818182e+01 -7.30445252130566e-01 3.26392876587547e-01 2.01990469443925e-01 +-2.75757575757576e+01 -7.34245004132877e-01 3.13793130446363e-01 2.04486479544941e-01 +-2.69696969696970e+01 -7.38225071786241e-01 3.01372922565738e-01 2.07262890698687e-01 +-2.63636363636364e+01 -7.42205139439605e-01 2.88952714685113e-01 2.10039301852433e-01 +-2.57575757575758e+01 -7.46555494689374e-01 2.76796428164473e-01 2.13304205864706e-01 +-2.51515151515151e+01 -7.51461195033535e-01 2.65035962173593e-01 2.17301735315320e-01 +-2.45454545454545e+01 -7.56366895377697e-01 2.53275496182714e-01 2.21299264765933e-01 +-2.39393939393939e+01 -7.61408712929841e-01 2.41586724908869e-01 2.25459999520073e-01 +-2.33333333333333e+01 -7.67675611706775e-01 2.30543219968779e-01 2.31089613603274e-01 +-2.27272727272727e+01 -7.73942510483708e-01 2.19499715028689e-01 2.36719227686470e-01 +-2.21212121212121e+01 -7.80209409260641e-01 2.08456210088599e-01 2.42348842244097e-01 +-2.15151515151515e+01 -7.88045843131190e-01 1.98028913518013e-01 2.49772937268922e-01 +-2.09090909090909e+01 -7.96274761734597e-01 1.87755708677063e-01 2.57645768551195e-01 +-2.03030303030303e+01 -8.04503680338007e-01 1.77482503836112e-01 2.65518599833468e-01 +-1.96969696969697e+01 -8.13721581766036e-01 1.67514312390042e-01 2.74509055953088e-01 +-1.90909090909091e+01 -8.23928410071538e-01 1.57851117084127e-01 2.84617073685583e-01 +-1.84848484848485e+01 -8.22646776262130e-01 1.48546940538688e-01 2.82973389715262e-01 +-1.78787878787879e+01 -8.19241192016627e-01 1.39555178352410e-01 2.78335523489406e-01 +-1.72727272727273e+01 -8.15446589363820e-01 1.31559887902139e-01 2.70012950129364e-01 +-1.66666666666667e+01 -8.03296483777369e-01 1.23564597452339e-01 2.53038201146750e-01 +-1.60606060606061e+01 -7.84310128533453e-01 1.15569307002924e-01 2.28984472824905e-01 +-1.54545454545455e+01 -7.65324759977866e-01 1.07574974865435e-01 2.04931438081052e-01 +-1.48484848484848e+01 -7.46339081540475e-01 9.95804834752580e-02 1.80878286802668e-01 +-1.42424242424242e+01 -7.27352144425903e-01 9.15851948410960e-02 1.56824554692099e-01 +-1.36363636363636e+01 -7.08366589041831e-01 8.35901811716822e-02 1.32771649802369e-01 +-1.30303030303030e+01 -6.89379329405081e-01 7.55946407967314e-02 1.08716220908226e-01 +-1.24242424242424e+01 -6.70394070681262e-01 6.75996503421858e-02 8.46633366461469e-02 +-1.18181818181818e+01 -6.51407025524249e-01 5.96041815994357e-02 6.06090692018439e-02 +-1.12121212121212e+01 -6.32421761536482e-01 5.16093484929349e-02 3.65561615953677e-02 +-1.06060606060606e+01 -6.13435225841655e-01 4.36139224210943e-02 1.25016108288645e-02 +-1.00000000000000e+01 -5.94449142982321e-01 3.56199339544178e-02 -1.15512079994493e-02 +-9.39393939393939e+00 -5.75463842145924e-01 2.76249494874552e-02 -3.56050262327576e-02 +-8.78787878787879e+00 -5.51403957680999e-01 2.01382266354268e-02 -5.87079502546054e-02 +-8.18181818181818e+00 -5.17926474912583e-01 1.35966762681344e-02 -8.00434679031281e-02 +-7.57575757575758e+00 -4.48013073952105e-01 1.04062079021587e-02 -9.38202181483299e-02 +-6.96969696969697e+00 -3.62306704515139e-01 8.91516259682469e-03 -1.02639355883834e-01 +-6.36363636363636e+00 -2.86592646559465e-01 7.49092009640339e-03 -1.05345389259135e-01 +-5.75757575757576e+00 -2.11681427543666e-01 7.05454354406601e-03 -1.07624248784689e-01 +-5.15151515151515e+00 -1.37278368249321e-01 6.76061495526902e-03 -1.09615083165669e-01 +-4.54545454545454e+00 -6.32446849221684e-02 6.51817990062387e-03 -1.11463657718864e-01 +-3.93939393939394e+00 1.03326039502837e-02 6.40000102450966e-03 -1.13157562089362e-01 +-3.33333333333333e+00 8.37357402666289e-02 6.36666345248257e-03 -1.14700049263230e-01 +-2.72727272727273e+00 1.57144890016423e-01 6.30000080854981e-03 -1.16209080405868e-01 +-2.12121212121212e+00 2.30132013733438e-01 6.30000067359949e-03 -1.17633366714045e-01 +-1.51515151515152e+00 3.03270133033896e-01 6.30000062134854e-03 -1.18966679175655e-01 +-9.09090909090912e-01 3.76007831012725e-01 6.30000062466049e-03 -1.20399983368341e-01 +-3.03030303030302e-01 4.48619593833060e-01 6.33939706788298e-03 -1.21733367482865e-01 + 3.03030303030302e-01 5.21162110305859e-01 6.40000063237506e-03 -1.23066648228140e-01 + 9.09090909090912e-01 5.93482962845902e-01 6.40000060506645e-03 -1.24318211551559e-01 + 1.51515151515152e+00 6.65499465508473e-01 6.50000049630823e-03 -1.25430305714767e-01 + 2.12121212121212e+00 7.37449721921112e-01 6.52424015611961e-03 -1.26642406027256e-01 + 2.72727272727273e+00 8.08982255779155e-01 6.64545608432346e-03 -1.27809109728731e-01 + 3.33333333333333e+00 8.80397540133069e-01 6.76666331848451e-03 -1.28833312226978e-01 + 3.93939393939394e+00 9.51421795343730e-01 6.88788064407856e-03 -1.29890930275742e-01 + 4.54545454545455e+00 1.02186277965824e+00 7.00909038513147e-03 -1.30763637928484e-01 + 5.15151515151515e+00 1.09189625174699e+00 7.16061521492726e-03 -1.31612160993914e-01 + 5.75757575757576e+00 1.16079950494080e+00 7.45454396592225e-03 -1.32306067865226e-01 + 6.36363636363637e+00 1.22720136736217e+00 7.96365014632842e-03 -1.32572739637886e-01 + 6.96969696969697e+00 1.28802461132675e+00 8.94546191359972e-03 -1.32130308376179e-01 + 7.57575757575757e+00 1.33932328366435e+00 1.07272367904880e-02 -1.30081875964063e-01 + 8.18181818181818e+00 1.38679182149843e+00 1.25091238234984e-02 -1.27572684159305e-01 + 8.78787878787879e+00 1.43442621343129e+00 1.40333059500536e-02 -1.25090961368079e-01 + 9.39393939393939e+00 1.48072468189907e+00 1.53666957749600e-02 -1.22230263597817e-01 + 1.00000000000000e+01 1.51619948622988e+00 1.65000203201040e-02 -1.21700002321685e-01 + 1.06060606060606e+01 1.54652613869201e+00 1.81605911900563e-02 -1.21700000182581e-01 + 1.12121212121212e+01 1.57015106631391e+00 2.03485522545774e-02 -1.21912123883377e-01 + 1.18181818181818e+01 1.58466270949876e+00 3.00903977018941e-02 -1.23218106611257e-01 + 1.24242424242424e+01 1.55439005671114e+00 4.64546703161752e-02 -1.25157568402582e-01 + 1.30303030303030e+01 1.50697011272490e+00 6.28179584205508e-02 -1.27096913764242e-01 + 1.36363636363636e+01 1.44636122440245e+00 7.91823777231142e-02 -1.29036401923583e-01 + 1.42424242424242e+01 1.39302933029550e+00 9.22728672271796e-02 -1.30587869102437e-01 + 1.48484848484848e+01 1.35060444483994e+00 1.00454826054870e-01 -1.31557584992825e-01 + 1.54545454545455e+01 1.32181783503487e+00 1.08636431096634e-01 -1.32527257164245e-01 + 1.60606060606061e+01 1.29757628829158e+00 1.16817964892734e-01 -1.33496920105626e-01 + 1.66666666666667e+01 1.27333348139179e+00 1.24999918769171e-01 -1.34466631124069e-01 + 1.72727272727273e+01 1.24363607861721e+00 1.33181874793555e-01 -1.35436343590531e-01 + 1.78787878787879e+01 1.20727187838534e+00 1.41363833443233e-01 -1.36406057826813e-01 + 1.84848484848485e+01 1.18992975180798e+00 1.49497904111867e-01 -1.37375729577547e-01 + 1.90909090909091e+01 1.17704327758037e+00 1.57851104306908e-01 -1.39089566615125e-01 + 1.96969696969697e+01 1.16246123156071e+00 1.67514298578136e-01 -1.45021783264679e-01 + 2.03030303030303e+01 1.14929279501434e+00 1.77482491349607e-01 -1.51632325921770e-01 + 2.09090909090909e+01 1.13753806488326e+00 1.87755699876179e-01 -1.58921232961736e-01 + 2.15151515151515e+01 1.12578334814572e+00 1.98028908402751e-01 -1.66210140001703e-01 + 2.21212121212121e+01 1.11458879313232e+00 2.08456208053037e-01 -1.73224589305943e-01 + 2.27272727272727e+01 1.10563435435787e+00 2.19499713649760e-01 -1.79141490064069e-01 + 2.33333333333333e+01 1.09667991558342e+00 2.30543219246483e-01 -1.85058390822194e-01 + 2.39393939393939e+01 1.08772547680897e+00 2.41586724843207e-01 -1.90975291580320e-01 + 2.45454545454545e+01 1.08052192847356e+00 2.53275496182714e-01 -1.96074563757929e-01 + 2.51515151515151e+01 1.07351291933540e+00 2.65035962173593e-01 -2.01082990269719e-01 + 2.57575757575758e+01 1.06650391019725e+00 2.76796428164473e-01 -2.06091416781509e-01 + 2.63636363636364e+01 1.06028929009176e+00 2.88952714685113e-01 -2.10729582407184e-01 + 2.69696969696970e+01 1.05460434497302e+00 3.01372922565738e-01 -2.15120869083270e-01 + 2.75757575757576e+01 1.04891939985428e+00 3.13793130446363e-01 -2.19512155759356e-01 + 2.81818181818182e+01 1.04349178876274e+00 3.26392876587547e-01 -2.23774943907361e-01 + 2.87878787878788e+01 1.03866457222799e+00 3.39411509401249e-01 -2.27737927876115e-01 + 2.93939393939394e+01 1.03383735569325e+00 3.52430142214952e-01 -2.31700911844869e-01 + 3.00000000000000e+01 1.02901013915851e+00 3.65448775028654e-01 -2.35663895813623e-01 + 3.30000000000000e+01 1.00799497239599e+00 4.33318752640849e-01 -2.53423032735973e-01 + 3.60000000000000e+01 9.87774208309456e-01 5.04059407890188e-01 -2.69936839647807e-01 + 3.90000000000000e+01 9.66310062840480e-01 5.77527415759156e-01 -2.85448460530465e-01 + 4.20000000000000e+01 9.41301077680331e-01 6.52705679055557e-01 -3.00284956735113e-01 + 4.50000000000000e+01 9.15005912938840e-01 7.28313277731023e-01 -3.14934033957096e-01 + 4.80000000000000e+01 8.81556716458514e-01 8.03911609903610e-01 -3.28999148408511e-01 + 5.10000000000000e+01 8.43945459545643e-01 8.77985655340274e-01 -3.42814120520528e-01 + 5.40000000000000e+01 7.98009814198267e-01 9.49011029312154e-01 -3.56128791872664e-01 + 5.70000000000000e+01 7.52074119773438e-01 1.02003546069401e+00 -3.69443361508008e-01 + 6.00000000000000e+01 7.06138400810069e-01 1.09105942078444e+00 -3.82757880285344e-01 + 6.30000000000000e+01 6.44352607936286e-01 1.14892683750823e+00 -3.94831155449636e-01 + 6.60000000000000e+01 5.82566479201223e-01 1.20679414145955e+00 -4.06904419974219e-01 + 6.90000000000000e+01 5.20779950464649e-01 1.26466144541088e+00 -4.18977684498238e-01 + 7.20000000000000e+01 4.51477437795751e-01 1.30909620656510e+00 -4.29844047643928e-01 + 7.50000000000000e+01 3.78417087022892e-01 1.34681497130280e+00 -4.40106984807332e-01 + 7.80000000000000e+01 3.05355899035943e-01 1.38453416826749e+00 -4.50369439573171e-01 + 8.10000000000000e+01 2.30983768185259e-01 1.41401808234901e+00 -4.59788640889162e-01 + 8.40000000000000e+01 1.53989842100278e-01 1.42703199912486e+00 -4.67521393514335e-01 + 8.70000000000000e+01 7.69949278241990e-02 1.44004601531985e+00 -4.75253805212904e-01 + 9.00000000000000e+01 -3.36381510214729e-07 1.45305991877594e+00 -4.82986020891325e-01 + 9.30000000000000e+01 -5.38962046405121e-02 1.44004600200010e+00 -4.86623800258682e-01 + 9.60000000000000e+01 -1.07792278764948e-01 1.42703203551508e+00 -4.90261391797100e-01 + 9.90000000000000e+01 -1.61688764627702e-01 1.41401796960994e+00 -4.93898611078009e-01 + 1.02000000000000e+02 -2.13749237020859e-01 1.38453398558587e+00 -4.94263399100741e-01 + 1.05000000000000e+02 -2.64891722560637e-01 1.34681522084817e+00 -4.92992006930170e-01 + 1.08000000000000e+02 -3.16034194150131e-01 1.30909602388533e+00 -4.91720002039579e-01 + 1.11000000000000e+02 -3.64545860001904e-01 1.26466094411154e+00 -4.89201398052675e-01 + 1.14000000000000e+02 -4.07795994504977e-01 1.20679430326659e+00 -4.84189631673154e-01 + 1.17000000000000e+02 -4.51046459413193e-01 1.14892722035528e+00 -4.79177427008757e-01 + 1.20000000000000e+02 -4.94297067830864e-01 1.09105989067524e+00 -4.74164999771467e-01 + 1.23000000000000e+02 -5.26452071104699e-01 1.02003593058481e+00 -4.67401844027926e-01 + 1.26000000000000e+02 -5.58606997203396e-01 9.49011499212308e-01 -4.60638662451069e-01 + 1.29000000000000e+02 -5.90761768946045e-01 8.77986125240427e-01 -4.53875428596403e-01 + 1.32000000000000e+02 -6.15420495447981e-01 8.03908732446007e-01 -4.47922999380913e-01 + 1.35000000000000e+02 -6.36331208215415e-01 7.28305333867222e-01 -4.42375971721764e-01 + 1.38000000000000e+02 -6.57241681367618e-01 6.52702801625276e-01 -4.36828407635875e-01 + 1.41000000000000e+02 -6.76094629416376e-01 5.78615784400164e-01 -4.33407828184422e-01 + 1.44000000000000e+02 -6.90832510562523e-01 5.07559809506317e-01 -4.34241235261194e-01 + 1.47000000000000e+02 -7.05570279118452e-01 4.36504377442686e-01 -4.35074635971279e-01 + 1.50000000000000e+02 -7.20307991381284e-01 3.65449216784472e-01 -4.35908033498135e-01 + 1.53000000000000e+02 -7.46801056114916e-01 3.07518286202364e-01 -4.57805090339867e-01 + 1.56000000000000e+02 -7.73294047043302e-01 2.49587407482254e-01 -4.79701903131578e-01 + 1.59000000000000e+02 -7.99786835582591e-01 1.91656571320831e-01 -5.01598162643685e-01 + 1.62000000000000e+02 -7.40790686340429e-01 1.53560875453361e-01 -5.07117800599876e-01 + 1.65000000000000e+02 -6.39049345205277e-01 1.25382917483086e-01 -5.04448986449598e-01 + 1.68000000000000e+02 -5.37308569933658e-01 9.72046824115369e-02 -5.01779602888075e-01 + 1.71000000000000e+02 -4.22533354527340e-01 7.05773220395183e-02 -4.50000513056908e-01 + 1.74000000000000e+02 -2.81688650312917e-01 4.70517834722228e-02 -2.99999717902353e-01 + 1.77000000000000e+02 -1.40202209005507e-01 3.86002803503690e-02 -6.87687043373218e-02 + 1.80000000000000e+02 0.00000000000000e+00 3.76960235595695e-02 1.99999773877240e-01 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_27.dat b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_27.dat new file mode 100644 index 000000000..e92595fbc --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_27.dat @@ -0,0 +1,254 @@ +! ------------ AirfoilInfo v1.01.x Input File ---------------------------------- +! AeroElasticSE FAST driver +! line +! line +! ------------------------------------------------------------------------------ +DEFAULT InterpOrd ! Interpolation order to use for quasi-steady table lookup {1=linear; 3=cubic spline; "default"} [default=3] +1 NonDimArea ! The non-dimensional area of the airfoil (area/chord^2) (set to 1.0 if unsure or unneeded) +@"NREL-2p8-127_AF27_Coords.txt" NumCoords ! The number of coordinates in the airfoil shape file. Set to zero if coordinates not included. +AF27_BL.txt BL_file ! The file name including the boundary layer characteristics of the profile. Ignored if the aeroacoustic module is not called. +1 NumTabs ! Number of airfoil tables in this file. Each table must have lines for Re and Ctrl. +! ------------------------------------------------------------------------------ +! data for table 1 +! ------------------------------------------------------------------------------ +6.000000 Re ! Reynolds number in millions +0 Ctrl ! Control setting (must be 0 for current AirfoilInfo) +True InclUAdata ! Is unsteady aerodynamics data included in this table? If TRUE, then include 30 UA coefficients below this line +!........................................ +-4.024505 alpha0 ! 0-lift angle of attack, depends on airfoil. +11.306884 alpha1 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA>alpha0. (deg) +-9.832557 alpha2 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA1] +0.000000 S2 ! Constant in the f curve best-fit for AOA> alpha1; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S3 ! Constant in the f curve best-fit for alpha2<=AOA< alpha0; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S4 ! Constant in the f curve best-fit for AOA< alpha2; by definition it depends on the airfoil. [ignored if UAMod<>1] +1.557235 Cn1 ! Critical value of C0n at leading edge separation. It should be extracted from airfoil data at a given Mach and Reynolds number. It can be calculated from the static value of Cn at either the break in the pitching moment or the loss of chord force at the onset of stall. It is close to the condition of maximum lift of the airfoil at low Mach numbers. +-0.830241 Cn2 ! As Cn1 for negative AOAs. +Default St_sh ! Strouhal's shedding frequency constant. [default = 0.19] +0.006417 Cd0 ! 2D drag coefficient value at 0-lift. +-0.112920 Cm0 ! 2D pitching moment coefficient about 1/4-chord location, at 0-lift, positive if nose up. [If the aerodynamics coefficients table does not include a column for Cm, this needs to be set to 0.0] +0.000000 k0 ! Constant in the \hat(x)_cp curve best-fit; = (\hat(x)_AC-0.25). [ignored if UAMod<>1] +0.000000 k1 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k2 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k3 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k1_hat ! Constant in the expression of Cc due to leading edge vortex effects. [ignored if UAMod<>1] +Default x_cp_bar ! Constant in the expression of \hat(x)_cp^v. [ignored if UAMod<>1, default = 0.2] +Default UACutout ! Angle of attack above which unsteady aerodynamics are disabled (deg). [Specifying the string "Default" sets UACutout to 45 degrees] +Default filtCutOff ! Cut-off frequency (-3 dB corner frequency) for low-pass filtering the AoA input to UA, as well as the 1st and 2nd derivatives (Hz) [default = 20] +!........................................ +! Table of aerodynamics coefficients +200 NumAlf ! Number of data lines in the following table +! Alpha Cl Cd Cm +! (deg) (-) (-) (-) +-1.80000000000000e+02 0.00000000000000e+00 3.76960000000000e-02 2.00000000000000e-01 +-1.77000000000000e+02 1.49471782056503e-01 3.76960000000000e-02 2.00000000000000e-01 +-1.74000000000000e+02 3.00312917607843e-01 4.52351574641884e-02 2.39999774321882e-01 +-1.71000000000000e+02 4.50470313592540e-01 6.78528773607728e-02 3.60000410445527e-01 +-1.68000000000000e+02 5.62141300000530e-01 9.47828314689296e-02 3.00100237874998e-01 +-1.65000000000000e+02 6.54569530813285e-01 1.23868852352745e-01 1.50251760664942e-01 +-1.62000000000000e+02 7.46998820775784e-01 1.52955206537882e-01 4.01566317437541e-04 +-1.59000000000000e+02 7.99786954801670e-01 1.91656498833410e-01 -9.28123657821359e-02 +-1.56000000000000e+02 7.73294117948629e-01 2.49587342086377e-01 -7.27556892942309e-02 +-1.53000000000000e+02 7.46801078706125e-01 3.07518227898197e-01 -5.26992595835046e-02 +-1.50000000000000e+02 7.20307965658325e-01 3.65449165572087e-01 -3.26429649313102e-02 +-1.47000000000000e+02 7.05570256415403e-01 4.36504328003481e-01 -1.75932576097200e-02 +-1.44000000000000e+02 6.90832490879619e-01 5.07559761840581e-01 -2.54349280354572e-03 +-1.41000000000000e+02 6.76094612754094e-01 5.78615738508475e-01 1.25063869759013e-02 +-1.38000000000000e+02 6.57241666993606e-01 6.52702757782292e-01 2.78005506087711e-02 +-1.35000000000000e+02 6.36331195763501e-01 7.28305292210269e-01 4.32168556727960e-02 +-1.32000000000000e+02 6.15420484918018e-01 8.03908692975958e-01 5.86333373939468e-02 +-1.29000000000000e+02 5.90761760127430e-01 8.77986088072914e-01 7.42048196933640e-02 +-1.26000000000000e+02 5.58606989674918e-01 9.49011464578596e-01 9.00863038811478e-02 +-1.23000000000000e+02 5.26452064865786e-01 1.02003589848443e+00 1.05968066745086e-01 +-1.20000000000000e+02 4.94297062881228e-01 1.09105986110795e+00 1.21849968941892e-01 +-1.17000000000000e+02 4.51046455307775e-01 1.14892719359139e+00 1.36973650595308e-01 +-1.14000000000000e+02 4.07795991243718e-01 1.20679427930608e+00 1.52097072994036e-01 +-1.11000000000000e+02 3.64545857584686e-01 1.26466092295440e+00 1.67219979864852e-01 +-1.08000000000000e+02 3.16034192336304e-01 1.30909600565222e+00 1.80733001904303e-01 +-1.05000000000000e+02 2.64891721229873e-01 1.34681520559943e+00 1.93441069265733e-01 +-1.02000000000000e+02 2.13749236173153e-01 1.38453397332146e+00 2.06148391012093e-01 +-9.90000000000000e+01 1.61688764154489e-01 1.41401796036258e+00 2.17512373571396e-01 +-9.60000000000000e+01 1.07792278449096e-01 1.42703202935019e+00 2.26189619569497e-01 +-9.30000000000000e+01 5.38962044824732e-02 1.44004599891764e+00 2.34866399278379e-01 +-9.00000000000000e+01 3.36381508994621e-07 1.45305991877593e+00 2.43542945846872e-01 +-8.70000000000000e+01 -5.38961493200293e-02 1.44004601223740e+00 2.47180796579284e-01 +-8.40000000000000e+01 -1.07792429155678e-01 1.42703199295995e+00 2.50818601967904e-01 +-8.10000000000000e+01 -1.61688297256642e-01 1.41401807310167e+00 2.54456379565910e-01 +-7.80000000000000e+01 -2.13748988477021e-01 1.38453415600310e+00 2.54821405258420e-01 +-7.50000000000000e+01 -2.64892059585176e-01 1.34681495605404e+00 2.53549998518008e-01 +-7.20000000000000e+01 -3.16033944645590e-01 1.30909618833200e+00 2.52278006351131e-01 +-6.90000000000000e+01 -3.64545482908305e-01 1.26466142425377e+00 2.49759236748571e-01 +-6.60000000000000e+01 -4.07796112179989e-01 1.20679411749904e+00 2.44746810177687e-01 +-6.30000000000000e+01 -4.51046741451673e-01 1.14892681074432e+00 2.39734383606802e-01 +-6.00000000000000e+01 -4.94297275617037e-01 1.09105939121714e+00 2.34721942034639e-01 +-5.70000000000000e+01 -5.26452277601595e-01 1.02003542859361e+00 2.27959383679512e-01 +-5.40000000000000e+01 -5.58607202409195e-01 9.49010994678426e-01 2.21196599493265e-01 +-5.10000000000000e+01 -5.90761972861707e-01 8.77985618172743e-01 2.14433363641336e-01 +-4.80000000000000e+01 -6.17089671120620e-01 8.03911570370645e-01 2.07956980763680e-01 +-4.50000000000000e+01 -6.40503926932036e-01 7.28313235916803e-01 2.01624019763027e-01 +-4.20000000000000e+01 -6.58910840133311e-01 6.52705635149657e-01 1.96862389618034e-01 +-3.90000000000000e+01 -6.76417027511146e-01 5.77527369809482e-01 1.92714494884031e-01 +-3.60000000000000e+01 -6.91442126694186e-01 5.04059360049167e-01 1.90773003374389e-01 +-3.30000000000000e+01 -7.05593958510807e-01 4.33318703053973e-01 1.91908992233939e-01 +-3.00000000000000e+01 -7.20308071684859e-01 3.65448723816258e-01 1.96465039072780e-01 +-2.93939393939394e+01 -7.23687122424702e-01 3.52430090699486e-01 1.98306835359819e-01 +-2.87878787878788e+01 -7.27066173164544e-01 3.39411457582714e-01 2.00148631646857e-01 +-2.81818181818182e+01 -7.30445223904387e-01 3.26392824465942e-01 2.01990427933895e-01 +-2.75757575757576e+01 -7.34244974993610e-01 3.13793078035017e-01 2.04486437101527e-01 +-2.69696969696970e+01 -7.38225041700157e-01 3.01372869870364e-01 2.07262847270964e-01 +-2.63636363636364e+01 -7.42205108406705e-01 2.88952661705710e-01 2.10039257440401e-01 +-2.57575757575758e+01 -7.46555462653963e-01 2.76796374908870e-01 2.13304160376248e-01 +-2.51515151515151e+01 -7.51461161912085e-01 2.65035908653530e-01 2.17301688612281e-01 +-2.45454545454545e+01 -7.56366861170206e-01 2.53275442398190e-01 2.21299216848314e-01 +-2.39393939393939e+01 -7.61408677387006e-01 2.41586670872199e-01 2.25459952105595e-01 +-2.33333333333333e+01 -7.67675572584808e-01 2.30543165790786e-01 2.31089582151761e-01 +-2.27272727272727e+01 -7.73942467782610e-01 2.19499660709374e-01 2.36719212197927e-01 +-2.21212121212121e+01 -7.80209362980412e-01 2.08456155627962e-01 2.42348842244093e-01 +-2.15151515151515e+01 -7.88045801889462e-01 1.98028860914946e-01 2.49772963288095e-01 +-2.09090909090909e+01 -7.96274727686348e-01 1.87755658431417e-01 2.57645822511188e-01 +-2.03030303030303e+01 -8.04503653483233e-01 1.77482455947888e-01 2.65518681734281e-01 +-1.96969696969697e+01 -8.13721563222721e-01 1.67514267203666e-01 2.74509167058282e-01 +-1.90909090909091e+01 -8.23928400957602e-01 1.57851074944005e-01 2.84617215258648e-01 +-1.84848484848485e+01 -8.22646763588942e-01 1.48546901850923e-01 2.82973548468764e-01 +-1.78787878787879e+01 -8.19241173382965e-01 1.39555143470384e-01 2.78335696038153e-01 +-1.72727272727273e+01 -8.15446564330172e-01 1.31559857952983e-01 2.70013132308244e-01 +-1.66666666666667e+01 -8.03296442896411e-01 1.23564572435581e-01 2.53038383173389e-01 +-1.60606060606061e+01 -7.84310064075638e-01 1.15569286918180e-01 2.28984646695628e-01 +-1.54545454545455e+01 -7.65324664303493e-01 1.07574959135167e-01 2.04931605118311e-01 +-1.48484848484848e+01 -7.46338949873589e-01 9.95804717419686e-02 1.80878447733115e-01 +-1.42424242424242e+01 -7.27351964982053e-01 9.15851862245671e-02 1.56824711255353e-01 +-1.36363636363636e+01 -7.08366360011050e-01 8.35901755495681e-02 1.32771801638210e-01 +-1.30303030303030e+01 -6.89379049576426e-01 7.55946380877238e-02 1.08716367776058e-01 +-1.24242424242424e+01 -6.70393771825338e-01 6.75996503421813e-02 8.46634665540094e-02 +-1.18181818181818e+01 -6.51406715493019e-01 5.96041815994351e-02 6.06091788446317e-02 +-1.12121212121212e+01 -6.32421454753742e-01 5.16093541595814e-02 3.65562447387649e-02 +-1.06060606060606e+01 -6.13434931389144e-01 4.36139312036515e-02 1.25016705283901e-02 +-1.00000000000000e+01 -5.94448865749824e-01 3.56199434645880e-02 -1.15511700947924e-02 +-9.39393939393939e+00 -5.75463587974779e-01 2.76249557125666e-02 -3.56050107398163e-02 +-8.78787878787879e+00 -5.51403736673166e-01 2.01382292840361e-02 -5.87079533337773e-02 +-8.18181818181818e+00 -5.17926305822838e-01 1.35966762681340e-02 -8.00434824257992e-02 +-7.57575757575758e+00 -4.48012922709353e-01 1.04062079021576e-02 -9.38202376741164e-02 +-6.96969696969697e+00 -3.62306556115099e-01 8.91516259682331e-03 -1.02639375733790e-01 +-6.36363636363636e+00 -2.86592508663283e-01 7.49091941073086e-03 -1.05345402946346e-01 +-5.75757575757576e+00 -2.11681301136276e-01 7.05454293237208e-03 -1.07624256716558e-01 +-5.15151515151515e+00 -1.37278254009080e-01 6.76061420557612e-03 -1.09615086355391e-01 +-4.54545454545454e+00 -6.32445813538124e-02 6.51817895525840e-03 -1.11463657835562e-01 +-3.93939393939394e+00 1.03326972358679e-02 6.40000000000000e-03 -1.13157562089366e-01 +-3.33333333333333e+00 8.37358252318253e-02 6.36666256139732e-03 -1.14700049263232e-01 +-2.72727272727273e+00 1.57144966549608e-01 6.30000000000000e-03 -1.16209080405869e-01 +-2.12121212121212e+00 2.30132082000148e-01 6.30000000000000e-03 -1.17633365893514e-01 +-1.51515151515152e+00 3.03270194866406e-01 6.30000000000000e-03 -1.18966675734322e-01 +-9.09090909090912e-01 3.76007887483945e-01 6.30000000000000e-03 -1.20399977937206e-01 +-3.03030303030302e-01 4.48619648411214e-01 6.33939639599868e-03 -1.21733360355986e-01 + 3.03030303030302e-01 5.21162162400790e-01 6.40000000000000e-03 -1.23066639644014e-01 + 9.09090909090912e-01 5.93483011578421e-01 6.40000000000000e-03 -1.24318201875268e-01 + 1.51515151515152e+00 6.65499510346614e-01 6.50000000000000e-03 -1.25430294786980e-01 + 2.12121212121212e+00 7.37449762821818e-01 6.52423946422604e-03 -1.26642394642260e-01 + 2.72727272727273e+00 8.08982292442682e-01 6.64545535339469e-03 -1.27809098180552e-01 + 3.33333333333333e+00 8.80397573785818e-01 6.76666256139732e-03 -1.28833300491179e-01 + 3.93939393939394e+00 9.51421826139261e-01 6.88787983927956e-03 -1.29890918553516e-01 + 4.54545454545455e+00 1.02186280754731e+00 7.00908947762920e-03 -1.30763626343404e-01 + 5.15151515151515e+00 1.09189627700035e+00 7.16061420557612e-03 -1.31612149719516e-01 + 5.75757575757576e+00 1.16079952835358e+00 7.45454293237208e-03 -1.32306057243163e-01 + 6.36363636363637e+00 1.22720139059598e+00 7.96364926341358e-03 -1.32572729852683e-01 + 6.96969696969697e+00 1.28802463107430e+00 8.94546166938641e-03 -1.32130299072563e-01 + 7.57575757575757e+00 1.33932330958836e+00 1.07272369407300e-02 -1.30081868282978e-01 + 8.18181818181818e+00 1.38679186165234e+00 1.25091248425769e-02 -1.27572678796319e-01 + 8.78787878787879e+00 1.43442629439737e+00 1.40333059500537e-02 -1.25090961368079e-01 + 9.39393939393939e+00 1.48072485366775e+00 1.53666845487907e-02 -1.22230262389112e-01 + 1.00000000000000e+01 1.51619976429293e+00 1.64999922859505e-02 -1.21700000000000e-01 + 1.06060606060606e+01 1.54652659135150e+00 1.81605492792916e-02 -1.21700000000000e-01 + 1.12121212121212e+01 1.57015165312925e+00 2.03485003516014e-02 -1.21912125087900e-01 + 1.18181818181818e+01 1.58466335911404e+00 3.00903504536651e-02 -1.23218115609323e-01 + 1.24242424242424e+01 1.55439065028940e+00 4.64546360854226e-02 -1.25157586499013e-01 + 1.30303030303030e+01 1.50697060273102e+00 6.28179372626244e-02 -1.27096940712607e-01 + 1.36363636363636e+01 1.44636161651328e+00 7.91823635414146e-02 -1.29036428271575e-01 + 1.42424242424242e+01 1.39302963646758e+00 9.22728558241098e-02 -1.30587894023598e-01 + 1.48484848484848e+01 1.35060468299441e+00 1.00454811136793e-01 -1.31557607245842e-01 + 1.54545454545455e+01 1.32181803006545e+00 1.08636414852911e-01 -1.32527278797382e-01 + 1.60606060606061e+01 1.29757644961134e+00 1.16817948256172e-01 -1.33496942015546e-01 + 1.66666666666667e+01 1.27333361905524e+00 1.24999903568856e-01 -1.34466655237790e-01 + 1.72727272727273e+01 1.24363618274871e+00 1.33181858881539e-01 -1.35436368460034e-01 + 1.78787878787879e+01 1.20727193691457e+00 1.41363814194223e-01 -1.36406081682278e-01 + 1.84848484848485e+01 1.18992978938591e+00 1.49497879761678e-01 -1.37375750456550e-01 + 1.90909090909091e+01 1.17704330010331e+00 1.57851074944005e-01 -1.39089585145003e-01 + 1.96969696969697e+01 1.16246123752382e+00 1.67514267203666e-01 -1.45021805782080e-01 + 2.03030303030303e+01 1.14929279501435e+00 1.77482455947888e-01 -1.51632351934001e-01 + 2.09090909090909e+01 1.13753805254846e+00 1.87755658431417e-01 -1.58921261976074e-01 + 2.15151515151515e+01 1.12578331008257e+00 1.98028860914946e-01 -1.66210172018147e-01 + 2.21212121212121e+01 1.11458874358451e+00 2.08456155627962e-01 -1.73224623443957e-01 + 2.27272727272727e+01 1.10563430457793e+00 2.19499660709374e-01 -1.79141522802416e-01 + 2.33333333333333e+01 1.09667986557135e+00 2.30543165790786e-01 -1.85058422160874e-01 + 2.39393939393939e+01 1.08772542656477e+00 2.41586670872199e-01 -1.90975321519332e-01 + 2.45454545454545e+01 1.08052187960139e+00 2.53275442398190e-01 -1.96074592475065e-01 + 2.51515151515151e+01 1.07351287201350e+00 2.65035908653530e-01 -2.01083017784734e-01 + 2.57575757575758e+01 1.06650386442561e+00 2.76796374908870e-01 -2.06091443094404e-01 + 2.63636363636364e+01 1.06028924575223e+00 2.88952661705710e-01 -2.10729607665482e-01 + 2.69696969696970e+01 1.05460430198682e+00 3.01372869870364e-01 -2.15120893385337e-01 + 2.75757575757576e+01 1.04891935822142e+00 3.13793078035017e-01 -2.19512179105193e-01 + 2.81818181818182e+01 1.04349174843484e+00 3.26392824465942e-01 -2.23774966350859e-01 + 2.87878787878788e+01 1.03866453309221e+00 3.39411457582714e-01 -2.27737949543009e-01 + 2.93939393939394e+01 1.03383731774957e+00 3.52430090699486e-01 -2.31700932735158e-01 + 3.00000000000000e+01 1.02901010240694e+00 3.65448723816258e-01 -2.35663915927308e-01 + 3.30000000000000e+01 1.00799494072346e+00 4.33318703053973e-01 -2.53423049843193e-01 + 3.60000000000000e+01 9.87774181033947e-01 5.04059360049167e-01 -2.69936854350083e-01 + 3.90000000000000e+01 9.66310039303889e-01 5.77527369809482e-01 -2.85448473353340e-01 + 4.20000000000000e+01 9.41301057332367e-01 6.52705635149657e-01 -3.00284968060017e-01 + 4.50000000000000e+01 9.15005895616392e-01 7.28313235916803e-01 -3.14934043892456e-01 + 4.80000000000000e+01 8.81556701601667e-01 8.03911570370646e-01 -3.28999157277327e-01 + 5.10000000000000e+01 8.43945446946677e-01 8.77985618172744e-01 -3.42814128421300e-01 + 5.40000000000000e+01 7.98009803441727e-01 9.49010994678426e-01 -3.56128799002399e-01 + 5.70000000000000e+01 7.52074110859421e-01 1.02003542859361e+00 -3.69443367867275e-01 + 6.00000000000000e+01 7.06138393738624e-01 1.09105939121714e+00 -3.82757885874428e-01 + 6.30000000000000e+01 6.44352602071576e-01 1.14892681074432e+00 -3.94831160514253e-01 + 6.60000000000000e+01 5.82566474543015e-01 1.20679411749904e+00 -4.06904424514653e-01 + 6.90000000000000e+01 5.20779947012492e-01 1.26466142425377e+00 -4.18977688515053e-01 + 7.20000000000000e+01 4.51477435205418e-01 1.30909618833200e+00 -4.29844051243441e-01 + 7.50000000000000e+01 3.78417085122278e-01 1.34681495605404e+00 -4.40106988042700e-01 + 7.80000000000000e+01 3.05355897825734e-01 1.38453415600310e+00 -4.50369442444556e-01 + 8.10000000000000e+01 2.30983767510451e-01 1.41401807310167e+00 -4.59788643436343e-01 + 8.40000000000000e+01 1.53989841650875e-01 1.42703199295995e+00 -4.67521395816866e-01 + 8.70000000000000e+01 7.69949275996385e-02 1.44004601223740e+00 -4.75253807270785e-01 + 9.00000000000000e+01 -3.36381509228363e-07 1.45305991877593e+00 -4.82986022704544e-01 + 9.30000000000000e+01 -5.38962044824732e-02 1.44004599891764e+00 -4.86623800302551e-01 + 9.60000000000000e+01 -1.07792278449097e-01 1.42703202935019e+00 -4.90261391797104e-01 + 9.90000000000000e+01 -1.61688764154490e-01 1.41401796036258e+00 -4.93898611078011e-01 + 1.02000000000000e+02 -2.13749236173153e-01 1.38453397332146e+00 -4.94263399100743e-01 + 1.05000000000000e+02 -2.64891721229873e-01 1.34681520559943e+00 -4.92992006930171e-01 + 1.08000000000000e+02 -3.16034192336304e-01 1.30909600565222e+00 -4.91720000190610e-01 + 1.11000000000000e+02 -3.64545857584686e-01 1.26466092295440e+00 -4.89201393327162e-01 + 1.14000000000000e+02 -4.07795991243718e-01 1.20679427930608e+00 -4.84189624190406e-01 + 1.17000000000000e+02 -4.51046455307775e-01 1.14892719359139e+00 -4.79177416768754e-01 + 1.20000000000000e+02 -4.94297062881228e-01 1.09105986110795e+00 -4.74164986774198e-01 + 1.23000000000000e+02 -5.26452064865786e-01 1.02003589848443e+00 -4.67401828422766e-01 + 1.26000000000000e+02 -5.58606989674918e-01 9.49011464578596e-01 -4.60638644238479e-01 + 1.29000000000000e+02 -5.90761760127430e-01 8.77986088072913e-01 -4.53875408386550e-01 + 1.32000000000000e+02 -6.15420484918018e-01 8.03908692975958e-01 -4.47922977473614e-01 + 1.35000000000000e+02 -6.36331195763501e-01 7.28305292210269e-01 -4.42375948063776e-01 + 1.38000000000000e+02 -6.57241666993606e-01 6.52702757782291e-01 -4.36828382226539e-01 + 1.41000000000000e+02 -6.76094612754094e-01 5.78615738508474e-01 -4.33407800721224e-01 + 1.44000000000000e+02 -6.90832490879619e-01 5.07559761840581e-01 -4.34241205139103e-01 + 1.47000000000000e+02 -7.05570256415403e-01 4.36504328003481e-01 -4.35074603190205e-01 + 1.50000000000000e+02 -7.20307965658325e-01 3.65449165572087e-01 -4.35907998058031e-01 + 1.53000000000000e+02 -7.46801078706125e-01 3.07518227898197e-01 -4.57805065052203e-01 + 1.56000000000000e+02 -7.73294117948629e-01 2.49587342086377e-01 -4.79701897484255e-01 + 1.59000000000000e+02 -7.99786954801670e-01 1.91656498833410e-01 -5.01598162643690e-01 + 1.62000000000000e+02 -7.40790822868899e-01 1.53560806333696e-01 -5.07117800599882e-01 + 1.65000000000000e+02 -6.39049483540701e-01 1.25382856960915e-01 -5.04448986449602e-01 + 1.68000000000000e+02 -5.37308710076014e-01 9.72046304867630e-02 -5.01779602888076e-01 + 1.71000000000000e+02 -4.22533481739914e-01 7.05772804657932e-02 -4.50000513056908e-01 + 1.74000000000000e+02 -2.81688735121593e-01 4.70517557569334e-02 -2.99999717902353e-01 + 1.77000000000000e+02 -1.40202251216632e-01 3.86002570677554e-02 -6.87686132694523e-02 + 1.80000000000000e+02 0.00000000000000e+00 3.76960000000000e-02 2.00000000000000e-01 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_28.dat b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_28.dat new file mode 100644 index 000000000..1adeee568 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_28.dat @@ -0,0 +1,254 @@ +! ------------ AirfoilInfo v1.01.x Input File ---------------------------------- +! AeroElasticSE FAST driver +! line +! line +! ------------------------------------------------------------------------------ +DEFAULT InterpOrd ! Interpolation order to use for quasi-steady table lookup {1=linear; 3=cubic spline; "default"} [default=3] +1 NonDimArea ! The non-dimensional area of the airfoil (area/chord^2) (set to 1.0 if unsure or unneeded) +@"NREL-2p8-127_AF28_Coords.txt" NumCoords ! The number of coordinates in the airfoil shape file. Set to zero if coordinates not included. +AF28_BL.txt BL_file ! The file name including the boundary layer characteristics of the profile. Ignored if the aeroacoustic module is not called. +1 NumTabs ! Number of airfoil tables in this file. Each table must have lines for Re and Ctrl. +! ------------------------------------------------------------------------------ +! data for table 1 +! ------------------------------------------------------------------------------ +6.000000 Re ! Reynolds number in millions +0 Ctrl ! Control setting (must be 0 for current AirfoilInfo) +True InclUAdata ! Is unsteady aerodynamics data included in this table? If TRUE, then include 30 UA coefficients below this line +!........................................ +-4.024505 alpha0 ! 0-lift angle of attack, depends on airfoil. +11.306884 alpha1 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA>alpha0. (deg) +-9.832557 alpha2 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA1] +0.000000 S2 ! Constant in the f curve best-fit for AOA> alpha1; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S3 ! Constant in the f curve best-fit for alpha2<=AOA< alpha0; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S4 ! Constant in the f curve best-fit for AOA< alpha2; by definition it depends on the airfoil. [ignored if UAMod<>1] +1.557235 Cn1 ! Critical value of C0n at leading edge separation. It should be extracted from airfoil data at a given Mach and Reynolds number. It can be calculated from the static value of Cn at either the break in the pitching moment or the loss of chord force at the onset of stall. It is close to the condition of maximum lift of the airfoil at low Mach numbers. +-0.830241 Cn2 ! As Cn1 for negative AOAs. +Default St_sh ! Strouhal's shedding frequency constant. [default = 0.19] +0.006417 Cd0 ! 2D drag coefficient value at 0-lift. +-0.112920 Cm0 ! 2D pitching moment coefficient about 1/4-chord location, at 0-lift, positive if nose up. [If the aerodynamics coefficients table does not include a column for Cm, this needs to be set to 0.0] +0.000000 k0 ! Constant in the \hat(x)_cp curve best-fit; = (\hat(x)_AC-0.25). [ignored if UAMod<>1] +0.000000 k1 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k2 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k3 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k1_hat ! Constant in the expression of Cc due to leading edge vortex effects. [ignored if UAMod<>1] +Default x_cp_bar ! Constant in the expression of \hat(x)_cp^v. [ignored if UAMod<>1, default = 0.2] +Default UACutout ! Angle of attack above which unsteady aerodynamics are disabled (deg). [Specifying the string "Default" sets UACutout to 45 degrees] +Default filtCutOff ! Cut-off frequency (-3 dB corner frequency) for low-pass filtering the AoA input to UA, as well as the 1st and 2nd derivatives (Hz) [default = 20] +!........................................ +! Table of aerodynamics coefficients +200 NumAlf ! Number of data lines in the following table +! Alpha Cl Cd Cm +! (deg) (-) (-) (-) +-1.80000000000000e+02 0.00000000000000e+00 3.76960000000000e-02 2.00000000000000e-01 +-1.77000000000000e+02 1.49471782056503e-01 3.76960000000000e-02 2.00000000000000e-01 +-1.74000000000000e+02 3.00312917607843e-01 4.52351574641884e-02 2.39999774321882e-01 +-1.71000000000000e+02 4.50470313592540e-01 6.78528773607728e-02 3.60000410445527e-01 +-1.68000000000000e+02 5.62141300000530e-01 9.47828314689296e-02 3.00100237874998e-01 +-1.65000000000000e+02 6.54569530813285e-01 1.23868852352745e-01 1.50251760664942e-01 +-1.62000000000000e+02 7.46998820775784e-01 1.52955206537882e-01 4.01566317437541e-04 +-1.59000000000000e+02 7.99786954801670e-01 1.91656498833410e-01 -9.28123657821359e-02 +-1.56000000000000e+02 7.73294117948629e-01 2.49587342086377e-01 -7.27556892942309e-02 +-1.53000000000000e+02 7.46801078706125e-01 3.07518227898197e-01 -5.26992595835046e-02 +-1.50000000000000e+02 7.20307965658325e-01 3.65449165572087e-01 -3.26429649313102e-02 +-1.47000000000000e+02 7.05570256415403e-01 4.36504328003481e-01 -1.75932576097200e-02 +-1.44000000000000e+02 6.90832490879619e-01 5.07559761840581e-01 -2.54349280354572e-03 +-1.41000000000000e+02 6.76094612754094e-01 5.78615738508475e-01 1.25063869759013e-02 +-1.38000000000000e+02 6.57241666993606e-01 6.52702757782292e-01 2.78005506087711e-02 +-1.35000000000000e+02 6.36331195763501e-01 7.28305292210269e-01 4.32168556727960e-02 +-1.32000000000000e+02 6.15420484918018e-01 8.03908692975958e-01 5.86333373939468e-02 +-1.29000000000000e+02 5.90761760127430e-01 8.77986088072914e-01 7.42048196933640e-02 +-1.26000000000000e+02 5.58606989674918e-01 9.49011464578596e-01 9.00863038811478e-02 +-1.23000000000000e+02 5.26452064865786e-01 1.02003589848443e+00 1.05968066745086e-01 +-1.20000000000000e+02 4.94297062881228e-01 1.09105986110795e+00 1.21849968941892e-01 +-1.17000000000000e+02 4.51046455307775e-01 1.14892719359139e+00 1.36973650595308e-01 +-1.14000000000000e+02 4.07795991243718e-01 1.20679427930608e+00 1.52097072994036e-01 +-1.11000000000000e+02 3.64545857584686e-01 1.26466092295440e+00 1.67219979864852e-01 +-1.08000000000000e+02 3.16034192336304e-01 1.30909600565222e+00 1.80733001904303e-01 +-1.05000000000000e+02 2.64891721229873e-01 1.34681520559943e+00 1.93441069265733e-01 +-1.02000000000000e+02 2.13749236173153e-01 1.38453397332146e+00 2.06148391012093e-01 +-9.90000000000000e+01 1.61688764154489e-01 1.41401796036258e+00 2.17512373571396e-01 +-9.60000000000000e+01 1.07792278449096e-01 1.42703202935019e+00 2.26189619569497e-01 +-9.30000000000000e+01 5.38962044824732e-02 1.44004599891764e+00 2.34866399278379e-01 +-9.00000000000000e+01 3.36381508994621e-07 1.45305991877593e+00 2.43542945846872e-01 +-8.70000000000000e+01 -5.38961493200293e-02 1.44004601223740e+00 2.47180796579284e-01 +-8.40000000000000e+01 -1.07792429155678e-01 1.42703199295995e+00 2.50818601967904e-01 +-8.10000000000000e+01 -1.61688297256642e-01 1.41401807310167e+00 2.54456379565910e-01 +-7.80000000000000e+01 -2.13748988477021e-01 1.38453415600310e+00 2.54821405258420e-01 +-7.50000000000000e+01 -2.64892059585176e-01 1.34681495605404e+00 2.53549998518008e-01 +-7.20000000000000e+01 -3.16033944645590e-01 1.30909618833200e+00 2.52278006351131e-01 +-6.90000000000000e+01 -3.64545482908305e-01 1.26466142425377e+00 2.49759236748571e-01 +-6.60000000000000e+01 -4.07796112179989e-01 1.20679411749904e+00 2.44746810177687e-01 +-6.30000000000000e+01 -4.51046741451673e-01 1.14892681074432e+00 2.39734383606802e-01 +-6.00000000000000e+01 -4.94297275617037e-01 1.09105939121714e+00 2.34721942034639e-01 +-5.70000000000000e+01 -5.26452277601595e-01 1.02003542859361e+00 2.27959383679512e-01 +-5.40000000000000e+01 -5.58607202409195e-01 9.49010994678426e-01 2.21196599493265e-01 +-5.10000000000000e+01 -5.90761972861707e-01 8.77985618172743e-01 2.14433363641336e-01 +-4.80000000000000e+01 -6.17089671120620e-01 8.03911570370645e-01 2.07956980763680e-01 +-4.50000000000000e+01 -6.40503926932036e-01 7.28313235916803e-01 2.01624019763027e-01 +-4.20000000000000e+01 -6.58910840133311e-01 6.52705635149657e-01 1.96862389618034e-01 +-3.90000000000000e+01 -6.76417027511146e-01 5.77527369809482e-01 1.92714494884031e-01 +-3.60000000000000e+01 -6.91442126694186e-01 5.04059360049167e-01 1.90773003374389e-01 +-3.30000000000000e+01 -7.05593958510807e-01 4.33318703053973e-01 1.91908992233939e-01 +-3.00000000000000e+01 -7.20308071684859e-01 3.65448723816258e-01 1.96465039072780e-01 +-2.93939393939394e+01 -7.23687122424702e-01 3.52430090699486e-01 1.98306835359819e-01 +-2.87878787878788e+01 -7.27066173164544e-01 3.39411457582714e-01 2.00148631646857e-01 +-2.81818181818182e+01 -7.30445223904387e-01 3.26392824465942e-01 2.01990427933895e-01 +-2.75757575757576e+01 -7.34244974993610e-01 3.13793078035017e-01 2.04486437101527e-01 +-2.69696969696970e+01 -7.38225041700157e-01 3.01372869870364e-01 2.07262847270964e-01 +-2.63636363636364e+01 -7.42205108406705e-01 2.88952661705710e-01 2.10039257440401e-01 +-2.57575757575758e+01 -7.46555462653963e-01 2.76796374908870e-01 2.13304160376248e-01 +-2.51515151515151e+01 -7.51461161912085e-01 2.65035908653530e-01 2.17301688612281e-01 +-2.45454545454545e+01 -7.56366861170206e-01 2.53275442398190e-01 2.21299216848314e-01 +-2.39393939393939e+01 -7.61408677387006e-01 2.41586670872199e-01 2.25459952105595e-01 +-2.33333333333333e+01 -7.67675572584808e-01 2.30543165790786e-01 2.31089582151761e-01 +-2.27272727272727e+01 -7.73942467782610e-01 2.19499660709374e-01 2.36719212197927e-01 +-2.21212121212121e+01 -7.80209362980412e-01 2.08456155627962e-01 2.42348842244093e-01 +-2.15151515151515e+01 -7.88045801889462e-01 1.98028860914946e-01 2.49772963288095e-01 +-2.09090909090909e+01 -7.96274727686348e-01 1.87755658431417e-01 2.57645822511188e-01 +-2.03030303030303e+01 -8.04503653483233e-01 1.77482455947888e-01 2.65518681734281e-01 +-1.96969696969697e+01 -8.13721563222721e-01 1.67514267203666e-01 2.74509167058282e-01 +-1.90909090909091e+01 -8.23928400957602e-01 1.57851074944005e-01 2.84617215258648e-01 +-1.84848484848485e+01 -8.22646763588942e-01 1.48546901850923e-01 2.82973548468764e-01 +-1.78787878787879e+01 -8.19241173382965e-01 1.39555143470384e-01 2.78335696038153e-01 +-1.72727272727273e+01 -8.15446564330172e-01 1.31559857952983e-01 2.70013132308244e-01 +-1.66666666666667e+01 -8.03296442896411e-01 1.23564572435581e-01 2.53038383173389e-01 +-1.60606060606061e+01 -7.84310064075638e-01 1.15569286918180e-01 2.28984646695628e-01 +-1.54545454545455e+01 -7.65324664303493e-01 1.07574959135167e-01 2.04931605118311e-01 +-1.48484848484848e+01 -7.46338949873589e-01 9.95804717419686e-02 1.80878447733115e-01 +-1.42424242424242e+01 -7.27351964982053e-01 9.15851862245671e-02 1.56824711255353e-01 +-1.36363636363636e+01 -7.08366360011050e-01 8.35901755495681e-02 1.32771801638210e-01 +-1.30303030303030e+01 -6.89379049576426e-01 7.55946380877238e-02 1.08716367776058e-01 +-1.24242424242424e+01 -6.70393771825338e-01 6.75996503421813e-02 8.46634665540094e-02 +-1.18181818181818e+01 -6.51406715493019e-01 5.96041815994351e-02 6.06091788446317e-02 +-1.12121212121212e+01 -6.32421454753742e-01 5.16093541595814e-02 3.65562447387649e-02 +-1.06060606060606e+01 -6.13434931389144e-01 4.36139312036515e-02 1.25016705283901e-02 +-1.00000000000000e+01 -5.94448865749824e-01 3.56199434645880e-02 -1.15511700947924e-02 +-9.39393939393939e+00 -5.75463587974779e-01 2.76249557125666e-02 -3.56050107398163e-02 +-8.78787878787879e+00 -5.51403736673166e-01 2.01382292840361e-02 -5.87079533337773e-02 +-8.18181818181818e+00 -5.17926305822838e-01 1.35966762681340e-02 -8.00434824257992e-02 +-7.57575757575758e+00 -4.48012922709353e-01 1.04062079021576e-02 -9.38202376741164e-02 +-6.96969696969697e+00 -3.62306556115099e-01 8.91516259682331e-03 -1.02639375733790e-01 +-6.36363636363636e+00 -2.86592508663283e-01 7.49091941073086e-03 -1.05345402946346e-01 +-5.75757575757576e+00 -2.11681301136276e-01 7.05454293237208e-03 -1.07624256716558e-01 +-5.15151515151515e+00 -1.37278254009080e-01 6.76061420557612e-03 -1.09615086355391e-01 +-4.54545454545454e+00 -6.32445813538124e-02 6.51817895525840e-03 -1.11463657835562e-01 +-3.93939393939394e+00 1.03326972358679e-02 6.40000000000000e-03 -1.13157562089366e-01 +-3.33333333333333e+00 8.37358252318253e-02 6.36666256139732e-03 -1.14700049263232e-01 +-2.72727272727273e+00 1.57144966549608e-01 6.30000000000000e-03 -1.16209080405869e-01 +-2.12121212121212e+00 2.30132082000148e-01 6.30000000000000e-03 -1.17633365893514e-01 +-1.51515151515152e+00 3.03270194866406e-01 6.30000000000000e-03 -1.18966675734322e-01 +-9.09090909090912e-01 3.76007887483945e-01 6.30000000000000e-03 -1.20399977937206e-01 +-3.03030303030302e-01 4.48619648411214e-01 6.33939639599868e-03 -1.21733360355986e-01 + 3.03030303030302e-01 5.21162162400790e-01 6.40000000000000e-03 -1.23066639644014e-01 + 9.09090909090912e-01 5.93483011578421e-01 6.40000000000000e-03 -1.24318201875268e-01 + 1.51515151515152e+00 6.65499510346614e-01 6.50000000000000e-03 -1.25430294786980e-01 + 2.12121212121212e+00 7.37449762821818e-01 6.52423946422604e-03 -1.26642394642260e-01 + 2.72727272727273e+00 8.08982292442682e-01 6.64545535339469e-03 -1.27809098180552e-01 + 3.33333333333333e+00 8.80397573785818e-01 6.76666256139732e-03 -1.28833300491179e-01 + 3.93939393939394e+00 9.51421826139261e-01 6.88787983927956e-03 -1.29890918553516e-01 + 4.54545454545455e+00 1.02186280754731e+00 7.00908947762920e-03 -1.30763626343404e-01 + 5.15151515151515e+00 1.09189627700035e+00 7.16061420557612e-03 -1.31612149719516e-01 + 5.75757575757576e+00 1.16079952835358e+00 7.45454293237208e-03 -1.32306057243163e-01 + 6.36363636363637e+00 1.22720139059598e+00 7.96364926341358e-03 -1.32572729852683e-01 + 6.96969696969697e+00 1.28802463107430e+00 8.94546166938641e-03 -1.32130299072563e-01 + 7.57575757575757e+00 1.33932330958836e+00 1.07272369407300e-02 -1.30081868282978e-01 + 8.18181818181818e+00 1.38679186165234e+00 1.25091248425769e-02 -1.27572678796319e-01 + 8.78787878787879e+00 1.43442629439737e+00 1.40333059500537e-02 -1.25090961368079e-01 + 9.39393939393939e+00 1.48072485366775e+00 1.53666845487907e-02 -1.22230262389112e-01 + 1.00000000000000e+01 1.51619976429293e+00 1.64999922859505e-02 -1.21700000000000e-01 + 1.06060606060606e+01 1.54652659135150e+00 1.81605492792916e-02 -1.21700000000000e-01 + 1.12121212121212e+01 1.57015165312925e+00 2.03485003516014e-02 -1.21912125087900e-01 + 1.18181818181818e+01 1.58466335911404e+00 3.00903504536651e-02 -1.23218115609323e-01 + 1.24242424242424e+01 1.55439065028940e+00 4.64546360854226e-02 -1.25157586499013e-01 + 1.30303030303030e+01 1.50697060273102e+00 6.28179372626244e-02 -1.27096940712607e-01 + 1.36363636363636e+01 1.44636161651328e+00 7.91823635414146e-02 -1.29036428271575e-01 + 1.42424242424242e+01 1.39302963646758e+00 9.22728558241098e-02 -1.30587894023598e-01 + 1.48484848484848e+01 1.35060468299441e+00 1.00454811136793e-01 -1.31557607245842e-01 + 1.54545454545455e+01 1.32181803006545e+00 1.08636414852911e-01 -1.32527278797382e-01 + 1.60606060606061e+01 1.29757644961134e+00 1.16817948256172e-01 -1.33496942015546e-01 + 1.66666666666667e+01 1.27333361905524e+00 1.24999903568856e-01 -1.34466655237790e-01 + 1.72727272727273e+01 1.24363618274871e+00 1.33181858881539e-01 -1.35436368460034e-01 + 1.78787878787879e+01 1.20727193691457e+00 1.41363814194223e-01 -1.36406081682278e-01 + 1.84848484848485e+01 1.18992978938591e+00 1.49497879761678e-01 -1.37375750456550e-01 + 1.90909090909091e+01 1.17704330010331e+00 1.57851074944005e-01 -1.39089585145003e-01 + 1.96969696969697e+01 1.16246123752382e+00 1.67514267203666e-01 -1.45021805782080e-01 + 2.03030303030303e+01 1.14929279501435e+00 1.77482455947888e-01 -1.51632351934001e-01 + 2.09090909090909e+01 1.13753805254846e+00 1.87755658431417e-01 -1.58921261976074e-01 + 2.15151515151515e+01 1.12578331008257e+00 1.98028860914946e-01 -1.66210172018147e-01 + 2.21212121212121e+01 1.11458874358451e+00 2.08456155627962e-01 -1.73224623443957e-01 + 2.27272727272727e+01 1.10563430457793e+00 2.19499660709374e-01 -1.79141522802416e-01 + 2.33333333333333e+01 1.09667986557135e+00 2.30543165790786e-01 -1.85058422160874e-01 + 2.39393939393939e+01 1.08772542656477e+00 2.41586670872199e-01 -1.90975321519332e-01 + 2.45454545454545e+01 1.08052187960139e+00 2.53275442398190e-01 -1.96074592475065e-01 + 2.51515151515151e+01 1.07351287201350e+00 2.65035908653530e-01 -2.01083017784734e-01 + 2.57575757575758e+01 1.06650386442561e+00 2.76796374908870e-01 -2.06091443094404e-01 + 2.63636363636364e+01 1.06028924575223e+00 2.88952661705710e-01 -2.10729607665482e-01 + 2.69696969696970e+01 1.05460430198682e+00 3.01372869870364e-01 -2.15120893385337e-01 + 2.75757575757576e+01 1.04891935822142e+00 3.13793078035017e-01 -2.19512179105193e-01 + 2.81818181818182e+01 1.04349174843484e+00 3.26392824465942e-01 -2.23774966350859e-01 + 2.87878787878788e+01 1.03866453309221e+00 3.39411457582714e-01 -2.27737949543009e-01 + 2.93939393939394e+01 1.03383731774957e+00 3.52430090699486e-01 -2.31700932735158e-01 + 3.00000000000000e+01 1.02901010240694e+00 3.65448723816258e-01 -2.35663915927308e-01 + 3.30000000000000e+01 1.00799494072346e+00 4.33318703053973e-01 -2.53423049843193e-01 + 3.60000000000000e+01 9.87774181033947e-01 5.04059360049167e-01 -2.69936854350083e-01 + 3.90000000000000e+01 9.66310039303889e-01 5.77527369809482e-01 -2.85448473353340e-01 + 4.20000000000000e+01 9.41301057332367e-01 6.52705635149657e-01 -3.00284968060017e-01 + 4.50000000000000e+01 9.15005895616392e-01 7.28313235916803e-01 -3.14934043892456e-01 + 4.80000000000000e+01 8.81556701601667e-01 8.03911570370646e-01 -3.28999157277327e-01 + 5.10000000000000e+01 8.43945446946677e-01 8.77985618172744e-01 -3.42814128421300e-01 + 5.40000000000000e+01 7.98009803441727e-01 9.49010994678426e-01 -3.56128799002399e-01 + 5.70000000000000e+01 7.52074110859421e-01 1.02003542859361e+00 -3.69443367867275e-01 + 6.00000000000000e+01 7.06138393738624e-01 1.09105939121714e+00 -3.82757885874428e-01 + 6.30000000000000e+01 6.44352602071576e-01 1.14892681074432e+00 -3.94831160514253e-01 + 6.60000000000000e+01 5.82566474543015e-01 1.20679411749904e+00 -4.06904424514653e-01 + 6.90000000000000e+01 5.20779947012492e-01 1.26466142425377e+00 -4.18977688515053e-01 + 7.20000000000000e+01 4.51477435205418e-01 1.30909618833200e+00 -4.29844051243441e-01 + 7.50000000000000e+01 3.78417085122278e-01 1.34681495605404e+00 -4.40106988042700e-01 + 7.80000000000000e+01 3.05355897825734e-01 1.38453415600310e+00 -4.50369442444556e-01 + 8.10000000000000e+01 2.30983767510451e-01 1.41401807310167e+00 -4.59788643436343e-01 + 8.40000000000000e+01 1.53989841650875e-01 1.42703199295995e+00 -4.67521395816866e-01 + 8.70000000000000e+01 7.69949275996385e-02 1.44004601223740e+00 -4.75253807270785e-01 + 9.00000000000000e+01 -3.36381509228363e-07 1.45305991877593e+00 -4.82986022704544e-01 + 9.30000000000000e+01 -5.38962044824732e-02 1.44004599891764e+00 -4.86623800302551e-01 + 9.60000000000000e+01 -1.07792278449097e-01 1.42703202935019e+00 -4.90261391797104e-01 + 9.90000000000000e+01 -1.61688764154490e-01 1.41401796036258e+00 -4.93898611078011e-01 + 1.02000000000000e+02 -2.13749236173153e-01 1.38453397332146e+00 -4.94263399100743e-01 + 1.05000000000000e+02 -2.64891721229873e-01 1.34681520559943e+00 -4.92992006930171e-01 + 1.08000000000000e+02 -3.16034192336304e-01 1.30909600565222e+00 -4.91720000190610e-01 + 1.11000000000000e+02 -3.64545857584686e-01 1.26466092295440e+00 -4.89201393327162e-01 + 1.14000000000000e+02 -4.07795991243718e-01 1.20679427930608e+00 -4.84189624190406e-01 + 1.17000000000000e+02 -4.51046455307775e-01 1.14892719359139e+00 -4.79177416768754e-01 + 1.20000000000000e+02 -4.94297062881228e-01 1.09105986110795e+00 -4.74164986774198e-01 + 1.23000000000000e+02 -5.26452064865786e-01 1.02003589848443e+00 -4.67401828422766e-01 + 1.26000000000000e+02 -5.58606989674918e-01 9.49011464578596e-01 -4.60638644238479e-01 + 1.29000000000000e+02 -5.90761760127430e-01 8.77986088072913e-01 -4.53875408386550e-01 + 1.32000000000000e+02 -6.15420484918018e-01 8.03908692975958e-01 -4.47922977473614e-01 + 1.35000000000000e+02 -6.36331195763501e-01 7.28305292210269e-01 -4.42375948063776e-01 + 1.38000000000000e+02 -6.57241666993606e-01 6.52702757782291e-01 -4.36828382226539e-01 + 1.41000000000000e+02 -6.76094612754094e-01 5.78615738508474e-01 -4.33407800721224e-01 + 1.44000000000000e+02 -6.90832490879619e-01 5.07559761840581e-01 -4.34241205139103e-01 + 1.47000000000000e+02 -7.05570256415403e-01 4.36504328003481e-01 -4.35074603190205e-01 + 1.50000000000000e+02 -7.20307965658325e-01 3.65449165572087e-01 -4.35907998058031e-01 + 1.53000000000000e+02 -7.46801078706125e-01 3.07518227898197e-01 -4.57805065052203e-01 + 1.56000000000000e+02 -7.73294117948629e-01 2.49587342086377e-01 -4.79701897484255e-01 + 1.59000000000000e+02 -7.99786954801670e-01 1.91656498833410e-01 -5.01598162643690e-01 + 1.62000000000000e+02 -7.40790822868899e-01 1.53560806333696e-01 -5.07117800599882e-01 + 1.65000000000000e+02 -6.39049483540701e-01 1.25382856960915e-01 -5.04448986449602e-01 + 1.68000000000000e+02 -5.37308710076014e-01 9.72046304867630e-02 -5.01779602888076e-01 + 1.71000000000000e+02 -4.22533481739914e-01 7.05772804657932e-02 -4.50000513056908e-01 + 1.74000000000000e+02 -2.81688735121593e-01 4.70517557569334e-02 -2.99999717902353e-01 + 1.77000000000000e+02 -1.40202251216632e-01 3.86002570677554e-02 -6.87686132694523e-02 + 1.80000000000000e+02 0.00000000000000e+00 3.76960000000000e-02 2.00000000000000e-01 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_29.dat b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_29.dat new file mode 100644 index 000000000..31764aedf --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/Airfoils/NREL-2p8-127_AeroDyn15_Polar_29.dat @@ -0,0 +1,254 @@ +! ------------ AirfoilInfo v1.01.x Input File ---------------------------------- +! AeroElasticSE FAST driver +! line +! line +! ------------------------------------------------------------------------------ +DEFAULT InterpOrd ! Interpolation order to use for quasi-steady table lookup {1=linear; 3=cubic spline; "default"} [default=3] +1 NonDimArea ! The non-dimensional area of the airfoil (area/chord^2) (set to 1.0 if unsure or unneeded) +@"NREL-2p8-127_AF29_Coords.txt" NumCoords ! The number of coordinates in the airfoil shape file. Set to zero if coordinates not included. +AF29_BL.txt BL_file ! The file name including the boundary layer characteristics of the profile. Ignored if the aeroacoustic module is not called. +1 NumTabs ! Number of airfoil tables in this file. Each table must have lines for Re and Ctrl. +! ------------------------------------------------------------------------------ +! data for table 1 +! ------------------------------------------------------------------------------ +6.000000 Re ! Reynolds number in millions +0 Ctrl ! Control setting (must be 0 for current AirfoilInfo) +True InclUAdata ! Is unsteady aerodynamics data included in this table? If TRUE, then include 30 UA coefficients below this line +!........................................ +-4.024505 alpha0 ! 0-lift angle of attack, depends on airfoil. +11.306884 alpha1 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA>alpha0. (deg) +-9.832557 alpha2 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA1] +0.000000 S2 ! Constant in the f curve best-fit for AOA> alpha1; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S3 ! Constant in the f curve best-fit for alpha2<=AOA< alpha0; by definition it depends on the airfoil. [ignored if UAMod<>1] +0.000000 S4 ! Constant in the f curve best-fit for AOA< alpha2; by definition it depends on the airfoil. [ignored if UAMod<>1] +1.557235 Cn1 ! Critical value of C0n at leading edge separation. It should be extracted from airfoil data at a given Mach and Reynolds number. It can be calculated from the static value of Cn at either the break in the pitching moment or the loss of chord force at the onset of stall. It is close to the condition of maximum lift of the airfoil at low Mach numbers. +-0.830241 Cn2 ! As Cn1 for negative AOAs. +Default St_sh ! Strouhal's shedding frequency constant. [default = 0.19] +0.006417 Cd0 ! 2D drag coefficient value at 0-lift. +-0.112920 Cm0 ! 2D pitching moment coefficient about 1/4-chord location, at 0-lift, positive if nose up. [If the aerodynamics coefficients table does not include a column for Cm, this needs to be set to 0.0] +0.000000 k0 ! Constant in the \hat(x)_cp curve best-fit; = (\hat(x)_AC-0.25). [ignored if UAMod<>1] +0.000000 k1 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k2 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k3 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1] +0.000000 k1_hat ! Constant in the expression of Cc due to leading edge vortex effects. [ignored if UAMod<>1] +Default x_cp_bar ! Constant in the expression of \hat(x)_cp^v. [ignored if UAMod<>1, default = 0.2] +Default UACutout ! Angle of attack above which unsteady aerodynamics are disabled (deg). [Specifying the string "Default" sets UACutout to 45 degrees] +Default filtCutOff ! Cut-off frequency (-3 dB corner frequency) for low-pass filtering the AoA input to UA, as well as the 1st and 2nd derivatives (Hz) [default = 20] +!........................................ +! Table of aerodynamics coefficients +200 NumAlf ! Number of data lines in the following table +! Alpha Cl Cd Cm +! (deg) (-) (-) (-) +-1.80000000000000e+02 0.00000000000000e+00 3.76960000000000e-02 2.00000000000000e-01 +-1.77000000000000e+02 1.49471782056503e-01 3.76960000000000e-02 2.00000000000000e-01 +-1.74000000000000e+02 3.00312917607843e-01 4.52351574641884e-02 2.39999774321882e-01 +-1.71000000000000e+02 4.50470313592540e-01 6.78528773607728e-02 3.60000410445527e-01 +-1.68000000000000e+02 5.62141300000530e-01 9.47828314689296e-02 3.00100237874998e-01 +-1.65000000000000e+02 6.54569530813285e-01 1.23868852352745e-01 1.50251760664942e-01 +-1.62000000000000e+02 7.46998820775784e-01 1.52955206537882e-01 4.01566317437541e-04 +-1.59000000000000e+02 7.99786954801670e-01 1.91656498833410e-01 -9.28123657821359e-02 +-1.56000000000000e+02 7.73294117948629e-01 2.49587342086377e-01 -7.27556892942309e-02 +-1.53000000000000e+02 7.46801078706125e-01 3.07518227898197e-01 -5.26992595835046e-02 +-1.50000000000000e+02 7.20307965658325e-01 3.65449165572087e-01 -3.26429649313102e-02 +-1.47000000000000e+02 7.05570256415403e-01 4.36504328003481e-01 -1.75932576097200e-02 +-1.44000000000000e+02 6.90832490879619e-01 5.07559761840581e-01 -2.54349280354572e-03 +-1.41000000000000e+02 6.76094612754094e-01 5.78615738508475e-01 1.25063869759013e-02 +-1.38000000000000e+02 6.57241666993606e-01 6.52702757782292e-01 2.78005506087711e-02 +-1.35000000000000e+02 6.36331195763501e-01 7.28305292210269e-01 4.32168556727960e-02 +-1.32000000000000e+02 6.15420484918018e-01 8.03908692975958e-01 5.86333373939468e-02 +-1.29000000000000e+02 5.90761760127430e-01 8.77986088072914e-01 7.42048196933640e-02 +-1.26000000000000e+02 5.58606989674918e-01 9.49011464578596e-01 9.00863038811478e-02 +-1.23000000000000e+02 5.26452064865786e-01 1.02003589848443e+00 1.05968066745086e-01 +-1.20000000000000e+02 4.94297062881228e-01 1.09105986110795e+00 1.21849968941892e-01 +-1.17000000000000e+02 4.51046455307775e-01 1.14892719359139e+00 1.36973650595308e-01 +-1.14000000000000e+02 4.07795991243718e-01 1.20679427930608e+00 1.52097072994036e-01 +-1.11000000000000e+02 3.64545857584686e-01 1.26466092295440e+00 1.67219979864852e-01 +-1.08000000000000e+02 3.16034192336304e-01 1.30909600565222e+00 1.80733001904303e-01 +-1.05000000000000e+02 2.64891721229873e-01 1.34681520559943e+00 1.93441069265733e-01 +-1.02000000000000e+02 2.13749236173153e-01 1.38453397332146e+00 2.06148391012093e-01 +-9.90000000000000e+01 1.61688764154489e-01 1.41401796036258e+00 2.17512373571396e-01 +-9.60000000000000e+01 1.07792278449096e-01 1.42703202935019e+00 2.26189619569497e-01 +-9.30000000000000e+01 5.38962044824732e-02 1.44004599891764e+00 2.34866399278379e-01 +-9.00000000000000e+01 3.36381508994621e-07 1.45305991877593e+00 2.43542945846872e-01 +-8.70000000000000e+01 -5.38961493200293e-02 1.44004601223740e+00 2.47180796579284e-01 +-8.40000000000000e+01 -1.07792429155678e-01 1.42703199295995e+00 2.50818601967904e-01 +-8.10000000000000e+01 -1.61688297256642e-01 1.41401807310167e+00 2.54456379565910e-01 +-7.80000000000000e+01 -2.13748988477021e-01 1.38453415600310e+00 2.54821405258420e-01 +-7.50000000000000e+01 -2.64892059585176e-01 1.34681495605404e+00 2.53549998518008e-01 +-7.20000000000000e+01 -3.16033944645590e-01 1.30909618833200e+00 2.52278006351131e-01 +-6.90000000000000e+01 -3.64545482908305e-01 1.26466142425377e+00 2.49759236748571e-01 +-6.60000000000000e+01 -4.07796112179989e-01 1.20679411749904e+00 2.44746810177687e-01 +-6.30000000000000e+01 -4.51046741451673e-01 1.14892681074432e+00 2.39734383606802e-01 +-6.00000000000000e+01 -4.94297275617037e-01 1.09105939121714e+00 2.34721942034639e-01 +-5.70000000000000e+01 -5.26452277601595e-01 1.02003542859361e+00 2.27959383679512e-01 +-5.40000000000000e+01 -5.58607202409195e-01 9.49010994678426e-01 2.21196599493265e-01 +-5.10000000000000e+01 -5.90761972861707e-01 8.77985618172743e-01 2.14433363641336e-01 +-4.80000000000000e+01 -6.17089671120620e-01 8.03911570370645e-01 2.07956980763680e-01 +-4.50000000000000e+01 -6.40503926932036e-01 7.28313235916803e-01 2.01624019763027e-01 +-4.20000000000000e+01 -6.58910840133311e-01 6.52705635149657e-01 1.96862389618034e-01 +-3.90000000000000e+01 -6.76417027511146e-01 5.77527369809482e-01 1.92714494884031e-01 +-3.60000000000000e+01 -6.91442126694186e-01 5.04059360049167e-01 1.90773003374389e-01 +-3.30000000000000e+01 -7.05593958510807e-01 4.33318703053973e-01 1.91908992233939e-01 +-3.00000000000000e+01 -7.20308071684859e-01 3.65448723816258e-01 1.96465039072780e-01 +-2.93939393939394e+01 -7.23687122424702e-01 3.52430090699486e-01 1.98306835359819e-01 +-2.87878787878788e+01 -7.27066173164544e-01 3.39411457582714e-01 2.00148631646857e-01 +-2.81818181818182e+01 -7.30445223904387e-01 3.26392824465942e-01 2.01990427933895e-01 +-2.75757575757576e+01 -7.34244974993610e-01 3.13793078035017e-01 2.04486437101527e-01 +-2.69696969696970e+01 -7.38225041700157e-01 3.01372869870364e-01 2.07262847270964e-01 +-2.63636363636364e+01 -7.42205108406705e-01 2.88952661705710e-01 2.10039257440401e-01 +-2.57575757575758e+01 -7.46555462653963e-01 2.76796374908870e-01 2.13304160376248e-01 +-2.51515151515151e+01 -7.51461161912085e-01 2.65035908653530e-01 2.17301688612281e-01 +-2.45454545454545e+01 -7.56366861170206e-01 2.53275442398190e-01 2.21299216848314e-01 +-2.39393939393939e+01 -7.61408677387006e-01 2.41586670872199e-01 2.25459952105595e-01 +-2.33333333333333e+01 -7.67675572584808e-01 2.30543165790786e-01 2.31089582151761e-01 +-2.27272727272727e+01 -7.73942467782610e-01 2.19499660709374e-01 2.36719212197927e-01 +-2.21212121212121e+01 -7.80209362980412e-01 2.08456155627962e-01 2.42348842244093e-01 +-2.15151515151515e+01 -7.88045801889462e-01 1.98028860914946e-01 2.49772963288095e-01 +-2.09090909090909e+01 -7.96274727686348e-01 1.87755658431417e-01 2.57645822511188e-01 +-2.03030303030303e+01 -8.04503653483233e-01 1.77482455947888e-01 2.65518681734281e-01 +-1.96969696969697e+01 -8.13721563222721e-01 1.67514267203666e-01 2.74509167058282e-01 +-1.90909090909091e+01 -8.23928400957602e-01 1.57851074944005e-01 2.84617215258648e-01 +-1.84848484848485e+01 -8.22646763588942e-01 1.48546901850923e-01 2.82973548468764e-01 +-1.78787878787879e+01 -8.19241173382965e-01 1.39555143470384e-01 2.78335696038153e-01 +-1.72727272727273e+01 -8.15446564330172e-01 1.31559857952983e-01 2.70013132308244e-01 +-1.66666666666667e+01 -8.03296442896411e-01 1.23564572435581e-01 2.53038383173389e-01 +-1.60606060606061e+01 -7.84310064075638e-01 1.15569286918180e-01 2.28984646695628e-01 +-1.54545454545455e+01 -7.65324664303493e-01 1.07574959135167e-01 2.04931605118311e-01 +-1.48484848484848e+01 -7.46338949873589e-01 9.95804717419686e-02 1.80878447733115e-01 +-1.42424242424242e+01 -7.27351964982053e-01 9.15851862245671e-02 1.56824711255353e-01 +-1.36363636363636e+01 -7.08366360011050e-01 8.35901755495681e-02 1.32771801638210e-01 +-1.30303030303030e+01 -6.89379049576426e-01 7.55946380877238e-02 1.08716367776058e-01 +-1.24242424242424e+01 -6.70393771825338e-01 6.75996503421813e-02 8.46634665540094e-02 +-1.18181818181818e+01 -6.51406715493019e-01 5.96041815994351e-02 6.06091788446317e-02 +-1.12121212121212e+01 -6.32421454753742e-01 5.16093541595814e-02 3.65562447387649e-02 +-1.06060606060606e+01 -6.13434931389144e-01 4.36139312036515e-02 1.25016705283901e-02 +-1.00000000000000e+01 -5.94448865749824e-01 3.56199434645880e-02 -1.15511700947924e-02 +-9.39393939393939e+00 -5.75463587974779e-01 2.76249557125666e-02 -3.56050107398163e-02 +-8.78787878787879e+00 -5.51403736673166e-01 2.01382292840361e-02 -5.87079533337773e-02 +-8.18181818181818e+00 -5.17926305822838e-01 1.35966762681340e-02 -8.00434824257992e-02 +-7.57575757575758e+00 -4.48012922709353e-01 1.04062079021576e-02 -9.38202376741164e-02 +-6.96969696969697e+00 -3.62306556115099e-01 8.91516259682331e-03 -1.02639375733790e-01 +-6.36363636363636e+00 -2.86592508663283e-01 7.49091941073086e-03 -1.05345402946346e-01 +-5.75757575757576e+00 -2.11681301136276e-01 7.05454293237208e-03 -1.07624256716558e-01 +-5.15151515151515e+00 -1.37278254009080e-01 6.76061420557612e-03 -1.09615086355391e-01 +-4.54545454545454e+00 -6.32445813538124e-02 6.51817895525840e-03 -1.11463657835562e-01 +-3.93939393939394e+00 1.03326972358679e-02 6.40000000000000e-03 -1.13157562089366e-01 +-3.33333333333333e+00 8.37358252318253e-02 6.36666256139732e-03 -1.14700049263232e-01 +-2.72727272727273e+00 1.57144966549608e-01 6.30000000000000e-03 -1.16209080405869e-01 +-2.12121212121212e+00 2.30132082000148e-01 6.30000000000000e-03 -1.17633365893514e-01 +-1.51515151515152e+00 3.03270194866406e-01 6.30000000000000e-03 -1.18966675734322e-01 +-9.09090909090912e-01 3.76007887483945e-01 6.30000000000000e-03 -1.20399977937206e-01 +-3.03030303030302e-01 4.48619648411214e-01 6.33939639599868e-03 -1.21733360355986e-01 + 3.03030303030302e-01 5.21162162400790e-01 6.40000000000000e-03 -1.23066639644014e-01 + 9.09090909090912e-01 5.93483011578421e-01 6.40000000000000e-03 -1.24318201875268e-01 + 1.51515151515152e+00 6.65499510346614e-01 6.50000000000000e-03 -1.25430294786980e-01 + 2.12121212121212e+00 7.37449762821818e-01 6.52423946422604e-03 -1.26642394642260e-01 + 2.72727272727273e+00 8.08982292442682e-01 6.64545535339469e-03 -1.27809098180552e-01 + 3.33333333333333e+00 8.80397573785818e-01 6.76666256139732e-03 -1.28833300491179e-01 + 3.93939393939394e+00 9.51421826139261e-01 6.88787983927956e-03 -1.29890918553516e-01 + 4.54545454545455e+00 1.02186280754731e+00 7.00908947762920e-03 -1.30763626343404e-01 + 5.15151515151515e+00 1.09189627700035e+00 7.16061420557612e-03 -1.31612149719516e-01 + 5.75757575757576e+00 1.16079952835358e+00 7.45454293237208e-03 -1.32306057243163e-01 + 6.36363636363637e+00 1.22720139059598e+00 7.96364926341358e-03 -1.32572729852683e-01 + 6.96969696969697e+00 1.28802463107430e+00 8.94546166938641e-03 -1.32130299072563e-01 + 7.57575757575757e+00 1.33932330958836e+00 1.07272369407300e-02 -1.30081868282978e-01 + 8.18181818181818e+00 1.38679186165234e+00 1.25091248425769e-02 -1.27572678796319e-01 + 8.78787878787879e+00 1.43442629439737e+00 1.40333059500537e-02 -1.25090961368079e-01 + 9.39393939393939e+00 1.48072485366775e+00 1.53666845487907e-02 -1.22230262389112e-01 + 1.00000000000000e+01 1.51619976429293e+00 1.64999922859505e-02 -1.21700000000000e-01 + 1.06060606060606e+01 1.54652659135150e+00 1.81605492792916e-02 -1.21700000000000e-01 + 1.12121212121212e+01 1.57015165312925e+00 2.03485003516014e-02 -1.21912125087900e-01 + 1.18181818181818e+01 1.58466335911404e+00 3.00903504536651e-02 -1.23218115609323e-01 + 1.24242424242424e+01 1.55439065028940e+00 4.64546360854226e-02 -1.25157586499013e-01 + 1.30303030303030e+01 1.50697060273102e+00 6.28179372626244e-02 -1.27096940712607e-01 + 1.36363636363636e+01 1.44636161651328e+00 7.91823635414146e-02 -1.29036428271575e-01 + 1.42424242424242e+01 1.39302963646758e+00 9.22728558241098e-02 -1.30587894023598e-01 + 1.48484848484848e+01 1.35060468299441e+00 1.00454811136793e-01 -1.31557607245842e-01 + 1.54545454545455e+01 1.32181803006545e+00 1.08636414852911e-01 -1.32527278797382e-01 + 1.60606060606061e+01 1.29757644961134e+00 1.16817948256172e-01 -1.33496942015546e-01 + 1.66666666666667e+01 1.27333361905524e+00 1.24999903568856e-01 -1.34466655237790e-01 + 1.72727272727273e+01 1.24363618274871e+00 1.33181858881539e-01 -1.35436368460034e-01 + 1.78787878787879e+01 1.20727193691457e+00 1.41363814194223e-01 -1.36406081682278e-01 + 1.84848484848485e+01 1.18992978938591e+00 1.49497879761678e-01 -1.37375750456550e-01 + 1.90909090909091e+01 1.17704330010331e+00 1.57851074944005e-01 -1.39089585145003e-01 + 1.96969696969697e+01 1.16246123752382e+00 1.67514267203666e-01 -1.45021805782080e-01 + 2.03030303030303e+01 1.14929279501435e+00 1.77482455947888e-01 -1.51632351934001e-01 + 2.09090909090909e+01 1.13753805254846e+00 1.87755658431417e-01 -1.58921261976074e-01 + 2.15151515151515e+01 1.12578331008257e+00 1.98028860914946e-01 -1.66210172018147e-01 + 2.21212121212121e+01 1.11458874358451e+00 2.08456155627962e-01 -1.73224623443957e-01 + 2.27272727272727e+01 1.10563430457793e+00 2.19499660709374e-01 -1.79141522802416e-01 + 2.33333333333333e+01 1.09667986557135e+00 2.30543165790786e-01 -1.85058422160874e-01 + 2.39393939393939e+01 1.08772542656477e+00 2.41586670872199e-01 -1.90975321519332e-01 + 2.45454545454545e+01 1.08052187960139e+00 2.53275442398190e-01 -1.96074592475065e-01 + 2.51515151515151e+01 1.07351287201350e+00 2.65035908653530e-01 -2.01083017784734e-01 + 2.57575757575758e+01 1.06650386442561e+00 2.76796374908870e-01 -2.06091443094404e-01 + 2.63636363636364e+01 1.06028924575223e+00 2.88952661705710e-01 -2.10729607665482e-01 + 2.69696969696970e+01 1.05460430198682e+00 3.01372869870364e-01 -2.15120893385337e-01 + 2.75757575757576e+01 1.04891935822142e+00 3.13793078035017e-01 -2.19512179105193e-01 + 2.81818181818182e+01 1.04349174843484e+00 3.26392824465942e-01 -2.23774966350859e-01 + 2.87878787878788e+01 1.03866453309221e+00 3.39411457582714e-01 -2.27737949543009e-01 + 2.93939393939394e+01 1.03383731774957e+00 3.52430090699486e-01 -2.31700932735158e-01 + 3.00000000000000e+01 1.02901010240694e+00 3.65448723816258e-01 -2.35663915927308e-01 + 3.30000000000000e+01 1.00799494072346e+00 4.33318703053973e-01 -2.53423049843193e-01 + 3.60000000000000e+01 9.87774181033947e-01 5.04059360049167e-01 -2.69936854350083e-01 + 3.90000000000000e+01 9.66310039303889e-01 5.77527369809482e-01 -2.85448473353340e-01 + 4.20000000000000e+01 9.41301057332367e-01 6.52705635149657e-01 -3.00284968060017e-01 + 4.50000000000000e+01 9.15005895616392e-01 7.28313235916803e-01 -3.14934043892456e-01 + 4.80000000000000e+01 8.81556701601667e-01 8.03911570370646e-01 -3.28999157277327e-01 + 5.10000000000000e+01 8.43945446946677e-01 8.77985618172744e-01 -3.42814128421300e-01 + 5.40000000000000e+01 7.98009803441727e-01 9.49010994678426e-01 -3.56128799002399e-01 + 5.70000000000000e+01 7.52074110859421e-01 1.02003542859361e+00 -3.69443367867275e-01 + 6.00000000000000e+01 7.06138393738624e-01 1.09105939121714e+00 -3.82757885874428e-01 + 6.30000000000000e+01 6.44352602071576e-01 1.14892681074432e+00 -3.94831160514253e-01 + 6.60000000000000e+01 5.82566474543015e-01 1.20679411749904e+00 -4.06904424514653e-01 + 6.90000000000000e+01 5.20779947012492e-01 1.26466142425377e+00 -4.18977688515053e-01 + 7.20000000000000e+01 4.51477435205418e-01 1.30909618833200e+00 -4.29844051243441e-01 + 7.50000000000000e+01 3.78417085122278e-01 1.34681495605404e+00 -4.40106988042700e-01 + 7.80000000000000e+01 3.05355897825734e-01 1.38453415600310e+00 -4.50369442444556e-01 + 8.10000000000000e+01 2.30983767510451e-01 1.41401807310167e+00 -4.59788643436343e-01 + 8.40000000000000e+01 1.53989841650875e-01 1.42703199295995e+00 -4.67521395816866e-01 + 8.70000000000000e+01 7.69949275996385e-02 1.44004601223740e+00 -4.75253807270785e-01 + 9.00000000000000e+01 -3.36381509228363e-07 1.45305991877593e+00 -4.82986022704544e-01 + 9.30000000000000e+01 -5.38962044824732e-02 1.44004599891764e+00 -4.86623800302551e-01 + 9.60000000000000e+01 -1.07792278449097e-01 1.42703202935019e+00 -4.90261391797104e-01 + 9.90000000000000e+01 -1.61688764154490e-01 1.41401796036258e+00 -4.93898611078011e-01 + 1.02000000000000e+02 -2.13749236173153e-01 1.38453397332146e+00 -4.94263399100743e-01 + 1.05000000000000e+02 -2.64891721229873e-01 1.34681520559943e+00 -4.92992006930171e-01 + 1.08000000000000e+02 -3.16034192336304e-01 1.30909600565222e+00 -4.91720000190610e-01 + 1.11000000000000e+02 -3.64545857584686e-01 1.26466092295440e+00 -4.89201393327162e-01 + 1.14000000000000e+02 -4.07795991243718e-01 1.20679427930608e+00 -4.84189624190406e-01 + 1.17000000000000e+02 -4.51046455307775e-01 1.14892719359139e+00 -4.79177416768754e-01 + 1.20000000000000e+02 -4.94297062881228e-01 1.09105986110795e+00 -4.74164986774198e-01 + 1.23000000000000e+02 -5.26452064865786e-01 1.02003589848443e+00 -4.67401828422766e-01 + 1.26000000000000e+02 -5.58606989674918e-01 9.49011464578596e-01 -4.60638644238479e-01 + 1.29000000000000e+02 -5.90761760127430e-01 8.77986088072913e-01 -4.53875408386550e-01 + 1.32000000000000e+02 -6.15420484918018e-01 8.03908692975958e-01 -4.47922977473614e-01 + 1.35000000000000e+02 -6.36331195763501e-01 7.28305292210269e-01 -4.42375948063776e-01 + 1.38000000000000e+02 -6.57241666993606e-01 6.52702757782291e-01 -4.36828382226539e-01 + 1.41000000000000e+02 -6.76094612754094e-01 5.78615738508474e-01 -4.33407800721224e-01 + 1.44000000000000e+02 -6.90832490879619e-01 5.07559761840581e-01 -4.34241205139103e-01 + 1.47000000000000e+02 -7.05570256415403e-01 4.36504328003481e-01 -4.35074603190205e-01 + 1.50000000000000e+02 -7.20307965658325e-01 3.65449165572087e-01 -4.35907998058031e-01 + 1.53000000000000e+02 -7.46801078706125e-01 3.07518227898197e-01 -4.57805065052203e-01 + 1.56000000000000e+02 -7.73294117948629e-01 2.49587342086377e-01 -4.79701897484255e-01 + 1.59000000000000e+02 -7.99786954801670e-01 1.91656498833410e-01 -5.01598162643690e-01 + 1.62000000000000e+02 -7.40790822868899e-01 1.53560806333696e-01 -5.07117800599882e-01 + 1.65000000000000e+02 -6.39049483540701e-01 1.25382856960915e-01 -5.04448986449602e-01 + 1.68000000000000e+02 -5.37308710076014e-01 9.72046304867630e-02 -5.01779602888076e-01 + 1.71000000000000e+02 -4.22533481739914e-01 7.05772804657932e-02 -4.50000513056908e-01 + 1.74000000000000e+02 -2.81688735121593e-01 4.70517557569334e-02 -2.99999717902353e-01 + 1.77000000000000e+02 -1.40202251216632e-01 3.86002570677554e-02 -6.87686132694523e-02 + 1.80000000000000e+02 0.00000000000000e+00 3.76960000000000e-02 2.00000000000000e-01 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/NREL-2.8-127.xlsx b/ROSCO/Test_Cases/NREL_2p8_127/NREL-2.8-127.xlsx new file mode 100644 index 000000000..5d5d89466 Binary files /dev/null and b/ROSCO/Test_Cases/NREL_2p8_127/NREL-2.8-127.xlsx differ diff --git a/ROSCO/Test_Cases/NREL_2p8_127/NREL-2.8-127_pitch-speed.csv b/ROSCO/Test_Cases/NREL_2p8_127/NREL-2.8-127_pitch-speed.csv new file mode 100644 index 000000000..8a37882c2 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/NREL-2.8-127_pitch-speed.csv @@ -0,0 +1,31 @@ +mps,pitch,speed +3,0,5 +3.889649963,0,5 +4.684006997,0,5.638983608 +5.377830234,0,6.474263714 +5.966542092,0,7.183002305 +6.446258474,0,7.760523392 +6.813814392,0,8.20301671 +7.066784852,0,8.507562856 +7.203500851,0,8.67215255 +7.223060389,0,8.695699891 +7.320786359,0,8.813350259 +7.535153079,0,9.071422123 +7.864746237,0,9.468212823 +8.307391303,1.972625303,10.00110448 +8.860167873,3.729032675,10.66658129 +9.519428937,5.277405528,11.46025268 +10.28082494,6.571034001,12.0388027 +10.68187298,7.135654103,12.0388027 +11.13933248,8.260696288,12.0388027 +12.08928745,10.26526353,12.0388027 +13.1244224,12.14867141,12.0388027 +14.23790791,13.95715081,12.0388027 +15.42239763,15.71431664,12.0388027 +16.67007674,17.45490652,12.0388027 +17.97271352,19.14151062,12.0388027 +19.32171368,20.8231505,12.0388027 +20.70817701,22.44383927,12.0388027 +22.12295617,24.03032967,12.0388027 +23.55671697,25.61093372,12.0388027 +25,27.13341342,12.0388027 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/NREL-2p8-127.fst b/ROSCO/Test_Cases/NREL_2p8_127/NREL-2p8-127.fst new file mode 100644 index 000000000..c177d10c9 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/NREL-2p8-127.fst @@ -0,0 +1,71 @@ +------- OpenFAST INPUT FILE ------------------------------------------- +Generated with AeroElasticSE FAST driver +---------------------- SIMULATION CONTROL -------------------------------------- +False Echo - Echo input data to .ech (flag) +"FATAL" AbortLevel - Error level when simulation should abort (string) {"WARNING", "SEVERE", "FATAL"} +300.0 TMax - Total run time (s) +0.005 DT - Recommended module time step (s) +2 InterpOrder - Interpolation order for input/output time history (-) {1=linear, 2=quadratic} +0 NumCrctn - Number of correction iterations (-) {0=explicit calculation, i.e., no corrections} +99999.0 DT_UJac - Time between calls to get Jacobians (s) +1000000.0 UJacSclFact - Scaling factor used in Jacobians (-) +---------------------- FEATURE SWITCHES AND FLAGS ------------------------------ +1 CompElast - Compute structural dynamics (switch) {1=ElastoDyn; 2=ElastoDyn + BeamDyn for blades} +1 CompInflow - Compute inflow wind velocities (switch) {0=still air; 1=InflowWind; 2=external from OpenFOAM} +2 CompAero - Compute aerodynamic loads (switch) {0=None; 1=AeroDyn v14; 2=AeroDyn v15} +1 CompServo - Compute control and electrical-drive dynamics (switch) {0=None; 1=ServoDyn} +0 CompHydro - Compute hydrodynamic loads (switch) {0=None; 1=HydroDyn} +0 CompSub - Compute sub-structural dynamics (switch) {0=None; 1=SubDyn; 2=External Platform MCKF} +0 CompMooring - Compute mooring system (switch) {0=None; 1=MAP++; 2=FEAMooring; 3=MoorDyn; 4=OrcaFlex} +0 CompIce - Compute ice loads (switch) {0=None; 1=IceFloe; 2=IceDyn} +0 MHK - MHK turbine type (switch) {0=Not an MHK turbine; 1=Fixed MHK turbine; 2=Floating MHK turbine} +---------------------- ENVIRONMENTAL CONDITIONS -------------------------------- + 9.80665 Gravity - Gravitational acceleration (m/s^2) + 1.225 AirDens - Air density (kg/m^3) + 0 WtrDens - Water density (kg/m^3) + 1.464E-05 KinVisc - Kinematic viscosity of working fluid (m^2/s) + 335 SpdSound - Speed of sound in working fluid (m/s) + 103500 Patm - Atmospheric pressure (Pa) [used only for an MHK turbine cavitation check] + 1700 Pvap - Vapour pressure of working fluid (Pa) [used only for an MHK turbine cavitation check] + 0 WtrDpth - Water depth (m) + 0 MSL2SWL - Offset between still-water level and mean sea level (m) [positive upward] +---------------------- INPUT FILES --------------------------------------------- +"NREL-2p8-127_ElastoDyn.dat" EDFile - Name of file containing ElastoDyn input parameters (quoted string) +"none" BDBldFile(1) - Name of file containing BeamDyn input parameters for blade 1 (quoted string) +"none" BDBldFile(2) - Name of file containing BeamDyn input parameters for blade 2 (quoted string) +"none" BDBldFile(3) - Name of file containing BeamDyn input parameters for blade 3 (quoted string) +"NREL-2p8-127_InflowFile.dat" InflowFile - Name of file containing inflow wind input parameters (quoted string) +"NREL-2p8-127_AeroDyn15.dat" AeroFile - Name of file containing aerodynamic input parameters (quoted string) +"NREL-2p8-127_ServoDyn.dat" ServoFile - Name of file containing control and electrical-drive input parameters (quoted string) +"none" HydroFile - Name of file containing hydrodynamic input parameters (quoted string) +"none" SubFile - Name of file containing sub-structural input parameters (quoted string) +"none" MooringFile - Name of file containing mooring system input parameters (quoted string) +"none" IceFile - Name of file containing ice input parameters (quoted string) +---------------------- OUTPUT -------------------------------------------------- +False SumPrint - Print summary data to ".sum" (flag) +10.0 SttsTime - Amount of time between screen status messages (s) +99999.0 ChkptTime - Amount of time between creating checkpoint files for potential restart (s) +default DT_Out - Time step for tabular output (s) (or "default") +0.0 TStart - Time to begin tabular output (s) +1 OutFileFmt - Format for tabular (time-marching) output file (switch) {1: text file [.out], 2: binary file [.outb], 3: both} +True TabDelim - Use tab delimiters in text tabular output file? (flag) {uses spaces if false} +"ES10.3E2" OutFmt - Format used for text tabular output, excluding the time channel. Resulting field should be 10 characters. (quoted string) +---------------------- LINEARIZATION ------------------------------------------- +False Linearize - Linearization analysis (flag) +False CalcSteady - Calculate a steady-state periodic operating point before linearization? [unused if Linearize=False] (flag) +3 TrimCase - Controller parameter to be trimmed {1:yaw; 2:torque; 3:pitch} [used only if CalcSteady=True] (-) +0.001 TrimTol - Tolerance for the rotational speed convergence [used only if CalcSteady=True] (-) +0.01 TrimGain - Proportional gain for the rotational speed error (>0) [used only if CalcSteady=True] (rad/(rad/s) for yaw or pitch; Nm/(rad/s) for torque) +0.0 Twr_Kdmp - Damping factor for the tower [used only if CalcSteady=True] (N/(m/s)) +0.0 Bld_Kdmp - Damping factor for the blades [used only if CalcSteady=True] (N/(m/s)) +2 NLinTimes - Number of times to linearize (-) [>=1] [unused if Linearize=False] +30.000000, 60.000000 LinTimes - List of times at which to linearize (s) [1 to NLinTimes] [used only when Linearize=True and CalcSteady=False] +1 LinInputs - Inputs included in linearization (switch) {0=none; 1=standard; 2=all module inputs (debug)} [unused if Linearize=False] +1 LinOutputs - Outputs included in linearization (switch) {0=none; 1=from OutList(s); 2=all module outputs (debug)} [unused if Linearize=False] +False LinOutJac - Include full Jacobians in linearization output (for debug) (flag) [unused if Linearize=False; used only if LinInputs=LinOutputs=2] +False LinOutMod - Write module-level linearization output files in addition to output for full system? (flag) [unused if Linearize=False] +---------------------- VISUALIZATION ------------------------------------------ +0 WrVTK - VTK visualization data output: (switch) {0=none; 1=initialization data only; 2=animation} +2 VTK_type - Type of VTK visualization data: (switch) {1=surfaces; 2=basic meshes (lines/points); 3=all meshes (debug)} [unused if WrVTK=0] +False VTK_fields - Write mesh fields to VTK data files? (flag) {true/false} [unused if WrVTK=0] +10.0 VTK_fps - Frame rate for VTK output (frames per second){will use closest integer multiple of DT} [used only if WrVTK=2] diff --git a/ROSCO/Test_Cases/NREL_2p8_127/NREL-2p8-127_AeroDyn15.dat b/ROSCO/Test_Cases/NREL_2p8_127/NREL-2p8-127_AeroDyn15.dat new file mode 100644 index 000000000..a37428992 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/NREL-2p8-127_AeroDyn15.dat @@ -0,0 +1,134 @@ +------- AERODYN v15.03.* INPUT FILE ------------------------------------------------ +Generated with AeroElasticSE FAST driver +====== General Options ============================================================================ +False Echo - Echo the input to ".AD.ech"? (flag) +default DTAero - Time interval for aerodynamic calculations {or "default"} (s) +1 WakeMod - Type of wake/induction model (switch) {0=none, 1=BEMT, 2=DBEMT, 3=OLAF} [WakeMod cannot be 2 or 3 when linearizing] +2 AFAeroMod - Type of blade airfoil aerodynamics model (switch) {1=steady model, 2=Beddoes-Leishman unsteady model} [AFAeroMod must be 1 when linearizing] +0 TwrPotent - Type tower influence on wind based on potential flow around the tower (switch) {0=none, 1=baseline potential flow, 2=potential flow with Bak correction} +0 TwrShadow - Calculate tower influence on wind based on downstream tower shadow (switch) {0=none, 1=Powles model, 2=Eames model} +False TwrAero - Calculate tower aerodynamic loads? (flag) +False FrozenWake - Assume frozen wake during linearization? (flag) [used only when WakeMod=1 and when linearizing] +False CavitCheck - Perform cavitation check? (flag) [AFAeroMod must be 1 when CavitCheck=true] +False Buoyancy - Include buoyancy effects? (flag) +False CompAA - Flag to compute AeroAcoustics calculation [only used when WakeMod=1 or 2] +AeroAcousticsInput.dat AA_InputFile - AeroAcoustics input file [used only when CompAA=true] +====== Environmental Conditions =================================================================== +"default" AirDens - Air density (kg/m^3) +"default" KinVisc - Kinematic air viscosity (m^2/s) +"default" SpdSound - Speed of sound (m/s) +"default" Patm - Atmospheric pressure (Pa) [used only when CavitCheck=True] +"default" Pvap - Vapour pressure of fluid (Pa) [used only when CavitCheck=True] +====== Blade-Element/Momentum Theory Options ====================================================== [used only when WakeMod=1] +2 SkewMod - Type of skewed-wake correction model (switch) {1=uncoupled, 2=Pitt/Peters, 3=coupled} [unused when WakeMod=0 or 3] +1.4726215563702154 SkewModFactor - Constant used in Pitt/Peters skewed wake model {or "default" is 15/32*pi} (-) [used only when SkewMod=2; unused when WakeMod=0 or 3] +True TipLoss - Use the Prandtl tip-loss model? (flag) [unused when WakeMod=0 or 3] +True HubLoss - Use the Prandtl hub-loss model? (flag) [unused when WakeMod=0 or 3] +True TanInd - Include tangential induction in BEMT calculations? (flag) [unused when WakeMod=0 or 3] +True AIDrag - Include the drag term in the axial-induction calculation? (flag) [unused when WakeMod=0 or 3] +True TIDrag - Include the drag term in the tangential-induction calculation? (flag) [unused when WakeMod=0,3 or TanInd=FALSE] +default IndToler - Convergence tolerance for BEMT nonlinear solve residual equation {or "default"} (-) [unused when WakeMod=0 or 3] +500 MaxIter - Maximum number of iteration steps (-) [unused when WakeMod=0] +====== Dynamic Blade-Element/Momentum Theory Options ====================================================== [used only when WakeMod=1] +2 DBEMT_Mod - Type of dynamic BEMT (DBEMT) model {1=constant tau1, 2=time-dependent tau1} (-) [used only when WakeMod=2] +2.0 tau1_const - Time constant for DBEMT (s) [used only when WakeMod=2 and DBEMT_Mod=1] +====== OLAF -- cOnvecting LAgrangian Filaments (Free Vortex Wake) Theory Options ================== [used only when WakeMod=3] +NREL-2p8-127_OLAF.dat OLAFInputFileName - Input file for OLAF [used only when WakeMod=3] +====== Beddoes-Leishman Unsteady Airfoil Aerodynamics Options ===================================== [used only when AFAeroMod=2] +3 UAMod - Unsteady Aero Model Switch (switch) {1=Baseline model (Original), 2=Gonzalez's variant (changes in Cn,Cc,Cm), 3=Minnema/Pierce variant (changes in Cc and Cm)} [used only when AFAeroMod=2] +True FLookup - Flag to indicate whether a lookup for f' will be calculated (TRUE) or whether best-fit exponential equations will be used (FALSE); if FALSE S1-S4 must be provided in airfoil input files (flag) [used only when AFAeroMod=2] +====== Airfoil Information ========================================================================= +1 AFTabMod - Interpolation method for multiple airfoil tables {1=1D interpolation on AoA (first table only); 2=2D interpolation on AoA and Re; 3=2D interpolation on AoA and UserProp} (-) +1 InCol_Alfa - The column in the airfoil tables that contains the angle of attack (-) +2 InCol_Cl - The column in the airfoil tables that contains the lift coefficient (-) +3 InCol_Cd - The column in the airfoil tables that contains the drag coefficient (-) +4 InCol_Cm - The column in the airfoil tables that contains the pitching-moment coefficient; use zero if there is no Cm column (-) +0 InCol_Cpmin - The column in the airfoil tables that contains the Cpmin coefficient; use zero if there is no Cpmin column (-) +30 NumAFfiles - Number of airfoil files used (-) +"Airfoils/NREL-2p8-127_AeroDyn15_Polar_00.dat" AFNames - Airfoil file names (NumAFfiles lines) (quoted strings) +"Airfoils/NREL-2p8-127_AeroDyn15_Polar_01.dat" +"Airfoils/NREL-2p8-127_AeroDyn15_Polar_02.dat" +"Airfoils/NREL-2p8-127_AeroDyn15_Polar_03.dat" +"Airfoils/NREL-2p8-127_AeroDyn15_Polar_04.dat" +"Airfoils/NREL-2p8-127_AeroDyn15_Polar_05.dat" +"Airfoils/NREL-2p8-127_AeroDyn15_Polar_06.dat" +"Airfoils/NREL-2p8-127_AeroDyn15_Polar_07.dat" +"Airfoils/NREL-2p8-127_AeroDyn15_Polar_08.dat" +"Airfoils/NREL-2p8-127_AeroDyn15_Polar_09.dat" +"Airfoils/NREL-2p8-127_AeroDyn15_Polar_10.dat" +"Airfoils/NREL-2p8-127_AeroDyn15_Polar_11.dat" +"Airfoils/NREL-2p8-127_AeroDyn15_Polar_12.dat" +"Airfoils/NREL-2p8-127_AeroDyn15_Polar_13.dat" +"Airfoils/NREL-2p8-127_AeroDyn15_Polar_14.dat" +"Airfoils/NREL-2p8-127_AeroDyn15_Polar_15.dat" +"Airfoils/NREL-2p8-127_AeroDyn15_Polar_16.dat" +"Airfoils/NREL-2p8-127_AeroDyn15_Polar_17.dat" +"Airfoils/NREL-2p8-127_AeroDyn15_Polar_18.dat" +"Airfoils/NREL-2p8-127_AeroDyn15_Polar_19.dat" +"Airfoils/NREL-2p8-127_AeroDyn15_Polar_20.dat" +"Airfoils/NREL-2p8-127_AeroDyn15_Polar_21.dat" +"Airfoils/NREL-2p8-127_AeroDyn15_Polar_22.dat" +"Airfoils/NREL-2p8-127_AeroDyn15_Polar_23.dat" +"Airfoils/NREL-2p8-127_AeroDyn15_Polar_24.dat" +"Airfoils/NREL-2p8-127_AeroDyn15_Polar_25.dat" +"Airfoils/NREL-2p8-127_AeroDyn15_Polar_26.dat" +"Airfoils/NREL-2p8-127_AeroDyn15_Polar_27.dat" +"Airfoils/NREL-2p8-127_AeroDyn15_Polar_28.dat" +"Airfoils/NREL-2p8-127_AeroDyn15_Polar_29.dat" +====== Rotor/Blade Properties ===================================================================== +True UseBlCm - Include aerodynamic pitching moment in calculations? (flag) +"NREL-2p8-127_AeroDyn15_blade.dat" ADBlFile(1) - Name of file containing distributed aerodynamic properties for Blade #1 (-) +"NREL-2p8-127_AeroDyn15_blade.dat" ADBlFile(2) - Name of file containing distributed aerodynamic properties for Blade #2 (-) [unused if NumBl < 2] +"NREL-2p8-127_AeroDyn15_blade.dat" ADBlFile(3) - Name of file containing distributed aerodynamic properties for Blade #3 (-) [unused if NumBl < 3] +====== Hub Properties ============================================================================== [used only when Buoyancy=True] +0.0 VolHub - Hub volume (m^3) +0.0 HubCenBx - Hub center of buoyancy x direction offset (m) +====== Nacelle Properties ========================================================================== [used only when Buoyancy=True] +0.0 VolNac - Nacelle volume (m^3) +0,0,0 NacCenB - Position of nacelle center of buoyancy from yaw bearing in nacelle coordinates (m) +====== Tail fin Aerodynamics ======================================================================== +False TFinAero - Calculate tail fin aerodynamics model (flag) +"unused" TFinFile - Input file for tail fin aerodynamics [used only when TFinAero=True] +====== Tower Influence and Aerodynamics ============================================================= [used only when TwrPotent/=0, TwrShadow/=0, or TwrAero=True] +10 NumTwrNds - Number of tower nodes used in the analysis (-) [used only when TwrPotent/=0, TwrShadow/=0, or TwrAero=True] +TwrElev TwrDiam TwrCd TwrTI TwrCb !TwrTI used only with TwrShadow=2, TwrCb used only with Buoyancy=True +(m) (m) (-) (-) (-) + 8.650000000000000e+00 3.999999999999999e+00 5.000000000000000e-01 1.000000000000000e-01 0.0 + 1.730800925925926e+01 4.000000000000000e+00 5.000000000000000e-01 1.000000000000000e-01 0.0 + 2.595800925925926e+01 4.000000000000000e+00 5.000000000000000e-01 1.000000000000000e-01 0.0 + 3.461601851851852e+01 3.953273204469021e+00 5.000000000000000e-01 1.000000000000000e-01 0.0 + 4.326601851851852e+01 3.712118013878008e+00 5.000000000000000e-01 1.000000000000000e-01 0.0 + 5.191601851851851e+01 3.433099970059946e+00 5.000000000000000e-01 1.000000000000000e-01 0.0 + 6.057402777777778e+01 3.130385763598736e+00 5.000000000000000e-01 1.000000000000000e-01 0.0 + 6.922402777777778e+01 2.796113422345067e+00 5.000000000000000e-01 1.000000000000000e-01 0.0 + 7.787402777777778e+01 2.382646880140990e+00 5.000000000000000e-01 1.000000000000000e-01 0.0 + 8.650000000000000e+01 2.324880163918676e+00 5.000000000000000e-01 1.000000000000000e-01 0.0 +====== Outputs ==================================================================================== +False SumPrint - Generate a summary file listing input options and interpolated properties to ".AD.sum"? (flag) +0 NBlOuts - Number of blade node outputs [0 - 9] (-) +4, 7, 10, 13, 15, 18, 21, 24, 27 BlOutNd - Blade nodes whose values will be output (-) +0 NTwOuts - Number of tower node outputs [0 - 9] (-) +0 TwOutNd - Tower nodes whose values will be output (-) + OutList - The next line(s) contains a list of output parameters. See OutListParameters.xlsx for a listing of available output channels, (-) +"B1Azimuth" +"B2Azimuth" +"B3Azimuth" +END of input file (the word "END" must appear in the first 3 columns of this last OutList line) +====== Outputs for all blade stations (same ending as above for B1N1.... =========================== [optional section] +3 BldNd_BladesOut - Number of blades to output all node information at. Up to number of blades on turbine. (-) +"All" BldNd_BlOutNd - Future feature will allow selecting a portion of the nodes to output. Not implemented yet. (-) + OutList - The next line(s) contains a list of output parameters. See OutListParameters.xlsx for a listing of available output channels, (-) +"Fx, Fy" +"Vx, Vy" +Vrel +TnInd +AxInd +Theta +Phi +Vindx +Vindy +Alpha +Fl +Fd +END (the word "END" must appear in the first 3 columns of this last OutList line in the optional nodal output section) +--------------------------------------------------------------------------------------- diff --git a/ROSCO/Test_Cases/NREL_2p8_127/NREL-2p8-127_AeroDyn15_blade.dat b/ROSCO/Test_Cases/NREL_2p8_127/NREL-2p8-127_AeroDyn15_blade.dat new file mode 100644 index 000000000..fd4b728fe --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/NREL-2p8-127_AeroDyn15_blade.dat @@ -0,0 +1,36 @@ +------- AERODYN v15.00.* BLADE DEFINITION INPUT FILE ------------------------------------- +Generated with AeroElasticSE FAST driver +====== Blade Properties ================================================================= +30 NumBlNds - Number of blade nodes used in the analysis (-) + BlSpn BlCrvAC BlSwpAC BlCrvAng BlTwist BlChord BlAFID + (m) (m) (m) (deg) (deg) (m) (-) + 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 1.999622705006573e+01 2.565746018075444e+00 1 + 2.119199517912653e+00 0.000000000000000e+00 0.000000000000000e+00 0.000000000000000e+00 1.931018243810786e+01 3.361938565422448e+00 2 + 4.238399035825307e+00 0.000000000000000e+00 0.000000000000000e+00 -2.621743302803628e-03 1.831714953780435e+01 4.045185045024725e+00 3 + 6.357598553737958e+00 -1.939408866995070e-04 0.000000000000000e+00 -6.412784123456707e-02 1.708763041181490e+01 4.534861529323176e+00 4 + 8.476798071650611e+00 -4.743793103448273e-03 0.000000000000000e+00 -1.978684279841359e-01 1.569212712279918e+01 4.750344090758699e+00 5 + 1.059599758956327e+01 -1.483103448275862e-02 0.000000000000000e+00 -3.150569530999122e-01 1.382289586770404e+01 4.737620755206947e+00 6 + 1.271519710747592e+01 -2.804970443349753e-02 0.000000000000000e+00 -4.200820236296363e-01 1.124554309027298e+01 4.683448688307037e+00 7 + 1.483439662538857e+01 -4.590591133004925e-02 0.000000000000000e+00 -5.312359339597873e-01 8.602632953470145e+00 4.602338372007760e+00 8 + 1.695359614330122e+01 -6.734679802955665e-02 0.000000000000000e+00 -6.413089831677180e-01 6.549224739725965e+00 4.505595976960268e+00 9 + 1.907279566121387e+01 -9.334512315270936e-02 0.000000000000000e+00 -7.594874026577699e-01 5.408188380153923e+00 4.380463162058345e+00 10 + 2.119199517912653e+01 -1.235274876847291e-01 0.000000000000000e+00 -8.814019981123943e-01 4.552816793256156e+00 4.183546777131121e+00 11 + 2.331119469703918e+01 -1.585433990147783e-01 0.000000000000000e+00 -1.022348344095032e+00 3.850103071189125e+00 3.945902894366683e+00 12 + 2.543039421495183e+01 -1.991506896551724e-01 0.000000000000000e+00 -1.183293448295596e+00 3.210053831367405e+00 3.702763428157307e+00 13 + 2.754959373286449e+01 -2.460701477832512e-01 0.000000000000000e+00 -1.342781789240282e+00 2.548277995517243e+00 3.476193009639851e+00 14 + 2.966879325077715e+01 -2.984725615763546e-01 0.000000000000000e+00 -1.515812813319435e+00 1.868987870564891e+00 3.235485886652345e+00 15 + 3.178799276868979e+01 -3.581878325123153e-01 0.000000000000000e+00 -1.698337241682368e+00 1.247026288989173e+00 2.994660335764964e+00 16 + 3.390719228660245e+01 -4.240869950738916e-01 0.000000000000000e+00 -1.908238044665007e+00 7.591906266374636e-01 2.774705218558286e+00 17 + 3.602639180451509e+01 -4.993217733990146e-01 0.000000000000000e+00 -2.133886441082087e+00 4.659000465949885e-01 2.591930205580583e+00 18 + 3.814559132242776e+01 -5.819026600985221e-01 0.000000000000000e+00 -2.384324918476038e+00 2.731580237682558e-01 2.424912635092513e+00 19 + 4.026479084034041e+01 -6.756489655172412e-01 0.000000000000000e+00 -2.659453831887105e+00 1.231485664729688e-01 2.273929330687443e+00 20 + 4.238399035825307e+01 -7.785625123152710e-01 0.000000000000000e+00 -2.957313507988756e+00 -1.889923787502366e-02 2.146862384202469e+00 21 + 4.450318987616572e+01 -8.943162068965517e-01 0.000000000000000e+00 -3.294896483624423e+00 -1.841259535939614e-01 2.051800999525918e+00 22 + 4.662238939407835e+01 -1.022164926108374e+00 0.000000000000000e+00 -3.676725314021781e+00 -3.432314804149588e-01 1.991284282831078e+00 23 + 4.874158891199102e+01 -1.166111724137931e+00 0.000000000000000e+00 -4.102651579820645e+00 -5.034899071419768e-01 1.944879951099011e+00 24 + 5.086078842990366e+01 -1.325395270935961e+00 0.000000000000000e+00 -4.585680344442696e+00 -6.944182383563149e-01 1.888109521438915e+00 25 + 5.297998794781633e+01 -1.504970886699507e+00 0.000000000000000e+00 -5.166689492052464e+00 -9.464479611794926e-01 1.795137265041130e+00 26 + 5.509918746572898e+01 -1.707078275862069e+00 0.000000000000000e+00 -5.829761241403034e+00 -1.331448785580028e+00 1.572950482786750e+00 27 + 5.721838698364163e+01 -1.935478029556650e+00 0.000000000000000e+00 -6.607040906671076e+00 -1.857716459023805e+00 1.205686533770803e+00 28 + 5.933758650155428e+01 -2.194745172413793e+00 0.000000000000000e+00 -7.654100340223317e+00 -2.493070572147947e+00 7.343636341297369e-01 29 + 6.145678601946693e+01 -2.500000000000000e+00 0.000000000000000e+00 -8.281837270494590e+00 -3.205330715589577e+00 1.999999999999999e-01 30 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/NREL-2p8-127_Cp_Ct_Cq.txt b/ROSCO/Test_Cases/NREL_2p8_127/NREL-2p8-127_Cp_Ct_Cq.txt new file mode 100644 index 000000000..2268df833 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/NREL-2p8-127_Cp_Ct_Cq.txt @@ -0,0 +1,111 @@ +# ----- Rotor performance tables for the WISDEM tuning wind turbine ----- +# ------------ Written on Jul-01-21 using the ROSCO toolbox ------------ + +# Pitch angle vector, 30 entries - x axis (matrix columns) (deg) +-5.0 -3.793 -2.586 -1.379 -0.1724 1.034 2.241 3.448 4.655 5.862 7.069 8.276 9.483 10.69 11.9 13.1 14.31 15.52 16.72 17.93 19.14 20.34 21.55 22.76 23.97 25.17 26.38 27.59 28.79 30.0 +# TSR vector, 30 entries - y axis (matrix rows) (-) +2.0 2.345 2.69 3.034 3.379 3.724 4.069 4.414 4.759 5.103 5.448 5.793 6.138 6.483 6.828 7.172 7.517 7.862 8.207 8.552 8.897 9.241 9.586 9.931 10.28 10.62 10.97 11.31 11.66 12.0 +# Wind speed vector - z axis (m/s) +10.68 + +# Power coefficient + +0.005733 0.008358 0.010931 0.013451 0.015923 0.018353 0.020747 0.023112 0.025459 0.027794 0.030128 0.032473 0.034841 0.037250 0.039720 0.042275 0.044947 0.047736 0.050369 0.052438 0.053782 0.054536 0.054902 0.055053 0.055070 0.054924 0.054451 0.053413 0.051671 0.049088 +0.010473 0.014052 0.017571 0.021038 0.024463 0.027857 0.031232 0.034602 0.037982 0.041391 0.044855 0.048407 0.052073 0.055894 0.059917 0.063725 0.066595 0.068386 0.069435 0.070068 0.070525 0.070875 0.070899 0.070223 0.068520 0.065563 0.061477 0.056461 0.050687 0.044351 +0.016648 0.021451 0.026198 0.030903 0.035583 0.040258 0.044950 0.049690 0.054525 0.059496 0.064610 0.069956 0.075525 0.080323 0.083509 0.085464 0.086777 0.087879 0.088967 0.089747 0.089510 0.087678 0.083964 0.078635 0.072110 0.064721 0.056667 0.048586 0.039467 0.029816 +0.024451 0.030790 0.037088 0.043370 0.049664 0.056017 0.062499 0.069156 0.075949 0.082980 0.090401 0.096848 0.101076 0.103789 0.105878 0.107957 0.110172 0.111665 0.111132 0.107849 0.102059 0.094460 0.085644 0.075982 0.066327 0.055369 0.043639 0.032509 0.020157 0.007204 +0.034042 0.042277 0.050504 0.058774 0.067185 0.075810 0.084575 0.093427 0.102846 0.111995 0.118495 0.122686 0.126019 0.129475 0.133430 0.136352 0.136037 0.131773 0.124323 0.114686 0.103692 0.091818 0.079871 0.066581 0.053315 0.038287 0.023162 0.007449 -0.008632 -0.024586 +0.045585 0.056130 0.066777 0.077664 0.088762 0.099834 0.111077 0.123170 0.133767 0.140785 0.145956 0.151011 0.157146 0.162829 0.164232 0.160094 0.151678 0.140464 0.127481 0.113476 0.099240 0.083738 0.067897 0.050473 0.032437 0.013439 -0.006199 -0.025342 -0.045516 -0.065143 +0.059260 0.072709 0.086474 0.100339 0.113961 0.127912 0.142939 0.155463 0.163934 0.171005 0.179040 0.188615 0.194301 0.192393 0.184326 0.172304 0.157818 0.142304 0.125481 0.108163 0.089149 0.070050 0.048899 0.026622 0.003778 -0.018932 -0.042759 -0.066818 -0.089995 -0.111563 +0.075452 0.092497 0.109469 0.125954 0.142837 0.161240 0.176710 0.187609 0.197446 0.209785 0.222490 0.226531 0.221214 0.209858 0.194803 0.177987 0.159296 0.139878 0.119164 0.097278 0.073947 0.048842 0.022621 -0.004023 -0.031153 -0.059069 -0.087357 -0.114578 -0.140484 -0.164736 +0.094511 0.115022 0.134762 0.154737 0.176972 0.196672 0.211032 0.224473 0.242210 0.257277 0.259309 0.251325 0.237445 0.219974 0.200798 0.179364 0.157090 0.133189 0.107637 0.080632 0.051709 0.021678 -0.009667 -0.041001 -0.073080 -0.105950 -0.138447 -0.169104 -0.197971 -0.224775 +0.115766 0.139262 0.162531 0.188762 0.214007 0.233062 0.250893 0.274820 0.291963 0.292630 0.283030 0.267459 0.248387 0.227009 0.203460 0.177863 0.150485 0.121761 0.090582 0.058077 0.023979 -0.011436 -0.047266 -0.084214 -0.121988 -0.160064 -0.196335 -0.230319 -0.262503 -0.292769 +0.138202 0.165180 0.195145 0.226872 0.252196 0.275177 0.305983 0.325658 0.326244 0.316157 0.300345 0.280365 0.256598 0.230927 0.201729 0.171679 0.139290 0.105344 0.069408 0.031095 -0.008598 -0.049591 -0.091288 -0.133915 -0.178094 -0.220525 -0.260789 -0.299211 -0.335296 -0.368913 +0.161551 0.194903 0.233072 0.266466 0.295512 0.333944 0.357168 0.359266 0.350611 0.334697 0.314121 0.289567 0.260693 0.230418 0.196940 0.161915 0.124757 0.085182 0.042894 -0.000790 -0.046411 -0.092800 -0.140820 -0.191037 -0.240613 -0.287931 -0.333389 -0.376354 -0.416036 -0.453961 +0.187222 0.230589 0.273386 0.309857 0.356719 0.384733 0.390248 0.383896 0.370565 0.350414 0.324413 0.295499 0.262058 0.226919 0.188856 0.149185 0.106270 0.060944 0.012546 -0.037082 -0.088941 -0.142059 -0.197711 -0.254659 -0.309941 -0.363301 -0.414317 -0.461320 -0.506034 -0.548809 +0.218182 0.270155 0.315870 0.371977 0.406056 0.416968 0.415541 0.404376 0.386195 0.360803 0.331422 0.297575 0.260704 0.220885 0.178443 0.132842 0.084899 0.032868 -0.022005 -0.078304 -0.136540 -0.197173 -0.261078 -0.325020 -0.387095 -0.447192 -0.502963 -0.555496 -0.605861 -0.653204 +0.254532 0.310663 0.376823 0.417704 0.436754 0.440281 0.435650 0.419393 0.397694 0.368784 0.336011 0.298185 0.257418 0.212716 0.165233 0.114373 0.059332 0.000710 -0.060597 -0.123897 -0.189821 -0.259087 -0.331270 -0.402899 -0.472743 -0.538898 -0.600642 -0.659473 -0.715589 -0.767490 +0.291345 0.362540 0.414077 0.442759 0.456364 0.457699 0.448489 0.431127 0.405674 0.375079 0.338260 0.297381 0.251595 0.202536 0.149608 0.092156 0.031270 -0.034407 -0.103383 -0.174606 -0.248877 -0.327443 -0.408776 -0.488867 -0.566514 -0.639447 -0.707853 -0.773526 -0.835768 -0.891588 +0.334267 0.392389 0.429122 0.454490 0.467414 0.468861 0.458486 0.439783 0.413047 0.379503 0.339810 0.294277 0.244514 0.190251 0.131042 0.067919 -0.000899 -0.074042 -0.150532 -0.230353 -0.313772 -0.402998 -0.493743 -0.583001 -0.669214 -0.748849 -0.825066 -0.898389 -0.966410 -1.025596 +0.357581 0.399673 0.430692 0.453633 0.471348 0.474079 0.465908 0.446519 0.418911 0.382644 0.339619 0.290170 0.235615 0.175506 0.110900 0.039947 -0.035948 -0.117185 -0.202556 -0.291136 -0.385516 -0.485608 -0.586336 -0.686466 -0.780338 -0.868234 -0.953223 -1.034163 -1.107681 -1.169678 +0.359089 0.395909 0.422920 0.446887 0.467916 0.476719 0.470246 0.452129 0.422792 0.384528 0.337886 0.284550 0.224670 0.159553 0.087437 0.009559 -0.074879 -0.164757 -0.258939 -0.357948 -0.463740 -0.575130 -0.688215 -0.798454 -0.900816 -0.998198 -1.092491 -1.181114 -1.259757 -1.324162 +0.352122 0.384922 0.412733 0.437293 0.459923 0.475065 0.473237 0.455603 0.425796 0.384974 0.335221 0.277195 0.212880 0.140688 0.062025 -0.024286 -0.117337 -0.216450 -0.320583 -0.430204 -0.548805 -0.673230 -0.799147 -0.919437 -1.031241 -1.139238 -1.243211 -1.339491 -1.422841 -1.489579 +0.337476 0.371192 0.400519 0.426291 0.450198 0.470638 0.473926 0.458015 0.427354 0.384641 0.331021 0.269346 0.198533 0.120306 0.033570 -0.061171 -0.163388 -0.272615 -0.386793 -0.509148 -0.641390 -0.779702 -0.918883 -1.049570 -1.172336 -1.291740 -1.405715 -1.509537 -1.597202 -1.666605 +0.318547 0.355113 0.386350 0.414679 0.439769 0.463178 0.472160 0.458769 0.428164 0.383342 0.326610 0.259227 0.183042 0.097321 0.002524 -0.100828 -0.213043 -0.332841 -0.458853 -0.594695 -0.741354 -0.895436 -1.047980 -1.189453 -1.324645 -1.456077 -1.580322 -1.691499 -1.783230 -1.855996 +0.296861 0.336357 0.371125 0.401227 0.428782 0.453625 0.468379 0.458572 0.427993 0.381040 0.320153 0.248295 0.165371 0.072165 -0.031080 -0.144120 -0.266822 -0.398094 -0.536575 -0.686751 -0.849789 -1.020458 -1.186248 -1.339816 -1.488593 -1.632618 -1.767333 -1.885639 -1.981441 -2.058554 +0.272813 0.316283 0.353808 0.387167 0.416653 0.443733 0.462868 0.457131 0.426821 0.377287 0.313149 0.235527 0.145893 0.044924 -0.067233 -0.190687 -0.324377 -0.467771 -0.619850 -0.786143 -0.967008 -1.154934 -1.333959 -1.501288 -1.664564 -1.821724 -1.967047 -2.092251 -2.192423 -2.275093 +0.246069 0.293978 0.335450 0.371711 0.404252 0.432681 0.455569 0.454421 0.424708 0.373151 0.304575 0.221274 0.124762 0.015593 -0.106430 -0.240075 -0.386009 -0.542363 -0.709498 -0.892981 -1.093361 -1.298929 -1.491618 -1.674356 -1.852938 -2.023747 -2.179757 -2.311694 -2.416806 -2.506397 +0.216826 0.269453 0.315238 0.355775 0.390496 0.421499 0.446849 0.450470 0.421163 0.367613 0.294770 0.205703 0.101961 -0.016317 -0.147823 -0.293601 -0.452261 -0.622484 -0.805520 -1.007723 -1.229078 -1.452472 -1.659852 -1.859420 -2.054090 -2.239027 -2.405773 -2.544411 -2.655240 -2.753201 +0.185378 0.242932 0.294130 0.338148 0.376456 0.409645 0.437023 0.444746 0.416677 0.361007 0.283893 0.188900 0.076999 -0.050213 -0.192792 -0.350430 -0.522552 -0.707567 -0.908176 -1.130888 -1.374382 -1.615659 -1.839260 -2.056853 -2.268390 -2.467901 -2.645409 -2.790903 -2.908382 -3.016187 +0.151541 0.215077 0.270909 0.319887 0.361564 0.397134 0.425931 0.437697 0.411248 0.353437 0.271813 0.170258 0.050180 -0.086481 -0.240782 -0.411284 -0.597745 -0.798619 -1.017747 -1.262940 -1.529489 -1.788749 -2.030361 -2.267024 -2.496202 -2.710710 -2.898994 -3.051693 -3.176877 -3.295979 +0.116719 0.184724 0.246682 0.300410 0.345826 0.383484 0.414182 0.429382 0.404775 0.344986 0.258834 0.150170 0.022144 -0.125552 -0.291478 -0.476005 -0.677661 -0.895479 -1.134529 -1.404210 -1.694559 -1.972164 -2.233589 -2.490305 -2.737888 -2.967794 -3.166880 -3.327314 -3.461362 -3.593163 +0.083160 0.153221 0.220860 0.279749 0.328690 0.369159 0.401864 0.419718 0.397476 0.335735 0.244382 0.129245 -0.008566 -0.166737 -0.345714 -0.544710 -0.762454 -0.998353 -1.258854 -1.554935 -1.869688 -2.166410 -2.449315 -2.727062 -2.993813 -3.239497 -3.449471 -3.618299 -3.762458 -3.908311 + + +# Thrust coefficient + +0.092617 0.091973 0.091282 0.090551 0.089789 0.089009 0.088223 0.087443 0.086683 0.085957 0.085280 0.084668 0.084140 0.083714 0.083409 0.083241 0.083187 0.083136 0.082900 0.082292 0.081228 0.079766 0.078062 0.076284 0.074489 0.072639 0.070589 0.068103 0.065041 0.061235 +0.107807 0.107099 0.106370 0.105637 0.104916 0.104226 0.103585 0.103012 0.102531 0.102166 0.101942 0.101882 0.102014 0.102313 0.102613 0.102616 0.102036 0.100793 0.099051 0.097090 0.095137 0.093216 0.091122 0.088501 0.085056 0.080536 0.075010 0.068694 0.061744 0.054369 +0.125690 0.125020 0.124378 0.123788 0.123275 0.122867 0.122595 0.122492 0.122590 0.122922 0.123517 0.124280 0.124878 0.124839 0.123887 0.122169 0.120092 0.118075 0.116232 0.114243 0.111480 0.107417 0.101732 0.094621 0.086475 0.077627 0.068292 0.059385 0.049429 0.039068 +0.146469 0.145968 0.145568 0.145305 0.145219 0.145353 0.145746 0.146440 0.147476 0.148736 0.149769 0.149930 0.148898 0.147006 0.144888 0.143119 0.141664 0.139693 0.136101 0.130177 0.122042 0.112323 0.101588 0.090223 0.079407 0.067285 0.054557 0.043004 0.030260 0.017273 +0.170322 0.170162 0.170211 0.170521 0.171142 0.172124 0.173518 0.175280 0.176969 0.177796 0.177163 0.175410 0.173408 0.172028 0.171348 0.169865 0.165714 0.158160 0.147807 0.135540 0.122189 0.108233 0.094835 0.080132 0.065961 0.050014 0.034389 0.018544 0.003193 -0.010886 +0.197455 0.197860 0.198615 0.199780 0.201413 0.203541 0.205932 0.207836 0.208292 0.207137 0.205373 0.204234 0.204557 0.204565 0.200976 0.192600 0.180449 0.165872 0.149876 0.133238 0.117061 0.099744 0.082616 0.064007 0.045159 0.025713 0.006302 -0.011125 -0.028289 -0.044210 +0.228108 0.229335 0.231075 0.233378 0.236206 0.239147 0.241258 0.241561 0.240420 0.239344 0.240052 0.242465 0.241498 0.233969 0.220968 0.204514 0.186057 0.167281 0.147603 0.127937 0.106751 0.086199 0.063660 0.040417 0.017219 -0.004685 -0.025932 -0.045670 -0.063692 -0.079450 +0.262520 0.264837 0.267792 0.271266 0.274765 0.277277 0.277848 0.277232 0.277418 0.280948 0.284986 0.281401 0.269491 0.252166 0.231752 0.210486 0.187865 0.165132 0.141511 0.117131 0.091777 0.064983 0.037642 0.010798 -0.015186 -0.039683 -0.062267 -0.082642 -0.100832 -0.116042 +0.300899 0.304470 0.308545 0.312661 0.315868 0.317175 0.317479 0.319387 0.326537 0.331420 0.324563 0.308564 0.287341 0.263390 0.239016 0.212699 0.186421 0.158835 0.130094 0.100520 0.069495 0.038176 0.006565 -0.023392 -0.051487 -0.077331 -0.101050 -0.121896 -0.139281 -0.152655 +0.343271 0.347913 0.352697 0.356873 0.359360 0.360881 0.364797 0.376183 0.381530 0.371589 0.352097 0.327447 0.300692 0.272771 0.243417 0.212456 0.180280 0.147567 0.112935 0.077849 0.042129 0.006311 -0.028141 -0.060918 -0.090649 -0.117951 -0.142121 -0.162077 -0.177778 -0.190200 +0.389280 0.394727 0.400026 0.404078 0.407075 0.413055 0.429223 0.435350 0.423077 0.400722 0.374104 0.344727 0.312349 0.279252 0.242837 0.206780 0.169140 0.130977 0.091820 0.051267 0.010784 -0.029060 -0.066758 -0.100984 -0.132612 -0.160509 -0.184044 -0.202810 -0.217522 -0.228949 +0.438633 0.445040 0.450918 0.455672 0.463524 0.485007 0.492799 0.479208 0.455888 0.426352 0.393770 0.358519 0.319308 0.280331 0.238875 0.197193 0.154621 0.110858 0.065544 0.020470 -0.024506 -0.067347 -0.107384 -0.144048 -0.176562 -0.204438 -0.227047 -0.244755 -0.258294 -0.268897 +0.491706 0.499452 0.506279 0.515668 0.542884 0.553453 0.539904 0.515588 0.485998 0.450602 0.410018 0.368368 0.323023 0.277884 0.231163 0.184623 0.136206 0.086882 0.036071 -0.013663 -0.062666 -0.108746 -0.151171 -0.189073 -0.222113 -0.249567 -0.271188 -0.287669 -0.300602 -0.310227 +0.549345 0.558514 0.569279 0.602408 0.616664 0.604690 0.582220 0.550051 0.512271 0.468142 0.422118 0.373239 0.323447 0.272627 0.221194 0.168412 0.115188 0.059566 0.003362 -0.051146 -0.103573 -0.152467 -0.196894 -0.235916 -0.269224 -0.295885 -0.316232 -0.332225 -0.344350 -0.352382 +0.612101 0.624375 0.664085 0.681142 0.674153 0.650222 0.621076 0.578484 0.533557 0.482845 0.431122 0.376532 0.321741 0.265249 0.208409 0.150399 0.090234 0.028797 -0.032224 -0.091118 -0.147230 -0.198731 -0.244615 -0.284679 -0.317626 -0.343032 -0.363010 -0.378328 -0.389183 -0.395374 +0.681140 0.722494 0.744937 0.741819 0.723240 0.692359 0.650892 0.603471 0.550332 0.495575 0.437299 0.378355 0.317265 0.255902 0.193374 0.128796 0.063320 -0.003921 -0.070382 -0.133867 -0.193205 -0.246832 -0.294513 -0.334907 -0.366839 -0.391968 -0.411381 -0.425701 -0.435248 -0.438943 +0.784148 0.809192 0.808836 0.792982 0.766161 0.727627 0.678346 0.624772 0.566940 0.506098 0.442987 0.377600 0.311662 0.244545 0.175539 0.105591 0.033001 -0.039972 -0.111103 -0.178920 -0.241079 -0.297271 -0.346084 -0.386032 -0.417835 -0.442342 -0.461133 -0.474603 -0.482332 -0.482920 +0.878798 0.878837 0.863060 0.835105 0.802967 0.756008 0.703552 0.644299 0.581942 0.515391 0.446747 0.375978 0.304277 0.230822 0.156465 0.079145 0.000687 -0.078083 -0.154487 -0.225874 -0.291394 -0.349551 -0.398730 -0.438965 -0.470211 -0.494454 -0.512604 -0.524870 -0.530317 -0.527179 +0.954018 0.939321 0.909436 0.873286 0.832514 0.783431 0.725750 0.663095 0.594833 0.523420 0.448910 0.372835 0.294905 0.216166 0.134425 0.050923 -0.034393 -0.118873 -0.199777 -0.275311 -0.343458 -0.403080 -0.453308 -0.493210 -0.524351 -0.548257 -0.565667 -0.576443 -0.579083 -0.571691 +1.023567 0.991396 0.952287 0.906521 0.858662 0.807150 0.747584 0.679776 0.607111 0.529975 0.450234 0.367981 0.284931 0.198845 0.110913 0.020042 -0.071681 -0.161822 -0.247543 -0.326338 -0.397314 -0.458714 -0.509404 -0.549186 -0.580227 -0.603771 -0.620315 -0.629247 -0.628527 -0.616549 +1.082395 1.041804 0.991706 0.937500 0.883506 0.829745 0.767582 0.695892 0.617983 0.535899 0.450029 0.362870 0.272561 0.180369 0.084918 -0.012918 -0.111052 -0.207054 -0.296861 -0.379668 -0.453228 -0.515758 -0.566811 -0.606870 -0.637885 -0.661022 -0.676524 -0.683203 -0.678594 -0.661917 +1.139470 1.088591 1.028946 0.968630 0.908004 0.850049 0.785703 0.710556 0.628371 0.540937 0.449853 0.355602 0.259321 0.159705 0.057014 -0.047554 -0.152331 -0.253888 -0.348541 -0.434946 -0.510661 -0.574581 -0.626062 -0.666337 -0.697360 -0.720024 -0.734260 -0.738241 -0.729302 -0.707987 +1.193356 1.132284 1.066459 0.998428 0.932385 0.868695 0.802509 0.724743 0.637956 0.545168 0.447725 0.347749 0.244209 0.137366 0.027344 -0.084534 -0.195804 -0.303098 -0.402185 -0.491831 -0.569969 -0.635054 -0.687035 -0.727643 -0.758678 -0.780783 -0.793478 -0.794302 -0.780726 -0.754961 +1.246139 1.176860 1.102810 1.028791 0.956073 0.887434 0.818433 0.738064 0.646836 0.548098 0.445275 0.338296 0.227647 0.113522 -0.003991 -0.123338 -0.241002 -0.353871 -0.457470 -0.550699 -0.630979 -0.697211 -0.749803 -0.790834 -0.821861 -0.843294 -0.854136 -0.851351 -0.832973 -0.803032 +1.297833 1.220927 1.139862 1.058606 0.980276 0.905327 0.833196 0.750616 0.655027 0.550899 0.441477 0.327617 0.209871 0.088199 -0.037295 -0.163462 -0.287985 -0.406413 -0.514793 -0.611346 -0.693698 -0.761096 -0.814426 -0.855942 -0.886923 -0.907540 -0.916195 -0.909382 -0.886156 -0.852355 +1.349499 1.264699 1.176444 1.089146 1.003822 0.923619 0.847140 0.762383 0.662108 0.552546 0.436663 0.315954 0.190856 0.061078 -0.071728 -0.205866 -0.337083 -0.461115 -0.573945 -0.673753 -0.758148 -0.826758 -0.880950 -0.922989 -0.953877 -0.973504 -0.979625 -0.968430 -0.940389 -0.903039 +1.401303 1.308592 1.213895 1.119148 1.027971 0.941861 0.860452 0.772903 0.668581 0.553361 0.431060 0.303363 0.170279 0.032750 -0.108329 -0.249749 -0.387655 -0.517261 -0.634906 -0.737912 -0.824352 -0.894252 -0.949413 -0.991994 -1.022726 -1.041166 -1.044395 -1.028546 -0.995775 -0.955152 +1.452242 1.353400 1.250891 1.149892 1.052236 0.960061 0.872934 0.782638 0.674455 0.553511 0.424528 0.289397 0.148463 0.002987 -0.146530 -0.295534 -0.440250 -0.575517 -0.697662 -0.803821 -0.892330 -0.963626 -1.019849 -1.062972 -1.093473 -1.110511 -1.110480 -1.089791 -1.052396 -1.008724 +1.502155 1.397642 1.288756 1.180858 1.076625 0.977784 0.885198 0.791667 0.679649 0.553086 0.417399 0.274454 0.126013 -0.028498 -0.185977 -0.343001 -0.494588 -0.635562 -0.762201 -0.871489 -0.962109 -1.034918 -1.092283 -1.135935 -1.166113 -1.181520 -1.177866 -1.152220 -1.110323 -1.063759 +1.548197 1.442437 1.326903 1.212074 1.100665 0.995531 0.897392 0.799857 0.684430 0.552127 0.409217 0.259083 0.101756 -0.061061 -0.227233 -0.392126 -0.550655 -0.697385 -0.828511 -0.940928 -1.033720 -1.108161 -1.166734 -1.210891 -1.240644 -1.254176 -1.246561 -1.215880 -1.169616 -1.120255 + + +# Torque coefficient + +0.002876 0.004193 0.005484 0.006749 0.007989 0.009208 0.010409 0.011596 0.012773 0.013945 0.015116 0.016292 0.017480 0.018689 0.019929 0.021210 0.022551 0.023950 0.025271 0.026309 0.026984 0.027362 0.027545 0.027621 0.027630 0.027557 0.027319 0.026798 0.025925 0.024629 +0.004482 0.006014 0.007519 0.009003 0.010469 0.011921 0.013366 0.014808 0.016254 0.017713 0.019195 0.020715 0.022284 0.023919 0.025641 0.027270 0.028499 0.029265 0.029714 0.029985 0.030180 0.030330 0.030340 0.030051 0.029322 0.028057 0.026309 0.024162 0.021691 0.018980 +0.006211 0.008003 0.009774 0.011529 0.013275 0.015019 0.016770 0.018538 0.020342 0.022197 0.024104 0.026099 0.028177 0.029967 0.031155 0.031885 0.032374 0.032786 0.033192 0.033483 0.033394 0.032711 0.031325 0.029337 0.026902 0.024146 0.021141 0.018126 0.014724 0.011124 +0.008085 0.010182 0.012264 0.014342 0.016423 0.018524 0.020667 0.022868 0.025115 0.027440 0.029894 0.032026 0.033424 0.034321 0.035012 0.035699 0.036432 0.036925 0.036749 0.035664 0.033749 0.031236 0.028321 0.025126 0.021933 0.018310 0.014430 0.010750 0.006666 0.002382 +0.010108 0.012554 0.014996 0.017452 0.019950 0.022511 0.025113 0.027742 0.030539 0.033256 0.035186 0.036430 0.037420 0.038446 0.039620 0.040488 0.040395 0.039128 0.036916 0.034054 0.030790 0.027264 0.023717 0.019770 0.015831 0.011369 0.006878 0.002212 -0.002563 -0.007300 +0.012283 0.015124 0.017993 0.020926 0.023916 0.026900 0.029929 0.033187 0.036043 0.037934 0.039327 0.040689 0.042342 0.043873 0.044251 0.043136 0.040869 0.037847 0.034349 0.030575 0.026740 0.022563 0.018294 0.013600 0.008740 0.003621 -0.001670 -0.006828 -0.012264 -0.017552 +0.014614 0.017931 0.021325 0.024745 0.028104 0.031544 0.035250 0.038339 0.040428 0.042171 0.044153 0.046514 0.047916 0.047446 0.045456 0.042492 0.038919 0.035093 0.030945 0.026674 0.021985 0.017275 0.012059 0.006565 0.000932 -0.004669 -0.010545 -0.016478 -0.022194 -0.027513 +0.017154 0.021028 0.024887 0.028635 0.032473 0.036657 0.040174 0.042652 0.044888 0.047693 0.050582 0.051500 0.050292 0.047710 0.044287 0.040464 0.036215 0.031800 0.027091 0.022115 0.016811 0.011104 0.005143 -0.000914 -0.007082 -0.013429 -0.019860 -0.026048 -0.031938 -0.037452 +0.019929 0.024255 0.028417 0.032629 0.037318 0.041472 0.044500 0.047334 0.051075 0.054252 0.054680 0.052997 0.050070 0.046386 0.042342 0.037822 0.033125 0.028085 0.022697 0.017003 0.010904 0.004571 -0.002038 -0.008646 -0.015410 -0.022342 -0.029194 -0.035659 -0.041746 -0.047398 +0.022762 0.027382 0.031957 0.037115 0.042078 0.045825 0.049331 0.054035 0.057406 0.057537 0.055650 0.052588 0.048838 0.044635 0.040005 0.034972 0.029588 0.023941 0.017810 0.011419 0.004715 -0.002249 -0.009294 -0.016558 -0.023985 -0.031472 -0.038603 -0.045286 -0.051614 -0.057565 +0.025454 0.030422 0.035941 0.041785 0.046449 0.050681 0.056355 0.059978 0.060087 0.058229 0.055317 0.051637 0.047259 0.042531 0.037154 0.031619 0.025654 0.019402 0.012783 0.005727 -0.001584 -0.009134 -0.016813 -0.024664 -0.032801 -0.040616 -0.048031 -0.055108 -0.061754 -0.067945 +0.027983 0.033760 0.040371 0.046156 0.051187 0.057844 0.061866 0.062230 0.060731 0.057974 0.054410 0.050157 0.045156 0.039912 0.034113 0.028046 0.021610 0.014755 0.007430 -0.000137 -0.008039 -0.016074 -0.024392 -0.033090 -0.041677 -0.049874 -0.057748 -0.065190 -0.072063 -0.078632 +0.030608 0.037697 0.044694 0.050656 0.058317 0.062897 0.063799 0.062760 0.060581 0.057286 0.053036 0.048309 0.042842 0.037097 0.030875 0.024389 0.017373 0.009963 0.002051 -0.006062 -0.014540 -0.023224 -0.032322 -0.041632 -0.050670 -0.059393 -0.067733 -0.075418 -0.082728 -0.089721 +0.033772 0.041816 0.048892 0.057577 0.062852 0.064541 0.064320 0.062592 0.059778 0.055847 0.051300 0.046061 0.040353 0.034190 0.027621 0.020562 0.013141 0.005088 -0.003406 -0.012120 -0.021134 -0.030520 -0.040411 -0.050309 -0.059917 -0.069219 -0.077852 -0.085983 -0.093779 -0.101107 +0.037408 0.045658 0.055381 0.061390 0.064189 0.064708 0.064027 0.061638 0.058449 0.054200 0.049383 0.043824 0.037832 0.031263 0.024284 0.016809 0.008720 0.000104 -0.008906 -0.018209 -0.027898 -0.038078 -0.048686 -0.059214 -0.069479 -0.079201 -0.088276 -0.096922 -0.105169 -0.112797 +0.040760 0.050721 0.057931 0.061943 0.063847 0.064034 0.062745 0.060316 0.056755 0.052475 0.047324 0.041605 0.035199 0.028335 0.020931 0.012893 0.004375 -0.004814 -0.014464 -0.024428 -0.034819 -0.045810 -0.057189 -0.068394 -0.079257 -0.089461 -0.099031 -0.108219 -0.116927 -0.124736 +0.044620 0.052378 0.057282 0.060668 0.062393 0.062586 0.061201 0.058705 0.055136 0.050658 0.045360 0.039282 0.032639 0.025396 0.017492 0.009066 -0.000120 -0.009884 -0.020094 -0.030749 -0.041884 -0.053794 -0.065908 -0.077822 -0.089331 -0.099961 -0.110134 -0.119922 -0.129002 -0.136902 +0.045638 0.051011 0.054970 0.057898 0.060159 0.060507 0.059464 0.056990 0.053466 0.048837 0.043346 0.037035 0.030072 0.022400 0.014154 0.005098 -0.004588 -0.014956 -0.025852 -0.037158 -0.049204 -0.061979 -0.074835 -0.087614 -0.099595 -0.110814 -0.121661 -0.131991 -0.141374 -0.149287 +0.043905 0.048407 0.051710 0.054640 0.057211 0.058288 0.057496 0.055281 0.051694 0.047016 0.041313 0.034791 0.027470 0.019508 0.010691 0.001169 -0.009155 -0.020145 -0.031660 -0.043766 -0.056701 -0.070320 -0.084147 -0.097626 -0.110141 -0.122048 -0.133577 -0.144413 -0.154028 -0.161903 +0.041317 0.045166 0.048429 0.051311 0.053967 0.055743 0.055529 0.053460 0.049962 0.045172 0.039334 0.032526 0.024979 0.016508 0.007278 -0.002850 -0.013768 -0.025398 -0.037617 -0.050479 -0.064396 -0.078996 -0.093770 -0.107885 -0.121004 -0.133676 -0.145876 -0.157174 -0.166954 -0.174785 +0.038064 0.041867 0.045175 0.048081 0.050778 0.053083 0.053454 0.051660 0.048201 0.043384 0.037336 0.030380 0.022393 0.013569 0.003786 -0.006900 -0.018429 -0.030748 -0.043627 -0.057427 -0.072343 -0.087943 -0.103641 -0.118381 -0.132228 -0.145696 -0.158551 -0.170261 -0.180149 -0.187977 +0.034588 0.038559 0.041951 0.045027 0.047751 0.050293 0.051268 0.049814 0.046491 0.041624 0.035464 0.028147 0.019875 0.010567 0.000274 -0.010948 -0.023133 -0.036140 -0.049823 -0.064573 -0.080497 -0.097228 -0.113791 -0.129153 -0.143832 -0.158103 -0.171594 -0.183666 -0.193626 -0.201527 +0.031074 0.035208 0.038848 0.041999 0.044883 0.047484 0.049028 0.048001 0.044800 0.039886 0.033512 0.025991 0.017310 0.007554 -0.003253 -0.015086 -0.027930 -0.041671 -0.056166 -0.071886 -0.088952 -0.106817 -0.124171 -0.140246 -0.155820 -0.170896 -0.184997 -0.197381 -0.207409 -0.215481 +0.027565 0.031958 0.035749 0.039120 0.042099 0.044835 0.046769 0.046189 0.043127 0.038122 0.031641 0.023798 0.014741 0.004539 -0.006793 -0.019267 -0.032775 -0.047264 -0.062630 -0.079433 -0.097708 -0.116696 -0.134785 -0.151692 -0.168190 -0.184069 -0.198753 -0.211404 -0.221525 -0.229878 +0.024029 0.028707 0.032757 0.036298 0.039475 0.042252 0.044487 0.044375 0.041473 0.036438 0.029742 0.021608 0.012183 0.001523 -0.010393 -0.023443 -0.037694 -0.052962 -0.069283 -0.087200 -0.106767 -0.126841 -0.145657 -0.163502 -0.180941 -0.197620 -0.212855 -0.225738 -0.236003 -0.244751 +0.020486 0.025458 0.029784 0.033614 0.036894 0.039823 0.042218 0.042560 0.039792 0.034732 0.027850 0.019435 0.009633 -0.001542 -0.013966 -0.027739 -0.042730 -0.058812 -0.076106 -0.095210 -0.116123 -0.137230 -0.156823 -0.175678 -0.194071 -0.211544 -0.227298 -0.240396 -0.250867 -0.260123 +0.016964 0.022230 0.026916 0.030944 0.034449 0.037486 0.039992 0.040698 0.038130 0.033035 0.025979 0.017286 0.007046 -0.004595 -0.017642 -0.032068 -0.047818 -0.064749 -0.083106 -0.103486 -0.125768 -0.147847 -0.168309 -0.188221 -0.207578 -0.225835 -0.242079 -0.255393 -0.266143 -0.276008 +0.013445 0.019081 0.024035 0.028380 0.032078 0.035233 0.037788 0.038832 0.036486 0.031357 0.024115 0.015105 0.004452 -0.007673 -0.021362 -0.036489 -0.053031 -0.070853 -0.090294 -0.112047 -0.135695 -0.158696 -0.180132 -0.201128 -0.221461 -0.240492 -0.257196 -0.270744 -0.281850 -0.292416 +0.010049 0.015904 0.021238 0.025864 0.029774 0.033016 0.035659 0.036967 0.034849 0.029701 0.022284 0.012929 0.001906 -0.010809 -0.025095 -0.040981 -0.058343 -0.077096 -0.097676 -0.120894 -0.145892 -0.169792 -0.192299 -0.214401 -0.235717 -0.255510 -0.272650 -0.286463 -0.298004 -0.309351 +0.006954 0.012812 0.018468 0.023393 0.027485 0.030869 0.033604 0.035097 0.033237 0.028074 0.020435 0.010808 -0.000716 -0.013943 -0.028909 -0.045549 -0.063757 -0.083483 -0.105266 -0.130024 -0.156344 -0.181156 -0.204813 -0.228038 -0.250344 -0.270888 -0.288446 -0.302563 -0.314618 -0.326814 + diff --git a/ROSCO/Test_Cases/NREL_2p8_127/NREL-2p8-127_DISCON.IN b/ROSCO/Test_Cases/NREL_2p8_127/NREL-2p8-127_DISCON.IN new file mode 100644 index 000000000..ec720eb57 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/NREL-2p8-127_DISCON.IN @@ -0,0 +1,173 @@ +! Controller parameter input file for the NREL-2p8-127 wind turbine +! - File written using ROSCO version 2.8.0 controller tuning logic on 04/10/23 + +!------- DEBUG ------------------------------------------------------------ +2 ! LoggingLevel - (0: write no debug files, 1: write standard output .dbg-file, 2: LoggingLevel 1 + ROSCO LocalVars (.dbg2) 3: LoggingLevel 2 + complete avrSWAP-array (.dbg3)) +0 ! Echo - (0 - no Echo, 1 - Echo input data to .echo) + +!------- CONTROLLER FLAGS ------------------------------------------------- +1 ! F_LPFType - (1: first-order low-pass filter, 2: second-order low-pass filter), [rad/s] (currently filters generator speed and pitch control signals +0 ! F_NotchType - Notch on the measured generator speed and/or tower fore-aft motion (for floating) {0: disable, 1: generator speed, 2: tower-top fore-aft motion, 3: generator speed and tower-top fore-aft motion} +1 ! IPC_ControlMode - Turn Individual Pitch Control (IPC) for fatigue load reductions (pitch contribution) {0: off, 1: 1P reductions, 2: 1P+2P reductions} +3 ! VS_ControlMode - Generator torque control mode in above rated conditions {0: constant torque, 1: constant power, 2: TSR tracking PI control with constant torque, 3: TSR tracking PI control with constant power} +1 ! PC_ControlMode - Blade pitch control mode {0: No pitch, fix to fine pitch, 1: active PI blade pitch control} +0 ! Y_ControlMode - Yaw control mode {0: no yaw control, 1: yaw rate control, 2: yaw-by-IPC} +1 ! SS_Mode - Setpoint Smoother mode {0: no setpoint smoothing, 1: introduce setpoint smoothing} +2 ! WE_Mode - Wind speed estimator mode {0: One-second low pass filtered hub height wind speed, 1: Immersion and Invariance Estimator, 2: Extended Kalman Filter} +1 ! PS_Mode - Pitch saturation mode {0: no pitch saturation, 1: implement pitch saturation} +0 ! SD_Mode - Shutdown mode {0: no shutdown procedure, 1: pitch to max pitch at shutdown} +0 ! Fl_Mode - Floating specific feedback mode {0: no nacelle velocity feedback, 1: feed back translational velocity, 2: feed back rotational veloicty} +0 ! TD_Mode - Tower damper mode {0: no tower damper, 1: feed back translational nacelle accelleration to pitch angle} +0 ! Flp_Mode - Flap control mode {0: no flap control, 1: steady state flap angle, 2: Proportional flap control, 2: Cyclic (1P) flap control} +0 ! OL_Mode - Open loop control mode {0: no open loop control, 1: open loop control vs. time} +0 ! PA_Mode - Pitch actuator mode {0 - not used, 1 - first order filter, 2 - second order filter} +0 ! PF_Mode - Pitch fault mode {0 - not used, 1 - constant offset on one or more blades} +0 ! AWC_Mode - Active wake control {0 - not used, 1 - complex number method, 2 - Coleman transform method} +0 ! Ext_Mode - External control mode {0 - not used, 1 - call external dynamic library} +0 ! ZMQ_Mode - Fuse ZeroMQ interface {0: unused, 1: Yaw Control} +0 ! CC_Mode - Cable control mode [0- unused, 1- User defined, 2- Open loop control] +0 ! StC_Mode - Structural control mode [0- unused, 1- User defined, 2- Open loop control] + +!------- FILTERS ---------------------------------------------------------- +2.07080 ! F_LPFCornerFreq - Corner frequency (-3dB point) in the low-pass filters, [rad/s] +0.00000 ! F_LPFDamping - Damping coefficient {used only when F_FilterType = 2} [-] +0.00000 ! F_NotchCornerFreq - Natural frequency of the notch filter, [rad/s] +0.000000 0.250000 ! F_NotchBetaNumDen - Two notch damping values (numerator and denominator, resp) - determines the width and depth of the notch, [-] +0.62830 ! F_SSCornerFreq - Corner frequency (-3dB point) in the first order low pass filter for the setpoint smoother, [rad/s]. +0.20944 ! F_WECornerFreq - Corner frequency (-3dB point) in the first order low pass filter for the wind speed estimate [rad/s]. +0.17952 ! F_YawErr - Low pass filter corner frequency for yaw controller [rad/s]. +0.000000 1.000000 ! F_FlCornerFreq - Natural frequency and damping in the second order low pass filter of the tower-top fore-aft motion for floating feedback control [rad/s, -]. +0.01042 ! F_FlHighPassFreq - Natural frequency of first-order high-pass filter for nacelle fore-aft motion [rad/s]. +0.000000 1.000000 ! F_FlpCornerFreq - Corner frequency and damping in the second order low pass filter of the blade root bending moment for flap control [rad/s, -]. + +!------- BLADE PITCH CONTROL ---------------------------------------------- +30 ! PC_GS_n - Amount of gain-scheduling table entries +0.075990 0.104503 0.127446 0.147544 0.164940 0.181678 0.197073 0.211624 0.225753 0.238993 0.252021 0.264458 0.276515 0.288229 0.299596 0.310932 0.321646 0.332112 0.342584 0.353105 0.363012 0.373072 0.382733 0.392195 0.401619 0.411107 0.420504 0.429096 0.437752 0.446357 ! PC_GS_angles - Gain-schedule table: pitch angles [rad]. +-0.024441 -0.021943 -0.019855 -0.018085 -0.016566 -0.015246 -0.014091 -0.013070 -0.012161 -0.011347 -0.010614 -0.009951 -0.009347 -0.008795 -0.008289 -0.007824 -0.007394 -0.006995 -0.006625 -0.006280 -0.005958 -0.005657 -0.005375 -0.005109 -0.004860 -0.004624 -0.004401 -0.004191 -0.003991 -0.003802 ! PC_GS_KP - Gain-schedule table: pitch controller kp gains [s]. +-0.000804 -0.000732 -0.000672 -0.000621 -0.000577 -0.000539 -0.000505 -0.000476 -0.000450 -0.000426 -0.000405 -0.000386 -0.000369 -0.000353 -0.000338 -0.000325 -0.000312 -0.000301 -0.000290 -0.000280 -0.000271 -0.000262 -0.000254 -0.000246 -0.000239 -0.000232 -0.000226 -0.000220 -0.000214 -0.000209 ! PC_GS_KI - Gain-schedule table: pitch controller ki gains [-]. +0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 ! PC_GS_KD - Gain-schedule table: pitch controller kd gains +0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 ! PC_GS_TF - Gain-schedule table: pitch controller tf gains (derivative filter) +1.570000000000 ! PC_MaxPit - Maximum physical pitch limit, [rad]. +-0.17453000000 ! PC_MinPit - Minimum physical pitch limit, [rad]. +0.174500000000 ! PC_MaxRat - Maximum pitch rate (in absolute value) in pitch controller, [rad/s]. +-0.17450000000 ! PC_MinRat - Minimum pitch rate (in absolute value) in pitch controller, [rad/s]. +122.9096700000 ! PC_RefSpd - Desired (reference) HSS speed for pitch controller, [rad/s]. +0.000000000000 ! PC_FinePit - Record 5: Below-rated pitch angle set-point, [rad] +0.017450000000 ! PC_Switch - Angle above lowest minimum pitch angle for switch, [rad] + +!------- INDIVIDUAL PITCH CONTROL ----------------------------------------- +9.120000 11.400000 ! IPC_Vramp - Start and end wind speeds for cut-in ramp function. First entry: IPC inactive, second entry: IPC fully active. [m/s] +2 ! IPC_SatMode - IPC Saturation method (0 - no saturation (except by PC_MinPit), 1 - saturate by PS_BldPitchMin, 2 - saturate sotfly (full IPC cycle) by PC_MinPit, 3 - saturate softly by PS_BldPitchMin) +0.3 ! IPC_IntSat - Integrator saturation (maximum signal amplitude contribution to pitch from IPC), [rad] +0.000e+00 0.000e+00 ! IPC_KP - Proportional gain for the individual pitch controller: first parameter for 1P reductions, second for 2P reductions, [-] +5.200e-09 0.000e+00 ! IPC_KI - Integral gain for the individual pitch controller: first parameter for 1P reductions, second for 2P reductions, [-] +0.000000 0.000000 ! IPC_aziOffset - Phase offset added to the azimuth angle for the individual pitch controller, [rad]. +0.0 ! IPC_CornerFreqAct - Corner frequency of the first-order actuators model, to induce a phase lag in the IPC signal {0: Disable}, [rad/s] + +!------- VS TORQUE CONTROL ------------------------------------------------ +93.94773000000 ! VS_GenEff - Generator efficiency mechanical power -> electrical power, [should match the efficiency defined in the generator properties!], [%] +24248.54567000 ! VS_ArSatTq - Above rated generator torque PI control saturation, [Nm] +1500000.000000 ! VS_MaxRat - Maximum torque rate (in absolute value) in torque controller, [Nm/s]. +26673.40024000 ! VS_MaxTq - Maximum generator torque in Region 3 (HSS side), [Nm]. +0.000000000000 ! VS_MinTq - Minimum generator torque (HSS side), [Nm]. +37.81562000000 ! VS_MinOMSpd - Minimum generator speed [rad/s] +1.931170000000 ! VS_Rgn2K - Generator torque constant in Region 2 (HSS side), [Nm/(rad/s)^2] +2800000.000000 ! VS_RtPwr - Wind turbine rated power [W] +24248.54567000 ! VS_RtTq - Rated torque, [Nm]. +122.9096700000 ! VS_RefSpd - Rated generator speed [rad/s] +1 ! VS_n - Number of generator PI torque controller gains +-600.450450000 ! VS_KP - Proportional gain for generator PI torque controller [-]. (Only used in the transitional 2.5 region if VS_ControlMode =/ 2) +-85.3230300000 ! VS_KI - Integral gain for generator PI torque controller [s]. (Only used in the transitional 2.5 region if VS_ControlMode =/ 2) +8.25 ! VS_TSRopt - Power-maximizing region 2 tip-speed-ratio [rad]. + +!------- SETPOINT SMOOTHER --------------------------------------------- +1.00000 ! SS_VSGain - Variable speed torque controller setpoint smoother gain, [-]. +0.00100 ! SS_PCGain - Collective pitch controller setpoint smoother gain, [-]. + +!------- WIND SPEED ESTIMATOR --------------------------------------------- +63.457 ! WE_BladeRadius - Blade length (distance from hub center to blade tip), [m] +1 ! WE_CP_n - Amount of parameters in the Cp array +0.0 ! WE_CP - Parameters that define the parameterized CP(lambda) function +0.0 ! WE_Gamma - Adaption gain of the wind speed estimator algorithm [m/rad] +97.0 ! WE_GearboxRatio - Gearbox ratio [>=1], [-] +66347470.49793 ! WE_Jtot - Total drivetrain inertia, including blades, hub and casted generator inertia to LSS, [kg m^2] +1.225 ! WE_RhoAir - Air density, [kg m^-3] +"NREL-2p8-127_Cp_Ct_Cq.txt" ! PerfFileName - File containing rotor performance tables (Cp,Ct,Cq) (absolute path or relative to this file) +30 30 ! PerfTableSize - Size of rotor performance tables, first number refers to number of blade pitch angles, second number referse to number of tip-speed ratios +60 ! WE_FOPoles_N - Number of first-order system poles used in EKF +3.0000 3.2897 3.5793 3.8690 4.1586 4.4483 4.7379 5.0276 5.3172 5.6069 5.8966 6.1862 6.4759 6.7655 7.0552 7.3448 7.6345 7.9241 8.2138 8.5034 8.7931 9.0828 9.3724 9.6621 9.9517 10.2414 10.5310 10.8207 11.1103 11.4000 11.8533 12.3067 12.7600 13.2133 13.6667 14.1200 14.5733 15.0267 15.4800 15.9333 16.3867 16.8400 17.2933 17.7467 18.2000 18.6533 19.1067 19.5600 20.0133 20.4667 20.9200 21.3733 21.8267 22.2800 22.7333 23.1867 23.6400 24.0933 24.5467 25.0000 ! WE_FOPoles_v - Wind speeds corresponding to first-order system poles [m/s] +-0.01246409 -0.01366752 -0.01487095 -0.01607438 -0.01727781 -0.01848123 -0.01968466 -0.02088809 -0.02209152 -0.02329495 -0.02449838 -0.02570181 -0.02690524 -0.02810867 -0.02931210 -0.03051553 -0.03171896 -0.03292239 -0.03412582 -0.03532924 -0.03653267 -0.03773610 -0.03893953 -0.04014296 -0.03876534 -0.03527029 -0.03014051 -0.02417865 -0.01714772 -0.00815401 0.00419449 -0.00048731 -0.00466276 -0.01071643 -0.01560323 -0.02192148 -0.02762358 -0.03415246 -0.03995877 -0.04666898 -0.05357684 -0.06017881 -0.06783693 -0.07545934 -0.08285355 -0.09099765 -0.09868985 -0.10643139 -0.11560625 -0.12454786 -0.13353192 -0.14319807 -0.15242426 -0.16161402 -0.17122186 -0.18158081 -0.19160223 -0.20032125 -0.20983653 -0.21909214 ! WE_FOPoles - First order system poles [1/s] + +!------- YAW CONTROL ------------------------------------------------------ +0.00000 ! Y_uSwitch - Wind speed to switch between Y_ErrThresh. If zero, only the second value of Y_ErrThresh is used [m/s] +4.000000 8.000000 ! Y_ErrThresh - Yaw error threshold/deadbands. Turbine begins to yaw when it passes this. If Y_uSwitch is zero, only the second value is used. [deg]. +0.00870 ! Y_Rate - Yaw rate [rad/s] +0.00000 ! Y_MErrSet - Integrator saturation (maximum signal amplitude contribution to pitch from yaw-by-IPC), [rad] +0.00000 ! Y_IPC_IntSat - Integrator saturation (maximum signal amplitude contribution to pitch from yaw-by-IPC), [rad] +0.00000 ! Y_IPC_KP - Yaw-by-IPC proportional controller gain Kp +0.00000 ! Y_IPC_KI - Yaw-by-IPC integral controller gain Ki + +!------- TOWER FORE-AFT DAMPING ------------------------------------------- +-1.00000 ! FA_KI - Integral gain for the fore-aft tower damper controller [rad s/m] +0.0 ! FA_HPFCornerFreq - Corner frequency (-3dB point) in the high-pass filter on the fore-aft acceleration signal [rad/s] +0.0 ! FA_IntSat - Integrator saturation (maximum signal amplitude contribution to pitch from FA damper), [rad] + +!------- MINIMUM PITCH SATURATION ------------------------------------------- +60 ! PS_BldPitchMin_N - Number of values in minimum blade pitch lookup table (should equal number of values in PS_WindSpeeds and PS_BldPitchMin) +3.0000 3.2897 3.5793 3.8690 4.1586 4.4483 4.7379 5.0276 5.3172 5.6069 5.8966 6.1862 6.4759 6.7655 7.0552 7.3448 7.6345 7.9241 8.2138 8.5034 8.7931 9.0828 9.3724 9.6621 9.9517 10.2414 10.5310 10.8207 11.1103 11.4000 11.8533 12.3067 12.7600 13.2133 13.6667 14.1200 14.5733 15.0267 15.4800 15.9333 16.3867 16.8400 17.2933 17.7467 18.2000 18.6533 19.1067 19.5600 20.0133 20.4667 20.9200 21.3733 21.8267 22.2800 22.7333 23.1867 23.6400 24.0933 24.5467 25.0000 ! PS_WindSpeeds - Wind speeds corresponding to minimum blade pitch angles [m/s] +0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.01902632 0.03121162 0.04101621 0.04957537 0.05812141 0.06604528 0.07366393 0.08564088 0.09644430 0.10731742 0.11740081 0.12723365 0.13691718 0.14655371 0.15552079 0.16457871 0.17358206 0.18261499 0.19163393 0.20072294 0.20968649 0.21849678 0.22748802 0.23597095 0.24444734 0.25312967 0.26178025 0.27046099 0.27863869 0.28691931 0.29527580 0.30349928 0.31191439 0.32017189 0.32834804 0.33653924 0.34452172 ! PS_BldPitchMin - Minimum blade pitch angles [rad] + +!------- SHUTDOWN ----------------------------------------------------------- +0.436300000000 ! SD_MaxPit - Maximum blade pitch angle to initiate shutdown, [rad] +0.418880000000 ! SD_CornerFreq - Cutoff Frequency for first order low-pass filter for blade pitch angle, [rad/s] + +!------- Floating ----------------------------------------------------------- +0.000000000000 ! Fl_Kp - Nacelle velocity proportional feedback gain [s] + +!------- FLAP ACTUATION ----------------------------------------------------- +0.000000000000 ! Flp_Angle - Initial or steady state flap angle [rad] +0.00000000e+00 ! Flp_Kp - Blade root bending moment proportional gain for flap control [s] +0.00000000e+00 ! Flp_Ki - Flap displacement integral gain for flap control [-] +0.174500000000 ! Flp_MaxPit - Maximum (and minimum) flap pitch angle [rad] + +!------- Open Loop Control ----------------------------------------------------- +"unused" ! OL_Filename - Input file with open loop timeseries (absolute path or relative to this file) +0 ! Ind_Breakpoint - The column in OL_Filename that contains the breakpoint (time if OL_Mode = 1) +0 ! Ind_BldPitch - The column in OL_Filename that contains the blade pitch input in rad +0 ! Ind_GenTq - The column in OL_Filename that contains the generator torque in Nm +0 ! Ind_YawRate - The column in OL_Filename that contains the nacelle yaw rate rad/s +0 ! Ind_CableControl - The column(s) in OL_Filename that contains the cable control inputs in m [Used with CC_Mode = 2, must be the same size as CC_Group_N] +0 ! Ind_StructControl - The column(s) in OL_Filename that contains the structural control inputs [Used with StC_Mode = 2, must be the same size as StC_Group_N] + +!------- Pitch Actuator Model ----------------------------------------------------- +3.140000000000 ! PA_CornerFreq - Pitch actuator bandwidth/cut-off frequency [rad/s] +0.707000000000 ! PA_Damping - Pitch actuator damping ratio [-, unused if PA_Mode = 1] + +!------- Pitch Actuator Faults ----------------------------------------------------- +0.00000000 0.00000000 0.00000000 ! PF_Offsets - Constant blade pitch offsets for blades 1-3 [rad] + +!------- Active Wake Control ----------------------------------------------------- +1 ! AWC_NumModes - Number of user-defined AWC forcing modes +1 ! AWC_n - Azimuthal mode number(s) (i.e., the number and direction of the lobes of the wake structure) +1 ! AWC_harmonic - Harmonic(s) to apply in the AWC Inverse Coleman Transformation (only used when AWC_Mode = 2) +0.0500 ! AWC_freq - Frequency(s) of forcing mode(s) [Hz] +1.0000 ! AWC_amp - Pitch amplitude(s) of individual forcing mode(s) [deg] +0.0000 ! AWC_clockangle - Initial angle(s) of forcing mode(s) [deg] + +!------- External Controller Interface ----------------------------------------------------- +"unused" ! DLL_FileName - Name/location of the dynamic library in the Bladed-DLL format +"unused" ! DLL_InFile - Name of input file sent to the DLL (-) +"DISCON" ! DLL_ProcName - Name of procedure in DLL to be called (-) + +!------- ZeroMQ Interface --------------------------------------------------------- +"tcp://localhost:5555" ! ZMQ_CommAddress - Communication address for ZMQ server, (e.g. "tcp://localhost:5555") +2 ! ZMQ_UpdatePeriod - Call ZeroMQ every [x] seconds, [s] + +!------- Cable Control --------------------------------------------------------- +1 ! CC_Group_N - Number of cable control groups + 0 ! CC_GroupIndex - First index for cable control group, should correspond to deltaL +20.000000 ! CC_ActTau - Time constant for line actuator [s] + +!------- Structural Controllers --------------------------------------------------------- +1 ! StC_Group_N - Number of cable control groups + 0 ! StC_GroupIndex - First index for structural control group, options specified in ServoDyn summary output diff --git a/ROSCO/Test_Cases/NREL_2p8_127/NREL-2p8-127_ElastoDyn.dat b/ROSCO/Test_Cases/NREL_2p8_127/NREL-2p8-127_ElastoDyn.dat new file mode 100644 index 000000000..6cced857f --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/NREL-2p8-127_ElastoDyn.dat @@ -0,0 +1,210 @@ +------- ELASTODYN v1.03.* INPUT FILE ------------------------------------------- +Generated with AeroElasticSE FAST driver +---------------------- SIMULATION CONTROL -------------------------------------- +False Echo - Echo input data to ".ech" (flag) +3 Method - Integration method: {1: RK4, 2: AB4, or 3: ABM4} (-) +default DT Integration time step (s) +---------------------- DEGREES OF FREEDOM -------------------------------------- +True FlapDOF1 - First flapwise blade mode DOF (flag) +True FlapDOF2 - Second flapwise blade mode DOF (flag) +True EdgeDOF - First edgewise blade mode DOF (flag) +False TeetDOF - Rotor-teeter DOF (flag) [unused for 3 blades] +False DrTrDOF - Drivetrain rotational-flexibility DOF (flag) +True GenDOF - Generator DOF (flag) +False YawDOF - Yaw DOF (flag) +False TwFADOF1 - First fore-aft tower bending-mode DOF (flag) +False TwFADOF2 - Second fore-aft tower bending-mode DOF (flag) +False TwSSDOF1 - First side-to-side tower bending-mode DOF (flag) +False TwSSDOF2 - Second side-to-side tower bending-mode DOF (flag) +False PtfmSgDOF - Platform horizontal surge translation DOF (flag) +False PtfmSwDOF - Platform horizontal sway translation DOF (flag) +False PtfmHvDOF - Platform vertical heave translation DOF (flag) +False PtfmRDOF - Platform roll tilt rotation DOF (flag) +False PtfmPDOF - Platform pitch tilt rotation DOF (flag) +False PtfmYDOF - Platform yaw rotation DOF (flag) +---------------------- INITIAL CONDITIONS -------------------------------------- +0.0 OoPDefl - Initial out-of-plane blade-tip displacement (meters) +0.0 IPDefl - Initial in-plane blade-tip deflection (meters) +0.0 BlPitch(1) - Blade 1 initial pitch (degrees) +0.0 BlPitch(2) - Blade 2 initial pitch (degrees) +0.0 BlPitch(3) - Blade 3 initial pitch (degrees) [unused for 2 blades] +0.0 TeetDefl - Initial or fixed teeter angle (degrees) [unused for 3 blades] +0.0 Azimuth - Initial azimuth angle for blade 1 (degrees) +7.223281620282807 RotSpeed - Initial or fixed rotor speed (rpm) +0.0 NacYaw - Initial or fixed nacelle-yaw angle (degrees) +0.0 TTDspFA - Initial fore-aft tower-top displacement (meters) +0.0 TTDspSS - Initial side-to-side tower-top displacement (meters) +0.0 PtfmSurge - Initial or fixed horizontal surge translational displacement of platform (meters) +0.0 PtfmSway - Initial or fixed horizontal sway translational displacement of platform (meters) +0.0 PtfmHeave - Initial or fixed vertical heave translational displacement of platform (meters) +0.0 PtfmRoll - Initial or fixed roll tilt rotational displacement of platform (degrees) +0.0 PtfmPitch - Initial or fixed pitch tilt rotational displacement of platform (degrees) +0.0 PtfmYaw - Initial or fixed yaw rotational displacement of platform (degrees) +---------------------- TURBINE CONFIGURATION ----------------------------------- +3 NumBl - Number of blades (-) +63.45678601946693 TipRad - The distance from the rotor apex to the blade tip (meters) +2.0 HubRad - The distance from the rotor apex to the blade root (meters) +-3.0 PreCone(1) - Blade 1 cone angle (degrees) +-3.0 PreCone(2) - Blade 2 cone angle (degrees) +-3.0 PreCone(3) - Blade 3 cone angle (degrees) [unused for 2 blades] +0.0 HubCM - Distance from rotor apex to hub mass [positive downwind] (meters) +0.0 UndSling - Undersling length [distance from teeter pin to the rotor apex] (meters) [unused for 3 blades] +0.0 Delta3 - Delta-3 angle for teetering rotors (degrees) [unused for 3 blades] +0.0 AzimB1Up - Azimuth value to use for I/O when blade 1 points up (degrees) +-5.0 OverHang - Distance from yaw axis to rotor apex [3 blades] or teeter pin [2 blades] (meters) +0.0 ShftGagL - Distance from rotor apex [3 blades] or teeter pin [2 blades] to shaft strain gages [positive for upwind rotors] (meters) +-4.999629720311564 ShftTilt - Rotor shaft tilt angle (degrees) +0.8829822658380706 NacCMxn - Downwind distance from the tower-top to the nacelle CM (meters) +-0.08924556522324154 NacCMyn - Lateral distance from the tower-top to the nacelle CM (meters) +0.8326312050685473 NacCMzn - Vertical distance from the tower-top to the nacelle CM (meters) +0.0 NcIMUxn - Downwind distance from the tower-top to the nacelle IMU (meters) +0.0 NcIMUyn - Lateral distance from the tower-top to the nacelle IMU (meters) +0.0 NcIMUzn - Vertical distance from the tower-top to the nacelle IMU (meters) +1.1177004388298077 Twr2Shft - Vertical distance from the tower-top to the rotor shaft (meters) +86.5 TowerHt - Height of tower above ground level [onshore] or MSL [offshore] (meters) +0.0 TowerBsHt - Height of tower base above ground level [onshore] or MSL [offshore] (meters) +0.0 PtfmCMxt - Downwind distance from the ground level [onshore] or MSL [offshore] to the platform CM (meters) +0.0 PtfmCMyt - Lateral distance from the ground level [onshore] or MSL [offshore] to the platform CM (meters) +0.0 PtfmCMzt - Vertical distance from the ground level [onshore] or MSL [offshore] to the platform CM (meters) +0.0 PtfmRefzt - Vertical distance from the ground level [onshore] or MSL [offshore] to the platform reference point (meters) +---------------------- MASS AND INERTIA ---------------------------------------- +0.0 TipMass(1) - Tip-brake mass, blade 1 (kg) +0.0 TipMass(2) - Tip-brake mass, blade 2 (kg) +0.0 TipMass(3) - Tip-brake mass, blade 3 (kg) [unused for 2 blades] +7482.264184443234 HubMass - Hub mass (kg) +28639.287453422658 HubIner - Hub inertia about rotor axis [3 blades] or teeter axis [2 blades] (kg m^2) +4940.938090969189 GenIner - Generator inertia about HSS (kg m^2) +113487.2812241146 NacMass - Nacelle mass (kg) +693579.6265889656 NacYIner - Nacelle inertia about yaw axis (kg m^2) +3353.0472655982394 YawBrMass - Yaw bearing mass (kg) +0.0 PtfmMass - Platform mass (kg) +0.0 PtfmRIner - Platform inertia for roll tilt rotation about the platform CM (kg m^2) +0.0 PtfmPIner - Platform inertia for pitch tilt rotation about the platform CM (kg m^2) +0.0 PtfmYIner - Platform inertia for yaw rotation about the platform CM (kg m^2) +---------------------- BLADE --------------------------------------------------- +50 BldNodes - Number of blade nodes (per blade) used for analysis (-) +"NREL-2p8-127_ElastoDyn_blade.dat" BldFile1 - Name of file containing properties for blade 1 (quoted string) +"NREL-2p8-127_ElastoDyn_blade.dat" BldFile2 - Name of file containing properties for blade 2 (quoted string) +"NREL-2p8-127_ElastoDyn_blade.dat" BldFile3 - Name of file containing properties for blade 3 (quoted string) [unused for 2 blades] +---------------------- ROTOR-TEETER -------------------------------------------- +0 TeetMod - Rotor-teeter spring/damper model {0: none, 1: standard, 2: user-defined from routine UserTeet} (switch) [unused for 3 blades] +0.0 TeetDmpP - Rotor-teeter damper position (degrees) [used only for 2 blades and when TeetMod=1] +0.0 TeetDmp - Rotor-teeter damping constant (N-m/(rad/s)) [used only for 2 blades and when TeetMod=1] +0.0 TeetCDmp - Rotor-teeter rate-independent Coulomb-damping moment (N-m) [used only for 2 blades and when TeetMod=1] +0.0 TeetSStP - Rotor-teeter soft-stop position (degrees) [used only for 2 blades and when TeetMod=1] +0.0 TeetHStP - Rotor-teeter hard-stop position (degrees) [used only for 2 blades and when TeetMod=1] +0.0 TeetSSSp - Rotor-teeter soft-stop linear-spring constant (N-m/rad) [used only for 2 blades and when TeetMod=1] +0.0 TeetHSSp - Rotor-teeter hard-stop linear-spring constant (N-m/rad) [used only for 2 blades and when TeetMod=1] +---------------------- DRIVETRAIN ---------------------------------------------- +95.5 GBoxEff - Gearbox efficiency (%) +97.0 GBRatio - Gearbox ratio (-) +283287696.9043701 DTTorSpr - Drivetrain torsional spring (N-m/rad) +1500541.6644456587 DTTorDmp - Drivetrain torsional damper (N-m/(rad/s)) +---------------------- FURLING ------------------------------------------------- +False Furling - Read in additional model properties for furling turbine (flag) [must currently be FALSE) +"none" FurlFile - Name of file containing furling properties (quoted string) [unused when Furling=False] +---------------------- TOWER --------------------------------------------------- +20 TwrNodes - Number of tower nodes used for analysis (-) +"NREL-2p8-127_ElastoDyn_tower.dat" TwrFile - Name of file containing tower properties (quoted string) +---------------------- OUTPUT -------------------------------------------------- +False SumPrint - Print summary data to ".sum" (flag) +1 OutFile - Switch to determine where output will be placed: {1: in module output file only; 2: in glue code output file only; 3: both} (currently unused) +True TabDelim - Use tab delimiters in text tabular output file? (flag) (currently unused) +"ES10.3E2" OutFmt - Format used for text tabular output (except time). Resulting field should be 10 characters. (quoted string) (currently unused) +0.0 TStart - Time to begin tabular output (s) (currently unused) +1 DecFact - Decimation factor for tabular output {1: output every time step} (-) (currently unused) +9 NTwGages - Number of tower nodes that have strain gages for output [0 to 9] (-) +2, 4, 6, 8, 10, 12, 14, 16, 18 TwrGagNd - List of tower nodes that have strain gages [1 to TwrNodes] (-) [unused if NTwGages=0] +9 NBlGages - Number of blade nodes that have strain gages for output [0 to 9] (-) +6, 11, 16, 21, 26, 31, 36, 41, 46 BldGagNd - List of blade nodes that have strain gages [1 to BldNodes] (-) [unused if NBlGages=0] + OutList - The next line(s) contains a list of output parameters. See OutListParameters.xlsx for a listing of available output channels, (-) +"Azimuth" +"BldPitch1" +"BldPitch2" +"BldPitch3" +"GenSpeed" +"LSSTipMys" +"LSSTipMzs" +"LSShftFys" +"LSShftFzs" +"NacYaw" +"RootFxb1" +"RootFxb2" +"RootFxb3" +"RootFxc1" +"RootFxc2" +"RootFxc3" +"RootFyb1" +"RootFyb2" +"RootFyb3" +"RootFyc1" +"RootFyc2" +"RootFyc3" +"RootFzb1" +"RootFzb2" +"RootFzb3" +"RootFzc1" +"RootFzc2" +"RootFzc3" +"RootMxb1" +"RootMxb2" +"RootMxb3" +"RootMxc1" +"RootMxc2" +"RootMxc3" +"RootMyb1" +"RootMyb2" +"RootMyb3" +"RootMyc1" +"RootMyc2" +"RootMyc3" +"RootMzb1" +"RootMzb2" +"RootMzb3" +"RootMzc1" +"RootMzc2" +"RootMzc3" +"RotSpeed" +"RotThrust" +"RotTorq" +"Spn1MLxb1" +"Spn1MLyb1" +"Spn2MLxb1" +"Spn2MLyb1" +"Spn3MLxb1" +"Spn3MLyb1" +"Spn4MLxb1" +"Spn4MLyb1" +"Spn5MLxb1" +"Spn5MLyb1" +"Spn6MLxb1" +"Spn6MLyb1" +"Spn7MLxb1" +"Spn7MLyb1" +"Spn8MLxb1" +"Spn8MLyb1" +"Spn9MLxb1" +"Spn9MLyb1" +"TipDxb1" +"TipDxb2" +"TipDxb3" +"TipDxc1" +"TipDxc2" +"TipDxc3" +"TipDyb1" +"TipDyb2" +"TipDyb3" +"TipDyc1" +"TipDyc2" +"TipDyc3" +"TipDzb1" +"TipDzb2" +"TipDzb3" +"TipDzc1" +"TipDzc2" +"TipDzc3" +"TwrBsMxt" +"TwrBsMyt" +"TwrBsMzt" +END of input file (the word "END" must appear in the first 3 columns of this last OutList line) +--------------------------------------------------------------------------------------- diff --git a/ROSCO/Test_Cases/NREL_2p8_127/NREL-2p8-127_ElastoDyn_blade.dat b/ROSCO/Test_Cases/NREL_2p8_127/NREL-2p8-127_ElastoDyn_blade.dat new file mode 100644 index 000000000..662c3af1d --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/NREL-2p8-127_ElastoDyn_blade.dat @@ -0,0 +1,62 @@ +------- ELASTODYN V1.00.* INDIVIDUAL BLADE INPUT FILE -------------------------- +Generated with AeroElasticSE FAST driver +---------------------- BLADE PARAMETERS ---------------------------------------- +30 NBlInpSt - Number of blade input stations (-) +1.0 BldFlDmp1 - Blade flap mode #1 structural damping in percent of critical (%) +1.0 BldFlDmp2 - Blade flap mode #2 structural damping in percent of critical (%) +1.0 BldEdDmp1 - Blade edge mode #1 structural damping in percent of critical (%) +---------------------- BLADE ADJUSTMENT FACTORS -------------------------------- +1.0 FlStTunr1 - Blade flapwise modal stiffness tuner, 1st mode (-) +1.0 FlStTunr2 - Blade flapwise modal stiffness tuner, 2nd mode (-) +1.0 AdjBlMs - Factor to adjust blade mass density (-) +1.0 AdjFlSt - Factor to adjust blade flap stiffness (-) +1.0 AdjEdSt - Factor to adjust blade edge stiffness (-) +---------------------- DISTRIBUTED BLADE PROPERTIES ---------------------------- + BlFract PitchAxis StrcTwst BMassDen FlpStff EdgStff + (-) (-) (deg) (kg/m) (Nm^2) (Nm^2) + 0.000000000000000e+00 5.000000000000000e-01 1.999622705006573e+01 9.710303775720137e+02 8.916645581889803e+09 8.916996828171421e+09 + 3.448275862068966e-02 4.797651657064801e-01 1.931018243810786e+01 9.360384963432447e+02 1.473326655503917e+10 1.503401326999529e+10 + 6.896551724137932e-02 4.100052021425268e-01 1.831714953780435e+01 7.384411481979697e+02 1.350641277548294e+10 1.668758117393011e+10 + 1.034482758620690e-01 3.512493343557562e-01 1.708763041181490e+01 5.242503736808504e+02 7.750625550591639e+09 1.313891689544163e+10 + 1.379310344827586e-01 3.110092285118687e-01 1.569212712279918e+01 4.095720481213451e+02 4.517970071596079e+09 1.065397599903997e+10 + 1.724137931034483e-01 2.834806852225638e-01 1.382289586770404e+01 2.986034040547503e+02 2.639603257135735e+09 7.691984348826207e+09 + 2.068965517241379e-01 2.649028377616424e-01 1.124554309027298e+01 2.242709960488304e+02 1.722995952419500e+09 5.352469758607450e+09 + 2.413793103448276e-01 2.524820938264642e-01 8.602632953470145e+00 2.129606273581960e+02 1.483184105878141e+09 4.327677642529569e+09 + 2.758620689655172e-01 2.449189056667618e-01 6.549224739725965e+00 2.091698491908484e+02 1.365990134494710e+09 3.614205549153540e+09 + 3.103448275862069e-01 2.413757812153578e-01 5.408188380153923e+00 1.968505270832688e+02 1.161884350732890e+09 3.059348888224575e+09 + 3.448275862068965e-01 2.409997816578705e-01 4.552816793256156e+00 1.840381495123537e+02 9.314103670023195e+08 2.635487762688528e+09 + 3.793103448275861e-01 2.438939371115084e-01 3.850103071189125e+00 1.707777565800272e+02 7.316000308334582e+08 2.188136539118910e+09 + 4.137931034482759e-01 2.495413982689942e-01 3.210053831367405e+00 1.577448933617357e+02 5.813400904874783e+08 1.847593613150510e+09 + 4.482758620689655e-01 2.579313748558032e-01 2.548277995517243e+00 1.472572881966913e+02 4.757592505107988e+08 1.631226610849327e+09 + 4.827586206896552e-01 2.680075313847211e-01 1.868987870564891e+00 1.385288690289785e+02 3.862376543475163e+08 1.405932074273394e+09 + 5.172413793103448e-01 2.786890302281694e-01 1.247026288989173e+00 1.303134456935171e+02 3.086236872618167e+08 1.086079003669758e+09 + 5.517241379310345e-01 2.889455550381649e-01 7.591906266374636e-01 1.214132928926456e+02 2.441246000330141e+08 7.279449241103762e+08 + 5.862068965517241e-01 2.981867550411185e-01 4.659000465949885e-01 1.130051988362277e+02 1.889011712485603e+08 4.718010458987974e+08 + 6.206896551724138e-01 3.061372927610646e-01 2.731580237682558e-01 1.057369028682480e+02 1.426024838771875e+08 3.311232129595062e+08 + 6.551724137931035e-01 3.119763987397355e-01 1.231485664729688e-01 9.974549711305480e+01 1.081121588014881e+08 2.531064287089206e+08 + 6.896551724137934e-01 3.154698036179193e-01 -1.889923787502366e-02 9.455111640202743e+01 8.496507419955346e+07 1.976683193694704e+08 + 7.241379310344830e-01 3.174252972719749e-01 -1.841259535939614e-01 8.918927437076574e+01 6.699354322582775e+07 1.803010747112424e+08 + 7.586206896551723e-01 3.157084507688791e-01 -3.432314804149588e-01 8.015835414506564e+01 5.106806818035772e+07 1.739724378313888e+08 + 7.931034482758621e-01 3.095467116664537e-01 -5.034899071419768e-01 7.140526341375902e+01 3.929235153694874e+07 1.684420237335510e+08 + 8.275862068965517e-01 2.996558060513167e-01 -6.944182383563149e-01 5.563937030326857e+01 2.849850000919442e+07 7.873543089740016e+07 + 8.620689655172414e-01 2.881116856742882e-01 -9.464479611794926e-01 4.591127859162181e+01 1.982854313004774e+07 6.415110790287662e+07 + 8.965517241379312e-01 2.777712184636389e-01 -1.331448785580028e+00 3.521480844524145e+01 1.075138794875714e+07 4.514001039735875e+07 + 9.310344827586208e-01 2.706279229199988e-01 -1.857716459023805e+00 2.414179066974884e+01 3.638232945365374e+06 2.616242592743580e+07 + 9.655172413793103e-01 2.665260978643628e-01 -2.493070572147947e+00 3.678240377890068e+00 8.650778718250984e+04 1.574666086617074e+06 + 1.000000000000000e+00 2.500000000000000e-01 -3.205330715589577e+00 1.002353815775734e+00 1.628296293397697e+03 3.168732291579445e+04 +---------------------- BLADE MODE SHAPES --------------------------------------- +0.004521475330089924 BldFl1Sh(2) - Flap mode 1, coeff of x^2 +1.0698094815587011 BldFl1Sh(3) - , coeff of x^3 +-0.1043639462789789 BldFl1Sh(4) - , coeff of x^4 +0.7886224122132662 BldFl1Sh(5) - , coeff of x^5 +-0.7585894228230783 BldFl1Sh(6) - , coeff of x^6 +-0.5138424457535536 BldFl2Sh(2) - Flap mode 2, coeff of x^2 +2.93531699885226 BldFl2Sh(3) - , coeff of x^3 +-19.409314950811712 BldFl2Sh(4) - , coeff of x^4 +32.48595903814384 BldFl2Sh(5) - , coeff of x^5 +-14.498118640430834 BldFl2Sh(6) - , coeff of x^6 +0.17685846482119558 BldEdgSh(2) - Edge mode 1, coeff of x^2 +1.9926745320317614 BldEdgSh(3) - , coeff of x^3 +-4.492670447108128 BldEdgSh(4) - , coeff of x^4 +6.331998738711197 BldEdgSh(5) - , coeff of x^5 +-3.0088612884560257 BldEdgSh(6) - , coeff of x^6 diff --git a/ROSCO/Test_Cases/NREL_2p8_127/NREL-2p8-127_ElastoDyn_tower.dat b/ROSCO/Test_Cases/NREL_2p8_127/NREL-2p8-127_ElastoDyn_tower.dat new file mode 100644 index 000000000..670d3cccb --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/NREL-2p8-127_ElastoDyn_tower.dat @@ -0,0 +1,50 @@ +------- ELASTODYN V1.00.* TOWER INPUT FILE ------------------------------------- +Generated with AeroElasticSE FAST driver +---------------------- TOWER PARAMETERS ---------------------------------------- +9 NTwInpSt - Number of input stations to specify tower geometry +1.0 TwrFADmp(1) - Tower 1st fore-aft mode structural damping ratio (%) +1.0 TwrFADmp(2) - Tower 2nd fore-aft mode structural damping ratio (%) +1.0 TwrSSDmp(1) - Tower 1st side-to-side mode structural damping ratio (%) +1.0 TwrSSDmp(2) - Tower 2nd side-to-side mode structural damping ratio (%) +---------------------- TOWER ADJUSTMUNT FACTORS -------------------------------- +1.0 FAStTunr(1) - Tower fore-aft modal stiffness tuner, 1st mode (-) +1.0 FAStTunr(2) - Tower fore-aft modal stiffness tuner, 2nd mode (-) +1.0 SSStTunr(1) - Tower side-to-side stiffness tuner, 1st mode (-) +1.0 SSStTunr(2) - Tower side-to-side stiffness tuner, 2nd mode (-) +1.0 AdjTwMa - Factor to adjust tower mass density (-) +1.0 AdjFASt - Factor to adjust tower fore-aft stiffness (-) +1.0 AdjSSSt - Factor to adjust tower side-to-side stiffness (-) +---------------------- DISTRIBUTED TOWER PROPERTIES ---------------------------- + HtFract TMassDen TwFAStif TwSSStif + (-) (kg/m) (Nm^2) (Nm^2) + 0.000000000000000e+00 3.027735301310815e+03 1.474853951124582e+11 1.474853951124582e+11 + 1.250433977548895e-01 2.718841246770161e+03 1.326329677125010e+11 1.326329677125010e+11 + 2.500867955097790e-01 2.405464101729817e+03 1.161354662267779e+11 1.161354662267779e+11 + 3.751301932646685e-01 2.112377458665061e+03 9.479550671463214e+10 9.479550671463214e+10 + 5.001157273463720e-01 1.947002758491315e+03 7.586780853389151e+10 7.586780853389151e+10 + 6.251591251012615e-01 1.783363103134093e+03 5.857866350808070e+10 5.857866350808070e+10 + 7.502025228561510e-01 1.603905893716689e+03 4.289862070041790e+10 4.289862070041790e+10 + 8.751880569378545e-01 1.409173987955922e+03 2.871944175926664e+10 2.871944175926664e+10 + 1.000000000000000e+00 1.161806938102961e+03 1.956567246347168e+10 1.956567246347168e+10 +---------------------- TOWER FORE-AFT MODE SHAPES ------------------------------ +1.0623105807354711 TwFAM1Sh(2) - Mode 1, coefficient of x^2 term +-0.12782107145017788 TwFAM1Sh(3) - , coefficient of x^3 term +-0.11374039457578099 TwFAM1Sh(4) - , coefficient of x^4 term +0.4380734650926717 TwFAM1Sh(5) - , coefficient of x^5 term +-0.2588225798021839 TwFAM1Sh(6) - , coefficient of x^6 term +916.0158542297875 TwFAM2Sh(2) - Mode 2, coefficient of x^2 term +-524.0268078619857 TwFAM2Sh(3) - , coefficient of x^3 term +-620.6941658768418 TwFAM2Sh(4) - , coefficient of x^4 term +844.0762210901079 TwFAM2Sh(5) - , coefficient of x^5 term +-614.3711015810677 TwFAM2Sh(6) - , coefficient of x^6 term +---------------------- TOWER SIDE-TO-SIDE MODE SHAPES -------------------------- +1.0569471838310198 TwSSM1Sh(2) - Mode 1, coefficient of x^2 term +-0.1296167767277 TwSSM1Sh(3) - , coefficient of x^3 term +-0.09657367230257455 TwSSM1Sh(4) - , coefficient of x^4 term +0.4145201607812788 TwSSM1Sh(5) - , coefficient of x^5 term +-0.24527689558202392 TwSSM1Sh(6) - , coefficient of x^6 term +66.717537330485 TwSSM2Sh(2) - Mode 2, coefficient of x^2 term +-28.88940079202735 TwSSM2Sh(3) - , coefficient of x^3 term +-68.66726547883196 TwSSM2Sh(4) - , coefficient of x^4 term +94.08317763633714 TwSSM2Sh(5) - , coefficient of x^5 term +-62.24404869596283 TwSSM2Sh(6) - , coefficient of x^6 term diff --git a/ROSCO/Test_Cases/NREL_2p8_127/NREL-2p8-127_InflowFile.dat b/ROSCO/Test_Cases/NREL_2p8_127/NREL-2p8-127_InflowFile.dat new file mode 100644 index 000000000..401fd0a01 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/NREL-2p8-127_InflowFile.dat @@ -0,0 +1,57 @@ +------- InflowWind v3.01.* INPUT FILE ------------------------------------------------------------------------- +Generated with AeroElasticSE FAST driver +--------------------------------------------------------------------------------------------------------------- +False Echo - Echo input data to .ech (flag) +1 WindType - switch for wind file type (1=steady; 2=uniform; 3=binary TurbSim FF; 4=binary Bladed-style FF; 5=HAWC format; 6=User defined; 7=native Bladed FF) +0.0 PropagationDir - Direction of wind propagation (meteoroligical rotation from aligned with X (positive rotates towards -Y) -- degrees) +0.0 VFlowAng - Upflow angle (degrees) (not used for native Bladed format WindType=7) +1 NWindVel - Number of points to output the wind velocity (0 to 9) +0.0 WindVxiList - List of coordinates in the inertial X direction (m) +0.0 WindVyiList - List of coordinates in the inertial Y direction (m) +88.5 WindVziList - List of coordinates in the inertial Z direction (m) +================== Parameters for Steady Wind Conditions [used only for WindType = 1] ========================= +6.0 HWindSpeed - Horizontal windspeed (m/s) +87.66 RefHt - Reference height for horizontal wind speed (m) +0.0 PLexp - Power law exponent (-) +================== Parameters for Uniform wind file [used only for WindType = 2] ============================ +"none" Filename_Uni - Filename of time series data for uniform wind field. (-) +87.66 RefHt_Uni - Reference height for horizontal wind speed (m) +1.0 RefLength - Reference length for linear horizontal and vertical sheer (-) +================== Parameters for Binary TurbSim Full-Field files [used only for WindType = 3] ============== +"none" FileName_BTS - Name of the Full field wind file to use (.bts) +================== Parameters for Binary Bladed-style Full-Field files [used only for WindType = 4] ========= +"none" FilenameRoot - Rootname of the full-field wind file to use (.wnd, .sum) +False TowerFile - Have tower file (.twr) (flag) +================== Parameters for HAWC-format binary files [Only used with WindType = 5] ===================== +"none" FileName_u - name of the file containing the u-component fluctuating wind (.bin) +"none" FileName_v - name of the file containing the v-component fluctuating wind (.bin) +"none" FileName_w - name of the file containing the w-component fluctuating wind (.bin) +2 nx - number of grids in the x direction (in the 3 files above) (-) +2 ny - number of grids in the y direction (in the 3 files above) (-) +2 nz - number of grids in the z direction (in the 3 files above) (-) +10 dx - distance (in meters) between points in the x direction (m) +10 dy - distance (in meters) between points in the y direction (m) +10 dz - distance (in meters) between points in the z direction (m) +0.0 RefHt_Hawc - reference height; the height (in meters) of the vertical center of the grid (m) +------------- Scaling parameters for turbulence --------------------------------------------------------- +0 ScaleMethod - Turbulence scaling method [0 = none, 1 = direct scaling, 2 = calculate scaling factor based on a desired standard deviation] +1.0 SFx - Turbulence scaling factor for the x direction (-) [ScaleMethod=1] +1.0 SFy - Turbulence scaling factor for the y direction (-) [ScaleMethod=1] +1.0 SFz - Turbulence scaling factor for the z direction (-) [ScaleMethod=1] +1.0 SigmaFx - Turbulence standard deviation to calculate scaling from in x direction (m/s) [ScaleMethod=2] +1.0 SigmaFy - Turbulence standard deviation to calculate scaling from in y direction (m/s) [ScaleMethod=2] +1.0 SigmaFz - Turbulence standard deviation to calculate scaling from in z direction (m/s) [ScaleMethod=2] +------------- Mean wind profile parameters (added to HAWC-format files) --------------------------------- +0.0 URef - Mean u-component wind speed at the reference height (m/s) +0 WindProfile - Wind profile type (0=constant;1=logarithmic,2=power law) +0.0 PLExp_Hawc - Power law exponent (-) (used for PL wind profile type only) +0.0 Z0 - Surface roughness length (m) (used for LG wind profile type only) +0 XOffset - Initial offset in +x direction (shift of wind box) (-) +====================== OUTPUT ================================================== +False SumPrint - Print summary data to .IfW.sum (flag) +OutList - The next line(s) contains a list of output parameters. See OutListParameters.xlsx for a listing of available output channels, (-) +"Wind1Velx" +"Wind1Vely" +"Wind1Velz" +END of input file (the word "END" must appear in the first 3 columns of this last OutList line) +--------------------------------------------------------------------------------------- diff --git a/ROSCO/Test_Cases/NREL_2p8_127/NREL-2p8-127_ServoDyn.dat b/ROSCO/Test_Cases/NREL_2p8_127/NREL-2p8-127_ServoDyn.dat new file mode 100644 index 000000000..bdc2d74d9 --- /dev/null +++ b/ROSCO/Test_Cases/NREL_2p8_127/NREL-2p8-127_ServoDyn.dat @@ -0,0 +1,110 @@ +------- SERVODYN v1.05.* INPUT FILE -------------------------------------------- +Generated with AeroElasticSE FAST driver +---------------------- SIMULATION CONTROL -------------------------------------- +False Echo - Echo input data to .ech (flag) +default DT - Communication interval for controllers (s) (or "default") +---------------------- PITCH CONTROL ------------------------------------------- +5 PCMode - Pitch control mode {0: none, 3: user-defined from routine PitchCntrl, 4: user-defined from Simulink/Labview, 5: user-defined from Bladed-style DLL} (switch) +0.0 TPCOn - Time to enable active pitch control (s) [unused when PCMode=0] +99999.0 TPitManS(1) - Time to start override pitch maneuver for blade 1 and end standard pitch control (s) +99999.0 TPitManS(2) - Time to start override pitch maneuver for blade 2 and end standard pitch control (s) +99999.0 TPitManS(3) - Time to start override pitch maneuver for blade 3 and end standard pitch control (s) [unused for 2 blades] +7.0 PitManRat(1) - Pitch rate at which override pitch maneuver heads toward final pitch angle for blade 1 (deg/s) +7.0 PitManRat(2) - Pitch rate at which override pitch maneuver heads toward final pitch angle for blade 2 (deg/s) +7.0 PitManRat(3) - Pitch rate at which override pitch maneuver heads toward final pitch angle for blade 3 (deg/s) [unused for 2 blades] +90.0 BlPitchF(1) - Blade 1 final pitch for pitch maneuvers (degrees) +90.0 BlPitchF(2) - Blade 2 final pitch for pitch maneuvers (degrees) +90.0 BlPitchF(3) - Blade 3 final pitch for pitch maneuvers (degrees) [unused for 2 blades] +---------------------- GENERATOR AND TORQUE CONTROL ---------------------------- +5 VSContrl - Variable-speed control mode {0: none, 1: simple VS, 3: user-defined from routine UserVSCont, 4: user-defined from Simulink/Labview, 5: user-defined from Bladed-style DLL} (switch) +1 GenModel - Generator model {1: simple, 2: Thevenin, 3: user-defined from routine UserGen} (switch) [used only when VSContrl=0] +93.94772808556249 GenEff - Generator efficiency [ignored by the Thevenin and user-defined generator models] (%) +True GenTiStr - Method to start the generator {T: timed using TimGenOn, F: generator speed using SpdGenOn} (flag) +True GenTiStp - Method to stop the generator {T: timed using TimGenOf, F: when generator power = 0} (flag) +99999.0 SpdGenOn - Generator speed to turn on the generator for a startup (HSS speed) (rpm) [used only when GenTiStr=False] +0.0 TimGenOn - Time to turn on the generator for a startup (s) [used only when GenTiStr=True] +99999.0 TimGenOf - Time to turn off the generator (s) [used only when GenTiStp=True] +---------------------- SIMPLE VARIABLE-SPEED TORQUE CONTROL -------------------- +99999.0 VS_RtGnSp - Rated generator speed for simple variable-speed generator control (HSS side) (rpm) [used only when VSContrl=1] +99999.0 VS_RtTq - Rated generator torque/constant generator torque in Region 3 for simple variable-speed generator control (HSS side) (N-m) [used only when VSContrl=1] +99999.0 VS_Rgn2K - Generator torque constant in Region 2 for simple variable-speed generator control (HSS side) (N-m/rpm^2) [used only when VSContrl=1] +99999.0 VS_SlPc - Rated generator slip percentage in Region 2 1/2 for simple variable-speed generator control (%) [used only when VSContrl=1] +---------------------- SIMPLE INDUCTION GENERATOR ------------------------------ +99999.0 SIG_SlPc - Rated generator slip percentage (%) [used only when VSContrl=0 and GenModel=1] +99999.0 SIG_SySp - Synchronous (zero-torque) generator speed (rpm) [used only when VSContrl=0 and GenModel=1] +99999.0 SIG_RtTq - Rated torque (N-m) [used only when VSContrl=0 and GenModel=1] +99999.0 SIG_PORt - Pull-out ratio (Tpullout/Trated) (-) [used only when VSContrl=0 and GenModel=1] +---------------------- THEVENIN-EQUIVALENT INDUCTION GENERATOR ----------------- +99999.0 TEC_Freq - Line frequency [50 or 60] (Hz) [used only when VSContrl=0 and GenModel=2] +0 TEC_NPol - Number of poles [even integer > 0] (-) [used only when VSContrl=0 and GenModel=2] +99999.0 TEC_SRes - Stator resistance (ohms) [used only when VSContrl=0 and GenModel=2] +99999.0 TEC_RRes - Rotor resistance (ohms) [used only when VSContrl=0 and GenModel=2] +99999.0 TEC_VLL - Line-to-line RMS voltage (volts) [used only when VSContrl=0 and GenModel=2] +99999.0 TEC_SLR - Stator leakage reactance (ohms) [used only when VSContrl=0 and GenModel=2] +99999.0 TEC_RLR - Rotor leakage reactance (ohms) [used only when VSContrl=0 and GenModel=2] +99999.0 TEC_MR - Magnetizing reactance (ohms) [used only when VSContrl=0 and GenModel=2] +---------------------- HIGH-SPEED SHAFT BRAKE ---------------------------------- +0 HSSBrMode - HSS brake model {0: none, 1: simple, 3: user-defined from routine UserHSSBr, 4: user-defined from Simulink/Labview, 5: user-defined from Bladed-style DLL} (switch) +99999.0 THSSBrDp - Time to initiate deployment of the HSS brake (s) +99999.0 HSSBrDT - Time for HSS-brake to reach full deployment once initiated (sec) [used only when HSSBrMode=1] +99999.0 HSSBrTqF - Fully deployed HSS-brake torque (N-m) +---------------------- NACELLE-YAW CONTROL ------------------------------------- +0 YCMode - Yaw control mode {0: none, 3: user-defined from routine UserYawCont, 4: user-defined from Simulink/Labview, 5: user-defined from Bladed-style DLL} (switch) +99999.0 TYCOn - Time to enable active yaw control (s) [unused when YCMode=0] +0.0 YawNeut - Neutral yaw position--yaw spring force is zero at this yaw (degrees) +496739375.65069634 YawSpr - Nacelle-yaw spring constant (N-m/rad) +187442.5509148155 YawDamp - Nacelle-yaw damping constant (N-m/(rad/s)) +99999.0 TYawManS - Time to start override yaw maneuver and end standard yaw control (s) +0.25 YawManRat - Yaw maneuver rate (in absolute value) (deg/s) +0.0 NacYawF - Final yaw angle for override yaw maneuvers (degrees) +---------------------- AERODYNAMIC FLOW CONTROL -------------------------------- + 0 AfCmode - Airfoil control mode {0: none, 1: cosine wave cycle, 4: user-defined from Simulink/Labview, 5: user-defined from Bladed-style DLL} (switch) + 0 AfC_Mean - Mean level for cosine cycling or steady value (-) [used only with AfCmode==1] + 0 AfC_Amp - Amplitude for for cosine cycling of flap signal (-) [used only with AfCmode==1] + 0 AfC_Phase - Phase relative to the blade azimuth (0 is vertical) for for cosine cycling of flap signal (deg) [used only with AfCmode==1] +---------------------- STRUCTURAL CONTROL -------------------------------------- +0 NumBStC - Number of blade structural controllers (integer) +"unused" BStCfiles - Name of the files for blade structural controllers (quoted strings) [unused when NumBStC==0] +0 NumNStC - Number of nacelle structural controllers (integer) +"unused" NStCfiles - Name of the files for nacelle structural controllers (quoted strings) [unused when NumNStC==0] +0 NumTStC - Number of tower structural controllers (integer) +"unused" TStCfiles - Name of the files for tower structural controllers (quoted strings) [unused when NumTStC==0] +0 NumSStC - Number of substructure structural controllers (integer) +"unused" SStCfiles - Name of the files for substructure structural controllers (quoted strings) [unused when NumSStC==0] +---------------------- CABLE CONTROL ------------------------------------------- + 0 CCmode - Cable control mode {0: none, 4: user-defined from Simulink/Labview, 5: user-defined from Bladed-style DLL} (switch) +---------------------- BLADED INTERFACE ---------------------------------------- [used only with Bladed Interface] +"/pscratch/ndeveld/awc/ROSCO_B/ROSCO/build/libdiscon.so" DLL_FileName - Name/location of the dynamic library {.dll [Windows] or .so [Linux]} in the Bladed-DLL format (-) [used only with Bladed Interface] +"NREL-2p8-127_DISCON.IN" DLL_InFile - Name of input file sent to the DLL (-) [used only with Bladed Interface] +"DISCON" DLL_ProcName - Name of procedure in DLL to be called (-) [case sensitive; used only with DLL Interface] +default DLL_DT - Communication interval for dynamic library (s) (or "default") [used only with Bladed Interface] +False DLL_Ramp - Whether a linear ramp should be used between DLL_DT time steps [introduces time shift when true] (flag) [used only with Bladed Interface] +99999.0 BPCutoff - Cuttoff frequency for low-pass filter on blade pitch from DLL (Hz) [used only with Bladed Interface] +0.0 NacYaw_North - Reference yaw angle of the nacelle when the upwind end points due North (deg) [used only with Bladed Interface] +1 Ptch_Cntrl - Record 28: Use individual pitch control {0: collective pitch; 1: individual pitch control} (switch) [used only with Bladed Interface] +0.0 Ptch_SetPnt - Record 5: Below-rated pitch angle set-point (deg) [used only with Bladed Interface] +0.0 Ptch_Min - Record 6: Minimum pitch angle (deg) [used only with Bladed Interface] +0.0 Ptch_Max - Record 7: Maximum pitch angle (deg) [used only with Bladed Interface] +0.0 PtchRate_Min - Record 8: Minimum pitch rate (most negative value allowed) (deg/s) [used only with Bladed Interface] +0.0 PtchRate_Max - Record 9: Maximum pitch rate (deg/s) [used only with Bladed Interface] +0.0 Gain_OM - Record 16: Optimal mode gain (Nm/(rad/s)^2) [used only with Bladed Interface] +0.0 GenSpd_MinOM - Record 17: Minimum generator speed (rpm) [used only with Bladed Interface] +0.0 GenSpd_MaxOM - Record 18: Optimal mode maximum speed (rpm) [used only with Bladed Interface] +0.0 GenSpd_Dem - Record 19: Demanded generator speed above rated (rpm) [used only with Bladed Interface] +0.0 GenTrq_Dem - Record 22: Demanded generator torque above rated (Nm) [used only with Bladed Interface] +0.0 GenPwr_Dem - Record 13: Demanded power (W) [used only with Bladed Interface] +---------------------- BLADED INTERFACE TORQUE-SPEED LOOK-UP TABLE ------------- +0 DLL_NumTrq - Record 26: No. of points in torque-speed look-up table {0 = none and use the optimal mode parameters; nonzero = ignore the optimal mode PARAMETERs by setting Record 16 to 0.0} (-) [used only with Bladed Interface] +GenSpd_TLU GenTrq_TLU +(rpm) (Nm) +---------------------- OUTPUT -------------------------------------------------- +False SumPrint - Print summary data to .sum (flag) (currently unused) +1 OutFile - Switch to determine where output will be placed: {1: in module output file only; 2: in glue code output file only; 3: both} (currently unused) +True TabDelim - Use tab delimiters in text tabular output file? (flag) (currently unused) +"ES10.3E2" OutFmt - Format used for text tabular output (except time). Resulting field should be 10 characters. (quoted string) (currently unused) +0.0 TStart - Time to begin tabular output (s) (currently unused) + OutList - The next line(s) contains a list of output parameters. See OutListParameters.xlsx for a listing of available output channels, (-) +"GenPwr" +"GenTq" +END of input file (the word "END" must appear in the first 3 columns of this last OutList line) +--------------------------------------------------------------------------------------- diff --git a/ROSCO/Test_Cases/update_rosco_discons.py b/ROSCO/Test_Cases/update_rosco_discons.py index ca08ea314..9a299991f 100644 --- a/ROSCO/Test_Cases/update_rosco_discons.py +++ b/ROSCO/Test_Cases/update_rosco_discons.py @@ -12,7 +12,8 @@ map_rel = { 'NREL5MW.yaml': 'NREL-5MW/DISCON.IN', 'IEA15MW.yaml': 'IEA-15-240-RWT-UMaineSemi/DISCON-UMaineSemi.IN', - 'BAR.yaml': 'BAR_10/BAR_10_DISCON.IN' + 'BAR.yaml': 'BAR_10/BAR_10_DISCON.IN', + 'NREL2p8.yaml': 'NREL_2p8_127/NREL-2p8-127_DISCON.IN', } # Directories diff --git a/ROSCO/Tune_Cases/IEA15MW_ballast.yaml b/ROSCO/Tune_Cases/IEA15MW_ballast.yaml new file mode 100644 index 000000000..6bf344185 --- /dev/null +++ b/ROSCO/Tune_Cases/IEA15MW_ballast.yaml @@ -0,0 +1,59 @@ +# --------------------- ROSCO controller tuning input file ------------------- + # Written for use with ROSCO_Toolbox tuning procedures + # Turbine: IEA 15MW Reference Wind Turbine +# ------------------------------ OpenFAST PATH DEFINITIONS ------------------------------ +path_params: + FAST_InputFile: 'IEA-15-240-RWT-UMaineSemi.fst' # Name of *.fst file + FAST_directory: '../Test_Cases/IEA-15-240-RWT-UMaineSemi' # Main OpenFAST model directory, where the *.fst lives + # Optional (but suggested...) + rotor_performance_filename: 'Cp_Ct_Cq.IEA15MW.txt' # Filename for rotor performance text file (if it has been generated by ccblade already) + +# -------------------------------- TURBINE PARAMETERS ----------------------------------- +turbine_params: + rotor_inertia: 310619488. # Rotor inertia [kg m^2], {Available in Elastodyn .sum file} + rated_rotor_speed: 0.7916813478 # Rated rotor speed [rad/s] + v_min: 3. # Cut-in wind speed [m/s] + v_rated: 10.74 # Rated wind speed [m/s] + v_max: 25.0 # Cut-out wind speed [m/s], -- Does not need to be exact (JUST ASSUME FOR NOW) + max_pitch_rate: 0.0349 # Maximum blade pitch rate [rad/s] + max_torque_rate: 4500000. # Maximum torque rate [Nm/s], {~1/4 VS_RtTq/s} + rated_power: 15000000. # Rated Power [W] + bld_edgewise_freq: 4.0324 # Blade edgewise first natural frequency [rad/s] + bld_flapwise_freq: 3.4872 # Blade flapwise first natural frequency [rad/s] + TSR_operational: 9.0 + +#------------------------------- CONTROLLER PARAMETERS ---------------------------------- +controller_params: + # Controller flags + LoggingLevel: 3 # {0: write no debug files, 1: write standard output .dbg-file, 2: write standard output .dbg-file and complete avrSWAP-array .dbg2-file + F_LPFType: 2 # {1: first-order low-pass filter, 2: second-order low-pass filter}, [rad/s] (currently filters generator speed and pitch control signals) + F_NotchType: 0 # Notch on the measured generator speed {0: disable, 1: enable} + IPC_ControlMode: 0 # Turn Individual Pitch Control (IPC) for fatigue load reductions (pitch contribution) {0: off, 1: 1P reductions, 2: 1P+2P reductions} + VS_ControlMode: 2 # Generator torque control mode in above rated conditions {0: constant torque, 1: constant power, 2: TSR tracking PI control} + PC_ControlMode: 1 # Blade pitch control mode {0: No pitch, fix to fine pitch, 1: active PI blade pitch control} + Y_ControlMode: 0 # Yaw control mode {0: no yaw control, 1: yaw rate control, 2: yaw-by-IPC} + SS_Mode: 1 # Setpoint Smoother mode {0: no setpoint smoothing, 1: introduce setpoint smoothing} + WE_Mode: 2 # Wind speed estimator mode {0: One-second low pass filtered hub height wind speed, 1: Immersion and Invariance Estimator (Ortega et al.)} + PS_Mode: 3 # Pitch saturation mode {0: no pitch saturation, 1: peak shaving, 2: Cp-maximizing pitch saturation, 3: peak shaving and Cp-maximizing pitch saturation} + SD_Mode: 0 # Shutdown mode {0: no shutdown procedure, 1: pitch to max pitch at shutdown} + Fl_Mode: 2 # Floating specific feedback mode {0: no nacelle velocity feedback, 1: nacelle velocity feedback} + Flp_Mode: 0 # Flap control mode {0: no flap control, 1: steady state flap angle, 2: Proportional flap control} + PA_Mode: 2 # Pitch actuator mode {0 - not used, 1 - first order filter, 2 - second order filter} + StC_Mode: 1 + # Controller parameters + # U_pc: [14] + zeta_pc: 1.0 # Pitch controller desired damping ratio [-] + omega_pc: 0.2 # Pitch controller desired natural frequency [rad/s] + zeta_vs: 0.85 # Torque controller desired damping ratio [-] + omega_vs: 0.12 # Torque controller desired natural frequency [rad/s] + twr_freq: 3.355 # for semi only! + ptfm_freq: 0.213 # for semi only! + # Optional - these can be defined, but do not need to be + min_pitch: 0.0 # Minimum pitch angle [rad], {default = 0 degrees} + vs_minspd: 0.523598775 # Minimum rotor speed [rad/s], {default = 0 rad/s} + ps_percent: 0.8 # Percent peak shaving [%, <= 1 ], {default = 80%} + PA_CornerFreq: 1.5708 # Pitch actuator natural frequency [rad/s] + PA_Damping: 0.707 # Pitch actuator natural frequency [rad/s] + DISCON: + StC_GroupIndex: [2818, 2838, 2858] + diff --git a/ROSCO/Tune_Cases/IEA15MW_cable.yaml b/ROSCO/Tune_Cases/IEA15MW_cable.yaml new file mode 100644 index 000000000..c17b006b6 --- /dev/null +++ b/ROSCO/Tune_Cases/IEA15MW_cable.yaml @@ -0,0 +1,59 @@ +# --------------------- ROSCO controller tuning input file ------------------- + # Written for use with ROSCO_Toolbox tuning procedures + # Turbine: IEA 15MW Reference Wind Turbine +# ------------------------------ OpenFAST PATH DEFINITIONS ------------------------------ +path_params: + FAST_InputFile: 'IEA-15-240-RWT-UMaineSemi.fst' # Name of *.fst file + FAST_directory: '../Test_Cases/IEA-15-240-RWT-UMaineSemi' # Main OpenFAST model directory, where the *.fst lives + # Optional (but suggested...) + rotor_performance_filename: 'Cp_Ct_Cq.IEA15MW.txt' # Filename for rotor performance text file (if it has been generated by ccblade already) + +# -------------------------------- TURBINE PARAMETERS ----------------------------------- +turbine_params: + rotor_inertia: 310619488. # Rotor inertia [kg m^2], {Available in Elastodyn .sum file} + rated_rotor_speed: 0.7916813478 # Rated rotor speed [rad/s] + v_min: 3. # Cut-in wind speed [m/s] + v_rated: 10.74 # Rated wind speed [m/s] + v_max: 25.0 # Cut-out wind speed [m/s], -- Does not need to be exact (JUST ASSUME FOR NOW) + max_pitch_rate: 0.0349 # Maximum blade pitch rate [rad/s] + max_torque_rate: 4500000. # Maximum torque rate [Nm/s], {~1/4 VS_RtTq/s} + rated_power: 15000000. # Rated Power [W] + bld_edgewise_freq: 4.0324 # Blade edgewise first natural frequency [rad/s] + bld_flapwise_freq: 3.4872 # Blade flapwise first natural frequency [rad/s] + TSR_operational: 9.0 + +#------------------------------- CONTROLLER PARAMETERS ---------------------------------- +controller_params: + # Controller flags + LoggingLevel: 3 # {0: write no debug files, 1: write standard output .dbg-file, 2: write standard output .dbg-file and complete avrSWAP-array .dbg2-file + F_LPFType: 2 # {1: first-order low-pass filter, 2: second-order low-pass filter}, [rad/s] (currently filters generator speed and pitch control signals) + F_NotchType: 0 # Notch on the measured generator speed {0: disable, 1: enable} + IPC_ControlMode: 0 # Turn Individual Pitch Control (IPC) for fatigue load reductions (pitch contribution) {0: off, 1: 1P reductions, 2: 1P+2P reductions} + VS_ControlMode: 2 # Generator torque control mode in above rated conditions {0: constant torque, 1: constant power, 2: TSR tracking PI control} + PC_ControlMode: 1 # Blade pitch control mode {0: No pitch, fix to fine pitch, 1: active PI blade pitch control} + Y_ControlMode: 0 # Yaw control mode {0: no yaw control, 1: yaw rate control, 2: yaw-by-IPC} + SS_Mode: 1 # Setpoint Smoother mode {0: no setpoint smoothing, 1: introduce setpoint smoothing} + WE_Mode: 2 # Wind speed estimator mode {0: One-second low pass filtered hub height wind speed, 1: Immersion and Invariance Estimator (Ortega et al.)} + PS_Mode: 3 # Pitch saturation mode {0: no pitch saturation, 1: peak shaving, 2: Cp-maximizing pitch saturation, 3: peak shaving and Cp-maximizing pitch saturation} + SD_Mode: 0 # Shutdown mode {0: no shutdown procedure, 1: pitch to max pitch at shutdown} + Fl_Mode: 2 # Floating specific feedback mode {0: no nacelle velocity feedback, 1: nacelle velocity feedback} + Flp_Mode: 0 # Flap control mode {0: no flap control, 1: steady state flap angle, 2: Proportional flap control} + PA_Mode: 2 # Pitch actuator mode {0 - not used, 1 - first order filter, 2 - second order filter} + CC_Mode: 1 + # Controller parameters + # U_pc: [14] + zeta_pc: 1.0 # Pitch controller desired damping ratio [-] + omega_pc: 0.2 # Pitch controller desired natural frequency [rad/s] + zeta_vs: 0.85 # Torque controller desired damping ratio [-] + omega_vs: 0.12 # Torque controller desired natural frequency [rad/s] + twr_freq: 3.355 # for semi only! + ptfm_freq: 0.213 # for semi only! + # Optional - these can be defined, but do not need to be + min_pitch: 0.0 # Minimum pitch angle [rad], {default = 0 degrees} + vs_minspd: 0.523598775 # Minimum rotor speed [rad/s], {default = 0 rad/s} + ps_percent: 0.8 # Percent peak shaving [%, <= 1 ], {default = 80%} + PA_CornerFreq: 1.5708 # Pitch actuator natural frequency [rad/s] + PA_Damping: 0.707 # Pitch actuator natural frequency [rad/s] + DISCON: + CC_GroupIndex: [2601, 2603, 2605] + diff --git a/ROSCO/Tune_Cases/NREL2p8.yaml b/ROSCO/Tune_Cases/NREL2p8.yaml new file mode 100644 index 000000000..bbba19a2b --- /dev/null +++ b/ROSCO/Tune_Cases/NREL2p8.yaml @@ -0,0 +1,65 @@ +path_params: {FAST_InputFile: NREL-2p8-127.fst, FAST_directory: ../Test_Cases/NREL_2p8_127, rotor_performance_filename: NREL-2p8-127_Cp_Ct_Cq.txt} +controller_params: + LoggingLevel: 2 + F_LPFType: 1 + F_NotchType: 0 + IPC_ControlMode: 1 + VS_ControlMode: 3 + PC_ControlMode: 1 + Y_ControlMode: 0 + SS_Mode: 1 + WE_Mode: 2 + PS_Mode: 1 + SD_Mode: 0 + Fl_Mode: 0 + Flp_Mode: 0 + zeta_pc: [2.0062413749856227] + omega_pc: [0.13653659182284006] + zeta_vs: 0.465 + omega_vs: 0.11 + twr_freq: 0.4499 + ptfm_freq: 0.2 + ps_percent: 0.8 + sd_maxpit: 0.4363 + DISCON: {PC_MinPit: -0.1745329, PC_FinePit: 0.0, DLL_FileName: unused, DLL_InFile: unused, DLL_ProcName: DISCON} + TD_Mode: 0 + PwC_Mode: 0 + ZMQ_Mode: 0 + PA_Mode: 0 + Ext_Mode: 0 + U_pc: [12] + interp_type: sigma + max_pitch: 1.57 + min_pitch: 0.0 + vs_minspd: 0.0 + ss_vsgain: 1.0 + ss_pcgain: 0.001 + flp_maxpit: 0.1745 + WS_GS_n: 60 + PC_GS_n: 30 + tune_Fl: true + max_torque_factor: 1.1 + IPC_Kp1p: 0.0 + IPC_Kp2p: 0.0 + IPC_Ki1p: 5.2e-9 + IPC_Ki2p: 0.0 + IPC_Vramp: [0.0, 0.0] + filter_params: {f_we_cornerfreq: 0.20944, f_fl_highpassfreq: 0.01042, f_ss_cornerfreq: 0.6283, f_yawerr: 0.17952, f_sd_cornerfreq: 0.41888} + open_loop: {flag: false, filename: unused, OL_Ind_Breakpoint: 1, OL_Ind_BldPitch: 0, OL_Ind_GenTq: 0, OL_Ind_YawRate: 0} + PA_CornerFreq: 3.14 + PA_Damping: 0.707 + linmodel_tuning: + type: none + linfile_path: none + lintune_outpath: lintune_outfiles + load_parallel: false + stability_margin: 0.1 + omega_pc: {} + flag: true + tuning_yaml: /home/dzalkind/Tools/ROSCO/Tune_Cases/NREL2p8.yaml + n_pitch: 30 + n_tsr: 30 + n_U: 1 + omega_flp: 0.0 + zeta_flp: 0.0 +turbine_params: {rotor_inertia: 19858184.0, rated_rotor_speed: 1.26711, v_min: 3.0, v_rated: 11.4, v_max: 25.0, max_pitch_rate: 0.1745, max_torque_rate: 1500000.0, rated_power: 2800000.0, bld_edgewise_freq: 8.2831853, bld_flapwise_freq: 0.0, TSR_operational: 0} diff --git a/ROSCO/Tune_Cases/tune_ROSCO.py b/ROSCO/Tune_Cases/tune_ROSCO.py deleted file mode 100644 index f06319365..000000000 --- a/ROSCO/Tune_Cases/tune_ROSCO.py +++ /dev/null @@ -1,68 +0,0 @@ -# Controller Tuning Script for NREL-5MW Wind Turbine -# -- Made to run the tools distributed as a part of the ROSCO_Toolbox -import os - -#-------------------------------- LOAD INPUT PARAMETERS ---------------------------------# -# Change this for your turbine -this_dir = os.path.dirname(__file__) -parameter_filename = os.path.join(this_dir,'IEA15MW.yaml') # Name of .yaml input file for the specific turbine - - - - -#--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------# -#--------------------- NOTHING SHOULD NEED TO CHANGE AFTER THIS -----------------------------------------------------------------------------------------------------------------# -#--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------# - - -#------------------------------------- INITIALIZATION ----------------------------------# -# Import python modules -import matplotlib.pyplot as plt -import yaml -# Import ROSCO_toolbox modules -from ROSCO_toolbox import controller as ROSCO_controller -from ROSCO_toolbox import turbine as ROSCO_turbine -from ROSCO_toolbox.utilities import write_rotor_performance, write_DISCON -from ROSCO_toolbox.inputs.validation import load_rosco_yaml - -# Initialize parameter dictionaries -turbine_params = {} -control_params = {} - -# Load input file contents, put them in some dictionaries to keep things cleaner -inps = load_rosco_yaml(parameter_filename) -path_params = inps['path_params'] -turbine_params = inps['turbine_params'] -controller_params = inps['controller_params'] - -#---------------------------------- DO THE FUN STUFF ------------------------------------# -# Initialiize turbine and controller -turbine = ROSCO_turbine.Turbine(turbine_params) - -# Load Turbine, write rotor performance file if it doesn't exist -if os.path.exists(os.path.join(this_dir,path_params['rotor_performance_filename'])): - turbine.load_from_fast(path_params['FAST_InputFile'], \ - os.path.join(this_dir,path_params['FAST_directory']), \ - dev_branch=True,rot_source='txt',txt_filename=path_params['rotor_performance_filename']) -else: - turbine.load_from_fast(path_params['FAST_InputFile'], \ - os.path.join(this_dir,path_params['FAST_directory']), \ - dev_branch=True,rot_source=None, txt_filename=path_params['rotor_performance_filename']) - - write_rotor_performance(turbine,txt_filename=os.path.join(this_dir,path_params['rotor_performance_filename'])) - -# Flap tuning if necessary -if controller_params['Flp_Mode']: - turbine.load_blade_info() - -# Instantiate controller tuning and tune controller -controller = ROSCO_controller.Controller(controller_params) -controller.tune_controller(turbine) - -# Write parameter input file -param_file = 'DISCON.IN' -write_DISCON(turbine,controller,param_file=param_file, txt_filename=os.path.join(this_dir,path_params['rotor_performance_filename'])) - -# Plot rotor performance -turbine.Cp.plot_performance() -plt.show() diff --git a/ROSCO/docs/source/api_change.rst b/ROSCO/docs/source/api_change.rst index 9efdd8db4..4fecc5a6c 100644 --- a/ROSCO/docs/source/api_change.rst +++ b/ROSCO/docs/source/api_change.rst @@ -9,6 +9,69 @@ The changes are tabulated according to the line number, and flag name. The line number corresponds to the resulting line number after all changes are implemented. Thus, be sure to implement each in order so that subsequent line numbers are correct. +2.7.0 to 2.8.0 +------------------------------- +Optional Inputs +- ROSCO now reads in the whole input file and searches for keywords to set the inputs. Blank spaces and specific ordering are no longer required. +- Input requirements depend on control modes. E.g., open loop inputs are not required if `OL_Mode = 0`` +Cable Control +- Can control OpenFAST cables (MoorDyn or SubDyn) using ROSCO +Structural Control +- Can control OpenFAST structural control elements (ServoDyn) using ROSCO +Active wake control +- Added Active Wake Control (AWC) implementation + +====== ================= ====================================================================================================================================================================================================== +New in ROSCO 2.8.0 +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Line Input Name Example Value +====== ================= ====================================================================================================================================================================================================== +6 Echo 0 ! Echo - (0 - no Echo, 1 - Echo input data to .echo) +25 AWC_Mode 0 ! AWC_Mode - Active wake control mode [0 - not used, 1 - complex number method, 2 - Coleman transform method] +28 CC_Mode 0 ! CC_Mode - Cable control mode [0- unused, 1- User defined, 2- Open loop control] +29 StC_Mode 0 ! StC_Mode - Structural control mode [0- unused, 1- User defined, 2- Open loop control] +139 Ind_CableControl 0 ! Ind_CableControl - The column(s) in OL_Filename that contains the cable control inputs in m [Used with CC_Mode = 2, must be the same size as CC_Group_N] +140 Ind_StructControl 0 ! Ind_StructControl - The column(s) in OL_Filename that contains the structural control inputs [Used with StC_Mode = 2, must be the same size as StC_Group_N] +148 Empty Line +149 AWC_Section !------- Active Wake Control ----------------------------------------------------- +150 AWC_NumModes 1 ! AWC_NumModes - AWC- Number of modes to include [-] +151 AWC_n 1 ! AWC_n - AWC azimuthal mode [-] (only used in complex number method) +152 AWC_harmonic 1 ! AWC_harmonic - AWC Coleman transform harmonic [-] (only used in Coleman transform method) +153 AWC_freq 0.03 ! AWC_freq - AWC frequency [Hz] +154 AWC_amp 2.0 ! AWC_amp - AWC amplitude [deg] +155 AWC_clockangle 0.0 ! AWC_clockangle - AWC clock angle [deg] +165 Empty Line +166 CC_Section !------- Cable Control --------------------------------------------------------- +167 CC_Group_N 3 ! CC_Group_N - Number of cable control groups +168 CC_GroupIndex 2601 2603 2605 ! CC_GroupIndex - First index for cable control group, should correspond to deltaL +169 CC_ActTau 20.000000 ! CC_ActTau - Time constant for line actuator [s] +170 Empty Line +171 StC_Section !------- Structural Controllers --------------------------------------------------------- +172 StC_Group_N 3 ! StC_Group_N - Number of cable control groups +173 StC_GroupIndex 2818 2838 2858 ! StC_GroupIndex - First index for structural control group, options specified in ServoDyn summary output +====== ================= ====================================================================================================================================================================================================== + + +2.6.0 to 2.7.0 +------------------------------- +Pitch Faults +- Constant pitch actuator offsets (PF_Mode = 1) +IPC Saturation Modes +- Added options for saturating the IPC command with the peak shaving limit + +====== ================= ====================================================================================================================================================================================================== +New in ROSCO 2.7.0 +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Line Input Name Example Value +====== ================= ====================================================================================================================================================================================================== +23 PF_Mode 0 ! PF_Mode - Pitch fault mode {0 - not used, 1 - constant offset on one or more blades} +56 IPC_SatMode 2 ! IPC_SatMode - IPC Saturation method (0 - no saturation (except by PC_MinPit), 1 - saturate by PS_BldPitchMin, 2 - saturate sotfly (full IPC cycle) by PC_MinPit, 3 - saturate softly by PS_BldPitchMin) +139 PF_Section !------- Pitch Actuator Faults --------------------------------------------------------- +140 PF_Offsets 0.00000000 0.00000000 0.00000000 ! PF_Offsets - Constant blade pitch offsets for blades 1-3 [rad] +141 Empty Line +====== ================= ====================================================================================================================================================================================================== + + 2.5.0 to 2.6.0 ------------------------------- IPC @@ -27,7 +90,7 @@ Updated yaw control - Filter wind direction with deadband, and yaw until direction error changes signs (https://iopscience.iop.org/article/10.1088/1742-6596/1037/3/032011) ====== ================= ====================================================================================================================================================================================================== -New in ROSCO develop +New in ROSCO 2.6.0 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Line Input Name Example Value ====== ================= ====================================================================================================================================================================================================== @@ -54,17 +117,17 @@ Line Input Name Example Value ====== ================= ====================================================================================================================================================================================================== ====== ================= ====================================================================================================================================================================================================== -Modified in ROSCO develop +Modified in ROSCO 2.6.0 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Line Input Name Example Value ====== ================= ====================================================================================================================================================================================================== -97 Y_ErrThresh 4.000000 8.000000 ! Y_ErrThresh - Yaw error threshold/deadband. Turbine begins to yaw when it passes this. If Y_uSwitch is zero, only the first value is used. [deg]. +97 Y_ErrThresh 4.000000 8.000000 ! Y_ErrThresh - Yaw error threshold/deadbands. Turbine begins to yaw when it passes this. If Y_uSwitch is zero, only the second value is used. [deg]. 98 Y_Rate 0.00870 ! Y_Rate - Yaw rate [rad/s] 99 Y_MErrSet 0.00000 ! Y_MErrSet - Integrator saturation (maximum signal amplitude contribution to pitch from yaw-by-IPC), [rad] ====== ================= ====================================================================================================================================================================================================== ====== ================= ====================================================================================================================================================================================================== -Removed in ROSCO develop +Removed in ROSCO 2.6.0 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Line Input Name Example Value ====== ================= ====================================================================================================================================================================================================== diff --git a/ROSCO/docs/source/install.rst b/ROSCO/docs/source/install.rst index 29a71620a..ecd12be2d 100644 --- a/ROSCO/docs/source/install.rst +++ b/ROSCO/docs/source/install.rst @@ -104,6 +104,7 @@ On Mac/Linux, standard compilers are generally available without any additional .. code-block:: bash conda install m2w64-toolchain libpython + conda install cmake make # if Windows users would like to install these in anaconda environment Once the CMake and the required compilers are downloaded, the following code can be used to compile ROSCO. @@ -181,17 +182,17 @@ Full ROSCO Installation We recommend using the full ROSCO tool-chain. This allows for full use of the provided functions along with the developed python packages and controller code, -Please follow the following steps to install the ROSCO tool-chain. You should do step 3 *or* 4. If you simply want to install the ROSCO toolbox without the controller, do step 3. If you would like to install the ROSCO toolbox and compile the controller simultaneously, do step 4. +Please follow the following steps to install the ROSCO tool-chain. You should do step 2 *or* 3. If you simply want to install the ROSCO toolbox without the controller, do step 3. If you would like to install the ROSCO toolbox and compile the controller simultaneously, do step 2. 1. Create a conda environment for ROSCO .. code-block:: bash - conda config --add channels conda-forge - conda create -y --name rosco-env python=3.8 - conda activate rosco-env + conda config --add channels conda-forge # (Enable Conda-forge Channel For Conda Package Manager) + conda create -y --name rosco-env python=3.8 # (Create a new environment named "rosco-env" that contains Python 3.8) + conda activate rosco-env # (Activate your "rosco-env" environment) -2. Clone and Install the ROSCO toolbox with ROSCO +2. Clone and Install the ROSCO toolbox with ROSCO controller .. code-block:: bash @@ -199,10 +200,11 @@ Please follow the following steps to install the ROSCO tool-chain. You should do cd ROSCO conda install compilers # (Mac/Linux only) conda install m2w64-toolchain libpython # (Windows only) - conda install -y wisdem + conda env config vars set FC=gfortran # Sometimes needed for Windows + conda install -y wisdem=3.5.0 python setup.py install --compile-rosco -3. Clone and Install the ROSCO toolbox without ROSCO +3. Clone and Install the ROSCO toolbox without ROSCO controller .. code-block:: bash diff --git a/ROSCO/docs/source/standard_use.rst b/ROSCO/docs/source/standard_use.rst index e96c4f520..a23310dc1 100644 --- a/ROSCO/docs/source/standard_use.rst +++ b/ROSCO/docs/source/standard_use.rst @@ -16,12 +16,11 @@ Several OpenFAST inputs are located in `Test_Cases/ `_. A detailed description of the ROSCO control inputs and tuning :code:`.yaml` are provided in :ref:`discon_in` and :ref:`rt_tuning_yaml`, respectively. -* :code:`example_01.py` loads an OpenFAST turbine model and displays a summary of its information -* :code:`example_02.py` plots the :math:`C_p` surface of a turbine +* :code:`01_turbine_model.py` loads an OpenFAST turbine model and displays a summary of its information ROSCO requires the power and thrust coefficients for tuning control inputs and running the extended Kalman filter wind speed estimator. -* :code:`example_03.py` runs cc-blade, a blade element momentum solver from WISDEM, to generate a :math:`C_p` surface. +* :code:`02_ccblade.py` runs cc-blade, a blade element momentum solver from WISDEM, to generate a :math:`C_p` surface. The :code:`Cp_Cq_Ct.txt` (or similar) file contains the rotor performance tables that are necessary to run the ROSCO controller. This file can be located wherever you desire, just be sure to point to it properly with the :code:`PerfFileName` parameter in :code:`DISCON.IN`. @@ -36,9 +35,9 @@ Generally :code:`omega_*` increases the responsiveness of the controller, reduci :code:`zeta_*` changes the damping of the controller and is generally less important of a tuning parameter, but could also help with loading. The default parameters in `Tune_Cases/ `_ are known to work well with the turbines in this repository. -* :code:`example_04.py` loads a turbine and tunes the PI control gains -* :code:`example_05.py` tunes a controller and runs a simple simualtion (not using OpenFAST) -* :code:`example_06.py` loads a turbine, tunes a controller, and runs an OpenFAST simulation +* :code:`03_tune_controller.py` loads a turbine and tunes the PI control gains +* :code:`04_simple_sim.py` tunes a controller and runs a simple simualtion (not using OpenFAST) +* :code:`05_openfast_sim.py` loads a turbine, tunes a controller, and runs an OpenFAST simulation Each of these examples generates a :code:`DISCON.IN` file, which is an input to libdiscon.*. When running the controller in OpenFAST, :code:`DISCON.IN` must be appropriately named using the :code:`DLL_FileName` parameter in ServoDyn. @@ -51,18 +50,18 @@ OpenFAST can be installed from `source `_ ROSCO can implement peak shaving (or thrust clipping) by changing the minimum pitch angle based on the estimated wind speed: -* :code:`example_07.py` loads a turbine and tunes a controller with peak shaving. +* :code:`06_peak_shaving.py` loads a turbine and tunes a controller with peak shaving. By setting the :code:`ps_percent` value in the tuning yaml, the minimum pitch versus wind speed table changes and is updated in the :code:`DISCON.IN` file. ROSCO also contains a method for distributed aerodynamic control (e.g., via trailing edge flaps): -* :code:`example_10.py` tunes a controller for distributed aerodynamic control +* :code:`09_distributed_aero.py` tunes a controller for distributed aerodynamic control The ROSCO toolbox also contains methods for working with OpenFAST linear models -* :code:`example_11.py` exports a file of the parameters used for the simplified linear models used to tune ROSCO -* :code:`example_12.py` shows how linear models generated using OpenFAST can be used to tune controllers with robust stability properties. -* :code:`example_13.py` shows the tuning procedure for IPC +* :code:`10_linear_params.py` exports a file of the parameters used for the simplified linear models used to tune ROSCO +* :code:`11_robust_tuning.py` shows how linear models generated using OpenFAST can be used to tune controllers with robust stability properties. +* :code:`12_tune_ipc.py` shows the tuning procedure for IPC Running OpenFAST Simulations ---------------------------- @@ -81,10 +80,10 @@ The ROSCO_toolbox has methods for running OpenFAST (and other) binary executable Several example scripts are set up to quickly simulate ROSCO with OpenFAST: -* :code:`example_06.py` loads a turbine, tunes a controller, and runs an OpenFAST simulation -* :code:`example_08.py` loads the OpenFAST output files and plots the results -* :code:`example_09.py` runs TurbSim, for generating turbulent wind inputs -* :code:`example_14.py` runs an OpenFAST simulation with ROSCO providing open loop control inputs +* :code:`05_openfast_sim.py` loads a turbine, tunes a controller, and runs an OpenFAST simulation +* :code:`07_openfast_outputs.py` loads the OpenFAST output files and plots the results +* :code:`08_run_turbsim.py` runs TurbSim, for generating turbulent wind inputs +* :code:`14_open_loop_control.py` runs an OpenFAST simulation with ROSCO providing open loop control inputs Testing ROSCO diff --git a/ROSCO/docs/source/toolbox_input.rst b/ROSCO/docs/source/toolbox_input.rst index a3b477292..5b205c703 100644 --- a/ROSCO/docs/source/toolbox_input.rst +++ b/ROSCO/docs/source/toolbox_input.rst @@ -9,7 +9,7 @@ ROSCO_Toolbox tuning .yaml Definition of inputs for ROSCO tuning procedure -toolbox_schema. +toolbox_schema @@ -102,7 +102,7 @@ controller_params *Default* = 1 - *Minimum* = 0 *Maximum* = 2 + *Minimum* = 0 *Maximum* = 3 :code:`F_LPFType` : Float @@ -256,9 +256,35 @@ controller_params *Minimum* = 0 *Maximum* = 2 +:code:`PF_Mode` : Float + Pitch fault mode {0 - not used, 1 - constant offset on one or more + blades} + + *Default* = 0 + + *Minimum* = 0 *Maximum* = 1 + + :code:`Ext_Mode` : Float - External control mode {{0 - not used, 1 - call external dynamic - library}} + External control mode [0 - not used, 1 - call external dynamic + library] + + *Default* = 0 + + *Minimum* = 0 *Maximum* = 1 + + +:code:`CC_Mode` : Float + Cable control mode [0- unused, 1- User defined, 2- Position + control (not yet implemented)] + + *Default* = 0 + + *Minimum* = 0 *Maximum* = 1 + + +:code:`StC_Mode` : Float + Structural control mode [0- unused, 1- User defined] *Default* = 0 @@ -558,6 +584,11 @@ These are pass-through parameters for the DISCON.IN file. Use with caution. write standard output .dbg-file and complete avrSWAP-array .dbg2-file) +:code:`Echo` : Float + 0 - no Echo, 1 - Echo input data to .echo + + *Default* = 0 + :code:`F_LPFType` : Float 1- first-order low-pass filter, 2- second-order low-pass filter (currently filters generator speed and pitch control signals @@ -688,6 +719,10 @@ These are pass-through parameters for the DISCON.IN file. Use with caution. Integrator saturation (maximum signal amplitude contribution to pitch from IPC) +:code:`IPC_SatMode` : Integer + IPC Saturation method (0 - no saturation, 1 - saturate by + PC_MinPit, 2 - saturate by PS_BldPitchMin) + :code:`IPC_KP` : Array of Floats Proportional gain for the individual pitch controller- first parameter for 1P reductions, second for 2P reductions, [-] @@ -909,6 +944,35 @@ These are pass-through parameters for the DISCON.IN file. Use with caution. *Default* = DISCON +:code:`PF_Offsets` : Array of Floats + Pitch angle offsets for each blade (array with length of 3) + +:code:`CC_Group_N` : Float + Number of cable control groups + + *Default* = 0 + +:code:`CC_GroupIndex` : Array of Floats + First index for cable control group, should correspond to deltaL + + *Default* = [0] + +:code:`CC_ActTau` : Float + Time constant for line actuator [s] + + *Default* = 20 + +:code:`StC_Group_N` : Float + Number of cable control groups + + *Default* = 0 + +:code:`StC_GroupIndex` : Array of Floats + First index for structural control group, options specified in + ServoDyn summary output + + *Default* = [0] + linmodel_tuning diff --git a/ROSCO/setup.py b/ROSCO/setup.py index ee6816479..3af0995ac 100644 --- a/ROSCO/setup.py +++ b/ROSCO/setup.py @@ -33,26 +33,27 @@ NAME = 'rosco' DESCRIPTION = 'A reference open source controller toolset for wind turbine applications.' URL = 'https://github.com/NREL/ROSCO' -EMAIL = 'nikhar.abbas@nrel.gov' +EMAIL = 'daniel.zalkind@nrel.gov' AUTHOR = 'NREL, National Wind Technology Center' -REQUIRES_PYTHON = '>=3.4' -VERSION = '2.6.0' +REQUIRES_PYTHON = '>=3.8' +VERSION = '2.7.0' # These packages are required for all of the code to be executed. # - Maybe you can get away with older versions... REQUIRED = [ 'matplotlib', 'numpy', - 'pytest', + #'pytest', 'scipy', 'pyYAML', - 'future', + #'future', 'pandas' ] # For the CMake Extensions this_directory = os.path.abspath(os.path.dirname(__file__)) + class CMakeExtension(Extension): def __init__(self, name, sourcedir='', **kwa): diff --git a/WISDEM/.github/workflows/CI_WISDEM.yml b/WISDEM/.github/workflows/CI_WISDEM.yml index 302f08452..fa8b718fa 100644 --- a/WISDEM/.github/workflows/CI_WISDEM.yml +++ b/WISDEM/.github/workflows/CI_WISDEM.yml @@ -5,32 +5,31 @@ on: [push, pull_request] # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: - build: - name: Build (${{ matrix.os }} Python ${{ matrix.python-version }}) + build_conda: + name: Conda Build-Test (${{ matrix.os }} Python ${{ matrix.python-version }}) runs-on: ${{ matrix.os }} defaults: run: - shell: bash -l {0} - + shell: bash -el {0} strategy: fail-fast: False matrix: - os: [ubuntu-latest, windows-latest] + os: [ubuntu-latest, windows-latest] #macos-latest, python-version: ["3.9", "3.10", "3.11"] steps: - name: checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - # Official way to do miniconda, but it messes with the worker environment and shell - - name: Install miniconda + - name: Install conda/mamba uses: conda-incubator/setup-miniconda@v2 # https://github.com/marketplace/actions/setup-miniconda with: - miniconda-version: "latest" - channels: conda-forge + # To use mamba, uncomment here, comment out the miniforge line + #mamba-version: "*" + miniforge-version: "latest" auto-update-conda: true python-version: ${{ matrix.python-version }} environment-file: environment.yml @@ -41,8 +40,7 @@ jobs: - name: Add dependencies ubuntu specific if: false == contains( matrix.os, 'windows') run: | - conda install -y petsc4py mpi4py gfortran - conda info -e + conda install -y petsc4py gfortran # Install dependencies of WISDEM specific to windows - name: Add dependencies windows specific @@ -50,40 +48,46 @@ jobs: run: | conda install -y m2w64-toolchain libpython - # Debugging session - #- name: Setup tmate session - # uses: mxschmitt/action-tmate@v3 + - name: Debug config + run: | + conda list + which -a gfortran + which pip # Install WISDEM with setup + # Note: For some reason, pip --no-deps doesn't find conda packages and downloads everything - name: Install WISDEM with setup run: | - python setup.py develop + python setup.py install # Install WISDEM with pip - - name: Install WISDEM with pip for Unix - if: false == contains( matrix.os, 'windows') - run: | - rm -rf meson_build - pip install -vv --no-deps -e . + #- name: Install WISDEM with pip for Unix + # if: false == contains( matrix.os, 'windows') + # run: | + # python setup.py install # Install WISDEM with pip #- name: Install WISDEM with pip for Windows # if: contains( matrix.os, 'windows') # run: | - # pip install -vv --no-deps --global-option --compiler=unix . + # python setup.py install + + # Debugging session + #- name: Setup tmate session + # uses: mxschmitt/action-tmate@v3 # Run all tests - name: Run tests - if: contains( matrix.os, 'ubuntu') + if: false == contains( matrix.os, 'windows') run: | - pytest --cov=wisdem + pytest -p no:warnings --disable-warnings --cov=wisdem # Run limited test on WINDOWS - - name: Add dependencies windows specific + - name: Limited Windows test if: contains( matrix.os, 'windows') run: | cd wisdem/test/test_gluecode - pytest test_g* + pytest -p no:warnings --disable-warnings test_g* # Run coveralls - name: Run coveralls @@ -94,3 +98,47 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | coveralls --service=github + + + build_pip: + name: Pip Build-Test (${{ matrix.os }} Python ${{ matrix.python-version }}) + runs-on: ${{ matrix.os }} + + defaults: + run: + shell: bash -el {0} + + strategy: + fail-fast: False + matrix: + os: [ubuntu-latest] #, windows-latest, macos-latest, + python-version: ["3.10"] + + steps: + - name: Setup GNU Fortran + uses: awvwgk/setup-fortran@v1 + #with: + # compiler: intel-classic + + - name: checkout repository + uses: actions/checkout@v4 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + id: cp + with: + python-version: ${{ matrix.python-version }} + update-environment: true + + # Install WISDEM with setup + # Note: For some reason, pip --no-deps doesn't find conda packages and downloads everything + - name: Install WISDEM with setup + run: | + '${{ steps.cp.outputs.python-path }}' -m pip install --upgrade pip install pytest + '${{ steps.cp.outputs.python-path }}' -m pip install -vv . + + # Run limited tests + - name: Limited test + run: | + cd wisdem/test/test_gluecode + pytest -p no:warnings --disable-warnings test_g* diff --git a/WISDEM/.github/workflows/Publish_WISDEM.yml b/WISDEM/.github/workflows/Publish_WISDEM.yml index 0855c5c82..287a53de5 100644 --- a/WISDEM/.github/workflows/Publish_WISDEM.yml +++ b/WISDEM/.github/workflows/Publish_WISDEM.yml @@ -5,8 +5,6 @@ name: Build and upload to PyPI #on: [push, pull_request] # Alternatively, to publish when a (published) GitHub Release is created, use the following: on: - push: - pull_request: release: types: - published @@ -21,13 +19,13 @@ jobs: steps: - name: Setup GNU Fortran - uses: modflowpy/install-gfortran-action@v1 - + uses: awvwgk/setup-fortran@v1 + - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Build wheels - uses: pypa/cibuildwheel@v2.12.3 + uses: pypa/cibuildwheel@v2.16.1 - uses: actions/upload-artifact@v3 with: @@ -61,7 +59,7 @@ jobs: name: artifact path: dist - - uses: pypa/gh-action-pypi-publish@v1.8.5 + - uses: pypa/gh-action-pypi-publish@v1.8.10 with: user: __token__ password: ${{ secrets.pypi_password }} diff --git a/WISDEM/README.md b/WISDEM/README.md index c555233e4..7be3fa7ea 100644 --- a/WISDEM/README.md +++ b/WISDEM/README.md @@ -38,21 +38,29 @@ The core modules draw upon some utility packages, which are typically compiled c ## Installation -Installation with [Anaconda](https://www.anaconda.com) is the recommended approach because of the ability to create self-contained environments suitable for testing and analysis. WISDEM® requires [Anaconda 64-bit](https://www.anaconda.com/distribution/). +Installation with [Anaconda](https://www.anaconda.com) is the recommended approach because of the ability to create self-contained environments suitable for testing and analysis. WISDEM® requires [Anaconda 64-bit](https://www.anaconda.com/distribution/). However, the `conda` command has begun to show its age and we now recommend the one-for-one replacement with `mamba` via the [Miniforge distribution](https://github.com/conda-forge/miniforge/releases), which is much more lightweight and more easily solves for the WISDEM package dependencies. + +### Installation as a "library" + +To use WISDEM's modules as a library for incorporation into other scripts or tools, WISDEM is available via `mamba install wisdem` or `pip install wisdem`, assuming that you have already setup your python environment. Note that on Windows platforms, we suggest using `conda/mamba` exclusively. + +### Installation for direct use + +These instructions are for interaction with WISDEM directly, the use of its examples, and the direct inspection of its source code. The installation instructions below use the environment name, "wisdem-env," but any name is acceptable. For those working behind company firewalls, you may have to change the conda authentication with `conda config --set ssl_verify no`. Proxy servers can also be set with `conda config --set proxy_servers.http http://id:pw@address:port` and `conda config --set proxy_servers.https https://id:pw@address:port`. To setup an environment based on a different Github branch of WISDEM, simply substitute the branch name for `master` in the setup line. 1. Setup and activate the Anaconda environment from a prompt (Anaconda3 Power Shell on Windows or Terminal.app on Mac) - conda config --add channels conda-forge - conda env create --name wisdem-env -f https://raw.githubusercontent.com/WISDEM/WISDEM/master/environment.yml python=3.10 - conda activate wisdem-env + mamba config --add channels conda-forge + mamba env create --name wisdem-env -f https://raw.githubusercontent.com/WISDEM/WISDEM/master/environment.yml python=3.10 + mamba activate wisdem-env 2. In order to directly use the examples in the repository and peek at the code when necessary, we recommend all users install WISDEM in *developer / editable* mode using the instructions here. If you really just want to use WISDEM as a library and lean on the documentation, you can always do `conda install wisdem` and be done. Note the differences between Windows and Mac/Linux build systems. For Linux, we recommend using the native compilers (for example, gcc and gfortran in the default GNU suite). - conda install -y petsc4py mpi4py # (Mac / Linux only) - conda install -y gfortran # (Mac only without Homebrew or Macports compilers) - conda install -y m2w64-toolchain libpython # (Windows only) + mamba install -y petsc4py mpi4py # (Mac / Linux only) + mamba install -y gfortran # (Mac only without Homebrew or Macports compilers) + mamba install -y m2w64-toolchain libpython # (Windows only) git clone https://github.com/WISDEM/WISDEM.git cd WISDEM python setup.py develop # Currently more reliable than: pip install -e diff --git a/WISDEM/docs/docstrings/var_guide_to_json.py b/WISDEM/docs/docstrings/var_guide_to_json.py new file mode 100644 index 000000000..ed7fcc8d0 --- /dev/null +++ b/WISDEM/docs/docstrings/var_guide_to_json.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +import sys +import numpy as np +import pandas as pd +import json + +# these were spot checked, unclear if there's a better way to directly +# obtain this mapping +var_prefixes = { + 'assembly': '*.', # scattered all over the place + 'ccblade': 'rotorse.', + 're': 'rotorse.', + 'rp': 'rotorse.', + 'rs': 'rotorse.', + 'stall_check': 'rotorse.', + 'wt_class': 'rotorse.', +} + +# the variable guide in csv format is generated by get_omdao_vars.py +tab = pd.read_csv('variable_guide.csv') +if tab.iloc[-1]['Description'] == 'description': + # throw out footer + tab = tab.iloc[:-1] +tab = tab.set_index('Variable') +tab['Units'] = tab['Units'].replace(np.nan, '-') +tab['Description'] = tab['Description'].replace(np.nan,'None') + +# convert to dict +varsdict = {} +for varn,info in tab.iterrows(): + curlev = varsdict + varlevels = varn.split('.') + toplevel = varlevels[0] + for lev in varlevels[:-1]: + if lev not in curlev: + curlev[lev] = {} + curlev = curlev[lev] + curlev[varlevels[-1]] = info.to_dict() # Units, Description + curlev[varlevels[-1]]['Name'] = var_prefixes.get(toplevel,'') + varn + +# save +with open('variable_guide.json','w') as f: + json.dump(varsdict, f, indent=2) diff --git a/WISDEM/docs/docstrings/variable_guide.json b/WISDEM/docs/docstrings/variable_guide.json new file mode 100644 index 000000000..36c68bf59 --- /dev/null +++ b/WISDEM/docs/docstrings/variable_guide.json @@ -0,0 +1,8718 @@ +{ + "airfoils": { + "Re": { + "Units": "-", + "Description": "1D array of the Reynolds numbers used to define the polars of the airfoils. All airfoils defined in openmdao share this grid.", + "Name": "airfoils.Re" + }, + "ac": { + "Units": "-", + "Description": "1D array of the aerodynamic centers of each airfoil.", + "Name": "airfoils.ac" + }, + "aoa": { + "Units": "rad", + "Description": "1D array of the angles of attack used to define the polars of the airfoils. All airfoils defined in openmdao share this grid.", + "Name": "airfoils.aoa" + }, + "cd": { + "Units": "-", + "Description": "4D array with the drag coefficients of the airfoils. Dimension 0 is along the different airfoils defined in the yaml, dimension 1 is along the angles of attack, dimension 2 is along the Reynolds number, dimension 3 is along the number of tabs, which may describe multiple sets at the same station, for example in presence of a flap.", + "Name": "airfoils.cd" + }, + "cl": { + "Units": "-", + "Description": "4D array with the lift coefficients of the airfoils. Dimension 0 is along the different airfoils defined in the yaml, dimension 1 is along the angles of attack, dimension 2 is along the Reynolds number, dimension 3 is along the number of tabs, which may describe multiple sets at the same station, for example in presence of a flap.", + "Name": "airfoils.cl" + }, + "cm": { + "Units": "-", + "Description": "4D array with the moment coefficients of the airfoils. Dimension 0 is along the different airfoils defined in the yaml, dimension 1 is along the angles of attack, dimension 2 is along the Reynolds number, dimension 3 is along the number of tabs, which may describe multiple sets at the same station, for example in presence of a flap.mass coefficient", + "Name": "airfoils.cm" + }, + "coord_xy": { + "Units": "-", + "Description": "3D array of the x and y airfoil coordinates of the n_af airfoils.", + "Name": "airfoils.coord_xy" + }, + "name": { + "Units": "Unavailable", + "Description": "1D array of names of airfoils.", + "Name": "airfoils.name" + }, + "r_thick": { + "Units": "-", + "Description": "1D array of the relative thicknesses of each airfoil.", + "Name": "airfoils.r_thick" + } + }, + "assembly": { + "blade_length": { + "Units": "m", + "Description": "Scalar of the 3D blade length computed along its axis, scaled based on the user defined rotor diameter.", + "Name": "*.assembly.blade_length" + }, + "blade_ref_axis": { + "Units": "m", + "Description": "2D array of the coordinates (x,y,z) of the blade reference axis scaled based on rotor diameter, defined along blade span. The coordinate system is the one of BeamDyn: it is placed at blade root with x pointing the suction side of the blade, y pointing the trailing edge and z along the blade span. A standard configuration will have negative x values (prebend), if swept positive y values, and positive z values.", + "Name": "*.assembly.blade_ref_axis" + }, + "blade_ref_axis_user": { + "Units": "m", + "Description": "2D array of the coordinates (x,y,z) of the blade reference axis, defined along blade span. The coordinate system is the one of BeamDyn: it is placed at blade root with x pointing the suction side of the blade, y pointing the trailing edge and z along the blade span. A standard configuration will have negative x values (prebend), if swept positive y values, and positive z values.", + "Name": "*.assembly.blade_ref_axis_user" + }, + "distance_tt_hub": { + "Units": "m", + "Description": "Vertical distance from tower top to hub center.", + "Name": "*.assembly.distance_tt_hub" + }, + "hub_height": { + "Units": "m", + "Description": "Height of the hub in the global reference system, i.e. distance rotor center to ground.hub height of wind turbine above ground / sea level", + "Name": "*.assembly.hub_height" + }, + "hub_height_user": { + "Units": "m", + "Description": "Height of the hub specified by the user.", + "Name": "*.assembly.hub_height_user" + }, + "hub_radius": { + "Units": "m", + "Description": "Radius of the hub. It defines the distance of the blade root from the rotor center along the coned line.", + "Name": "*.assembly.hub_radius" + }, + "r_blade": { + "Units": "m", + "Description": "1D array of the dimensional spanwise grid defined along the rotor (hub radius to blade tip projected on the plane)", + "Name": "*.assembly.r_blade" + }, + "rotor_diameter": { + "Units": "m", + "Description": "Diameter of the rotor used in WISDEM. It is defined as two times the blade length plus the hub diameter.rotor diameter", + "Name": "*.assembly.rotor_diameter" + }, + "rotor_diameter_user": { + "Units": "m", + "Description": "Diameter of the rotor specified by the user. It is defined as two times the blade length plus the hub diameter.", + "Name": "*.assembly.rotor_diameter_user" + }, + "rotor_radius": { + "Units": "m", + "Description": "Scalar of the rotor radius, defined ignoring prebend and sweep curvatures, and cone and uptilt angles.", + "Name": "*.assembly.rotor_radius" + }, + "tower_ref_axis": { + "Units": "m", + "Description": "2D array of the coordinates (x,y,z) of the tower reference axis. The coordinate system is the global coordinate system of OpenFAST: it is placed at tower base with x pointing downwind, y pointing on the side and z pointing vertically upwards. A standard tower configuration will have zero x and y values and positive z values.", + "Name": "*.assembly.tower_ref_axis" + }, + "tower_ref_axis_user": { + "Units": "m", + "Description": "2D array of the coordinates (x,y,z) of the tower reference axis. The coordinate system is the global coordinate system of OpenFAST: it is placed at tower base with x pointing downwind, y pointing on the side and z pointing vertically upwards. A standard tower configuration will have zero x and y values and positive z values.", + "Name": "*.assembly.tower_ref_axis_user" + } + }, + "blade": { + "internal_structure_2d_fem": { + "chord": { + "Units": "m", + "Description": "1D array of the chord values defined along blade span.Chord length at each section.", + "Name": "blade.internal_structure_2d_fem.chord" + }, + "coord_xy_dim": { + "Units": "m", + "Description": "3D array of the dimensional x and y airfoil coordinates of the airfoils interpolated along span for n_span stations. The origin is placed at the pitch axis.", + "Name": "blade.internal_structure_2d_fem.coord_xy_dim" + }, + "definition_layer": { + "Units": "Unavailable", + "Description": "1D array of flags identifying how layers are specified in the yaml. 1) all around (skin, paint, ) 2) offset+rotation twist+width (spar caps) 3) offset+user defined rotation+width 4) midpoint TE+width (TE reinf) 5) midpoint LE+width (LE reinf) 6) layer position fixed to other layer (core fillers) 7) start and width 8) end and width 9) start and end nd 10) web layer", + "Name": "blade.internal_structure_2d_fem.definition_layer" + }, + "definition_web": { + "Units": "Unavailable", + "Description": "1D array of flags identifying how webs are specified in the yaml. 1) offset+rotation=twist 2) offset+rotation", + "Name": "blade.internal_structure_2d_fem.definition_web" + }, + "index_layer_end": { + "Units": "Unavailable", + "Description": "Index used to fix a layer to another", + "Name": "blade.internal_structure_2d_fem.index_layer_end" + }, + "index_layer_start": { + "Units": "Unavailable", + "Description": "Index used to fix a layer to another", + "Name": "blade.internal_structure_2d_fem.index_layer_start" + }, + "layer_end_nd": { + "Units": "-", + "Description": "2D array of the non-dimensional end point defined along the outer profile of a layer. The TE suction side is 0, the TE pressure side is 1. The first dimension represents each layer, the second dimension represents each entry along blade span.", + "Name": "blade.internal_structure_2d_fem.layer_end_nd" + }, + "layer_end_nd_yaml": { + "Units": "-", + "Description": "2D array of the non-dimensional end point defined along the outer profile of a layer. The TE suction side is 0, the TE pressure side is 1. The first dimension represents each layer, the second dimension represents each entry along blade span.", + "Name": "blade.internal_structure_2d_fem.layer_end_nd_yaml" + }, + "layer_midpoint_nd": { + "Units": "-", + "Description": "2D array of the non-dimensional midpoint defined along the outer profile of a layer. The first dimension represents each layer, the second dimension represents each entry along blade span.", + "Name": "blade.internal_structure_2d_fem.layer_midpoint_nd" + }, + "layer_offset_y_pa": { + "Units": "m", + "Description": "2D array of the offset along the y axis to set the position of a layer. Positive values move the layer towards the trailing edge, negative values towards the leading edge. The first dimension represents each layer, the second dimension represents each entry along blade span.", + "Name": "blade.internal_structure_2d_fem.layer_offset_y_pa" + }, + "layer_offset_y_pa_yaml": { + "Units": "m", + "Description": "2D array of the offset along the y axis to set the position of a layer. Positive values move the layer towards the trailing edge, negative values towards the leading edge. The first dimension represents each layer, the second dimension represents each entry along blade span.", + "Name": "blade.internal_structure_2d_fem.layer_offset_y_pa_yaml" + }, + "layer_rotation": { + "Units": "rad", + "Description": "2D array of the rotation angle of a layer in respect to the chord line. The first dimension represents each layer, the second dimension represents each entry along blade span. If the rotation is equal to negative twist +- a constant, then the layer is built straight.", + "Name": "blade.internal_structure_2d_fem.layer_rotation" + }, + "layer_rotation_yaml": { + "Units": "rad", + "Description": "2D array of the rotation angle of a layer in respect to the chord line. The first dimension represents each layer, the second dimension represents each entry along blade span. If the rotation is equal to negative twist +- a constant, then the layer is built straight.", + "Name": "blade.internal_structure_2d_fem.layer_rotation_yaml" + }, + "layer_side": { + "Units": "Unavailable", + "Description": "1D array setting whether the layer is on the suction or pressure side. This entry is only used if definition_layer is equal to 1 or 2.", + "Name": "blade.internal_structure_2d_fem.layer_side" + }, + "layer_start_nd": { + "Units": "-", + "Description": "2D array of the non-dimensional start point defined along the outer profile of a layer. The TE suction side is 0, the TE pressure side is 1. The first dimension represents each layer, the second dimension represents each entry along blade span.", + "Name": "blade.internal_structure_2d_fem.layer_start_nd" + }, + "layer_start_nd_yaml": { + "Units": "-", + "Description": "2D array of the non-dimensional start point defined along the outer profile of a layer. The TE suction side is 0, the TE pressure side is 1. The first dimension represents each layer, the second dimension represents each entry along blade span.", + "Name": "blade.internal_structure_2d_fem.layer_start_nd_yaml" + }, + "layer_thickness": { + "Units": "m", + "Description": "2D array of the thickness of the layers of the blade structure. The first dimension represents each layer, the second dimension represents each entry along blade span.2D array of the thickness of the layers of the column structure. The first\r\ndimension represents each layer, the second dimension represents each piecewise-\r\nconstant entry of the column sections.", + "Name": "blade.internal_structure_2d_fem.layer_thickness" + }, + "layer_web": { + "Units": "-", + "Description": "1D array of the web id the layer is associated to. If the layer is on the outer profile, this entry can simply stay equal to zero.", + "Name": "blade.internal_structure_2d_fem.layer_web" + }, + "layer_width": { + "Units": "m", + "Description": "2D array of the width along the outer profile of a layer. The first dimension represents each layer, the second dimension represents each entry along blade span.", + "Name": "blade.internal_structure_2d_fem.layer_width" + }, + "layer_width_yaml": { + "Units": "m", + "Description": "2D array of the width along the outer profile of a layer. The first dimension represents each layer, the second dimension represents each entry along blade span.", + "Name": "blade.internal_structure_2d_fem.layer_width_yaml" + }, + "pitch_axis": { + "Units": "-", + "Description": "1D array of the chordwise position of the pitch axis (0-LE, 1-TE), defined along blade span.", + "Name": "blade.internal_structure_2d_fem.pitch_axis" + }, + "s": { + "Units": "-", + "Description": "1D array of the non-dimensional spanwise grid defined along blade axis (0-blade root, 1-blade tip)1D array of the non-dimensional grid defined along the column axis (0-column base,\r\n1-column top)", + "Name": "blade.internal_structure_2d_fem.s" + }, + "twist": { + "Units": "rad", + "Description": "1D array of the twist values defined along blade span. The twist is defined positive for negative rotations around the z axis (the same as in BeamDyn).", + "Name": "blade.internal_structure_2d_fem.twist" + }, + "web_end_nd": { + "Units": "-", + "Description": "2D array of the non-dimensional end point defined along the outer profile of a web. The TE suction side is 0, the TE pressure side is 1. The first dimension represents each web, the second dimension represents each entry along blade span.", + "Name": "blade.internal_structure_2d_fem.web_end_nd" + }, + "web_end_nd_yaml": { + "Units": "-", + "Description": "2D array of the non-dimensional end point defined along the outer profile of a web. The TE suction side is 0, the TE pressure side is 1. The first dimension represents each web, the second dimension represents each entry along blade span.", + "Name": "blade.internal_structure_2d_fem.web_end_nd_yaml" + }, + "web_offset_y_pa": { + "Units": "m", + "Description": "2D array of the offset along the y axis to set the position of the shear webs. Positive values move the web towards the trailing edge, negative values towards the leading edge. The first dimension represents each shear web, the second dimension represents each entry along blade span.", + "Name": "blade.internal_structure_2d_fem.web_offset_y_pa" + }, + "web_offset_y_pa_yaml": { + "Units": "m", + "Description": "2D array of the offset along the y axis to set the position of the shear webs. Positive values move the web towards the trailing edge, negative values towards the leading edge. The first dimension represents each shear web, the second dimension represents each entry along blade span.", + "Name": "blade.internal_structure_2d_fem.web_offset_y_pa_yaml" + }, + "web_rotation": { + "Units": "rad", + "Description": "2D array of the rotation angle of the shear webs in respect to the chord line. The first dimension represents each shear web, the second dimension represents each entry along blade span. If the rotation is equal to negative twist +- a constant, then the web is built straight.", + "Name": "blade.internal_structure_2d_fem.web_rotation" + }, + "web_rotation_yaml": { + "Units": "rad", + "Description": "2D array of the rotation angle of the shear webs in respect to the chord line. The first dimension represents each shear web, the second dimension represents each entry along blade span. If the rotation is equal to negative twist +- a constant, then the web is built straight.", + "Name": "blade.internal_structure_2d_fem.web_rotation_yaml" + }, + "web_start_nd": { + "Units": "-", + "Description": "2D array of the non-dimensional start point defined along the outer profile of a web. The TE suction side is 0, the TE pressure side is 1. The first dimension represents each web, the second dimension represents each entry along blade span.", + "Name": "blade.internal_structure_2d_fem.web_start_nd" + }, + "web_start_nd_yaml": { + "Units": "-", + "Description": "2D array of the non-dimensional start point defined along the outer profile of a web. The TE suction side is 0, the TE pressure side is 1. The first dimension represents each web, the second dimension represents each entry along blade span.", + "Name": "blade.internal_structure_2d_fem.web_start_nd_yaml" + } + }, + "interp_airfoils": { + "ac": { + "Units": "-", + "Description": "1D array of the aerodynamic centers of each airfoil.", + "Name": "blade.interp_airfoils.ac" + }, + "ac_interp": { + "Units": "-", + "Description": "1D array of the aerodynamic center of the blade defined along span.", + "Name": "blade.interp_airfoils.ac_interp" + }, + "af_position": { + "Units": "-", + "Description": "1D array of the non dimensional positions of the airfoils af_used defined along blade span.", + "Name": "blade.interp_airfoils.af_position" + }, + "aoa": { + "Units": "rad", + "Description": "1D array of the angles of attack used to define the polars of the airfoils. All airfoils defined in openmdao share this grid.", + "Name": "blade.interp_airfoils.aoa" + }, + "cd": { + "Units": "-", + "Description": "4D array with the drag coefficients of the airfoils. Dimension 0 is along the different airfoils defined in the yaml, dimension 1 is along the angles of attack, dimension 2 is along the Reynolds number, dimension 3 is along the number of tabs, which may describe multiple sets at the same station, for example in presence of a flap.", + "Name": "blade.interp_airfoils.cd" + }, + "cd_interp": { + "Units": "-", + "Description": "4D array with the drag coefficients of the airfoils. Dimension 0 is along the blade span for n_span stations, dimension 1 is along the angles of attack, dimension 2 is along the Reynolds number, dimension 3 is along the number of tabs, which may describe multiple sets at the same station, for example in presence of a flap.", + "Name": "blade.interp_airfoils.cd_interp" + }, + "chord": { + "Units": "m", + "Description": "1D array of the chord values defined along blade span.Chord length at each section.", + "Name": "blade.interp_airfoils.chord" + }, + "cl": { + "Units": "-", + "Description": "4D array with the lift coefficients of the airfoils. Dimension 0 is along the different airfoils defined in the yaml, dimension 1 is along the angles of attack, dimension 2 is along the Reynolds number, dimension 3 is along the number of tabs, which may describe multiple sets at the same station, for example in presence of a flap.", + "Name": "blade.interp_airfoils.cl" + }, + "cl_interp": { + "Units": "-", + "Description": "4D array with the lift coefficients of the airfoils. Dimension 0 is along the blade span for n_span stations, dimension 1 is along the angles of attack, dimension 2 is along the Reynolds number, dimension 3 is along the number of tabs, which may describe multiple sets at the same station, for example in presence of a flap.", + "Name": "blade.interp_airfoils.cl_interp" + }, + "cm": { + "Units": "-", + "Description": "4D array with the moment coefficients of the airfoils. Dimension 0 is along the different airfoils defined in the yaml, dimension 1 is along the angles of attack, dimension 2 is along the Reynolds number, dimension 3 is along the number of tabs, which may describe multiple sets at the same station, for example in presence of a flap.mass coefficient", + "Name": "blade.interp_airfoils.cm" + }, + "cm_interp": { + "Units": "-", + "Description": "4D array with the moment coefficients of the airfoils. Dimension 0 is along the blade span for n_span stations, dimension 1 is along the angles of attack, dimension 2 is along the Reynolds number, dimension 3 is along the number of tabs, which may describe multiple sets at the same station, for example in presence of a flap.", + "Name": "blade.interp_airfoils.cm_interp" + }, + "coord_xy": { + "Units": "-", + "Description": "3D array of the x and y airfoil coordinates of the n_af airfoils.", + "Name": "blade.interp_airfoils.coord_xy" + }, + "coord_xy_dim": { + "Units": "m", + "Description": "3D array of the dimensional x and y airfoil coordinates of the airfoils interpolated along span for n_span stations. The origin is placed at the pitch axis.", + "Name": "blade.interp_airfoils.coord_xy_dim" + }, + "coord_xy_interp": { + "Units": "-", + "Description": "3D array of the non-dimensional x and y airfoil coordinates of the airfoils interpolated along span for n_span stations. The leading edge is place at x=0 and y=0.", + "Name": "blade.interp_airfoils.coord_xy_interp" + }, + "name": { + "Units": "Unavailable", + "Description": "1D array of names of airfoils.", + "Name": "blade.interp_airfoils.name" + }, + "pitch_axis": { + "Units": "-", + "Description": "1D array of the chordwise position of the pitch axis (0-LE, 1-TE), defined along blade span.", + "Name": "blade.interp_airfoils.pitch_axis" + }, + "r_thick": { + "Units": "-", + "Description": "1D array of the relative thicknesses of each airfoil.", + "Name": "blade.interp_airfoils.r_thick" + }, + "r_thick_interp": { + "Units": "-", + "Description": "1D array of the relative thicknesses of the blade defined along span.", + "Name": "blade.interp_airfoils.r_thick_interp" + }, + "s": { + "Units": "-", + "Description": "1D array of the non-dimensional spanwise grid defined along blade axis (0-blade root, 1-blade tip)1D array of the non-dimensional grid defined along the column axis (0-column base,\r\n1-column top)", + "Name": "blade.interp_airfoils.s" + } + }, + "opt_var": { + "af_position": { + "Units": "-", + "Description": "None", + "Name": "blade.opt_var.af_position" + }, + "chord_opt_gain": { + "Units": "-", + "Description": "None", + "Name": "blade.opt_var.chord_opt_gain" + }, + "s_opt_chord": { + "Units": "-", + "Description": "None", + "Name": "blade.opt_var.s_opt_chord" + }, + "s_opt_twist": { + "Units": "-", + "Description": "None", + "Name": "blade.opt_var.s_opt_twist" + }, + "spar_cap_ps_opt_gain": { + "Units": "-", + "Description": "None", + "Name": "blade.opt_var.spar_cap_ps_opt_gain" + }, + "spar_cap_ss_opt_gain": { + "Units": "-", + "Description": "None", + "Name": "blade.opt_var.spar_cap_ss_opt_gain" + }, + "twist_opt_gain": { + "Units": "-", + "Description": "None", + "Name": "blade.opt_var.twist_opt_gain" + } + }, + "outer_shape_bem": { + "af_position": { + "Units": "-", + "Description": "1D array of the non dimensional positions of the airfoils af_used defined along blade span.", + "Name": "blade.outer_shape_bem.af_position" + }, + "chord": { + "Units": "m", + "Description": "1D array of the chord values defined along blade span.Chord length at each section.", + "Name": "blade.outer_shape_bem.chord" + }, + "chord_yaml": { + "Units": "m", + "Description": "1D array of the chord values defined along blade span.", + "Name": "blade.outer_shape_bem.chord_yaml" + }, + "pitch_axis": { + "Units": "-", + "Description": "1D array of the chordwise position of the pitch axis (0-LE, 1-TE), defined along blade span.", + "Name": "blade.outer_shape_bem.pitch_axis" + }, + "pitch_axis_yaml": { + "Units": "-", + "Description": "1D array of the chordwise position of the pitch axis (0-LE, 1-TE), defined along blade span.", + "Name": "blade.outer_shape_bem.pitch_axis_yaml" + }, + "ref_axis": { + "Units": "m", + "Description": "2D array of the coordinates (x,y,z) of the blade reference axis, defined along blade span. The coordinate system is the one of BeamDyn: it is placed at blade root with x pointing the suction side of the blade, y pointing the trailing edge and z along the blade span. A standard configuration will have negative x values (prebend), if swept positive y values, and positive z values.", + "Name": "blade.outer_shape_bem.ref_axis" + }, + "ref_axis_yaml": { + "Units": "m", + "Description": "2D array of the coordinates (x,y,z) of the blade reference axis, defined along blade span. The coordinate system is the one of BeamDyn: it is placed at blade root with x pointing the suction side of the blade, y pointing the trailing edge and z along the blade span. A standard configuration will have negative x values (prebend), if swept positive y values, and positive z values.", + "Name": "blade.outer_shape_bem.ref_axis_yaml" + }, + "s": { + "Units": "-", + "Description": "1D array of the non-dimensional spanwise grid defined along blade axis (0-blade root, 1-blade tip)1D array of the non-dimensional grid defined along the column axis (0-column base,\r\n1-column top)", + "Name": "blade.outer_shape_bem.s" + }, + "s_default": { + "Units": "-", + "Description": "1D array of the non-dimensional spanwise grid defined along blade axis (0-blade root, 1-blade tip)", + "Name": "blade.outer_shape_bem.s_default" + }, + "span_end": { + "Units": "-", + "Description": "1D array of the positions along blade span where something (a DAC device?) starts and we want a grid point. Only values between 0 and 1 are meaningful.", + "Name": "blade.outer_shape_bem.span_end" + }, + "span_ext": { + "Units": "-", + "Description": "1D array of the extensions along blade span where something (a DAC device?) lives and we want a grid point. Only values between 0 and 1 are meaningful.", + "Name": "blade.outer_shape_bem.span_ext" + }, + "twist": { + "Units": "rad", + "Description": "1D array of the twist values defined along blade span. The twist is defined positive for negative rotations around the z axis (the same as in BeamDyn).", + "Name": "blade.outer_shape_bem.twist" + }, + "twist_yaml": { + "Units": "rad", + "Description": "1D array of the twist values defined along blade span. The twist is defined positive for negative rotations around the z axis (the same as in BeamDyn).", + "Name": "blade.outer_shape_bem.twist_yaml" + } + }, + "pa": { + "chord_opt_gain": { + "Units": "-", + "Description": "1D array of the non-dimensional gains to optimize the blade spanwise distribution of the chord", + "Name": "blade.pa.chord_opt_gain" + }, + "chord_original": { + "Units": "m", + "Description": "1D array of the chord values defined along blade span. The chord is the one defined in the yaml.", + "Name": "blade.pa.chord_original" + }, + "chord_param": { + "Units": "m", + "Description": "1D array of the chord values defined along blade span. The chord is the result of the parameterization.", + "Name": "blade.pa.chord_param" + }, + "max_chord_constr": { + "Units": "-", + "Description": "1D array of the ratio between chord values and maximum chord along blade span.", + "Name": "blade.pa.max_chord_constr" + }, + "s": { + "Units": "-", + "Description": "1D array of the non-dimensional spanwise grid defined along blade axis (0-blade root, 1-blade tip)1D array of the non-dimensional grid defined along the column axis (0-column base,\r\n1-column top)", + "Name": "blade.pa.s" + }, + "s_opt_chord": { + "Units": "-", + "Description": "1D array of the non-dimensional spanwise grid defined along blade axis to optimize the blade chord", + "Name": "blade.pa.s_opt_chord" + }, + "s_opt_twist": { + "Units": "-", + "Description": "1D array of the non-dimensional spanwise grid defined along blade axis to optimize the blade twist angle", + "Name": "blade.pa.s_opt_twist" + }, + "twist_opt_gain": { + "Units": "-", + "Description": "1D array of the non-dimensional gains to optimize the blade spanwise distribution of the twist angle", + "Name": "blade.pa.twist_opt_gain" + }, + "twist_original": { + "Units": "rad", + "Description": "1D array of the twist values defined along blade span. The twist is the one defined in the yaml.", + "Name": "blade.pa.twist_original" + }, + "twist_param": { + "Units": "rad", + "Description": "1D array of the twist values defined along blade span. The twist is the result of the parameterization.", + "Name": "blade.pa.twist_param" + } + }, + "ps": { + "layer_thickness_original": { + "Units": "m", + "Description": "2D array of the thickness of the layers of the blade structure. The first dimension represents each layer, the second dimension represents each entry along blade span.", + "Name": "blade.ps.layer_thickness_original" + }, + "layer_thickness_param": { + "Units": "m", + "Description": "2D array of the thickness of the layers of the blade structure after the parametrization. The first dimension represents each layer, the second dimension represents each entry along blade span.", + "Name": "blade.ps.layer_thickness_param" + }, + "s": { + "Units": "-", + "Description": "1D array of the non-dimensional spanwise grid defined along blade axis (0-blade root, 1-blade tip)1D array of the non-dimensional grid defined along the column axis (0-column base,\r\n1-column top)", + "Name": "blade.ps.s" + }, + "s_opt_spar_cap_ps": { + "Units": "-", + "Description": "1D array of the non-dimensional spanwise grid defined along blade axis to optimize the blade spar cap pressure side", + "Name": "blade.ps.s_opt_spar_cap_ps" + }, + "s_opt_spar_cap_ss": { + "Units": "-", + "Description": "1D array of the non-dimensional spanwise grid defined along blade axis to optimize the blade spar cap suction side", + "Name": "blade.ps.s_opt_spar_cap_ss" + }, + "spar_cap_ps_opt_gain": { + "Units": "-", + "Description": "1D array of the non-dimensional gains to optimize the blade spanwise distribution of the spar caps pressure side", + "Name": "blade.ps.spar_cap_ps_opt_gain" + }, + "spar_cap_ss_opt_gain": { + "Units": "-", + "Description": "1D array of the non-dimensional gains to optimize the blade spanwise distribution of the spar caps suction side", + "Name": "blade.ps.spar_cap_ss_opt_gain" + } + } + }, + "bos": { + "boem_review_cost": { + "Units": "USD", + "Description": "None", + "Name": "bos.boem_review_cost" + }, + "commissioning_pct": { + "Units": "-", + "Description": "None", + "Name": "bos.commissioning_pct" + }, + "construction_operations_plan_cost": { + "Units": "USD", + "Description": "None", + "Name": "bos.construction_operations_plan_cost" + }, + "decommissioning_pct": { + "Units": "-", + "Description": "None", + "Name": "bos.decommissioning_pct" + }, + "design_install_plan_cost": { + "Units": "USD", + "Description": "None", + "Name": "bos.design_install_plan_cost" + }, + "distance_to_interconnection": { + "Units": "km", + "Description": "None", + "Name": "bos.distance_to_interconnection" + }, + "distance_to_landfall": { + "Units": "km", + "Description": "None", + "Name": "bos.distance_to_landfall" + }, + "distance_to_substation": { + "Units": "km", + "Description": "None", + "Name": "bos.distance_to_substation" + }, + "interconnect_voltage": { + "Units": "kV", + "Description": "None", + "Name": "bos.interconnect_voltage" + }, + "plant_row_spacing": { + "Units": "-", + "Description": "Distance between turbine rows in rotor diameters", + "Name": "bos.plant_row_spacing" + }, + "plant_turbine_spacing": { + "Units": "-", + "Description": "Distance between turbines in rotor diameters", + "Name": "bos.plant_turbine_spacing" + }, + "port_cost_per_month": { + "Units": "USD/mo", + "Description": "None", + "Name": "bos.port_cost_per_month" + }, + "site_assessment_cost": { + "Units": "USD", + "Description": "None", + "Name": "bos.site_assessment_cost" + }, + "site_assessment_plan_cost": { + "Units": "USD", + "Description": "None", + "Name": "bos.site_assessment_plan_cost" + }, + "site_auction_price": { + "Units": "USD", + "Description": "None", + "Name": "bos.site_auction_price" + }, + "site_distance": { + "Units": "km", + "Description": "None", + "Name": "bos.site_distance" + } + }, + "ccblade": { + "CM": { + "Units": "-", + "Description": "Blade flapwise moment coefficient", + "Name": "rotorse.ccblade.CM" + }, + "CP": { + "Units": "-", + "Description": "Rotor power coefficient", + "Name": "rotorse.ccblade.CP" + }, + "D_n_opt": { + "Units": "N/m", + "Description": "Distributed drag force", + "Name": "rotorse.ccblade.D_n_opt" + }, + "DragF": { + "Units": "N/m", + "Description": "Distributed drag force", + "Name": "rotorse.ccblade.DragF" + }, + "L_n_opt": { + "Units": "N/m", + "Description": "Distributed lift force", + "Name": "rotorse.ccblade.L_n_opt" + }, + "LiftF": { + "Units": "N/m", + "Description": "Distributed lift force", + "Name": "rotorse.ccblade.LiftF" + }, + "Px_af": { + "Units": "N/m", + "Description": "Distributed loads in airfoil x-direction", + "Name": "rotorse.ccblade.Px_af" + }, + "Px_b": { + "Units": "N/m", + "Description": "Distributed loads in blade-aligned x-direction", + "Name": "rotorse.ccblade.Px_b" + }, + "Py_af": { + "Units": "N/m", + "Description": "Distributed loads in airfoil y-direction", + "Name": "rotorse.ccblade.Py_af" + }, + "Py_b": { + "Units": "N/m", + "Description": "Distributed loads in blade-aligned y-direction", + "Name": "rotorse.ccblade.Py_b" + }, + "Pz_af": { + "Units": "N/m", + "Description": "Distributed loads in airfoil z-direction", + "Name": "rotorse.ccblade.Pz_af" + }, + "Pz_b": { + "Units": "N/m", + "Description": "Distributed loads in blade-aligned z-direction", + "Name": "rotorse.ccblade.Pz_b" + }, + "Rhub": { + "Units": "m", + "Description": "hub radiusHub radius.", + "Name": "rotorse.ccblade.Rhub" + }, + "Rtip": { + "Units": "m", + "Description": "tip radiusBlade tip location in z_b", + "Name": "rotorse.ccblade.Rtip" + }, + "Uhub": { + "Units": "m/s", + "Description": "Undisturbed wind speed", + "Name": "rotorse.ccblade.Uhub" + }, + "a": { + "Units": "-", + "Description": "Axial induction along blade span", + "Name": "rotorse.ccblade.a" + }, + "airfoils_Re": { + "Units": "-", + "Description": "Reynolds numbers of polarsReynolds numbers of polars.", + "Name": "rotorse.ccblade.airfoils_Re" + }, + "airfoils_aoa": { + "Units": "deg", + "Description": "angle of attack grid for polarsAngle of attack grid for polars.", + "Name": "rotorse.ccblade.airfoils_aoa" + }, + "airfoils_cd": { + "Units": "-", + "Description": "drag coefficients, spanwiseDrag coefficients, spanwise.", + "Name": "rotorse.ccblade.airfoils_cd" + }, + "airfoils_cl": { + "Units": "-", + "Description": "lift coefficients, spanwiseLift coefficients, spanwise.", + "Name": "rotorse.ccblade.airfoils_cl" + }, + "airfoils_cm": { + "Units": "-", + "Description": "moment coefficients, spanwiseMoment coefficients, spanwise.", + "Name": "rotorse.ccblade.airfoils_cm" + }, + "alpha": { + "Units": "deg", + "Description": "Angles of attack along blade span", + "Name": "rotorse.ccblade.alpha" + }, + "ap": { + "Units": "-", + "Description": "Tangential induction along blade span", + "Name": "rotorse.ccblade.ap" + }, + "cd": { + "Units": "-", + "Description": "Drag coefficients along blade span", + "Name": "rotorse.ccblade.cd" + }, + "cd_n_opt": { + "Units": "-", + "Description": "Drag coefficients along blade span", + "Name": "rotorse.ccblade.cd_n_opt" + }, + "chord": { + "Units": "m", + "Description": "chord length at each sectionChord length at each section.", + "Name": "rotorse.ccblade.chord" + }, + "cl": { + "Units": "-", + "Description": "Lift coefficients along blade span", + "Name": "rotorse.ccblade.cl" + }, + "cl_n_opt": { + "Units": "-", + "Description": "Lift coefficients along blade span", + "Name": "rotorse.ccblade.cl_n_opt" + }, + "hub_height": { + "Units": "m", + "Description": "hub heighthub height of wind turbine above ground / sea level", + "Name": "rotorse.ccblade.hub_height" + }, + "hubloss": { + "Units": "Unavailable", + "Description": "include Prandtl hub loss modelInclude Prandtl hub loss model.", + "Name": "rotorse.ccblade.hubloss" + }, + "mu": { + "Units": "kg/(m*s)", + "Description": "dynamic viscosity of airDynamic viscosity of air", + "Name": "rotorse.ccblade.mu" + }, + "nBlades": { + "Units": "Unavailable", + "Description": "number of bladesNumber of blades", + "Name": "rotorse.ccblade.nBlades" + }, + "nSector": { + "Units": "Unavailable", + "Description": "number of sectors to divide rotor face into in computing thrust and powerNumber of sectors to divide rotor face into in computing thrust and power.", + "Name": "rotorse.ccblade.nSector" + }, + "pitch": { + "Units": "deg", + "Description": "Pitch angle", + "Name": "rotorse.ccblade.pitch" + }, + "precone": { + "Units": "deg", + "Description": "precone angleRotor precone angle", + "Name": "rotorse.ccblade.precone" + }, + "precurve": { + "Units": "m", + "Description": "precurve at each sectionPrecurve at each section.", + "Name": "rotorse.ccblade.precurve" + }, + "precurveTip": { + "Units": "m", + "Description": "precurve at tipPrecurve at tip.", + "Name": "rotorse.ccblade.precurveTip" + }, + "presweep": { + "Units": "m", + "Description": "presweep at each section", + "Name": "rotorse.ccblade.presweep" + }, + "presweepTip": { + "Units": "m", + "Description": "presweep at tip", + "Name": "rotorse.ccblade.presweepTip" + }, + "r": { + "Units": "m", + "Description": "radial locations where blade is defined (should be increasing and not go all the way to hub or tip)Radial locations where blade is defined. Should be increasing and not\r\ngo all the way to hub or tip.", + "Name": "rotorse.ccblade.r" + }, + "rho": { + "Units": "kg/m**3", + "Description": "density of airDensity of the materials along the column sections.", + "Name": "rotorse.ccblade.rho" + }, + "rthick": { + "Units": "-", + "Description": "1D array of the relative thicknesses of the blade defined along span.", + "Name": "rotorse.ccblade.rthick" + }, + "s_opt_chord": { + "Units": "-", + "Description": "1D array of the non-dimensional spanwise grid defined along blade axis to optimize the blade chord", + "Name": "rotorse.ccblade.s_opt_chord" + }, + "s_opt_twist": { + "Units": "-", + "Description": "1D array of the non-dimensional spanwise grid defined along blade axis to optimize the blade twist", + "Name": "rotorse.ccblade.s_opt_twist" + }, + "shearExp": { + "Units": "-", + "Description": "shear exponentshear exponent", + "Name": "rotorse.ccblade.shearExp" + }, + "theta": { + "Units": "rad", + "Description": "Twist angle at each section (positive decreases angle of attack)Twist angle at each section (positive decreases angle of attack).", + "Name": "rotorse.ccblade.theta" + }, + "tilt": { + "Units": "deg", + "Description": "shaft tiltNacelle uptilt angle", + "Name": "rotorse.ccblade.tilt" + }, + "tiploss": { + "Units": "Unavailable", + "Description": "include Prandtl tip loss modelInclude Prandtl tip loss model.", + "Name": "rotorse.ccblade.tiploss" + }, + "tsr": { + "Units": "-", + "Description": "Tip speed ratio", + "Name": "rotorse.ccblade.tsr" + }, + "twist": { + "Units": "rad", + "Description": "twist angle at each section (positive decreases angle of attack)", + "Name": "rotorse.ccblade.twist" + }, + "usecd": { + "Units": "Unavailable", + "Description": "use drag coefficient in computing induction factorsUse drag coefficient in computing induction factors.", + "Name": "rotorse.ccblade.usecd" + }, + "wakerotation": { + "Units": "Unavailable", + "Description": "include effect of wake rotation (i.e., tangential induction factor is nonzero)Iclude effect of wake rotation (i.e., tangential induction factor is nonzero).", + "Name": "rotorse.ccblade.wakerotation" + }, + "yaw": { + "Units": "deg", + "Description": "yaw erroryaw angle", + "Name": "rotorse.ccblade.yaw" + } + }, + "configuration": { + "gearbox_type": { + "Units": "Unavailable", + "Description": "Gearbox configuration (geared, direct-drive, etc.).", + "Name": "configuration.gearbox_type" + }, + "hub_height_user": { + "Units": "m", + "Description": "Height of the hub center over the ground (land-based) or the mean sea level (offshore) specified by the user.", + "Name": "configuration.hub_height_user" + }, + "n_blades": { + "Units": "Unavailable", + "Description": "Number of blades of the rotor.Number of rotor blades", + "Name": "configuration.n_blades" + }, + "rated_power": { + "Units": "W", + "Description": "Electrical rated power of the generator.", + "Name": "configuration.rated_power" + }, + "rotor_diameter_user": { + "Units": "m", + "Description": "Diameter of the rotor specified by the user. It is defined as two times the blade length plus the hub diameter.", + "Name": "configuration.rotor_diameter_user" + }, + "rotor_orientation": { + "Units": "Unavailable", + "Description": "Rotor orientation, either upwind or downwind.Rotor orientation, either upwind or downwind.", + "Name": "configuration.rotor_orientation" + }, + "turb_class": { + "Units": "Unavailable", + "Description": "IEC wind turbine category. A - high turbulence intensity (land-based), B - mid turbulence, C - low turbulence (offshore).", + "Name": "configuration.turb_class" + }, + "upwind": { + "Units": "Unavailable", + "Description": "Convenient boolean for upwind (True) or downwind (False).Flag whether the design is upwind or downwind", + "Name": "configuration.upwind" + }, + "ws_class": { + "Units": "Unavailable", + "Description": "IEC wind turbine class. I - offshore, II coastal, III - land-based, IV - low wind speed site.", + "Name": "configuration.ws_class" + } + }, + "control": { + "V_in": { + "Units": "m/s", + "Description": "Cut in wind speed. This is the wind speed where region II begins.", + "Name": "control.V_in" + }, + "V_out": { + "Units": "m/s", + "Description": "Cut out wind speed. This is the wind speed where region III ends.", + "Name": "control.V_out" + }, + "maxOmega": { + "Units": "rad/s", + "Description": "Maximum allowed rotor speed.", + "Name": "control.maxOmega" + }, + "max_TS": { + "Units": "m/s", + "Description": "Maximum allowed blade tip speed.", + "Name": "control.max_TS" + }, + "max_pitch_rate": { + "Units": "rad/s", + "Description": "Maximum allowed blade pitch rate", + "Name": "control.max_pitch_rate" + }, + "max_torque_rate": { + "Units": "N*m/s", + "Description": "Maximum allowed generator torque rate", + "Name": "control.max_torque_rate" + }, + "minOmega": { + "Units": "rad/s", + "Description": "Minimum allowed rotor speed.", + "Name": "control.minOmega" + }, + "rated_TSR": { + "Units": "-", + "Description": "Constant tip speed ratio in region II.", + "Name": "control.rated_TSR" + }, + "rated_pitch": { + "Units": "rad", + "Description": "Constant pitch angle in region II.", + "Name": "control.rated_pitch" + } + }, + "costs": { + "bearing_mass_cost_coeff": { + "Units": "USD/kg", + "Description": "main bearing mass-cost coeff", + "Name": "costs.bearing_mass_cost_coeff" + }, + "bedplate_mass_cost_coeff": { + "Units": "USD/kg", + "Description": "bedplate mass-cost coeff", + "Name": "costs.bedplate_mass_cost_coeff" + }, + "blade_mass_cost_coeff": { + "Units": "USD/kg", + "Description": "blade mass-cost coeff", + "Name": "costs.blade_mass_cost_coeff" + }, + "bos_per_kW": { + "Units": "USD/kW", + "Description": "Balance of station/plant capital costBalance of system costs of the turbine", + "Name": "costs.bos_per_kW" + }, + "controls_machine_rating_cost_coeff": { + "Units": "USD/kW", + "Description": "controls cost coefficient per kW", + "Name": "costs.controls_machine_rating_cost_coeff" + }, + "converter_mass_cost_coeff": { + "Units": "USD/kg", + "Description": "variable speed electronics mass cost coeff", + "Name": "costs.converter_mass_cost_coeff" + }, + "cover_mass_cost_coeff": { + "Units": "USD/kg", + "Description": "nacelle cover mass cost coeff", + "Name": "costs.cover_mass_cost_coeff" + }, + "crane_cost": { + "Units": "USD", + "Description": "crane cost if present", + "Name": "costs.crane_cost" + }, + "elec_connec_machine_rating_cost_coeff": { + "Units": "USD/kW", + "Description": "electrical connections cost coefficient per kW", + "Name": "costs.elec_connec_machine_rating_cost_coeff" + }, + "fixed_charge_rate": { + "Units": "-", + "Description": "Fixed charge rate for coe calculationFixed charge rate for coe calculation", + "Name": "costs.fixed_charge_rate" + }, + "gearbox_mass_cost_coeff": { + "Units": "USD/kg", + "Description": "gearbox mass-cost coeff", + "Name": "costs.gearbox_mass_cost_coeff" + }, + "generator_mass_cost_coeff": { + "Units": "USD/kg", + "Description": "generator mass cost coeff", + "Name": "costs.generator_mass_cost_coeff" + }, + "hss_mass_cost_coeff": { + "Units": "USD/kg", + "Description": "high speed shaft mass-cost coeff", + "Name": "costs.hss_mass_cost_coeff" + }, + "hub_mass_cost_coeff": { + "Units": "USD/kg", + "Description": "hub mass-cost coeff", + "Name": "costs.hub_mass_cost_coeff" + }, + "hvac_mass_cost_coeff": { + "Units": "USD/kg", + "Description": "hydraulic and cooling system mass cost coeff", + "Name": "costs.hvac_mass_cost_coeff" + }, + "labor_rate": { + "Units": "USD/h", + "Description": "None", + "Name": "costs.labor_rate" + }, + "lss_mass_cost_coeff": { + "Units": "USD/kg", + "Description": "low speed shaft mass-cost coeff", + "Name": "costs.lss_mass_cost_coeff" + }, + "offset_tcc_per_kW": { + "Units": "USD/kW", + "Description": "Offset to turbine capital costOffset to turbine capital cost", + "Name": "costs.offset_tcc_per_kW" + }, + "opex_per_kW": { + "Units": "USD/kW/yr", + "Description": "Average annual operational expenditures of the turbineAverage annual operational expenditures of the turbine", + "Name": "costs.opex_per_kW" + }, + "painting_rate": { + "Units": "USD/m**2", + "Description": "None", + "Name": "costs.painting_rate" + }, + "pitch_system_mass_cost_coeff": { + "Units": "USD/kg", + "Description": "pitch system mass-cost coeff", + "Name": "costs.pitch_system_mass_cost_coeff" + }, + "platforms_mass_cost_coeff": { + "Units": "USD/kg", + "Description": "nacelle platforms mass cost coeff", + "Name": "costs.platforms_mass_cost_coeff" + }, + "spinner_mass_cost_coeff": { + "Units": "USD/kg", + "Description": "spinner/nose cone mass-cost coeff", + "Name": "costs.spinner_mass_cost_coeff" + }, + "tower_mass_cost_coeff": { + "Units": "USD/kg", + "Description": "tower mass-cost coeff", + "Name": "costs.tower_mass_cost_coeff" + }, + "transformer_mass_cost_coeff": { + "Units": "USD/kg", + "Description": "transformer mass cost coeff", + "Name": "costs.transformer_mass_cost_coeff" + }, + "turbine_number": { + "Units": "Unavailable", + "Description": "Number of turbines at plantNumber of turbines at plant", + "Name": "costs.turbine_number" + }, + "wake_loss_factor": { + "Units": "-", + "Description": "The losses in AEP due to waked conditionsThe losses in AEP due to waked conditions", + "Name": "costs.wake_loss_factor" + }, + "yaw_mass_cost_coeff": { + "Units": "USD/kg", + "Description": "yaw system mass cost coeff", + "Name": "costs.yaw_mass_cost_coeff" + } + }, + "drivese": { + "D_bearing1": { + "Units": "m", + "Description": "None", + "Name": "drivese.D_bearing1" + }, + "D_bearing2": { + "Units": "m", + "Description": "None", + "Name": "drivese.D_bearing2" + }, + "D_bedplate": { + "Units": "m", + "Description": "Bedplate diameters", + "Name": "drivese.D_bedplate" + }, + "D_gearbox": { + "Units": "m", + "Description": "None", + "Name": "drivese.D_gearbox" + }, + "D_top": { + "Units": "m", + "Description": "Tower top outer diameter", + "Name": "drivese.D_top" + }, + "E_mat": { + "Units": "Pa", + "Description": "2D array of the Youngs moduli of the materials. Each row represents a material,\r\nthe three columns represent E11, E22 and E33.", + "Name": "drivese.E_mat" + }, + "F_generator": { + "Units": "N", + "Description": "None", + "Name": "drivese.F_generator" + }, + "F_hub": { + "Units": "N", + "Description": "Force vector applied to the hub (WITH WEIGHT???)", + "Name": "drivese.F_hub" + }, + "F_mb1": { + "Units": "N", + "Description": "Force vector applied to bearing 1 in hub c.s.", + "Name": "drivese.F_mb1" + }, + "F_mb2": { + "Units": "N", + "Description": "Force vector applied to bearing 2 in hub c.s.", + "Name": "drivese.F_mb2" + }, + "F_torq": { + "Units": "N", + "Description": "None", + "Name": "drivese.F_torq" + }, + "G_mat": { + "Units": "Pa", + "Description": "2D array of the shear moduli of the materials. Each row represents a material,\r\nthe three columns represent G12, G13 and G23.", + "Name": "drivese.G_mat" + }, + "H_bedplate": { + "Units": "m", + "Description": "height of bedplate", + "Name": "drivese.H_bedplate" + }, + "L_12": { + "Units": "m", + "Description": "Length from bearing #1 to bearing #2", + "Name": "drivese.L_12" + }, + "L_bedplate": { + "Units": "m", + "Description": "None", + "Name": "drivese.L_bedplate" + }, + "L_drive": { + "Units": "m", + "Description": "Length of drivetrain from bedplate to hub flang", + "Name": "drivese.L_drive" + }, + "L_gearbox": { + "Units": "m", + "Description": "None", + "Name": "drivese.L_gearbox" + }, + "L_generator": { + "Units": "m", + "Description": "Generator stack width", + "Name": "drivese.L_generator" + }, + "L_h1": { + "Units": "m", + "Description": "Length from hub / start of lss to bearing #1", + "Name": "drivese.L_h1" + }, + "L_hss": { + "Units": "m", + "Description": "None", + "Name": "drivese.L_hss" + }, + "L_lss": { + "Units": "m", + "Description": "None", + "Name": "drivese.L_lss" + }, + "L_nose": { + "Units": "m", + "Description": "None", + "Name": "drivese.L_nose" + }, + "M_generator": { + "Units": "N*m", + "Description": "None", + "Name": "drivese.M_generator" + }, + "M_hub": { + "Units": "N*m", + "Description": "Moment vector applied to the hub", + "Name": "drivese.M_hub" + }, + "M_mb1": { + "Units": "N*m", + "Description": "Moment vector applied to bearing 1 in hub c.s.", + "Name": "drivese.M_mb1" + }, + "M_mb2": { + "Units": "N*m", + "Description": "Moment vector applied to bearing 2 in hub c.s.", + "Name": "drivese.M_mb2" + }, + "M_torq": { + "Units": "N*m", + "Description": "None", + "Name": "drivese.M_torq" + }, + "R_generator": { + "Units": "m", + "Description": "Generatour outer diameter", + "Name": "drivese.R_generator" + }, + "Xt_mat": { + "Units": "Pa", + "Description": "None", + "Name": "drivese.Xt_mat" + }, + "above_yaw_I": { + "Units": "kg*m**2", + "Description": "None", + "Name": "drivese.above_yaw_I" + }, + "above_yaw_cm": { + "Units": "m", + "Description": "None", + "Name": "drivese.above_yaw_cm" + }, + "above_yaw_mass": { + "Units": "kg", + "Description": "None", + "Name": "drivese.above_yaw_mass" + }, + "access_diameter": { + "Units": "m", + "Description": "Minimum diameter required for maintenance access", + "Name": "drivese.access_diameter" + }, + "base_F": { + "Units": "N", + "Description": "None", + "Name": "drivese.base_F" + }, + "base_M": { + "Units": "N*m", + "Description": "None", + "Name": "drivese.base_M" + }, + "bear1": { + "D_bearing": { + "Units": "m", + "Description": "bearing diameter/facewidth", + "Name": "drivese.bear1.D_bearing" + }, + "D_shaft": { + "Units": "m", + "Description": "Shaft diameter", + "Name": "drivese.bear1.D_shaft" + }, + "bearing_type": { + "Units": "Unavailable", + "Description": "bearing mass type", + "Name": "drivese.bear1.bearing_type" + }, + "mb_I": { + "Units": "kg*m**2", + "Description": "None", + "Name": "drivese.bear1.mb_I" + }, + "mb_mass": { + "Units": "kg", + "Description": "None", + "Name": "drivese.bear1.mb_mass" + }, + "mb_max_defl_ang": { + "Units": "rad", + "Description": "None", + "Name": "drivese.bear1.mb_max_defl_ang" + } + }, + "bear2": { + "D_bearing": { + "Units": "m", + "Description": "bearing diameter/facewidth", + "Name": "drivese.bear2.D_bearing" + }, + "D_shaft": { + "Units": "m", + "Description": "Shaft diameter", + "Name": "drivese.bear2.D_shaft" + }, + "bearing_type": { + "Units": "Unavailable", + "Description": "bearing mass type", + "Name": "drivese.bear2.bearing_type" + }, + "mb_I": { + "Units": "kg*m**2", + "Description": "None", + "Name": "drivese.bear2.mb_I" + }, + "mb_mass": { + "Units": "kg", + "Description": "None", + "Name": "drivese.bear2.mb_mass" + }, + "mb_max_defl_ang": { + "Units": "rad", + "Description": "None", + "Name": "drivese.bear2.mb_max_defl_ang" + } + }, + "bedplate_E": { + "Units": "Pa", + "Description": "modulus of elasticity", + "Name": "drivese.bedplate_E" + }, + "bedplate_G": { + "Units": "Pa", + "Description": "shear modulus", + "Name": "drivese.bedplate_G" + }, + "bedplate_I": { + "Units": "kg*m**2", + "Description": "component I", + "Name": "drivese.bedplate_I" + }, + "bedplate_Xy": { + "Units": "Pa", + "Description": "yield stress", + "Name": "drivese.bedplate_Xy" + }, + "bedplate_axial_stress": { + "Units": "Pa", + "Description": "None", + "Name": "drivese.bedplate_axial_stress" + }, + "bedplate_bending_stress": { + "Units": "Pa", + "Description": "None", + "Name": "drivese.bedplate_bending_stress" + }, + "bedplate_cm": { + "Units": "m", + "Description": "component CM", + "Name": "drivese.bedplate_cm" + }, + "bedplate_deflection": { + "Units": "m", + "Description": "None", + "Name": "drivese.bedplate_deflection" + }, + "bedplate_flange_thickness": { + "Units": "m", + "Description": "Bedplate is two parallel I beams, this is the flange thickness", + "Name": "drivese.bedplate_flange_thickness" + }, + "bedplate_flange_width": { + "Units": "m", + "Description": "Bedplate is two parallel I beams, this is the flange width", + "Name": "drivese.bedplate_flange_width" + }, + "bedplate_mass": { + "Units": "kg", + "Description": "component mass", + "Name": "drivese.bedplate_mass" + }, + "bedplate_mat_cost": { + "Units": "USD/kg", + "Description": "None", + "Name": "drivese.bedplate_mat_cost" + }, + "bedplate_material": { + "Units": "Unavailable", + "Description": "None", + "Name": "drivese.bedplate_material" + }, + "bedplate_nose_axial_stress": { + "Units": "Pa", + "Description": "None", + "Name": "drivese.bedplate_nose_axial_stress" + }, + "bedplate_nose_bending_stress": { + "Units": "Pa", + "Description": "None", + "Name": "drivese.bedplate_nose_bending_stress" + }, + "bedplate_nose_shear_stress": { + "Units": "Pa", + "Description": "None", + "Name": "drivese.bedplate_nose_shear_stress" + }, + "bedplate_rho": { + "Units": "kg/m**3", + "Description": "material density", + "Name": "drivese.bedplate_rho" + }, + "bedplate_rotation": { + "Units": "rad", + "Description": "None", + "Name": "drivese.bedplate_rotation" + }, + "bedplate_shear_stress": { + "Units": "Pa", + "Description": "None", + "Name": "drivese.bedplate_shear_stress" + }, + "bedplate_wall_thickness": { + "Units": "m", + "Description": "Bedplate wall thickness", + "Name": "drivese.bedplate_wall_thickness" + }, + "bedplate_web_height": { + "Units": "m", + "Description": "Bedplate is two parallel I beams, this is the web height", + "Name": "drivese.bedplate_web_height" + }, + "bedplate_web_thickness": { + "Units": "m", + "Description": "Bedplate is two parallel I beams, this is the web thickness", + "Name": "drivese.bedplate_web_thickness" + }, + "blade_mass": { + "Units": "kg", + "Description": "Total mass of one blade", + "Name": "drivese.blade_mass" + }, + "blade_root_diameter": { + "Units": "m", + "Description": "Outer diameter of blade root", + "Name": "drivese.blade_root_diameter" + }, + "blades_I": { + "Units": "kg*m**2", + "Description": "Mass moments of inertia of all blades about hub center", + "Name": "drivese.blades_I" + }, + "blades_mass": { + "Units": "kg", + "Description": "Mass of all bladea", + "Name": "drivese.blades_mass" + }, + "brake_I": { + "Units": "kg*m**2", + "Description": "component I", + "Name": "drivese.brake_I" + }, + "brake_cm": { + "Units": "m", + "Description": "component CM", + "Name": "drivese.brake_cm" + }, + "brake_mass": { + "Units": "kg", + "Description": "component mass", + "Name": "drivese.brake_mass" + }, + "brake_mass_user": { + "Units": "kg", + "Description": "User override of brake mass", + "Name": "drivese.brake_mass_user" + }, + "carrier_I": { + "Units": "kg*m**2", + "Description": "None", + "Name": "drivese.carrier_I" + }, + "carrier_mass": { + "Units": "kg", + "Description": "None", + "Name": "drivese.carrier_mass" + }, + "clearance_hub_spinner": { + "Units": "m", + "Description": "Clearance between spinner and hub", + "Name": "drivese.clearance_hub_spinner" + }, + "constr_access": { + "Units": "m", + "Description": "None", + "Name": "drivese.constr_access" + }, + "constr_bedplate_vonmises": { + "Units": "-", + "Description": "None", + "Name": "drivese.constr_bedplate_vonmises" + }, + "constr_ecc": { + "Units": "m", + "Description": "None", + "Name": "drivese.constr_ecc" + }, + "constr_height": { + "Units": "m", + "Description": "None", + "Name": "drivese.constr_height" + }, + "constr_hss_vonmises": { + "Units": "-", + "Description": "None", + "Name": "drivese.constr_hss_vonmises" + }, + "constr_hub_diameter": { + "Units": "m", + "Description": "None", + "Name": "drivese.constr_hub_diameter" + }, + "constr_length": { + "Units": "m", + "Description": "None", + "Name": "drivese.constr_length" + }, + "constr_lss_vonmises": { + "Units": "-", + "Description": "None", + "Name": "drivese.constr_lss_vonmises" + }, + "constr_mb1_defl": { + "Units": "-", + "Description": "None", + "Name": "drivese.constr_mb1_defl" + }, + "constr_mb2_defl": { + "Units": "-", + "Description": "None", + "Name": "drivese.constr_mb2_defl" + }, + "converter_I": { + "Units": "kg*m**2", + "Description": "moments of Inertia for the component [Ixx, Iyy, Izz] around its center of mass", + "Name": "drivese.converter_I" + }, + "converter_cm": { + "Units": "m", + "Description": "center of mass of the component in [x,y,z] for an arbitrary coordinate system", + "Name": "drivese.converter_cm" + }, + "converter_mass": { + "Units": "kg", + "Description": "overall component mass", + "Name": "drivese.converter_mass" + }, + "converter_mass_user": { + "Units": "kg", + "Description": "Override regular regression-based calculation of converter mass with this value", + "Name": "drivese.converter_mass_user" + }, + "cover_I": { + "Units": "m", + "Description": "component mass moments of inertia", + "Name": "drivese.cover_I" + }, + "cover_cm": { + "Units": "m", + "Description": "component center of mass", + "Name": "drivese.cover_cm" + }, + "cover_mass": { + "Units": "kg", + "Description": "component mass", + "Name": "drivese.cover_mass" + }, + "drive_height": { + "Units": "m", + "Description": "Hub height above tower top", + "Name": "drivese.drive_height" + }, + "flange_ID2flange_OD": { + "Units": "-", + "Description": "Ratio of flange inner diameter to flange outer diameter", + "Name": "drivese.flange_ID2flange_OD" + }, + "flange_OD2hub_D": { + "Units": "-", + "Description": "Ratio of flange outer diameter to hub diameter", + "Name": "drivese.flange_OD2hub_D" + }, + "flange_t2shell_t": { + "Units": "-", + "Description": "Ratio of flange thickness to shell thickness", + "Name": "drivese.flange_t2shell_t" + }, + "gear_configuration": { + "Units": "Unavailable", + "Description": "3-letter string of Es or Ps to denote epicyclic or parallel gear configuration", + "Name": "drivese.gear_configuration" + }, + "gear_ratio": { + "Units": "-", + "Description": "overall gearbox ratio", + "Name": "drivese.gear_ratio" + }, + "gearbox_I": { + "Units": "kg*m**2", + "Description": "Gearbox moment of inertia (measured about its cm)", + "Name": "drivese.gearbox_I" + }, + "gearbox_cm": { + "Units": "m", + "Description": "component CM", + "Name": "drivese.gearbox_cm" + }, + "gearbox_mass": { + "Units": "kg", + "Description": "Gearbox rotor mass", + "Name": "drivese.gearbox_mass" + }, + "generator": { + "A_1": { + "Units": "-", + "Description": "None", + "Name": "drivese.generator.A_1" + }, + "A_Curcalc": { + "Units": "mm**2", + "Description": "None", + "Name": "drivese.generator.A_Curcalc" + }, + "A_Cuscalc": { + "Units": "mm**2", + "Description": "None", + "Name": "drivese.generator.A_Cuscalc" + }, + "B_g": { + "Units": "T", + "Description": "None", + "Name": "drivese.generator.B_g" + }, + "B_g1": { + "Units": "T", + "Description": "None", + "Name": "drivese.generator.B_g1" + }, + "B_pm1": { + "Units": "-", + "Description": "None", + "Name": "drivese.generator.B_pm1" + }, + "B_r": { + "Units": "T", + "Description": "Remnant flux density", + "Name": "drivese.generator.B_r" + }, + "B_rymax": { + "Units": "T", + "Description": "None", + "Name": "drivese.generator.B_rymax" + }, + "B_smax": { + "Units": "T", + "Description": "None", + "Name": "drivese.generator.B_smax" + }, + "B_symax": { + "Units": "T", + "Description": "Peak Stator Yoke flux density B_ymax", + "Name": "drivese.generator.B_symax" + }, + "B_tmax": { + "Units": "T", + "Description": "Peak Teeth flux density", + "Name": "drivese.generator.B_tmax" + }, + "B_trmax": { + "Units": "T", + "Description": "None", + "Name": "drivese.generator.B_trmax" + }, + "B_tsmax": { + "Units": "T", + "Description": "None", + "Name": "drivese.generator.B_tsmax" + }, + "C_Cu": { + "Units": "USD/kg", + "Description": "Specific cost of copper", + "Name": "drivese.generator.C_Cu" + }, + "C_Fe": { + "Units": "USD/kg", + "Description": "Specific cost of magnetic steel/iron", + "Name": "drivese.generator.C_Fe" + }, + "C_Fes": { + "Units": "USD/kg", + "Description": "Specific cost of structural steel", + "Name": "drivese.generator.C_Fes" + }, + "C_PM": { + "Units": "USD/kg", + "Description": "Specific cost of Magnet", + "Name": "drivese.generator.C_PM" + }, + "Copper": { + "Units": "kg", + "Description": "Copper mass", + "Name": "drivese.generator.Copper" + }, + "Current_ratio": { + "Units": "-", + "Description": "None", + "Name": "drivese.generator.Current_ratio" + }, + "D_nose": { + "Units": "m", + "Description": "Nose outer diameter", + "Name": "drivese.generator.D_nose" + }, + "D_ratio": { + "Units": "-", + "Description": "None", + "Name": "drivese.generator.D_ratio" + }, + "D_ratio_L": { + "Units": "-", + "Description": "None", + "Name": "drivese.generator.D_ratio_L" + }, + "D_ratio_LL": { + "Units": "-", + "Description": "None", + "Name": "drivese.generator.D_ratio_LL" + }, + "D_ratio_U": { + "Units": "-", + "Description": "None", + "Name": "drivese.generator.D_ratio_U" + }, + "D_ratio_UL": { + "Units": "-", + "Description": "None", + "Name": "drivese.generator.D_ratio_UL" + }, + "D_shaft": { + "Units": "m", + "Description": "Shaft diameter", + "Name": "drivese.generator.D_shaft" + }, + "E": { + "Units": "Pa", + "Description": "Isotropic Youngs modulus of the materials along the column sections.", + "Name": "drivese.generator.E" + }, + "E_p": { + "Units": "V", + "Description": "Stator phase voltage", + "Name": "drivese.generator.E_p" + }, + "G": { + "Units": "Pa", + "Description": "Isotropic shear modulus of the materials along the column sections.", + "Name": "drivese.generator.G" + }, + "I_0": { + "Units": "A", + "Description": "no-load excitation current", + "Name": "drivese.generator.I_0" + }, + "I_s": { + "Units": "A", + "Description": "None", + "Name": "drivese.generator.I_s" + }, + "Iron": { + "Units": "kg", + "Description": "Iron mass", + "Name": "drivese.generator.Iron" + }, + "J_actual": { + "Units": "A/m**2", + "Description": "None", + "Name": "drivese.generator.J_actual" + }, + "J_r": { + "Units": "-", + "Description": "None", + "Name": "drivese.generator.J_r" + }, + "J_s": { + "Units": "A*m**-2", + "Description": "None", + "Name": "drivese.generator.J_s" + }, + "K_rad": { + "Units": "-", + "Description": "None", + "Name": "drivese.generator.K_rad" + }, + "K_rad_L": { + "Units": "-", + "Description": "None", + "Name": "drivese.generator.K_rad_L" + }, + "K_rad_LL": { + "Units": "-", + "Description": "None", + "Name": "drivese.generator.K_rad_LL" + }, + "K_rad_U": { + "Units": "-", + "Description": "None", + "Name": "drivese.generator.K_rad_U" + }, + "K_rad_UL": { + "Units": "-", + "Description": "None", + "Name": "drivese.generator.K_rad_UL" + }, + "L_r": { + "Units": "-", + "Description": "None", + "Name": "drivese.generator.L_r" + }, + "L_s": { + "Units": "-", + "Description": "None", + "Name": "drivese.generator.L_s" + }, + "L_sm": { + "Units": "-", + "Description": "None", + "Name": "drivese.generator.L_sm" + }, + "Losses": { + "Units": "W", + "Description": "None", + "Name": "drivese.generator.Losses" + }, + "Mass_tooth_stator": { + "Units": "kg", + "Description": "None", + "Name": "drivese.generator.Mass_tooth_stator" + }, + "Mass_yoke_rotor": { + "Units": "kg", + "Description": "None", + "Name": "drivese.generator.Mass_yoke_rotor" + }, + "Mass_yoke_stator": { + "Units": "kg", + "Description": "None", + "Name": "drivese.generator.Mass_yoke_stator" + }, + "N_c": { + "Units": "-", + "Description": "Number of turns per coil", + "Name": "drivese.generator.N_c" + }, + "N_r": { + "Units": "-", + "Description": "None", + "Name": "drivese.generator.N_r" + }, + "N_s": { + "Units": "-", + "Description": "None", + "Name": "drivese.generator.N_s" + }, + "P_Fe0e": { + "Units": "W/kg", + "Description": "specific eddy losses @ 1.5T, 50Hz", + "Name": "drivese.generator.P_Fe0e" + }, + "P_Fe0h": { + "Units": "W/kg", + "Description": "specific hysteresis losses W / kg @ 1.5 T @50 Hz", + "Name": "drivese.generator.P_Fe0h" + }, + "P_mech": { + "Units": "W", + "Description": "Shaft mechanical power", + "Name": "drivese.generator.P_mech" + }, + "Q_r": { + "Units": "-", + "Description": "None", + "Name": "drivese.generator.Q_r" + }, + "R_R": { + "Units": "-", + "Description": "None", + "Name": "drivese.generator.R_R" + }, + "R_out": { + "Units": "m", + "Description": "Outer radius", + "Name": "drivese.generator.R_out" + }, + "R_s": { + "Units": "ohm", + "Description": "None", + "Name": "drivese.generator.R_s" + }, + "S": { + "Units": "-", + "Description": "None", + "Name": "drivese.generator.S" + }, + "S_N": { + "Units": "-", + "Description": "Slip", + "Name": "drivese.generator.S_N" + }, + "S_Nmax": { + "Units": "-", + "Description": "Max rated Slip", + "Name": "drivese.generator.S_Nmax" + }, + "Slot_aspect_ratio": { + "Units": "-", + "Description": "None", + "Name": "drivese.generator.Slot_aspect_ratio" + }, + "Slot_aspect_ratio1": { + "Units": "-", + "Description": "None", + "Name": "drivese.generator.Slot_aspect_ratio1" + }, + "Slot_aspect_ratio2": { + "Units": "-", + "Description": "None", + "Name": "drivese.generator.Slot_aspect_ratio2" + }, + "Structural_mass": { + "Units": "kg", + "Description": "Structural mass", + "Name": "drivese.generator.Structural_mass" + }, + "Structural_mass_rotor": { + "Units": "kg", + "Description": "None", + "Name": "drivese.generator.Structural_mass_rotor" + }, + "Structural_mass_stator": { + "Units": "kg", + "Description": "None", + "Name": "drivese.generator.Structural_mass_stator" + }, + "TC1": { + "Units": "m**3", + "Description": "None", + "Name": "drivese.generator.TC1" + }, + "TC2r": { + "Units": "m**3", + "Description": "None", + "Name": "drivese.generator.TC2r" + }, + "TC2s": { + "Units": "m**3", + "Description": "None", + "Name": "drivese.generator.TC2s" + }, + "TCr": { + "Units": "m**3", + "Description": "None", + "Name": "drivese.generator.TCr" + }, + "TCs": { + "Units": "m**3", + "Description": "None", + "Name": "drivese.generator.TCs" + }, + "T_e": { + "Units": "N*m", + "Description": "None", + "Name": "drivese.generator.T_e" + }, + "alpha_p": { + "Units": "-", + "Description": "None", + "Name": "drivese.generator.alpha_p" + }, + "b": { + "Units": "-", + "Description": "Slot pole combination", + "Name": "drivese.generator.b" + }, + "b_allow_r": { + "Units": "m", + "Description": "None", + "Name": "drivese.generator.b_allow_r" + }, + "b_allow_s": { + "Units": "m", + "Description": "None", + "Name": "drivese.generator.b_allow_s" + }, + "b_arm": { + "Units": "m", + "Description": "arm width", + "Name": "drivese.generator.b_arm" + }, + "b_m": { + "Units": "-", + "Description": "None", + "Name": "drivese.generator.b_m" + }, + "b_r": { + "Units": "-", + "Description": "None", + "Name": "drivese.generator.b_r" + }, + "b_r_tau_r": { + "Units": "-", + "Description": "Rotor Slot width / Slot pitch ratio", + "Name": "drivese.generator.b_r_tau_r" + }, + "b_ro": { + "Units": "m", + "Description": "Rotor slot opening width", + "Name": "drivese.generator.b_ro" + }, + "b_s": { + "Units": "m", + "Description": "None", + "Name": "drivese.generator.b_s" + }, + "b_s_tau_s": { + "Units": "-", + "Description": "Stator Slot width/Slot pitch ratio", + "Name": "drivese.generator.b_s_tau_s" + }, + "b_so": { + "Units": "m", + "Description": "Stator slot opening width", + "Name": "drivese.generator.b_so" + }, + "b_st": { + "Units": "m", + "Description": "arm width b_st", + "Name": "drivese.generator.b_st" + }, + "b_t": { + "Units": "m", + "Description": "None", + "Name": "drivese.generator.b_t" + }, + "b_tr": { + "Units": "-", + "Description": "None", + "Name": "drivese.generator.b_tr" + }, + "b_trmin": { + "Units": "-", + "Description": "None", + "Name": "drivese.generator.b_trmin" + }, + "c": { + "Units": "-", + "Description": "Slot pole combination", + "Name": "drivese.generator.c" + }, + "cofi": { + "Units": "-", + "Description": "power factor", + "Name": "drivese.generator.cofi" + }, + "con_Bsmax": { + "Units": "T", + "Description": "None", + "Name": "drivese.generator.con_Bsmax" + }, + "con_TC2r": { + "Units": "m**3", + "Description": "None", + "Name": "drivese.generator.con_TC2r" + }, + "con_TC2s": { + "Units": "m**3", + "Description": "None", + "Name": "drivese.generator.con_TC2s" + }, + "con_br": { + "Units": "m", + "Description": "None", + "Name": "drivese.generator.con_br" + }, + "con_bst": { + "Units": "m", + "Description": "None", + "Name": "drivese.generator.con_bst" + }, + "con_uar": { + "Units": "m", + "Description": "None", + "Name": "drivese.generator.con_uar" + }, + "con_uas": { + "Units": "m", + "Description": "None", + "Name": "drivese.generator.con_uas" + }, + "con_yar": { + "Units": "m", + "Description": "None", + "Name": "drivese.generator.con_yar" + }, + "con_yas": { + "Units": "m", + "Description": "None", + "Name": "drivese.generator.con_yas" + }, + "con_zar": { + "Units": "m", + "Description": "None", + "Name": "drivese.generator.con_zar" + }, + "con_zas": { + "Units": "m", + "Description": "None", + "Name": "drivese.generator.con_zas" + }, + "d_r": { + "Units": "m", + "Description": "arm depth d_r", + "Name": "drivese.generator.d_r" + }, + "d_s": { + "Units": "m", + "Description": "arm depth d_s", + "Name": "drivese.generator.d_s" + }, + "f": { + "Units": "-", + "Description": "None", + "Name": "drivese.generator.f" + }, + "freq": { + "Units": "Hz", + "Description": "grid frequency", + "Name": "drivese.generator.freq" + }, + "h_0": { + "Units": "m", + "Description": "Slot height", + "Name": "drivese.generator.h_0" + }, + "h_i": { + "Units": "m", + "Description": "coil insulation thickness", + "Name": "drivese.generator.h_i" + }, + "h_m": { + "Units": "m", + "Description": "magnet height", + "Name": "drivese.generator.h_m" + }, + "h_s": { + "Units": "m", + "Description": "Yoke height h_s", + "Name": "drivese.generator.h_s" + }, + "h_sr": { + "Units": "m", + "Description": "Structural Mass", + "Name": "drivese.generator.h_sr" + }, + "h_ss": { + "Units": "m", + "Description": "Stator yoke height", + "Name": "drivese.generator.h_ss" + }, + "h_sy0": { + "Units": "-", + "Description": "None", + "Name": "drivese.generator.h_sy0" + }, + "h_t": { + "Units": "m", + "Description": "None", + "Name": "drivese.generator.h_t" + }, + "h_w": { + "Units": "m", + "Description": "Slot wedge height", + "Name": "drivese.generator.h_w" + }, + "h_yr": { + "Units": "m", + "Description": "rotor yoke height", + "Name": "drivese.generator.h_yr" + }, + "h_ys": { + "Units": "m", + "Description": "Yoke height", + "Name": "drivese.generator.h_ys" + }, + "k_fes": { + "Units": "-", + "Description": "Stator iron fill factor per Grauers", + "Name": "drivese.generator.k_fes" + }, + "k_fillr": { + "Units": "-", + "Description": "Rotor slot fill factor", + "Name": "drivese.generator.k_fillr" + }, + "k_fills": { + "Units": "-", + "Description": "Stator Slot fill factor", + "Name": "drivese.generator.k_fills" + }, + "k_s": { + "Units": "-", + "Description": "magnetic saturation factor for iron", + "Name": "drivese.generator.k_s" + }, + "len_ag": { + "Units": "m", + "Description": "None", + "Name": "drivese.generator.len_ag" + }, + "len_s": { + "Units": "m", + "Description": "Stator core length", + "Name": "drivese.generator.len_s" + }, + "m": { + "Units": "Unavailable", + "Description": "added mass", + "Name": "drivese.generator.m" + }, + "mass_PM": { + "Units": "kg", + "Description": "Magnet mass", + "Name": "drivese.generator.mass_PM" + }, + "mu_0": { + "Units": "m*kg/s**2/A**2", + "Description": "permeability of free space", + "Name": "drivese.generator.mu_0" + }, + "mu_r": { + "Units": "m*kg/s**2/A**2", + "Description": "relative permeability (neodymium)", + "Name": "drivese.generator.mu_r" + }, + "n_r": { + "Units": "-", + "Description": "number of arms n", + "Name": "drivese.generator.n_r" + }, + "n_s": { + "Units": "-", + "Description": "number of stator arms n_s", + "Name": "drivese.generator.n_s" + }, + "p": { + "Units": "-", + "Description": "pressure oscillation", + "Name": "drivese.generator.p" + }, + "phi": { + "Units": "rad", + "Description": "tilt angle (during transportation)", + "Name": "drivese.generator.phi" + }, + "q": { + "Units": "N/m**2", + "Description": "None", + "Name": "drivese.generator.q" + }, + "q1": { + "Units": "Unavailable", + "Description": "Stator slots per pole per phase", + "Name": "drivese.generator.q1" + }, + "q2": { + "Units": "Unavailable", + "Description": "Rotor slots per pole per phase", + "Name": "drivese.generator.q2" + }, + "rad_ag": { + "Units": "m", + "Description": "airgap radius", + "Name": "drivese.generator.rad_ag" + }, + "ratio_mw2pp": { + "Units": "-", + "Description": "ratio of magnet width to pole pitch(bm / self.tau_p)", + "Name": "drivese.generator.ratio_mw2pp" + }, + "resist_Cu": { + "Units": "ohm/m", + "Description": "Copper resistivity", + "Name": "drivese.generator.resist_Cu" + }, + "rho_Copper": { + "Units": "kg*m**-3", + "Description": "Copper density", + "Name": "drivese.generator.rho_Copper" + }, + "rho_Fe": { + "Units": "kg*m**-3", + "Description": "Magnetic Steel density", + "Name": "drivese.generator.rho_Fe" + }, + "rho_Fes": { + "Units": "kg*m**-3", + "Description": "Structural Steel density", + "Name": "drivese.generator.rho_Fes" + }, + "rho_PM": { + "Units": "kg*m**-3", + "Description": "Magnet density", + "Name": "drivese.generator.rho_PM" + }, + "shaft_rpm": { + "Units": "rpm", + "Description": "rated speed of input shaft (lss for direct, hss for geared)", + "Name": "drivese.generator.shaft_rpm" + }, + "sigma": { + "Units": "Pa", + "Description": "assumed max shear stress", + "Name": "drivese.generator.sigma" + }, + "t_r": { + "Units": "m", + "Description": "Rotor disc thickness", + "Name": "drivese.generator.t_r" + }, + "t_s": { + "Units": "m", + "Description": "Stator disc thickness", + "Name": "drivese.generator.t_s" + }, + "t_wr": { + "Units": "m", + "Description": "arm depth thickness", + "Name": "drivese.generator.t_wr" + }, + "t_ws": { + "Units": "m", + "Description": "arm depth thickness", + "Name": "drivese.generator.t_ws" + }, + "tau_p": { + "Units": "m", + "Description": "Pole pitch self.tau_p", + "Name": "drivese.generator.tau_p" + }, + "tau_s": { + "Units": "m", + "Description": "None", + "Name": "drivese.generator.tau_s" + }, + "theta_bd": { + "Units": "rad", + "Description": "Slope at the bedplate", + "Name": "drivese.generator.theta_bd" + }, + "theta_sh": { + "Units": "rad", + "Description": "slope of shaft", + "Name": "drivese.generator.theta_sh" + }, + "twist_r": { + "Units": "deg", + "Description": "None", + "Name": "drivese.generator.twist_r" + }, + "twist_s": { + "Units": "deg", + "Description": "None", + "Name": "drivese.generator.twist_s" + }, + "u_allow_pcent": { + "Units": "-", + "Description": "Radial deflection as a percentage of air gap diameter", + "Name": "drivese.generator.u_allow_pcent" + }, + "u_allow_r": { + "Units": "m", + "Description": "None", + "Name": "drivese.generator.u_allow_r" + }, + "u_allow_s": { + "Units": "m", + "Description": "None", + "Name": "drivese.generator.u_allow_s" + }, + "u_ar": { + "Units": "m", + "Description": "None", + "Name": "drivese.generator.u_ar" + }, + "u_as": { + "Units": "m", + "Description": "None", + "Name": "drivese.generator.u_as" + }, + "v": { + "Units": "-", + "Description": "poisson ratio", + "Name": "drivese.generator.v" + }, + "y_allow_pcent": { + "Units": "-", + "Description": "Radial deflection as a percentage of air gap diameter", + "Name": "drivese.generator.y_allow_pcent" + }, + "y_allow_r": { + "Units": "m", + "Description": "None", + "Name": "drivese.generator.y_allow_r" + }, + "y_allow_s": { + "Units": "m", + "Description": "None", + "Name": "drivese.generator.y_allow_s" + }, + "y_ar": { + "Units": "m", + "Description": "None", + "Name": "drivese.generator.y_ar" + }, + "y_as": { + "Units": "m", + "Description": "None", + "Name": "drivese.generator.y_as" + }, + "y_bd": { + "Units": "m", + "Description": "Deflection of the bedplate", + "Name": "drivese.generator.y_bd" + }, + "y_sh": { + "Units": "m", + "Description": "Shaft deflection", + "Name": "drivese.generator.y_sh" + }, + "y_tau_p": { + "Units": "-", + "Description": "Stator coil span to pole pitch", + "Name": "drivese.generator.y_tau_p" + }, + "y_tau_pr": { + "Units": "-", + "Description": "Rotor coil span to pole pitch", + "Name": "drivese.generator.y_tau_pr" + }, + "z_allow_deg": { + "Units": "deg", + "Description": "Allowable torsional twist", + "Name": "drivese.generator.z_allow_deg" + }, + "z_allow_r": { + "Units": "m", + "Description": "None", + "Name": "drivese.generator.z_allow_r" + }, + "z_allow_s": { + "Units": "m", + "Description": "None", + "Name": "drivese.generator.z_allow_s" + }, + "z_ar": { + "Units": "m", + "Description": "None", + "Name": "drivese.generator.z_ar" + }, + "z_as": { + "Units": "m", + "Description": "None", + "Name": "drivese.generator.z_as" + } + }, + "generator_I": { + "Units": "kg*m**2", + "Description": "component I", + "Name": "drivese.generator_I" + }, + "generator_cm": { + "Units": "m", + "Description": "component CM", + "Name": "drivese.generator_cm" + }, + "generator_cost": { + "Units": "USD", + "Description": "generator cost", + "Name": "drivese.generator_cost" + }, + "generator_efficiency": { + "Units": "-", + "Description": "None", + "Name": "drivese.generator_efficiency" + }, + "generator_mass": { + "Units": "kg", + "Description": "Actual mass", + "Name": "drivese.generator_mass" + }, + "generator_rotor_I": { + "Units": "kg*m**2", + "Description": "Generator rotor moment of inertia (measured about its cm)", + "Name": "drivese.generator_rotor_I" + }, + "generator_rotor_mass": { + "Units": "kg", + "Description": "Generator rotor mass", + "Name": "drivese.generator_rotor_mass" + }, + "generator_stator_I": { + "Units": "kg*m**2", + "Description": "Generator stator moment of inertia (measured about cm)", + "Name": "drivese.generator_stator_I" + }, + "generator_stator_mass": { + "Units": "kg", + "Description": "Generator stator mass", + "Name": "drivese.generator_stator_mass" + }, + "hss_E": { + "Units": "Pa", + "Description": "modulus of elasticity", + "Name": "drivese.hss_E" + }, + "hss_G": { + "Units": "Pa", + "Description": "shear modulus", + "Name": "drivese.hss_G" + }, + "hss_I": { + "Units": "kg*m**2", + "Description": "component I", + "Name": "drivese.hss_I" + }, + "hss_Xy": { + "Units": "Pa", + "Description": "yield stress", + "Name": "drivese.hss_Xy" + }, + "hss_axial_stress": { + "Units": "Pa", + "Description": "None", + "Name": "drivese.hss_axial_stress" + }, + "hss_bending_stress": { + "Units": "Pa", + "Description": "None", + "Name": "drivese.hss_bending_stress" + }, + "hss_cm": { + "Units": "m", + "Description": "component CM", + "Name": "drivese.hss_cm" + }, + "hss_cost": { + "Units": "USD/kg", + "Description": "hss cost", + "Name": "drivese.hss_cost" + }, + "hss_diameter": { + "Units": "m", + "Description": "Lss discretized diameter values at coordinates", + "Name": "drivese.hss_diameter" + }, + "hss_mass": { + "Units": "kg", + "Description": "component mass", + "Name": "drivese.hss_mass" + }, + "hss_material": { + "Units": "Unavailable", + "Description": "None", + "Name": "drivese.hss_material" + }, + "hss_rho": { + "Units": "kg/m**3", + "Description": "material density", + "Name": "drivese.hss_rho" + }, + "hss_rpm": { + "Units": "rpm", + "Description": "None", + "Name": "drivese.hss_rpm" + }, + "hss_shear_stress": { + "Units": "Pa", + "Description": "None", + "Name": "drivese.hss_shear_stress" + }, + "hss_wall_thickness": { + "Units": "m", + "Description": "Lss discretized thickness values at coordinates", + "Name": "drivese.hss_wall_thickness" + }, + "hub_E": { + "Units": "Pa", + "Description": "None", + "Name": "drivese.hub_E" + }, + "hub_G": { + "Units": "Pa", + "Description": "None", + "Name": "drivese.hub_G" + }, + "hub_I": { + "Units": "kg*m**2", + "Description": "Total mass moment of inertia of the hub about its cm", + "Name": "drivese.hub_I" + }, + "hub_Xy": { + "Units": "Pa", + "Description": "None", + "Name": "drivese.hub_Xy" + }, + "hub_cm": { + "Units": "m", + "Description": "Distance between hub/shaft flange and hub center of mass", + "Name": "drivese.hub_cm" + }, + "hub_cost": { + "Units": "USD", + "Description": "Cost of the hub shell, including flanges", + "Name": "drivese.hub_cost" + }, + "hub_diameter": { + "Units": "m", + "Description": "Outer diameter of the hub", + "Name": "drivese.hub_diameter" + }, + "hub_in2out_circ": { + "Units": "-", + "Description": "None", + "Name": "drivese.hub_in2out_circ" + }, + "hub_mass": { + "Units": "kg", + "Description": "Total mass of the hub shell, including the flanges", + "Name": "drivese.hub_mass" + }, + "hub_mat_cost": { + "Units": "USD/kg", + "Description": "None", + "Name": "drivese.hub_mat_cost" + }, + "hub_material": { + "Units": "Unavailable", + "Description": "None", + "Name": "drivese.hub_material" + }, + "hub_rho": { + "Units": "kg/m**3", + "Description": "None", + "Name": "drivese.hub_rho" + }, + "hub_shell": { + "Xy": { + "Units": "Pa", + "Description": "Yield strength metal", + "Name": "drivese.hub_shell.Xy" + }, + "metal_cost": { + "Units": "USD/kg", + "Description": "Unit cost metal", + "Name": "drivese.hub_shell.metal_cost" + }, + "n_blades": { + "Units": "Unavailable", + "Description": "Number of rotor blades", + "Name": "drivese.hub_shell.n_blades" + }, + "rho": { + "Units": "kg/m**3", + "Description": "Density of the materials along the column sections.", + "Name": "drivese.hub_shell.rho" + } + }, + "hub_stress_concentration": { + "Units": "-", + "Description": "Stress concentration factor. Stress concentration occurs at all fillets,\r\nnotches, lifting lugs, hatches and are accounted for by assigning a\r\nstress concentration factor", + "Name": "drivese.hub_stress_concentration" + }, + "hub_system_I": { + "Units": "kg*m**2", + "Description": "Hub system moment of inertia", + "Name": "drivese.hub_system_I" + }, + "hub_system_cm": { + "Units": "m", + "Description": "Hub system center of mass distance from hub flange", + "Name": "drivese.hub_system_cm" + }, + "hub_system_cost": { + "Units": "USD", + "Description": "Cost for hub system", + "Name": "drivese.hub_system_cost" + }, + "hub_system_mass": { + "Units": "kg", + "Description": "Hub system mass", + "Name": "drivese.hub_system_mass" + }, + "hvac_I": { + "Units": "m", + "Description": "component mass moments of inertia", + "Name": "drivese.hvac_I" + }, + "hvac_cm": { + "Units": "m", + "Description": "component center of mass", + "Name": "drivese.hvac_cm" + }, + "hvac_mass": { + "Units": "kg", + "Description": "component mass", + "Name": "drivese.hvac_mass" + }, + "hvac_mass_coeff": { + "Units": "kg/kW/m", + "Description": "Regression-based scaling coefficient on machine rating to get HVAC system mass", + "Name": "drivese.hvac_mass_coeff" + }, + "lss_E": { + "Units": "Pa", + "Description": "modulus of elasticity", + "Name": "drivese.lss_E" + }, + "lss_G": { + "Units": "Pa", + "Description": "shear modulus", + "Name": "drivese.lss_G" + }, + "lss_I": { + "Units": "kg*m**2", + "Description": "LSS moment of inertia around cm in axial (hub-aligned) c.s.", + "Name": "drivese.lss_I" + }, + "lss_Xy": { + "Units": "Pa", + "Description": "yield stress", + "Name": "drivese.lss_Xy" + }, + "lss_axial_stress": { + "Units": "Pa", + "Description": "None", + "Name": "drivese.lss_axial_stress" + }, + "lss_cm": { + "Units": "m", + "Description": "LSS center of mass along shaft axis from bedplate", + "Name": "drivese.lss_cm" + }, + "lss_cost": { + "Units": "USD/kg", + "Description": "lss cost", + "Name": "drivese.lss_cost" + }, + "lss_diameter": { + "Units": "m", + "Description": "LSS outer diameter from hub to bearing 2", + "Name": "drivese.lss_diameter" + }, + "lss_mass": { + "Units": "kg", + "Description": "LSS mass", + "Name": "drivese.lss_mass" + }, + "lss_material": { + "Units": "Unavailable", + "Description": "None", + "Name": "drivese.lss_material" + }, + "lss_rho": { + "Units": "kg/m**3", + "Description": "material density", + "Name": "drivese.lss_rho" + }, + "lss_rpm": { + "Units": "rpm", + "Description": "None", + "Name": "drivese.lss_rpm" + }, + "lss_shear_stress": { + "Units": "Pa", + "Description": "None", + "Name": "drivese.lss_shear_stress" + }, + "lss_wall_thickness": { + "Units": "m", + "Description": "LSS wall thickness", + "Name": "drivese.lss_wall_thickness" + }, + "machine_rating": { + "Units": "kW", + "Description": "Machine rating", + "Name": "drivese.machine_rating" + }, + "material_names": { + "Units": "Unavailable", + "Description": "1D array of names of materials.", + "Name": "drivese.material_names" + }, + "max_torque": { + "Units": "N*m", + "Description": "Max torque that the hub needs to resist (Mx in a hub aliged reference system)", + "Name": "drivese.max_torque" + }, + "mb1_I": { + "Units": "kg*m**2", + "Description": "component I", + "Name": "drivese.mb1_I" + }, + "mb1_cm": { + "Units": "m", + "Description": "component CM", + "Name": "drivese.mb1_cm" + }, + "mb1_deflection": { + "Units": "m", + "Description": "None", + "Name": "drivese.mb1_deflection" + }, + "mb1_mass": { + "Units": "kg", + "Description": "component mass", + "Name": "drivese.mb1_mass" + }, + "mb1_max_defl_ang": { + "Units": "rad", + "Description": "Maximum allowable deflection angle", + "Name": "drivese.mb1_max_defl_ang" + }, + "mb1_rotation": { + "Units": "rad", + "Description": "None", + "Name": "drivese.mb1_rotation" + }, + "mb2_I": { + "Units": "kg*m**2", + "Description": "component I", + "Name": "drivese.mb2_I" + }, + "mb2_cm": { + "Units": "m", + "Description": "component CM", + "Name": "drivese.mb2_cm" + }, + "mb2_deflection": { + "Units": "m", + "Description": "None", + "Name": "drivese.mb2_deflection" + }, + "mb2_mass": { + "Units": "kg", + "Description": "component mass", + "Name": "drivese.mb2_mass" + }, + "mb2_max_defl_ang": { + "Units": "rad", + "Description": "Maximum allowable deflection angle", + "Name": "drivese.mb2_max_defl_ang" + }, + "mb2_rotation": { + "Units": "rad", + "Description": "None", + "Name": "drivese.mb2_rotation" + }, + "mean_bearing_mass": { + "Units": "kg", + "Description": "None", + "Name": "drivese.mean_bearing_mass" + }, + "minimum_rpm": { + "Units": "rpm", + "Description": "Minimum shaft rotations-per-minute (rpm), usually set by controller", + "Name": "drivese.minimum_rpm" + }, + "n_blades": { + "Units": "Unavailable", + "Description": "Number of rotor blades", + "Name": "drivese.n_blades" + }, + "n_front_brackets": { + "Units": "Unavailable", + "Description": "Number of front spinner brackets", + "Name": "drivese.n_front_brackets" + }, + "n_rear_brackets": { + "Units": "Unavailable", + "Description": "Number of rear spinner brackets", + "Name": "drivese.n_rear_brackets" + }, + "nacelle_I": { + "Units": "kg*m**2", + "Description": "Mass moments of inertia of nacelle about its CofM", + "Name": "drivese.nacelle_I" + }, + "nacelle_cm": { + "Units": "m", + "Description": "Nacelle center of mass relative to tower top in yaw-aligned c.s.", + "Name": "drivese.nacelle_cm" + }, + "nacelle_mass": { + "Units": "kg", + "Description": "Mass of nacelle system", + "Name": "drivese.nacelle_mass" + }, + "nose_I": { + "Units": "kg*m**2", + "Description": "Nose moment of inertia around cm in axial (hub-aligned) c.s.", + "Name": "drivese.nose_I" + }, + "nose_cm": { + "Units": "m", + "Description": "Nose center of mass along nose axis from bedplate", + "Name": "drivese.nose_cm" + }, + "nose_diameter": { + "Units": "m", + "Description": "Nose outer diameter from bearing 1 to bedplate", + "Name": "drivese.nose_diameter" + }, + "nose_mass": { + "Units": "kg", + "Description": "Nose mass", + "Name": "drivese.nose_mass" + }, + "nose_wall_thickness": { + "Units": "m", + "Description": "Nose wall thickness", + "Name": "drivese.nose_wall_thickness" + }, + "other_mass": { + "Units": "kg", + "Description": "Mass of other nacelle components that rest on mainplate", + "Name": "drivese.other_mass" + }, + "overhang": { + "Units": "m", + "Description": "Horizontal distance between hub and tower-top axis", + "Name": "drivese.overhang" + }, + "pitch_I": { + "Units": "kg*m**2", + "Description": "Total mass moment of inertia of the pitch system about central point", + "Name": "drivese.pitch_I" + }, + "pitch_cost": { + "Units": "USD", + "Description": "Cost of the pitch system", + "Name": "drivese.pitch_cost" + }, + "pitch_mass": { + "Units": "kg", + "Description": "Total mass of the pitch system", + "Name": "drivese.pitch_mass" + }, + "pitch_system": { + "BRFM": { + "Units": "N*m", + "Description": "Flapwise bending moment at blade root", + "Name": "drivese.pitch_system.BRFM" + }, + "Xy": { + "Units": "Pa", + "Description": "Yield strength metal", + "Name": "drivese.pitch_system.Xy" + }, + "rho": { + "Units": "kg/m**3", + "Description": "Density of the materials along the column sections.", + "Name": "drivese.pitch_system.rho" + } + }, + "pitch_system_scaling_factor": { + "Units": "-", + "Description": "Scaling factor to tune the total mass (0.54 is recommended for modern designs)", + "Name": "drivese.pitch_system_scaling_factor" + }, + "planet_numbers": { + "Units": "Unavailable", + "Description": "None", + "Name": "drivese.planet_numbers" + }, + "platform_I": { + "Units": "m", + "Description": "component mass moments of inertia", + "Name": "drivese.platform_I" + }, + "platform_cm": { + "Units": "m", + "Description": "component center of mass", + "Name": "drivese.platform_cm" + }, + "platform_mass": { + "Units": "kg", + "Description": "component mass", + "Name": "drivese.platform_mass" + }, + "rated_rpm": { + "Units": "rpm", + "Description": "Rated shaft rotations-per-minute (rpm)", + "Name": "drivese.rated_rpm" + }, + "rated_torque": { + "Units": "N*m", + "Description": "rotor torque at rated power", + "Name": "drivese.rated_torque" + }, + "rho_castiron": { + "Units": "kg/m**3", + "Description": "None", + "Name": "drivese.rho_castiron" + }, + "rho_fiberglass": { + "Units": "kg/m**3", + "Description": "material density of fiberglass", + "Name": "drivese.rho_fiberglass" + }, + "rho_mat": { + "Units": "kg/m**3", + "Description": "1D array of the density of the materials. For composites, this is the density of\r\nthe laminate.", + "Name": "drivese.rho_mat" + }, + "rna_I_TT": { + "Units": "kg*m**2", + "Description": "None", + "Name": "drivese.rna_I_TT" + }, + "rna_cm": { + "Units": "m", + "Description": "None", + "Name": "drivese.rna_cm" + }, + "rna_mass": { + "Units": "kg", + "Description": "Mass of RNA", + "Name": "drivese.rna_mass" + }, + "rotor_diameter": { + "Units": "m", + "Description": "rotor diameter", + "Name": "drivese.rotor_diameter" + }, + "rotor_mass": { + "Units": "kg", + "Description": "Total rotor mass", + "Name": "drivese.rotor_mass" + }, + "s_drive": { + "Units": "m", + "Description": "None", + "Name": "drivese.s_drive" + }, + "s_gearbox": { + "Units": "m", + "Description": "Gearbox s-coordinate measured from bedplate", + "Name": "drivese.s_gearbox" + }, + "s_generator": { + "Units": "m", + "Description": "None", + "Name": "drivese.s_generator" + }, + "s_hss": { + "Units": "m", + "Description": "Discretized s-coordinates along drivetrain, measured from bedplate (direct) or tower center (geared)", + "Name": "drivese.s_hss" + }, + "s_lss": { + "Units": "m", + "Description": "Discretized s-coordinates along drivetrain, measured from bedplate (direct) or tower center (geared)", + "Name": "drivese.s_lss" + }, + "s_mb1": { + "Units": "m", + "Description": "Bearing 1 s-coordinate along drivetrain, measured from bedplate", + "Name": "drivese.s_mb1" + }, + "s_mb2": { + "Units": "m", + "Description": "Bearing 2 s-coordinate along drivetrain, measured from bedplate", + "Name": "drivese.s_mb2" + }, + "s_nose": { + "Units": "m", + "Description": "Discretized s-coordinates along drivetrain, measured from bedplate", + "Name": "drivese.s_nose" + }, + "s_rotor": { + "Units": "m", + "Description": "Generator rotor attachment to lss s-coordinate measured from bedplate (direct) or tower center (geared)", + "Name": "drivese.s_rotor" + }, + "s_stator": { + "Units": "m", + "Description": "Generator stator attachment to lss s-coordinate measured from bedplate", + "Name": "drivese.s_stator" + }, + "sigma_y_mat": { + "Units": "Pa", + "Description": "2D array of the yield strength of the materials. Each row represents a material,\r\nthe three columns represent Xt12, Xt13 and Xt23.", + "Name": "drivese.sigma_y_mat" + }, + "spin_hole_incr": { + "Units": "-", + "Description": "Ratio between access hole diameter in the spinner and blade root diameter.\r\nTypical value 1.2", + "Name": "drivese.spin_hole_incr" + }, + "spinner": { + "Xy": { + "Units": "Pa", + "Description": "Yield strength metal", + "Name": "drivese.spinner.Xy" + }, + "composite_Xt": { + "Units": "Pa", + "Description": "Tensile strength of the composite material of the shell.\r\nA glass CFM (continuous fiber mat) is often used.", + "Name": "drivese.spinner.composite_Xt" + }, + "composite_cost": { + "Units": "USD/kg", + "Description": "Unit cost composite of the shell", + "Name": "drivese.spinner.composite_cost" + }, + "composite_rho": { + "Units": "kg/m**3", + "Description": "Density of composite of the shell", + "Name": "drivese.spinner.composite_rho" + }, + "metal_cost": { + "Units": "USD/kg", + "Description": "Unit cost metal", + "Name": "drivese.spinner.metal_cost" + }, + "metal_rho": { + "Units": "kg/m**3", + "Description": "Density metal", + "Name": "drivese.spinner.metal_rho" + }, + "spinner_diameter": { + "Units": "m", + "Description": "None", + "Name": "drivese.spinner.spinner_diameter" + } + }, + "spinner_I": { + "Units": "kg*m**2", + "Description": "Total mass moment of inertia of the spinner about its cm", + "Name": "drivese.spinner_I" + }, + "spinner_Xt": { + "Units": "Pa", + "Description": "None", + "Name": "drivese.spinner_Xt" + }, + "spinner_cm": { + "Units": "m", + "Description": "Radius / Distance between center of mass of the spinner and outer surface", + "Name": "drivese.spinner_cm" + }, + "spinner_cost": { + "Units": "kg", + "Description": "Cost of the spinner", + "Name": "drivese.spinner_cost" + }, + "spinner_gust_ws": { + "Units": "m/s", + "Description": "Extreme gust wind speed", + "Name": "drivese.spinner_gust_ws" + }, + "spinner_mass": { + "Units": "kg", + "Description": "Total mass of the spinner", + "Name": "drivese.spinner_mass" + }, + "spinner_mat_cost": { + "Units": "USD/kg", + "Description": "None", + "Name": "drivese.spinner_mat_cost" + }, + "spinner_material": { + "Units": "Unavailable", + "Description": "None", + "Name": "drivese.spinner_material" + }, + "spinner_rho": { + "Units": "kg/m**3", + "Description": "None", + "Name": "drivese.spinner_rho" + }, + "stage_ratios": { + "Units": "-", + "Description": "None", + "Name": "drivese.stage_ratios" + }, + "stator_deflection": { + "Units": "m", + "Description": "None", + "Name": "drivese.stator_deflection" + }, + "stator_rotation": { + "Units": "rad", + "Description": "None", + "Name": "drivese.stator_rotation" + }, + "stop_time": { + "Units": "s", + "Description": "Time required for the turbine rotor to come to a complete stop", + "Name": "drivese.stop_time" + }, + "t_bedplate": { + "Units": "m", + "Description": "Bedplate wall thickness (mirrors input)", + "Name": "drivese.t_bedplate" + }, + "tilt": { + "Units": "deg", + "Description": "Nacelle uptilt angle", + "Name": "drivese.tilt" + }, + "torq_deflection": { + "Units": "m", + "Description": "None", + "Name": "drivese.torq_deflection" + }, + "torq_rotation": { + "Units": "rad", + "Description": "None", + "Name": "drivese.torq_rotation" + }, + "total_bedplate_mass": { + "Units": "kg", + "Description": "None", + "Name": "drivese.total_bedplate_mass" + }, + "transformer_I": { + "Units": "kg*m**2", + "Description": "moments of Inertia for the component [Ixx, Iyy, Izz] around its center of mass", + "Name": "drivese.transformer_I" + }, + "transformer_cm": { + "Units": "m", + "Description": "center of mass of the component in [x,y,z] for an arbitrary coordinate system", + "Name": "drivese.transformer_cm" + }, + "transformer_mass": { + "Units": "kg", + "Description": "overall component mass", + "Name": "drivese.transformer_mass" + }, + "transformer_mass_user": { + "Units": "kg", + "Description": "Override regular regression-based calculation of transformer mass with this value", + "Name": "drivese.transformer_mass_user" + }, + "unit_cost_mat": { + "Units": "USD/kg", + "Description": "1D array of the unit costs of the materials.", + "Name": "drivese.unit_cost_mat" + }, + "uptower": { + "Units": "Unavailable", + "Description": "Power electronics are placed in the nacelle at the tower top", + "Name": "drivese.uptower" + }, + "upwind": { + "Units": "Unavailable", + "Description": "Flag whether the design is upwind or downwind", + "Name": "drivese.upwind" + }, + "x_bedplate": { + "Units": "m", + "Description": "Bedplate centerline x-coordinates", + "Name": "drivese.x_bedplate" + }, + "x_bedplate_inner": { + "Units": "m", + "Description": "Bedplate lower curve x-coordinates", + "Name": "drivese.x_bedplate_inner" + }, + "x_bedplate_outer": { + "Units": "m", + "Description": "Bedplate outer curve x-coordinates", + "Name": "drivese.x_bedplate_outer" + }, + "yaw": { + "rho": { + "Units": "kg/m**3", + "Description": "Density of the materials along the column sections.", + "Name": "drivese.yaw.rho" + } + }, + "yaw_I": { + "Units": "kg*m**2", + "Description": "moments of Inertia for the component [Ixx, Iyy, Izz] around its center of mass", + "Name": "drivese.yaw_I" + }, + "yaw_cm": { + "Units": "m", + "Description": "center of mass of the component in [x,y,z] for an arbitrary coordinate system", + "Name": "drivese.yaw_cm" + }, + "yaw_mass": { + "Units": "kg", + "Description": "overall component mass", + "Name": "drivese.yaw_mass" + }, + "z_bedplate": { + "Units": "m", + "Description": "Bedplate centerline z-coordinates", + "Name": "drivese.z_bedplate" + }, + "z_bedplate_inner": { + "Units": "m", + "Description": "Bedplate lower curve z-coordinates", + "Name": "drivese.z_bedplate_inner" + }, + "z_bedplate_outer": { + "Units": "m", + "Description": "Bedplate outer curve z-coordinates", + "Name": "drivese.z_bedplate_outer" + } + }, + "env": { + "G_soil": { + "Units": "N/m**2", + "Description": "Shear stress of soil", + "Name": "env.G_soil" + }, + "Hsig_wave": { + "Units": "m", + "Description": "Significant wave heightsignificant wave height", + "Name": "env.Hsig_wave" + }, + "Tsig_wave": { + "Units": "s", + "Description": "Significant wave periodperiod of maximum wave height", + "Name": "env.Tsig_wave" + }, + "mu_air": { + "Units": "kg/(m*s)", + "Description": "Dynamic viscosity of airdynamic viscosity of air", + "Name": "env.mu_air" + }, + "mu_water": { + "Units": "kg/(m*s)", + "Description": "Dynamic viscosity of ocean waterdynamic viscosity of water", + "Name": "env.mu_water" + }, + "nu_soil": { + "Units": "-", + "Description": "Poisson ratio of soil", + "Name": "env.nu_soil" + }, + "rho_air": { + "Units": "kg/m**3", + "Description": "Density of airair density", + "Name": "env.rho_air" + }, + "rho_water": { + "Units": "kg/m**3", + "Description": "Density of ocean waterdensity of water", + "Name": "env.rho_water" + }, + "shear_exp": { + "Units": "-", + "Description": "Shear exponent of the wind.", + "Name": "env.shear_exp" + }, + "speed_sound_air": { + "Units": "m/s", + "Description": "Speed of sound in air.", + "Name": "env.speed_sound_air" + }, + "water_depth": { + "Units": "m", + "Description": "Water depth for analysis. Values > 0 mean offshorewater depth", + "Name": "env.water_depth" + }, + "weibull_k": { + "Units": "-", + "Description": "Shape parameter of the Weibull probability density function of the wind.", + "Name": "env.weibull_k" + } + }, + "financese": { + "bos_per_kW": { + "Units": "USD/kW", + "Description": "Balance of system costs of the turbine", + "Name": "financese.bos_per_kW" + }, + "fixed_charge_rate": { + "Units": "-", + "Description": "Fixed charge rate for coe calculation", + "Name": "financese.fixed_charge_rate" + }, + "lcoe": { + "Units": "USD/kW/h", + "Description": "None", + "Name": "financese.lcoe" + }, + "machine_rating": { + "Units": "kW", + "Description": "Machine rating", + "Name": "financese.machine_rating" + }, + "offset_tcc_per_kW": { + "Units": "USD/kW", + "Description": "Offset to turbine capital cost", + "Name": "financese.offset_tcc_per_kW" + }, + "opex_per_kW": { + "Units": "USD/kW/yr", + "Description": "Average annual operational expenditures of the turbine", + "Name": "financese.opex_per_kW" + }, + "plant_aep": { + "Units": "USD/kW/h", + "Description": "None", + "Name": "financese.plant_aep" + }, + "plant_aep_in": { + "Units": "kW*h", + "Description": "Annual Energy Production of the wind plant", + "Name": "financese.plant_aep_in" + }, + "tcc_per_kW": { + "Units": "USD/kW", + "Description": "Turbine capital cost", + "Name": "financese.tcc_per_kW" + }, + "turbine_aep": { + "Units": "kW*h", + "Description": "Annual Energy Production of the wind turbine", + "Name": "financese.turbine_aep" + }, + "turbine_number": { + "Units": "Unavailable", + "Description": "Number of turbines at plant", + "Name": "financese.turbine_number" + }, + "wake_loss_factor": { + "Units": "-", + "Description": "The losses in AEP due to waked conditions", + "Name": "financese.wake_loss_factor" + } + }, + "generator": { + "B_r": { + "Units": "T", + "Description": "Remnant flux density", + "Name": "generator.B_r" + }, + "B_symax": { + "Units": "T", + "Description": "Peak Stator Yoke flux density B_ymax", + "Name": "generator.B_symax" + }, + "B_tmax": { + "Units": "T", + "Description": "Peak Teeth flux density", + "Name": "generator.B_tmax" + }, + "C_Cu": { + "Units": "USD/kg", + "Description": "Specific cost of copper", + "Name": "generator.C_Cu" + }, + "C_Fe": { + "Units": "USD/kg", + "Description": "Specific cost of magnetic steel/iron", + "Name": "generator.C_Fe" + }, + "C_Fes": { + "Units": "USD/kg", + "Description": "Specific cost of structural steel", + "Name": "generator.C_Fes" + }, + "C_PM": { + "Units": "USD/kg", + "Description": "Specific cost of Magnet", + "Name": "generator.C_PM" + }, + "E_p": { + "Units": "V", + "Description": "Stator phase voltage", + "Name": "generator.E_p" + }, + "I_0": { + "Units": "A", + "Description": "no-load excitation current", + "Name": "generator.I_0" + }, + "N_c": { + "Units": "-", + "Description": "Number of turns per coil", + "Name": "generator.N_c" + }, + "P_Fe0e": { + "Units": "W/kg", + "Description": "specific eddy losses @ 1.5T, 50Hz", + "Name": "generator.P_Fe0e" + }, + "P_Fe0h": { + "Units": "W/kg", + "Description": "specific hysteresis losses W / kg @ 1.5 T @50 Hz", + "Name": "generator.P_Fe0h" + }, + "S_N": { + "Units": "-", + "Description": "Slip", + "Name": "generator.S_N" + }, + "S_Nmax": { + "Units": "-", + "Description": "Max rated Slip", + "Name": "generator.S_Nmax" + }, + "alpha_p": { + "Units": "-", + "Description": "None", + "Name": "generator.alpha_p" + }, + "b": { + "Units": "-", + "Description": "Slot pole combination", + "Name": "generator.b" + }, + "b_r_tau_r": { + "Units": "-", + "Description": "Rotor Slot width / Slot pitch ratio", + "Name": "generator.b_r_tau_r" + }, + "b_ro": { + "Units": "m", + "Description": "Rotor slot opening width", + "Name": "generator.b_ro" + }, + "b_s_tau_s": { + "Units": "-", + "Description": "Stator Slot width/Slot pitch ratio", + "Name": "generator.b_s_tau_s" + }, + "b_so": { + "Units": "m", + "Description": "Stator slot opening width", + "Name": "generator.b_so" + }, + "b_st": { + "Units": "m", + "Description": "arm width b_st", + "Name": "generator.b_st" + }, + "c": { + "Units": "-", + "Description": "Slot pole combination", + "Name": "generator.c" + }, + "cofi": { + "Units": "-", + "Description": "power factor", + "Name": "generator.cofi" + }, + "d_r": { + "Units": "m", + "Description": "arm depth d_r", + "Name": "generator.d_r" + }, + "d_s": { + "Units": "m", + "Description": "arm depth d_s", + "Name": "generator.d_s" + }, + "freq": { + "Units": "Hz", + "Description": "grid frequency", + "Name": "generator.freq" + }, + "h_0": { + "Units": "m", + "Description": "Slot height", + "Name": "generator.h_0" + }, + "h_i": { + "Units": "m", + "Description": "coil insulation thickness", + "Name": "generator.h_i" + }, + "h_m": { + "Units": "m", + "Description": "magnet height", + "Name": "generator.h_m" + }, + "h_s": { + "Units": "m", + "Description": "Yoke height h_s", + "Name": "generator.h_s" + }, + "h_sr": { + "Units": "m", + "Description": "Structural MassStructural Mass", + "Name": "generator.h_sr" + }, + "h_ss": { + "Units": "m", + "Description": "Stator yoke height", + "Name": "generator.h_ss" + }, + "h_sy0": { + "Units": "-", + "Description": "None", + "Name": "generator.h_sy0" + }, + "h_w": { + "Units": "m", + "Description": "Slot wedge height", + "Name": "generator.h_w" + }, + "h_yr": { + "Units": "m", + "Description": "rotor yoke height", + "Name": "generator.h_yr" + }, + "h_ys": { + "Units": "m", + "Description": "Yoke height", + "Name": "generator.h_ys" + }, + "k_fes": { + "Units": "-", + "Description": "Stator iron fill factor per Grauers", + "Name": "generator.k_fes" + }, + "k_fillr": { + "Units": "-", + "Description": "Rotor slot fill factor", + "Name": "generator.k_fillr" + }, + "k_fills": { + "Units": "-", + "Description": "Stator Slot fill factor", + "Name": "generator.k_fills" + }, + "k_s": { + "Units": "-", + "Description": "magnetic saturation factor for iron", + "Name": "generator.k_s" + }, + "len_s": { + "Units": "m", + "Description": "Stator core length", + "Name": "generator.len_s" + }, + "m": { + "Units": "Unavailable", + "Description": "added mass", + "Name": "generator.m" + }, + "mu_0": { + "Units": "m*kg/s**2/A**2", + "Description": "permeability of free space", + "Name": "generator.mu_0" + }, + "mu_r": { + "Units": "m*kg/s**2/A**2", + "Description": "relative permeability (neodymium)", + "Name": "generator.mu_r" + }, + "n_r": { + "Units": "-", + "Description": "number of arms n", + "Name": "generator.n_r" + }, + "n_s": { + "Units": "-", + "Description": "number of stator arms n_s", + "Name": "generator.n_s" + }, + "p": { + "Units": "-", + "Description": "pressure oscillation", + "Name": "generator.p" + }, + "phi": { + "Units": "rad", + "Description": "tilt angle (during transportation)", + "Name": "generator.phi" + }, + "q1": { + "Units": "Unavailable", + "Description": "Stator slots per pole per phase", + "Name": "generator.q1" + }, + "q2": { + "Units": "Unavailable", + "Description": "Rotor slots per pole per phase", + "Name": "generator.q2" + }, + "rad_ag": { + "Units": "m", + "Description": "airgap radius", + "Name": "generator.rad_ag" + }, + "ratio_mw2pp": { + "Units": "-", + "Description": "ratio of magnet width to pole pitch(bm / self.tau_p)", + "Name": "generator.ratio_mw2pp" + }, + "resist_Cu": { + "Units": "ohm/m", + "Description": "Copper resistivity", + "Name": "generator.resist_Cu" + }, + "rho_Copper": { + "Units": "kg*m**-3", + "Description": "Copper density", + "Name": "generator.rho_Copper" + }, + "rho_Fe": { + "Units": "kg*m**-3", + "Description": "Magnetic Steel density", + "Name": "generator.rho_Fe" + }, + "rho_Fes": { + "Units": "kg*m**-3", + "Description": "Structural Steel density", + "Name": "generator.rho_Fes" + }, + "rho_PM": { + "Units": "kg*m**-3", + "Description": "Magnet density", + "Name": "generator.rho_PM" + }, + "sigma": { + "Units": "Pa", + "Description": "assumed max shear stress", + "Name": "generator.sigma" + }, + "t_r": { + "Units": "m", + "Description": "Rotor disc thickness", + "Name": "generator.t_r" + }, + "t_s": { + "Units": "m", + "Description": "Stator disc thickness", + "Name": "generator.t_s" + }, + "t_wr": { + "Units": "m", + "Description": "arm depth thickness", + "Name": "generator.t_wr" + }, + "t_ws": { + "Units": "m", + "Description": "arm depth thickness", + "Name": "generator.t_ws" + }, + "u_allow_pcent": { + "Units": "-", + "Description": "Radial deflection as a percentage of air gap diameter", + "Name": "generator.u_allow_pcent" + }, + "y_allow_pcent": { + "Units": "-", + "Description": "Radial deflection as a percentage of air gap diameter", + "Name": "generator.y_allow_pcent" + }, + "y_tau_p": { + "Units": "-", + "Description": "Stator coil span to pole pitch", + "Name": "generator.y_tau_p" + }, + "y_tau_pr": { + "Units": "-", + "Description": "Rotor coil span to pole pitch", + "Name": "generator.y_tau_pr" + }, + "z_allow_deg": { + "Units": "deg", + "Description": "Allowable torsional twist", + "Name": "generator.z_allow_deg" + } + }, + "hub": { + "clearance_hub_spinner": { + "Units": "m", + "Description": "Clearance between spinner and hub", + "Name": "hub.clearance_hub_spinner" + }, + "cone": { + "Units": "rad", + "Description": "Cone angle of the rotor. It defines the angle between the rotor plane and the blade pitch axis. A standard machine has positive values.", + "Name": "hub.cone" + }, + "diameter": { + "Units": "m", + "Description": "cylinder diameter at corresponding locations", + "Name": "hub.diameter" + }, + "flange_ID2flange_OD": { + "Units": "-", + "Description": "Ratio of flange inner diameter to flange outer diameter", + "Name": "hub.flange_ID2flange_OD" + }, + "flange_OD2hub_D": { + "Units": "-", + "Description": "Ratio of flange outer diameter to hub diameter", + "Name": "hub.flange_OD2hub_D" + }, + "flange_t2shell_t": { + "Units": "-", + "Description": "Ratio of flange thickness to shell thickness", + "Name": "hub.flange_t2shell_t" + }, + "hub_in2out_circ": { + "Units": "-", + "Description": "None", + "Name": "hub.hub_in2out_circ" + }, + "hub_material": { + "Units": "Unavailable", + "Description": "None", + "Name": "hub.hub_material" + }, + "hub_stress_concentration": { + "Units": "-", + "Description": "Stress concentration factor. Stress concentration occurs at all fillets,\r\nnotches, lifting lugs, hatches and are accounted for by assigning a\r\nstress concentration factor", + "Name": "hub.hub_stress_concentration" + }, + "n_front_brackets": { + "Units": "Unavailable", + "Description": "Number of front spinner brackets", + "Name": "hub.n_front_brackets" + }, + "n_rear_brackets": { + "Units": "Unavailable", + "Description": "Number of rear spinner brackets", + "Name": "hub.n_rear_brackets" + }, + "pitch_system_scaling_factor": { + "Units": "-", + "Description": "Scaling factor to tune the total mass (0.54 is recommended for modern designs)", + "Name": "hub.pitch_system_scaling_factor" + }, + "radius": { + "Units": "m", + "Description": "Radius of the hub. It defines the distance of the blade root from the rotor center along the coned line.", + "Name": "hub.radius" + }, + "spin_hole_incr": { + "Units": "-", + "Description": "Ratio between access hole diameter in the spinner and blade root diameter.\r\nTypical value 1.2", + "Name": "hub.spin_hole_incr" + }, + "spinner_gust_ws": { + "Units": "m/s", + "Description": "Extreme gust wind speed", + "Name": "hub.spinner_gust_ws" + }, + "spinner_material": { + "Units": "Unavailable", + "Description": "None", + "Name": "hub.spinner_material" + } + }, + "landbosse": { + "Mass tonne": { + "Units": "t", + "Description": "None", + "Name": "landbosse.Mass tonne" + }, + "allow_same_flag": { + "Units": "Unavailable", + "Description": "Allow same crane for base and topping (True or False)", + "Name": "landbosse.allow_same_flag" + }, + "bearing_pressure_n_m2": { + "Units": "-", + "Description": "Bearing Pressure (n/m2)", + "Name": "landbosse.bearing_pressure_n_m2" + }, + "blade_drag_coefficient": { + "Units": "-", + "Description": "None", + "Name": "landbosse.blade_drag_coefficient" + }, + "blade_drag_multiplier": { + "Units": "-", + "Description": "None", + "Name": "landbosse.blade_drag_multiplier" + }, + "blade_install_cycle_time": { + "Units": "h", + "Description": "None", + "Name": "landbosse.blade_install_cycle_time" + }, + "blade_lever_arm": { + "Units": "m", + "Description": "None", + "Name": "landbosse.blade_lever_arm" + }, + "blade_mass": { + "Units": "kg", + "Description": "The mass of one rotor blade.Total mass of one blade", + "Name": "landbosse.blade_mass" + }, + "blade_offload_cycle_time": { + "Units": "h", + "Description": "None", + "Name": "landbosse.blade_offload_cycle_time" + }, + "blade_offload_hook_height": { + "Units": "m", + "Description": "None", + "Name": "landbosse.blade_offload_hook_height" + }, + "bos_capex": { + "Units": "USD", + "Description": "Total BOS CAPEX not including commissioning or decommissioning.", + "Name": "landbosse.bos_capex" + }, + "bos_capex_kW": { + "Units": "USD/kW", + "Description": "Total BOS CAPEX per kW not including commissioning or decommissioning.", + "Name": "landbosse.bos_capex_kW" + }, + "breakpoint_between_base_and_topping_percent": { + "Units": "-", + "Description": "Breakpoint between base and topping (percent)", + "Name": "landbosse.breakpoint_between_base_and_topping_percent" + }, + "cable_specs": { + "Units": "Unavailable", + "Description": "cable specs for collection system", + "Name": "landbosse.cable_specs" + }, + "commissioning_pct": { + "Units": "-", + "Description": "None", + "Name": "landbosse.commissioning_pct" + }, + "components": { + "Units": "Unavailable", + "Description": "Dataframe of components for tower, blade, nacelle", + "Name": "landbosse.components" + }, + "construct_duration": { + "Units": "-", + "Description": "Total project construction time (months)", + "Name": "landbosse.construct_duration" + }, + "crane_breakdown_fraction": { + "Units": "-", + "Description": "0 means the crane is never broken down. 1 means it is broken down every turbine.", + "Name": "landbosse.crane_breakdown_fraction" + }, + "crane_specs": { + "Units": "Unavailable", + "Description": "Dataframe of specifications of cranes", + "Name": "landbosse.crane_specs" + }, + "crane_width": { + "Units": "m", + "Description": "Crane width (m)", + "Name": "landbosse.crane_width" + }, + "crew": { + "Units": "Unavailable", + "Description": "Dataframe of crew configurations", + "Name": "landbosse.crew" + }, + "crew_price": { + "Units": "Unavailable", + "Description": "Dataframe of costs per hour for each type of worker.", + "Name": "landbosse.crew_price" + }, + "critical_height_non_erection_wind_delays_m": { + "Units": "m", + "Description": "Non-Erection Wind Delay Critical Height (m)", + "Name": "landbosse.critical_height_non_erection_wind_delays_m" + }, + "critical_speed_non_erection_wind_delays_m_per_s": { + "Units": "m/s", + "Description": "Non-Erection Wind Delay Critical Speed (m/s)", + "Name": "landbosse.critical_speed_non_erection_wind_delays_m_per_s" + }, + "decommissioning_pct": { + "Units": "-", + "Description": "None", + "Name": "landbosse.decommissioning_pct" + }, + "depth": { + "Units": "m", + "Description": "Foundation depth mdepth of foundation in the soil", + "Name": "landbosse.depth" + }, + "development_labor_cost_usd": { + "Units": "USD", + "Description": "The cost of labor in the development phase", + "Name": "landbosse.development_labor_cost_usd" + }, + "distance_to_interconnect_mi": { + "Units": "mi", + "Description": "Distance to interconnect (miles)", + "Name": "landbosse.distance_to_interconnect_mi" + }, + "equip": { + "Units": "Unavailable", + "Description": "Collections of equipment to perform erection operations.", + "Name": "landbosse.equip" + }, + "equip_price": { + "Units": "Unavailable", + "Description": "Prices for various type of equipment.", + "Name": "landbosse.equip_price" + }, + "erection_component_name_topvbase": { + "Units": "Unavailable", + "Description": "List of components and whether they are a topping or base operation", + "Name": "landbosse.erection_component_name_topvbase" + }, + "erection_components": { + "Units": "Unavailable", + "Description": "List of components with their values modified from the defaults.", + "Name": "landbosse.erection_components" + }, + "erection_crane_choice": { + "Units": "Unavailable", + "Description": "The crane choices for erection.", + "Name": "landbosse.erection_crane_choice" + }, + "foundation_height": { + "Units": "m", + "Description": "starting height of tower", + "Name": "landbosse.foundation_height" + }, + "fraction_new_roads": { + "Units": "-", + "Description": "Percent of roads that will be constructed (0.0 - 1.0)", + "Name": "landbosse.fraction_new_roads" + }, + "fuel_cost_usd_per_gal": { + "Units": "-", + "Description": "Fuel cost USD/gal", + "Name": "landbosse.fuel_cost_usd_per_gal" + }, + "gust_velocity_m_per_s": { + "Units": "m/s", + "Description": "50-year Gust Velocity (m/s)", + "Name": "landbosse.gust_velocity_m_per_s" + }, + "hour_day": { + "Units": "Unavailable", + "Description": "Dictionary of normal and long hours for construction in a day in the form of {'long': 24, 'normal': 10}", + "Name": "landbosse.hour_day" + }, + "hub_height_meters": { + "Units": "m", + "Description": "Hub height m", + "Name": "landbosse.hub_height_meters" + }, + "hub_mass": { + "Units": "kg", + "Description": "Mass of the rotor hubTotal mass of the hub shell, including the flanges", + "Name": "landbosse.hub_mass" + }, + "installation_capex": { + "Units": "USD", + "Description": "Total foundation and erection installation cost.", + "Name": "landbosse.installation_capex" + }, + "installation_capex_kW": { + "Units": "USD", + "Description": "Total foundation and erection installation cost per kW.", + "Name": "landbosse.installation_capex_kW" + }, + "installation_time_months": { + "Units": "-", + "Description": "Total balance of system installation time (months).", + "Name": "landbosse.installation_time_months" + }, + "interconnect_voltage_kV": { + "Units": "kV", + "Description": "Interconnect Voltage (kV)", + "Name": "landbosse.interconnect_voltage_kV" + }, + "labor_cost_multiplier": { + "Units": "-", + "Description": "Labor cost multiplier", + "Name": "landbosse.labor_cost_multiplier" + }, + "landbosse_costs_by_module_type_operation": { + "Units": "Unavailable", + "Description": "The costs by module, type and operation", + "Name": "landbosse.landbosse_costs_by_module_type_operation" + }, + "landbosse_details_by_module": { + "Units": "Unavailable", + "Description": "The details from the run of LandBOSSE. This includes some costs, but mostly other things", + "Name": "landbosse.landbosse_details_by_module" + }, + "line_frequency_hz": { + "Units": "Hz", + "Description": "Line Frequency (Hz)", + "Name": "landbosse.line_frequency_hz" + }, + "markup_contingency": { + "Units": "-", + "Description": "Markup contingency", + "Name": "landbosse.markup_contingency" + }, + "markup_overhead": { + "Units": "-", + "Description": "Markup overhead", + "Name": "landbosse.markup_overhead" + }, + "markup_profit_margin": { + "Units": "-", + "Description": "Markup profit margin", + "Name": "landbosse.markup_profit_margin" + }, + "markup_sales_and_use_tax": { + "Units": "-", + "Description": "Markup sales and use tax", + "Name": "landbosse.markup_sales_and_use_tax" + }, + "markup_warranty_management": { + "Units": "-", + "Description": "Markup warranty management", + "Name": "landbosse.markup_warranty_management" + }, + "material_price": { + "Units": "Unavailable", + "Description": "Prices of materials for foundations and roads", + "Name": "landbosse.material_price" + }, + "nacelle_mass": { + "Units": "kg", + "Description": "Mass of nacelle system", + "Name": "landbosse.nacelle_mass" + }, + "new_switchyard": { + "Units": "Unavailable", + "Description": "New Switchyard (True or False)", + "Name": "landbosse.new_switchyard" + }, + "num_access_roads": { + "Units": "Unavailable", + "Description": "Number of access roads", + "Name": "landbosse.num_access_roads" + }, + "num_hwy_permits": { + "Units": "Unavailable", + "Description": "Number of highway permits", + "Name": "landbosse.num_hwy_permits" + }, + "num_turbines": { + "Units": "Unavailable", + "Description": "Number of turbines in projectNumber of turbines that need scouring protection.", + "Name": "landbosse.num_turbines" + }, + "number_of_blades": { + "Units": "Unavailable", + "Description": "Number of blades on the rotor", + "Name": "landbosse.number_of_blades" + }, + "overtime_multiplier": { + "Units": "-", + "Description": "Overtime multiplier", + "Name": "landbosse.overtime_multiplier" + }, + "project_data": { + "Units": "Unavailable", + "Description": "Dictionary of all dataframes of data", + "Name": "landbosse.project_data" + }, + "rate_of_deliveries": { + "Units": "Unavailable", + "Description": "Rate of deliveries (turbines per week)", + "Name": "landbosse.rate_of_deliveries" + }, + "rated_thrust_N": { + "Units": "N", + "Description": "Rated Thrust (N)", + "Name": "landbosse.rated_thrust_N" + }, + "road_distributed_winnd": { + "Units": "Unavailable", + "Description": "None", + "Name": "landbosse.road_distributed_winnd" + }, + "road_length_adder_m": { + "Units": "m", + "Description": "Road length adder (m)", + "Name": "landbosse.road_length_adder_m" + }, + "road_quality": { + "Units": "-", + "Description": "Road Quality (0-1)", + "Name": "landbosse.road_quality" + }, + "road_thickness": { + "Units": "-", + "Description": "Road thickness (in)", + "Name": "landbosse.road_thickness" + }, + "road_width_ft": { + "Units": "ft", + "Description": "Road width (ft)", + "Name": "landbosse.road_width_ft" + }, + "rotor_diameter_m": { + "Units": "m", + "Description": "Rotor diameter m", + "Name": "landbosse.rotor_diameter_m" + }, + "row_spacing_rotor_diameters": { + "Units": "-", + "Description": "Row spacing (times rotor diameter)", + "Name": "landbosse.row_spacing_rotor_diameters" + }, + "rsmeans": { + "Units": "Unavailable", + "Description": "RSMeans price data", + "Name": "landbosse.rsmeans" + }, + "site_facility_building_area_df": { + "Units": "Unavailable", + "Description": "site_facility_building_area DataFrame", + "Name": "landbosse.site_facility_building_area_df" + }, + "time_construct": { + "Units": "Unavailable", + "Description": "One of the keys in the hour_day dictionary to specify how many hours per day construction happens.", + "Name": "landbosse.time_construct" + }, + "total_capex": { + "Units": "USD", + "Description": "Total BOS CAPEX including commissioning and decommissioning.", + "Name": "landbosse.total_capex" + }, + "total_capex_kW": { + "Units": "USD/kW", + "Description": "Total BOS CAPEX per kW including commissioning and decommissioning.", + "Name": "landbosse.total_capex_kW" + }, + "tower_mass": { + "Units": "kg", + "Description": "Mass of tower", + "Name": "landbosse.tower_mass" + }, + "tower_section_length_m": { + "Units": "m", + "Description": "None", + "Name": "landbosse.tower_section_length_m" + }, + "trench_len_to_substation_km": { + "Units": "km", + "Description": "Combined Homerun Trench Length to Substation (km)", + "Name": "landbosse.trench_len_to_substation_km" + }, + "turbine_rating_MW": { + "Units": "MW", + "Description": "Turbine rating MW", + "Name": "landbosse.turbine_rating_MW" + }, + "turbine_spacing_rotor_diameters": { + "Units": "-", + "Description": "Turbine spacing (times rotor diameter)", + "Name": "landbosse.turbine_spacing_rotor_diameters" + }, + "user_defined_distance_to_grid_connection": { + "Units": "Unavailable", + "Description": "Flag for user-defined home run trench length (True or False)", + "Name": "landbosse.user_defined_distance_to_grid_connection" + }, + "user_defined_home_run_trench": { + "Units": "Unavailable", + "Description": "Flag for user-defined home run trench length (0 = no; 1 = yes)", + "Name": "landbosse.user_defined_home_run_trench" + }, + "weather_window": { + "Units": "Unavailable", + "Description": "Dataframe of wind toolkit data", + "Name": "landbosse.weather_window" + }, + "wind_shear_exponent": { + "Units": "-", + "Description": "Wind shear exponent", + "Name": "landbosse.wind_shear_exponent" + } + }, + "materials": { + "E": { + "Units": "Pa", + "Description": "2D array of the Youngs moduli of the materials. Each row represents a material, the three columns represent E11, E22 and E33.Isotropic Youngs modulus of the materials along the column sections.", + "Name": "materials.E" + }, + "G": { + "Units": "Pa", + "Description": "2D array of the shear moduli of the materials. Each row represents a material, the three columns represent G12, G13 and G23.Isotropic shear modulus of the materials along the column sections.", + "Name": "materials.G" + }, + "Xc": { + "Units": "Pa", + "Description": "2D array of the Ultimate Compressive Strength (UCS) of the materials. Each row represents a material, the three columns represent Xc12, Xc13 and Xc23.", + "Name": "materials.Xc" + }, + "Xt": { + "Units": "Pa", + "Description": "2D array of the Ultimate Tensile Strength (UTS) of the materials. Each row represents a material, the three columns represent Xt12, Xt13 and Xt23.", + "Name": "materials.Xt" + }, + "component_id": { + "Units": "Unavailable", + "Description": "1D array of flags to set whether a material is used in a blade: 0 - coating, 1 - sandwich filler , 2 - shell skin, 3 - shear webs, 4 - spar caps, 5 - TE reinf.isotropic.", + "Name": "materials.component_id" + }, + "fvf": { + "Units": "-", + "Description": "1D array of the non-dimensional fiber volume fraction of the composite materials. Non-composite materials are kept at 0.", + "Name": "materials.fvf" + }, + "fvf_from_yaml": { + "Units": "-", + "Description": "1D array of the non-dimensional fiber volume fraction of the composite materials. Non-composite materials are kept at 0.", + "Name": "materials.fvf_from_yaml" + }, + "fwf": { + "Units": "-", + "Description": "1D array of the non-dimensional fiber weight- fraction of the composite materials. Non-composite materials are kept at 0.", + "Name": "materials.fwf" + }, + "fwf_from_yaml": { + "Units": "-", + "Description": "1D array of the non-dimensional fiber weight- fraction of the composite materials. Non-composite materials are kept at 0.", + "Name": "materials.fwf_from_yaml" + }, + "name": { + "Units": "Unavailable", + "Description": "1D array of names of materials.", + "Name": "materials.name" + }, + "nu": { + "Units": "-", + "Description": "2D array of the Poisson ratio of the materials. Each row represents a material, the three columns represent nu12, nu13 and nu23.poissons ratio of column material", + "Name": "materials.nu" + }, + "orth": { + "Units": "Unavailable", + "Description": "1D array of flags to set whether a material is isotropic (0) or orthtropic (1). Each entry represents a material.", + "Name": "materials.orth" + }, + "ply_t": { + "Units": "m", + "Description": "1D array of the ply thicknesses of the materials. Non-composite materials are kept at 0.", + "Name": "materials.ply_t" + }, + "ply_t_from_yaml": { + "Units": "m", + "Description": "1D array of the ply thicknesses of the materials. Non-composite materials are kept at 0.", + "Name": "materials.ply_t_from_yaml" + }, + "rho": { + "Units": "kg/m**3", + "Description": "1D array of the density of the materials. For composites, this is the density of the laminate.Density of the materials along the column sections.", + "Name": "materials.rho" + }, + "rho_area_dry": { + "Units": "kg/m**2", + "Description": "1D array of the dry aerial density of the composite fabrics. Non-composite materials are kept at 0.", + "Name": "materials.rho_area_dry" + }, + "rho_fiber": { + "Units": "kg/m**3", + "Description": "1D array of the density of the fibers of the materials.", + "Name": "materials.rho_fiber" + }, + "roll_mass": { + "Units": "kg", + "Description": "1D array of the roll mass of the composite fabrics. Non-composite materials are kept at 0.", + "Name": "materials.roll_mass" + }, + "sigma_y": { + "Units": "Pa", + "Description": "Yield stress of the material (in the principle direction for composites).Isotropic yield strength of the materials along the column sections.", + "Name": "materials.sigma_y" + }, + "unit_cost": { + "Units": "USD/kg", + "Description": "1D array of the unit costs of the materials.Unit costs of the materials along the column sections.", + "Name": "materials.unit_cost" + }, + "waste": { + "Units": "-", + "Description": "1D array of the non-dimensional waste fraction of the materials.", + "Name": "materials.waste" + } + }, + "monopile": { + "diameter": { + "Units": "m", + "Description": "1D array of the outer diameter values defined along the tower axis.cylinder diameter at corresponding locations", + "Name": "monopile.diameter" + }, + "foundation_height": { + "Units": "m", + "Description": "Foundation height in respect to the ground level.starting height of tower", + "Name": "monopile.foundation_height" + }, + "gravity_foundation_mass": { + "Units": "kg", + "Description": "extra mass of gravity foundationpoint mass of transition piece", + "Name": "monopile.gravity_foundation_mass" + }, + "height": { + "Units": "m", + "Description": "Scalar of the tower height computed along the z axis.Scalar of the column height computed along the z axis.", + "Name": "monopile.height" + }, + "layer_mat": { + "Units": "Unavailable", + "Description": "1D array of the names of the materials of each layer modeled in the tower structure.", + "Name": "monopile.layer_mat" + }, + "layer_name": { + "Units": "Unavailable", + "Description": "1D array of the names of the layers modeled in the tower structure.", + "Name": "monopile.layer_name" + }, + "layer_thickness": { + "Units": "m", + "Description": "2D array of the thickness of the layers of the tower structure. The first dimension represents each layer, the second dimension represents each piecewise-constant entry of the tower sections.2D array of the thickness of the layers of the column structure. The first\r\ndimension represents each layer, the second dimension represents each piecewise-\r\nconstant entry of the column sections.", + "Name": "monopile.layer_thickness" + }, + "length": { + "Units": "m", + "Description": "Scalar of the tower length computed along its curved axis. A standard straight tower will be as high as long.Length of a single cable connecting the OSS to the interconnection in km.", + "Name": "monopile.length" + }, + "outfitting_factor": { + "Units": "-", + "Description": "Multiplier that accounts for secondary structure mass inside of towerMass fraction added for outfitting", + "Name": "monopile.outfitting_factor" + }, + "ref_axis": { + "Units": "m", + "Description": "2D array of the coordinates (x,y,z) of the tower reference axis. The coordinate system is the global coordinate system of OpenFAST: it is placed at tower base with x pointing downwind, y pointing on the side and z pointing vertically upwards. A standard tower configuration will have zero x and y values and positive z values.", + "Name": "monopile.ref_axis" + }, + "s": { + "Units": "-", + "Description": "1D array of the non-dimensional grid defined along the tower axis (0-tower base, 1-tower top)1D array of the non-dimensional grid defined along the column axis (0-column base,\r\n1-column top)", + "Name": "monopile.s" + }, + "transition_piece_cost": { + "Units": "USD", + "Description": "cost of transition pieceCost of transition piece", + "Name": "monopile.transition_piece_cost" + }, + "transition_piece_mass": { + "Units": "kg", + "Description": "point mass of transition piecepoint mass of transition piece", + "Name": "monopile.transition_piece_mass" + } + }, + "nacelle": { + "L_generator": { + "Units": "m", + "Description": "Generator length along shaftGenerator stack width", + "Name": "nacelle.L_generator" + }, + "bedplate_flange_thickness": { + "Units": "m", + "Description": "Bedplate I-beam flange thicknessBedplate is two parallel I beams, this is the flange thickness", + "Name": "nacelle.bedplate_flange_thickness" + }, + "bedplate_flange_width": { + "Units": "m", + "Description": "Bedplate I-beam flange widthBedplate is two parallel I beams, this is the flange width", + "Name": "nacelle.bedplate_flange_width" + }, + "bedplate_material": { + "Units": "Unavailable", + "Description": "Material name identifier for the bedplate", + "Name": "nacelle.bedplate_material" + }, + "bedplate_wall_thickness": { + "Units": "m", + "Description": "Thickness of hollow elliptical bedplateBedplate wall thickness", + "Name": "nacelle.bedplate_wall_thickness" + }, + "bedplate_web_thickness": { + "Units": "m", + "Description": "Bedplate I-beam web thicknessBedplate is two parallel I beams, this is the web thickness", + "Name": "nacelle.bedplate_web_thickness" + }, + "brake_mass_user": { + "Units": "kg", + "Description": "Override regular regression-based calculation of brake mass with this valueUser override of brake mass", + "Name": "nacelle.brake_mass_user" + }, + "converter_mass_user": { + "Units": "kg", + "Description": "Override regular regression-based calculation of converter mass with this valueOverride regular regression-based calculation of converter mass with this value", + "Name": "nacelle.converter_mass_user" + }, + "distance_hub2mb": { + "Units": "m", + "Description": "Distance from hub flange to first main bearing along shaft", + "Name": "nacelle.distance_hub2mb" + }, + "distance_mb2mb": { + "Units": "m", + "Description": "Distance from first to second main bearing along shaft", + "Name": "nacelle.distance_mb2mb" + }, + "distance_tt_hub": { + "Units": "m", + "Description": "Vertical distance from tower top plane to hub flange", + "Name": "nacelle.distance_tt_hub" + }, + "gear_configuration": { + "Units": "Unavailable", + "Description": "3-letter string of Es or Ps to denote epicyclic or parallel gear configuration3-letter string of Es or Ps to denote epicyclic or parallel gear configuration", + "Name": "nacelle.gear_configuration" + }, + "gear_ratio": { + "Units": "-", + "Description": "Total gear ratio of drivetrain (use 1.0 for direct)overall gearbox ratio", + "Name": "nacelle.gear_ratio" + }, + "gearbox_efficiency": { + "Units": "-", + "Description": "Efficiency of the gearbox. Set to 1.0 for direct-drive", + "Name": "nacelle.gearbox_efficiency" + }, + "hss_diameter": { + "Units": "m", + "Description": "Diameter of high speed shaftLss discretized diameter values at coordinates", + "Name": "nacelle.hss_diameter" + }, + "hss_length": { + "Units": "m", + "Description": "Length of high speed shaft", + "Name": "nacelle.hss_length" + }, + "hss_material": { + "Units": "Unavailable", + "Description": "Material name identifier for the high speed shaft", + "Name": "nacelle.hss_material" + }, + "hss_wall_thickness": { + "Units": "m", + "Description": "Wall thickness of high speed shaftLss discretized thickness values at coordinates", + "Name": "nacelle.hss_wall_thickness" + }, + "hvac_mass_coeff": { + "Units": "kg/kW/m", + "Description": "Regression-based scaling coefficient on machine rating to get HVAC system massRegression-based scaling coefficient on machine rating to get HVAC system mass", + "Name": "nacelle.hvac_mass_coeff" + }, + "lss_diameter": { + "Units": "m", + "Description": "Diameter of low speed shaftLSS outer diameter from hub to bearing 2", + "Name": "nacelle.lss_diameter" + }, + "lss_material": { + "Units": "Unavailable", + "Description": "Material name identifier for the low speed shaft", + "Name": "nacelle.lss_material" + }, + "lss_wall_thickness": { + "Units": "m", + "Description": "Thickness of low speed shaftLSS wall thickness", + "Name": "nacelle.lss_wall_thickness" + }, + "mb1Type": { + "Units": "Unavailable", + "Description": "Type of main bearing: CARB / CRB / SRB / TRB", + "Name": "nacelle.mb1Type" + }, + "mb2Type": { + "Units": "Unavailable", + "Description": "Type of main bearing: CARB / CRB / SRB / TRB", + "Name": "nacelle.mb2Type" + }, + "nose_diameter": { + "Units": "m", + "Description": "Diameter of nose (also called turret or spindle)Nose outer diameter from bearing 1 to bedplate", + "Name": "nacelle.nose_diameter" + }, + "nose_wall_thickness": { + "Units": "m", + "Description": "Thickness of nose (also called turret or spindle)Nose wall thickness", + "Name": "nacelle.nose_wall_thickness" + }, + "overhang": { + "Units": "m", + "Description": "Horizontal distance from tower top edge to hub flangeHorizontal distance between hub and tower-top axis", + "Name": "nacelle.overhang" + }, + "planet_numbers": { + "Units": "Unavailable", + "Description": "Number of planets for epicyclic stages (use 0 for parallel)", + "Name": "nacelle.planet_numbers" + }, + "transformer_mass_user": { + "Units": "kg", + "Description": "Override regular regression-based calculation of transformer mass with this valueOverride regular regression-based calculation of transformer mass with this value", + "Name": "nacelle.transformer_mass_user" + }, + "uptilt": { + "Units": "rad", + "Description": "Nacelle uptilt angle. A standard machine has positive values.", + "Name": "nacelle.uptilt" + }, + "uptower": { + "Units": "Unavailable", + "Description": "If power electronics are located uptower (True) or at tower base (False)Power electronics are placed in the nacelle at the tower top", + "Name": "nacelle.uptower" + } + }, + "orbit": { + "anchor_mass": { + "Units": "kg", + "Description": "Total mass of an anchor", + "Name": "orbit.anchor_mass" + }, + "anchor_type": { + "Units": "Unavailable", + "Description": "Number of mooring lines per platform.SUCTIONPILE or DRAGEMBEDMENT", + "Name": "orbit.anchor_type" + }, + "blade_deck_space": { + "Units": "m**2", + "Description": "Deck space required to transport a blade. Defaults to 0 in order to not be a constraint on installation.", + "Name": "orbit.blade_deck_space" + }, + "blade_mass": { + "Units": "t", + "Description": "mass of an individual blade.Total mass of one blade", + "Name": "orbit.blade_mass" + }, + "boem_review_cost": { + "Units": "USD", + "Description": "Cost for additional review by U.S. Dept of Interior Bureau of Ocean Energy Management (BOEM)", + "Name": "orbit.boem_review_cost" + }, + "bos_capex": { + "Units": "USD", + "Description": "Total BOS CAPEX not including commissioning or decommissioning.", + "Name": "orbit.bos_capex" + }, + "commissioning_pct": { + "Units": "-", + "Description": "Commissioning percent.", + "Name": "orbit.commissioning_pct" + }, + "construction_operations_plan_cost": { + "Units": "USD", + "Description": "Cost to do construction planning", + "Name": "orbit.construction_operations_plan_cost" + }, + "decommissioning_pct": { + "Units": "-", + "Description": "Decommissioning percent.", + "Name": "orbit.decommissioning_pct" + }, + "design_install_plan_cost": { + "Units": "USD", + "Description": "Cost to do installation planning", + "Name": "orbit.design_install_plan_cost" + }, + "feeder": { + "Units": "Unavailable", + "Description": "Vessel configuration to use for (optional) feeder barges.", + "Name": "orbit.feeder" + }, + "hub_height": { + "Units": "m", + "Description": "Turbine hub height.hub height of wind turbine above ground / sea level", + "Name": "orbit.hub_height" + }, + "installation_capex": { + "Units": "USD", + "Description": "Total balance of system installation cost.", + "Name": "orbit.installation_capex" + }, + "installation_time": { + "Units": "h", + "Description": "Total balance of system installation time.", + "Name": "orbit.installation_time" + }, + "interconnection_distance": { + "Units": "km", + "Description": "Distance from landfall to interconnection.", + "Name": "orbit.interconnection_distance" + }, + "monopile_deck_space": { + "Units": "m**2", + "Description": "Deck space required to transport a monopile. Defaults to 0 in order to not be a constraint on installation.", + "Name": "orbit.monopile_deck_space" + }, + "monopile_diameter": { + "Units": "m", + "Description": "Diameter of monopile.", + "Name": "orbit.monopile_diameter" + }, + "monopile_length": { + "Units": "m", + "Description": "Length of monopile.", + "Name": "orbit.monopile_length" + }, + "monopile_mass": { + "Units": "t", + "Description": "mass of an individual monopile.Monopile mass", + "Name": "orbit.monopile_mass" + }, + "mooring_line_diameter": { + "Units": "m", + "Description": "Cross-sectional diameter of a mooring line", + "Name": "orbit.mooring_line_diameter" + }, + "mooring_line_length": { + "Units": "m", + "Description": "Unstretched mooring line lengthUnstretched total mooring line length", + "Name": "orbit.mooring_line_length" + }, + "mooring_line_mass": { + "Units": "kg", + "Description": "Total mass of a mooring line", + "Name": "orbit.mooring_line_mass" + }, + "nacelle_deck_space": { + "Units": "m**2", + "Description": "Deck space required to transport the rotor nacelle assembly (RNA). Defaults to 0 in order to not be a constraint on installation.", + "Name": "orbit.nacelle_deck_space" + }, + "nacelle_mass": { + "Units": "t", + "Description": "mass of the rotor nacelle assembly (RNA).Mass of nacelle system", + "Name": "orbit.nacelle_mass" + }, + "num_assembly_lines": { + "Units": "Unavailable", + "Description": "Number of assembly lines used when assembly occurs at the port.", + "Name": "orbit.num_assembly_lines" + }, + "num_feeders": { + "Units": "Unavailable", + "Description": "Number of feeder barges to use for installation of foundations and turbines.", + "Name": "orbit.num_feeders" + }, + "num_mooring_lines": { + "Units": "Unavailable", + "Description": "Number of mooring lines per platform.", + "Name": "orbit.num_mooring_lines" + }, + "num_port_cranes": { + "Units": "Unavailable", + "Description": "Number of cranes used at the port to load feeders / WTIVS when assembly occurs on-site or assembly cranes when assembling at port.", + "Name": "orbit.num_port_cranes" + }, + "num_station_keeping": { + "Units": "Unavailable", + "Description": "Number of station keeping vessels that attach to floating platforms under tow-out.", + "Name": "orbit.num_station_keeping" + }, + "num_towing": { + "Units": "Unavailable", + "Description": "Number of towing vessels to use for floating platforms that are assembled at port (with or without the turbine).", + "Name": "orbit.num_towing" + }, + "number_of_blades": { + "Units": "Unavailable", + "Description": "Number of blades per turbine.", + "Name": "orbit.number_of_blades" + }, + "number_of_turbines": { + "Units": "Unavailable", + "Description": "Number of turbines.", + "Name": "orbit.number_of_turbines" + }, + "oss_install_vessel": { + "Units": "Unavailable", + "Description": "Vessel configuration to use for installation of offshore substations.", + "Name": "orbit.oss_install_vessel" + }, + "plant_row_spacing": { + "Units": "-", + "Description": "Row spacing in rotor diameters. Not used in ring layouts.", + "Name": "orbit.plant_row_spacing" + }, + "plant_substation_distance": { + "Units": "km", + "Description": "Distance from first turbine in string to substation.", + "Name": "orbit.plant_substation_distance" + }, + "plant_turbine_spacing": { + "Units": "-", + "Description": "Turbine spacing in rotor diameters.", + "Name": "orbit.plant_turbine_spacing" + }, + "port_cost_per_month": { + "Units": "USD/mo", + "Description": "Monthly port costs.", + "Name": "orbit.port_cost_per_month" + }, + "site_assessment_cost": { + "Units": "USD", + "Description": "Cost to execute site assessment", + "Name": "orbit.site_assessment_cost" + }, + "site_assessment_plan_cost": { + "Units": "USD", + "Description": "Cost to do engineering plan for site assessment", + "Name": "orbit.site_assessment_plan_cost" + }, + "site_auction_price": { + "Units": "USD", + "Description": "Cost to secure site lease", + "Name": "orbit.site_auction_price" + }, + "site_depth": { + "Units": "m", + "Description": "Site depth.Average depth at the site in km.", + "Name": "orbit.site_depth" + }, + "site_distance": { + "Units": "km", + "Description": "Distance from site to installation port.", + "Name": "orbit.site_distance" + }, + "site_distance_to_landfall": { + "Units": "km", + "Description": "Distance from site to landfall for export cable.", + "Name": "orbit.site_distance_to_landfall" + }, + "site_mean_windspeed": { + "Units": "m/s", + "Description": "Mean windspeed of the site.", + "Name": "orbit.site_mean_windspeed" + }, + "takt_time": { + "Units": "h", + "Description": "Substructure assembly cycle time when doing assembly at the port.", + "Name": "orbit.takt_time" + }, + "total_capex": { + "Units": "USD", + "Description": "Total BOS CAPEX including commissioning and decommissioning.", + "Name": "orbit.total_capex" + }, + "total_capex_kW": { + "Units": "USD/kW", + "Description": "Total BOS CAPEX including commissioning and decommissioning.", + "Name": "orbit.total_capex_kW" + }, + "tower_deck_space": { + "Units": "m**2", + "Description": "Deck space required to transport the tower. Defaults to 0 in order to not be a constraint on installation.", + "Name": "orbit.tower_deck_space" + }, + "tower_length": { + "Units": "m", + "Description": "Total length of the tower.", + "Name": "orbit.tower_length" + }, + "tower_mass": { + "Units": "t", + "Description": "mass of the total tower.Mass of tower", + "Name": "orbit.tower_mass" + }, + "transition_piece_deck_space": { + "Units": "m**2", + "Description": "Deck space required to transport a transition piece. Defaults to 0 in order to not be a constraint on installation.", + "Name": "orbit.transition_piece_deck_space" + }, + "transition_piece_mass": { + "Units": "t", + "Description": "mass of an individual transition piece.point mass of transition piece", + "Name": "orbit.transition_piece_mass" + }, + "turbine_capex": { + "Units": "USD/kW", + "Description": "Turbine CAPEX", + "Name": "orbit.turbine_capex" + }, + "turbine_rated_windspeed": { + "Units": "m/s", + "Description": "Rated windspeed of the turbine.", + "Name": "orbit.turbine_rated_windspeed" + }, + "turbine_rating": { + "Units": "MW", + "Description": "Rated capacity of a turbine.Capacity of an individual turbine in MW.", + "Name": "orbit.turbine_rating" + }, + "turbine_rotor_diameter": { + "Units": "m", + "Description": "Turbine rotor diameter.", + "Name": "orbit.turbine_rotor_diameter" + }, + "wtiv": { + "Units": "Unavailable", + "Description": "Vessel configuration to use for installation of foundations and turbines.", + "Name": "orbit.wtiv" + } + }, + "outputs_2_screen": { + "Flp_omega": { + "Units": "rad/s", + "Description": "None", + "Name": "outputs_2_screen.Flp_omega" + }, + "Flp_zeta": { + "Units": "-", + "Description": "None", + "Name": "outputs_2_screen.Flp_zeta" + }, + "My_std": { + "Units": "N*m", + "Description": "None", + "Name": "outputs_2_screen.My_std" + }, + "PC_omega": { + "Units": "rad/s", + "Description": "None", + "Name": "outputs_2_screen.PC_omega" + }, + "PC_zeta": { + "Units": "-", + "Description": "None", + "Name": "outputs_2_screen.PC_zeta" + }, + "VS_omega": { + "Units": "rad/s", + "Description": "None", + "Name": "outputs_2_screen.VS_omega" + }, + "VS_zeta": { + "Units": "-", + "Description": "None", + "Name": "outputs_2_screen.VS_zeta" + }, + "aep": { + "Units": "GW * h", + "Description": "None", + "Name": "outputs_2_screen.aep" + }, + "blade_mass": { + "Units": "kg", + "Description": "Total mass of one blade", + "Name": "outputs_2_screen.blade_mass" + }, + "flp1_std": { + "Units": "deg", + "Description": "None", + "Name": "outputs_2_screen.flp1_std" + }, + "lcoe": { + "Units": "USD/MW/h", + "Description": "None", + "Name": "outputs_2_screen.lcoe" + }, + "tip_deflection": { + "Units": "m", + "Description": "Blade tip deflection in yaw x-direction", + "Name": "outputs_2_screen.tip_deflection" + } + }, + "re": { + "A": { + "Units": "m**2", + "Description": "airfoil cross section material areamagnitude of wave acceleration", + "Name": "rotorse.re.A" + }, + "EA": { + "Units": "N", + "Description": "axial stiffness", + "Name": "rotorse.re.EA" + }, + "EIxx": { + "Units": "N*m**2", + "Description": "edgewise stiffness (bending about :ref:`x-axis of airfoil aligned coordinate system `)", + "Name": "rotorse.re.EIxx" + }, + "EIxy": { + "Units": "N*m**2", + "Description": "coupled flap-edge stiffness", + "Name": "rotorse.re.EIxy" + }, + "EIyy": { + "Units": "N*m**2", + "Description": "flatwise stiffness (bending about y-axis of airfoil aligned coordinate system)", + "Name": "rotorse.re.EIyy" + }, + "GJ": { + "Units": "N*m**2", + "Description": "torsional stiffness (about axial z-axis of airfoil aligned coordinate system)", + "Name": "rotorse.re.GJ" + }, + "Tw_iner": { + "Units": "m", + "Description": "Orientation of the section principal inertia axes with respect the blade reference plane", + "Name": "rotorse.re.Tw_iner" + }, + "chord": { + "Units": "m", + "Description": "chord length at each sectionChord length at each section.", + "Name": "rotorse.re.chord" + }, + "precomp": { + "E": { + "Units": "Pa", + "Description": "2D array of the Youngs moduli of the materials. Each row represents a material, the three columns represent E11, E22 and E33.Isotropic Youngs modulus of the materials along the column sections.", + "Name": "rotorse.re.precomp.E" + }, + "G": { + "Units": "Pa", + "Description": "2D array of the shear moduli of the materials. Each row represents a material, the three columns represent G12, G13 and G23.Isotropic shear modulus of the materials along the column sections.", + "Name": "rotorse.re.precomp.G" + }, + "I_all_blades": { + "Units": "kg*m**2", + "Description": "mass moments of inertia of all blades in yaw c.s. order:Ixx, Iyy, Izz, Ixy, Ixz, Iyz", + "Name": "rotorse.re.precomp.I_all_blades" + }, + "blade_mass": { + "Units": "kg", + "Description": "mass of one bladeTotal mass of one blade", + "Name": "rotorse.re.precomp.blade_mass" + }, + "blade_moment_of_inertia": { + "Units": "kg*m**2", + "Description": "mass moment of inertia of blade about hub", + "Name": "rotorse.re.precomp.blade_moment_of_inertia" + }, + "component_id": { + "Units": "Unavailable", + "Description": "1D array of flags to set whether a material is used in a blade: 0 - coating, 1 - sandwich filler , 2 - shell skin, 3 - shear webs, 4 - spar caps, 5 - TE reinf.isotropic.", + "Name": "rotorse.re.precomp.component_id" + }, + "coord_xy_interp": { + "Units": "-", + "Description": "3D array of the non-dimensional x and y airfoil coordinates of the airfoils interpolated along span for n_span stations.", + "Name": "rotorse.re.precomp.coord_xy_interp" + }, + "definition_layer": { + "Units": "Unavailable", + "Description": "1D array of flags identifying how layers are specified in the yaml. 1) all around (skin, paint, ) 2) offset+rotation twist+width (spar caps) 3) offset+user defined rotation+width 4) midpoint TE+width (TE reinf) 5) midpoint LE+width (LE reinf) 6) layer position fixed to other layer (core fillers) 7) start and width 8) end and width 9) start and end nd 10) web layer", + "Name": "rotorse.re.precomp.definition_layer" + }, + "edge_iner": { + "Units": "kg/m", + "Description": "Section lag inertia about the X_G axis per unit length", + "Name": "rotorse.re.precomp.edge_iner" + }, + "fiber_orientation": { + "Units": "deg", + "Description": "2D array of the orientation of the layers of the blade structure. The first dimension represents each layer, the second dimension represents each entry along blade span.", + "Name": "rotorse.re.precomp.fiber_orientation" + }, + "flap_iner": { + "Units": "kg/m", + "Description": "Section flap inertia about the Y_G axis per unit length.", + "Name": "rotorse.re.precomp.flap_iner" + }, + "fvf": { + "Units": "-", + "Description": "1D array of the non-dimensional fiber volume fraction of the composite materials. Non-composite materials are kept at 0.", + "Name": "rotorse.re.precomp.fvf" + }, + "fwf": { + "Units": "-", + "Description": "1D array of the non-dimensional fiber weight- fraction of the composite materials. Non-composite materials are kept at 0.", + "Name": "rotorse.re.precomp.fwf" + }, + "layer_end_nd": { + "Units": "-", + "Description": "2D array of the non-dimensional end point defined along the outer profile of a layer. The TE suction side is 0, the TE pressure side is 1. The first dimension represents each layer, the second dimension represents each entry along blade span.", + "Name": "rotorse.re.precomp.layer_end_nd" + }, + "layer_start_nd": { + "Units": "-", + "Description": "2D array of the non-dimensional start point defined along the outer profile of a layer. The TE suction side is 0, the TE pressure side is 1. The first dimension represents each layer, the second dimension represents each entry along blade span.", + "Name": "rotorse.re.precomp.layer_start_nd" + }, + "layer_thickness": { + "Units": "m", + "Description": "2D array of the thickness of the layers of the blade structure. The first dimension represents each layer, the second dimension represents each entry along blade span.2D array of the thickness of the layers of the column structure. The first\r\ndimension represents each layer, the second dimension represents each piecewise-\r\nconstant entry of the column sections.", + "Name": "rotorse.re.precomp.layer_thickness" + }, + "layer_web": { + "Units": "-", + "Description": "1D array of the web id the layer is associated to. If the layer is on the outer profile, this entry can simply stay equal to 0.", + "Name": "rotorse.re.precomp.layer_web" + }, + "mass_all_blades": { + "Units": "kg", + "Description": "mass of all blades", + "Name": "rotorse.re.precomp.mass_all_blades" + }, + "mat_name": { + "Units": "Unavailable", + "Description": "1D array of names of materials.", + "Name": "rotorse.re.precomp.mat_name" + }, + "n_blades": { + "Units": "Unavailable", + "Description": "Number of blades of the rotor.Number of rotor blades", + "Name": "rotorse.re.precomp.n_blades" + }, + "nu": { + "Units": "-", + "Description": "2D array of the Poisson ratio of the materials. Each row represents a material, the three columns represent nu12, nu13 and nu23.poissons ratio of column material", + "Name": "rotorse.re.precomp.nu" + }, + "orth": { + "Units": "Unavailable", + "Description": "1D array of flags to set whether a material is isotropic (0) or orthtropic (1). Each entry represents a material.", + "Name": "rotorse.re.precomp.orth" + }, + "pitch_axis": { + "Units": "-", + "Description": "1D array of the chordwise position of the pitch axis (0-LE, 1-TE), defined along blade span.", + "Name": "rotorse.re.precomp.pitch_axis" + }, + "ply_t": { + "Units": "m", + "Description": "1D array of the ply thicknesses of the materials. Non-composite materials are kept at 0.", + "Name": "rotorse.re.precomp.ply_t" + }, + "rho": { + "Units": "kg/m**3", + "Description": "1D array of the density of the materials. For composites, this is the density of the laminate.Density of the materials along the column sections.", + "Name": "rotorse.re.precomp.rho" + }, + "rho_area_dry": { + "Units": "kg/m**2", + "Description": "1D array of the dry aerial density of the composite fabrics. Non-composite materials are kept at 0.", + "Name": "rotorse.re.precomp.rho_area_dry" + }, + "rho_fiber": { + "Units": "kg/m**3", + "Description": "1D array of the density of the fibers of the materials.", + "Name": "rotorse.re.precomp.rho_fiber" + }, + "roll_mass": { + "Units": "kg", + "Description": "1D array of the roll mass of the composite fabrics. Non-composite materials are kept at 0.", + "Name": "rotorse.re.precomp.roll_mass" + }, + "total_blade_cost": { + "Units": "USD", + "Description": "total blade cost", + "Name": "rotorse.re.precomp.total_blade_cost" + }, + "total_blade_mass": { + "Units": "USD", + "Description": "total blade cost", + "Name": "rotorse.re.precomp.total_blade_mass" + }, + "unit_cost": { + "Units": "USD/kg", + "Description": "1D array of the unit costs of the materials.Unit costs of the materials along the column sections.", + "Name": "rotorse.re.precomp.unit_cost" + }, + "uptilt": { + "Units": "deg", + "Description": "Nacelle uptilt angle. A standard machine has positive values.", + "Name": "rotorse.re.precomp.uptilt" + }, + "waste": { + "Units": "-", + "Description": "1D array of the non-dimensional waste fraction of the materials.", + "Name": "rotorse.re.precomp.waste" + }, + "web_end_nd": { + "Units": "-", + "Description": "2D array of the non-dimensional end point defined along the outer profile of a web. The TE suction side is 0, the TE pressure side is 1. The first dimension represents each web, the second dimension represents each entry along blade span.", + "Name": "rotorse.re.precomp.web_end_nd" + }, + "web_start_nd": { + "Units": "-", + "Description": "2D array of the non-dimensional start point defined along the outer profile of a web. The TE suction side is 0, the TE pressure side is 1. The first dimension represents each web, the second dimension represents each entry along blade span.", + "Name": "rotorse.re.precomp.web_start_nd" + }, + "x_cg": { + "Units": "m", + "Description": "X-coordinate of the center-of-mass offset with respect to the XR-YR axes", + "Name": "rotorse.re.precomp.x_cg" + }, + "x_tc": { + "Units": "m", + "Description": "X-coordinate of the tension-center offset with respect to the XR-YR axes", + "Name": "rotorse.re.precomp.x_tc" + }, + "xl_strain_spar": { + "Units": "-", + "Description": "x-position of midpoint of spar cap on lower surface for strain calculation", + "Name": "rotorse.re.precomp.xl_strain_spar" + }, + "xl_strain_te": { + "Units": "-", + "Description": "x-position of midpoint of trailing-edge panel on lower surface for strain calculation", + "Name": "rotorse.re.precomp.xl_strain_te" + }, + "xu_strain_spar": { + "Units": "-", + "Description": "x-position of midpoint of spar cap on upper surface for strain calculation", + "Name": "rotorse.re.precomp.xu_strain_spar" + }, + "xu_strain_te": { + "Units": "-", + "Description": "x-position of midpoint of trailing-edge panel on upper surface for strain calculation", + "Name": "rotorse.re.precomp.xu_strain_te" + }, + "y_cg": { + "Units": "m", + "Description": "Chordwise offset of the section center of mass with respect to the XR-YR axes", + "Name": "rotorse.re.precomp.y_cg" + }, + "y_tc": { + "Units": "m", + "Description": "Chordwise offset of the section tension-center with respect to the XR-YR axes", + "Name": "rotorse.re.precomp.y_tc" + }, + "yl_strain_spar": { + "Units": "-", + "Description": "y-position of midpoint of spar cap on lower surface for strain calculation", + "Name": "rotorse.re.precomp.yl_strain_spar" + }, + "yl_strain_te": { + "Units": "-", + "Description": "y-position of midpoint of trailing-edge panel on lower surface for strain calculation", + "Name": "rotorse.re.precomp.yl_strain_te" + }, + "yu_strain_spar": { + "Units": "-", + "Description": "y-position of midpoint of spar cap on upper surface for strain calculation", + "Name": "rotorse.re.precomp.yu_strain_spar" + }, + "yu_strain_te": { + "Units": "-", + "Description": "y-position of midpoint of trailing-edge panel on upper surface for strain calculation", + "Name": "rotorse.re.precomp.yu_strain_te" + }, + "z": { + "Units": "m", + "Description": "locations of properties along beamlocation along cylinder. start at bottom and go to top", + "Name": "rotorse.re.precomp.z" + } + }, + "precurve": { + "Units": "m", + "Description": "precurve at each sectionPrecurve at each section.", + "Name": "rotorse.re.precurve" + }, + "presweep": { + "Units": "m", + "Description": "presweep at each section", + "Name": "rotorse.re.presweep" + }, + "r": { + "Units": "m", + "Description": "radial locations where blade is defined (should be increasing and not go all the way to hub or tip)Radial locations where blade is defined. Should be increasing and not\r\ngo all the way to hub or tip.", + "Name": "rotorse.re.r" + }, + "rail": { + "blade_ref_axis": { + "Units": "m", + "Description": "2D array of the coordinates (x,y,z) of the blade reference axis, defined along blade span. The coordinate system is the one of BeamDyn: it is placed at blade root with x pointing the suction side of the blade, y pointing the trailing edge and z along the blade span. A standard configuration will have negative x values (prebend), if swept positive y values, and positive z values.", + "Name": "rotorse.re.rail.blade_ref_axis" + }, + "constr_LV_4axle_horiz": { + "Units": "-", + "Description": "Constraint for max L/V for a 4-axle flatcar on horiz curves, violated when bigger than 1", + "Name": "rotorse.re.rail.constr_LV_4axle_horiz" + }, + "constr_LV_4axle_vert": { + "Units": "-", + "Description": "Constraint for max L/V for a 4-axle flatcar on vert curves, violated when bigger than 1", + "Name": "rotorse.re.rail.constr_LV_4axle_vert" + }, + "constr_LV_8axle_horiz": { + "Units": "-", + "Description": "Constraint for max L/V for an 8-axle flatcar on horiz curves, violated when bigger than 1", + "Name": "rotorse.re.rail.constr_LV_8axle_horiz" + }, + "constr_LV_8axle_vert": { + "Units": "-", + "Description": "Constraint for max L/V for an 8-axle flatcar on vert curves, violated when bigger than 1", + "Name": "rotorse.re.rail.constr_LV_8axle_vert" + }, + "constr_strainLE": { + "Units": "-", + "Description": "Strain along leading edge side of blade on a vertical curve", + "Name": "rotorse.re.rail.constr_strainLE" + }, + "constr_strainPS": { + "Units": "-", + "Description": "Strain along pressure side of blade on a horizontal curve", + "Name": "rotorse.re.rail.constr_strainPS" + }, + "constr_strainSS": { + "Units": "-", + "Description": "Strain along suction side of blade on a horizontal curve", + "Name": "rotorse.re.rail.constr_strainSS" + }, + "constr_strainTE": { + "Units": "-", + "Description": "Strain along trailing edge side of blade on a vertical curve", + "Name": "rotorse.re.rail.constr_strainTE" + }, + "coord_xy_dim": { + "Units": "m", + "Description": "3D array of the dimensional x and y airfoil coordinates of the airfoils interpolated along span for n_span stations. The origin is placed at the pitch axis.", + "Name": "rotorse.re.rail.coord_xy_dim" + }, + "coord_xy_interp": { + "Units": "-", + "Description": "3D array of the non-dimensional x and y airfoil coordinates of the airfoils interpolated along span for n_span stations. The leading edge is place at x=0 and y=0.", + "Name": "rotorse.re.rail.coord_xy_interp" + }, + "deck_height": { + "Units": "m", + "Description": "Height of the deck of the flatcar from the rails (4 feet)", + "Name": "rotorse.re.rail.deck_height" + }, + "flatcar_tc_length": { + "Units": "m", + "Description": "Flatcar truck center to truck center lenght", + "Name": "rotorse.re.rail.flatcar_tc_length" + }, + "horizontal_angle_deg": { + "Units": "deg", + "Description": "Angle of horizontal turn (defined for an chord of 100 feet)", + "Name": "rotorse.re.rail.horizontal_angle_deg" + }, + "lateral_clearance": { + "Units": "m", + "Description": "Clearance profile horizontal (22 feet)", + "Name": "rotorse.re.rail.lateral_clearance" + }, + "max_LV": { + "Units": "-", + "Description": "Max allowable ratio between lateral and vertical forces", + "Name": "rotorse.re.rail.max_LV" + }, + "max_flatcar_weight_4axle": { + "Units": "kg", + "Description": "Max mass of an 4-axle flatcar (286000 lbm)", + "Name": "rotorse.re.rail.max_flatcar_weight_4axle" + }, + "max_flatcar_weight_8axle": { + "Units": "kg", + "Description": "Max mass of an 8-axle flatcar (480000 lbm)", + "Name": "rotorse.re.rail.max_flatcar_weight_8axle" + }, + "max_root_rot_deg": { + "Units": "deg", + "Description": "Max degree of angle at blade root", + "Name": "rotorse.re.rail.max_root_rot_deg" + }, + "max_strains": { + "Units": "-", + "Description": "Max allowable strains during transport", + "Name": "rotorse.re.rail.max_strains" + }, + "min_vertical_radius": { + "Units": "m", + "Description": "Minimum radius of a vertical curvature (hill or sag) (2000 feet)", + "Name": "rotorse.re.rail.min_vertical_radius" + }, + "pitch_axis": { + "Units": "-", + "Description": "1D array of the chordwise position of the pitch axis (0-LE, 1-TE), defined along blade span.", + "Name": "rotorse.re.rail.pitch_axis" + }, + "vertical_clearance": { + "Units": "m", + "Description": "Clearance profile vertical (23 feet)", + "Name": "rotorse.re.rail.vertical_clearance" + } + }, + "rhoA": { + "Units": "kg/m", + "Description": "mass per unit length", + "Name": "rotorse.re.rhoA" + }, + "rhoJ": { + "Units": "kg*m", + "Description": "polar mass moment of inertia per unit length", + "Name": "rotorse.re.rhoJ" + }, + "sc_ps_mats": { + "Units": "-", + "Description": "spar cap, pressure side, boolean of materials in each composite layer spanwise, passed as floats for differentiablity, used for Fatigue Analysis", + "Name": "rotorse.re.sc_ps_mats" + }, + "sc_ss_mats": { + "Units": "-", + "Description": "spar cap, suction side, boolean of materials in each composite layer spanwise, passed as floats for differentiablity, used for Fatigue Analysis", + "Name": "rotorse.re.sc_ss_mats" + }, + "te_ps_mats": { + "Units": "-", + "Description": "trailing edge reinforcement, pressure side, boolean of materials in each composite layer spanwise, passed as floats for differentiablity, used for Fatigue Analysis", + "Name": "rotorse.re.te_ps_mats" + }, + "te_ss_mats": { + "Units": "-", + "Description": "trailing edge reinforcement, suction side, boolean of materials in each composite layer spanwise, passed as floats for differentiablity, used for Fatigue Analysis", + "Name": "rotorse.re.te_ss_mats" + }, + "theta": { + "Units": "deg", + "Description": "Twist angle at each section (positive decreases angle of attack)Twist angle at each section (positive decreases angle of attack).", + "Name": "rotorse.re.theta" + }, + "x_ec": { + "Units": "m", + "Description": "x-distance to elastic center from point about which above structural properties are computed (airfoil aligned coordinate system)", + "Name": "rotorse.re.x_ec" + }, + "x_sc": { + "Units": "m", + "Description": "X-coordinate of the shear-center offset with respect to the XR-YR axes", + "Name": "rotorse.re.x_sc" + }, + "y_ec": { + "Units": "m", + "Description": "y-distance to elastic center from point about which above structural properties are computed", + "Name": "rotorse.re.y_ec" + }, + "y_sc": { + "Units": "m", + "Description": "Chordwise offset of the section shear-center with respect to the reference frame, XR-YR", + "Name": "rotorse.re.y_sc" + } + }, + "rp": { + "AEP": { + "Units": "kW*h", + "Description": "annual energy production", + "Name": "rotorse.rp.AEP" + }, + "Rhub": { + "Units": "m", + "Description": "hub radiusHub radius.", + "Name": "rotorse.rp.Rhub" + }, + "Rtip": { + "Units": "m", + "Description": "tip radiusBlade tip location in z_b", + "Name": "rotorse.rp.Rtip" + }, + "aep": { + "CDF_V": { + "Units": "m/s", + "Description": "cumulative distribution function evaluated at each wind speed", + "Name": "rotorse.rp.aep.CDF_V" + }, + "P": { + "Units": "W", + "Description": "power curve (power)", + "Name": "rotorse.rp.aep.P" + }, + "lossFactor": { + "Units": "-", + "Description": "multiplicative factor for availability and other losses (soiling, array, etc.)", + "Name": "rotorse.rp.aep.lossFactor" + } + }, + "airfoils_Re": { + "Units": "-", + "Description": "Reynolds numbers of polarsReynolds numbers of polars.", + "Name": "rotorse.rp.airfoils_Re" + }, + "airfoils_aoa": { + "Units": "deg", + "Description": "angle of attack grid for polarsAngle of attack grid for polars.", + "Name": "rotorse.rp.airfoils_aoa" + }, + "airfoils_cd": { + "Units": "-", + "Description": "drag coefficients, spanwiseDrag coefficients, spanwise.", + "Name": "rotorse.rp.airfoils_cd" + }, + "airfoils_cl": { + "Units": "-", + "Description": "lift coefficients, spanwiseLift coefficients, spanwise.", + "Name": "rotorse.rp.airfoils_cl" + }, + "airfoils_cm": { + "Units": "-", + "Description": "moment coefficients, spanwiseMoment coefficients, spanwise.", + "Name": "rotorse.rp.airfoils_cm" + }, + "cdf": { + "F": { + "Units": "m/s", + "Description": "magnitude of wind speed at each z location", + "Name": "rotorse.rp.cdf.F" + }, + "k": { + "Units": "-", + "Description": "shape or form factor", + "Name": "rotorse.rp.cdf.k" + }, + "x": { + "Units": "m/s", + "Description": "corresponding reference height", + "Name": "rotorse.rp.cdf.x" + }, + "xbar": { + "Units": "m/s", + "Description": "mean value of distribution", + "Name": "rotorse.rp.cdf.xbar" + } + }, + "chord": { + "Units": "m", + "Description": "chord length at each sectionChord length at each section.", + "Name": "rotorse.rp.chord" + }, + "control_maxTS": { + "Units": "m/s", + "Description": "maximum allowed blade tip speed", + "Name": "rotorse.rp.control_maxTS" + }, + "control_pitch": { + "Units": "deg", + "Description": "pitch angle in region 2 (and region 3 for fixed pitch machines)", + "Name": "rotorse.rp.control_pitch" + }, + "drivetrainType": { + "Units": "Unavailable", + "Description": "None", + "Name": "rotorse.rp.drivetrainType" + }, + "gust": { + "V_gust": { + "Units": "m/s", + "Description": "gust wind speed", + "Name": "rotorse.rp.gust.V_gust" + }, + "V_hub": { + "Units": "m/s", + "Description": "hub height wind speed", + "Name": "rotorse.rp.gust.V_hub" + }, + "V_mean": { + "Units": "m/s", + "Description": "IEC average wind speed for turbine class", + "Name": "rotorse.rp.gust.V_mean" + }, + "std": { + "Units": "-", + "Description": "number of standard deviations for strength of gust", + "Name": "rotorse.rp.gust.std" + }, + "turbulence_class": { + "Units": "Unavailable", + "Description": "IEC turbulence class", + "Name": "rotorse.rp.gust.turbulence_class" + } + }, + "hub_height": { + "Units": "m", + "Description": "hub heighthub height of wind turbine above ground / sea level", + "Name": "rotorse.rp.hub_height" + }, + "mu": { + "Units": "kg/(m*s)", + "Description": "dynamic viscosity of airDynamic viscosity of air", + "Name": "rotorse.rp.mu" + }, + "nBlades": { + "Units": "Unavailable", + "Description": "number of bladesNumber of blades", + "Name": "rotorse.rp.nBlades" + }, + "omega_max": { + "Units": "rpm", + "Description": "maximum allowed rotor rotation speed", + "Name": "rotorse.rp.omega_max" + }, + "omega_min": { + "Units": "rpm", + "Description": "minimum allowed rotor rotation speed", + "Name": "rotorse.rp.omega_min" + }, + "powercurve": { + "Cm_aero": { + "Units": "-", + "Description": "rotor aerodynamic moment coefficient", + "Name": "rotorse.rp.powercurve.Cm_aero" + }, + "Cp": { + "Units": "-", + "Description": "rotor electrical power coefficient", + "Name": "rotorse.rp.powercurve.Cp" + }, + "Cp_aero": { + "Units": "-", + "Description": "rotor aerodynamic power coefficient", + "Name": "rotorse.rp.powercurve.Cp_aero" + }, + "Cp_regII": { + "Units": "-", + "Description": "power coefficient at cut-in wind speed", + "Name": "rotorse.rp.powercurve.Cp_regII" + }, + "Cq_aero": { + "Units": "-", + "Description": "rotor aerodynamic torque coefficient", + "Name": "rotorse.rp.powercurve.Cq_aero" + }, + "Ct_aero": { + "Units": "-", + "Description": "rotor aerodynamic thrust coefficient", + "Name": "rotorse.rp.powercurve.Ct_aero" + }, + "M": { + "Units": "N*m", + "Description": "blade root moment", + "Name": "rotorse.rp.powercurve.M" + }, + "Omega": { + "Units": "rpm", + "Description": "rotor rotational speed", + "Name": "rotorse.rp.powercurve.Omega" + }, + "Omega_spline": { + "Units": "rpm", + "Description": "omega", + "Name": "rotorse.rp.powercurve.Omega_spline" + }, + "P": { + "Units": "W", + "Description": "rotor electrical power", + "Name": "rotorse.rp.powercurve.P" + }, + "P_aero": { + "Units": "W", + "Description": "rotor mechanical power", + "Name": "rotorse.rp.powercurve.P_aero" + }, + "P_spline": { + "Units": "W", + "Description": "rotor electrical power", + "Name": "rotorse.rp.powercurve.P_spline" + }, + "Q": { + "Units": "N*m", + "Description": "rotor aerodynamic torque", + "Name": "rotorse.rp.powercurve.Q" + }, + "T": { + "Units": "N", + "Description": "rotor aerodynamic thrust", + "Name": "rotorse.rp.powercurve.T" + }, + "V": { + "Units": "m/s", + "Description": "wind vector", + "Name": "rotorse.rp.powercurve.V" + }, + "V_R25": { + "Units": "m/s", + "Description": "region 2.5 transition wind speed", + "Name": "rotorse.rp.powercurve.V_R25" + }, + "V_spline": { + "Units": "m/s", + "Description": "wind vector", + "Name": "rotorse.rp.powercurve.V_spline" + }, + "aoa_regII": { + "Units": "deg", + "Description": "angle of attack distribution along blade span at cut-in wind speed", + "Name": "rotorse.rp.powercurve.aoa_regII" + }, + "ax_induct_regII": { + "Units": "-", + "Description": "rotor axial induction at cut-in wind speed along blade span", + "Name": "rotorse.rp.powercurve.ax_induct_regII" + }, + "cd_regII": { + "Units": "-", + "Description": "drag coefficient distribution along blade span at cut-in wind speed", + "Name": "rotorse.rp.powercurve.cd_regII" + }, + "cl_regII": { + "Units": "-", + "Description": "lift coefficient distribution along blade span at cut-in wind speed", + "Name": "rotorse.rp.powercurve.cl_regII" + }, + "gearbox_efficiency": { + "Units": "-", + "Description": "None", + "Name": "rotorse.rp.powercurve.gearbox_efficiency" + }, + "generator_efficiency": { + "Units": "-", + "Description": "Generator efficiency at various rpm values to support table lookup", + "Name": "rotorse.rp.powercurve.generator_efficiency" + }, + "hubloss": { + "Units": "Unavailable", + "Description": "include Prandtl hub loss modelInclude Prandtl hub loss model.", + "Name": "rotorse.rp.powercurve.hubloss" + }, + "lss_rpm": { + "Units": "rpm", + "Description": "Low speed shaft RPM values at which the generator efficiency values are given", + "Name": "rotorse.rp.powercurve.lss_rpm" + }, + "nSector": { + "Units": "Unavailable", + "Description": "number of sectors to divide rotor face into in computing thrust and powerNumber of sectors to divide rotor face into in computing thrust and power.", + "Name": "rotorse.rp.powercurve.nSector" + }, + "pitch": { + "Units": "deg", + "Description": "rotor pitch schedule", + "Name": "rotorse.rp.powercurve.pitch" + }, + "rated_Omega": { + "Units": "rpm", + "Description": "rotor rotation speed at rated", + "Name": "rotorse.rp.powercurve.rated_Omega" + }, + "rated_Q": { + "Units": "N*m", + "Description": "rotor aerodynamic torque at rated", + "Name": "rotorse.rp.powercurve.rated_Q" + }, + "rated_T": { + "Units": "N", + "Description": "rotor aerodynamic thrust at rated", + "Name": "rotorse.rp.powercurve.rated_T" + }, + "rated_V": { + "Units": "m/s", + "Description": "rated wind speed", + "Name": "rotorse.rp.powercurve.rated_V" + }, + "rated_efficiency": { + "Units": "-", + "Description": "Efficiency at rated conditions", + "Name": "rotorse.rp.powercurve.rated_efficiency" + }, + "rated_mech": { + "Units": "W", + "Description": "Mechanical shaft power at rated", + "Name": "rotorse.rp.powercurve.rated_mech" + }, + "rated_pitch": { + "Units": "deg", + "Description": "pitch setting at rated", + "Name": "rotorse.rp.powercurve.rated_pitch" + }, + "shearExp": { + "Units": "-", + "Description": "shear exponentshear exponent", + "Name": "rotorse.rp.powercurve.shearExp" + }, + "tang_induct_regII": { + "Units": "-", + "Description": "rotor tangential induction at cut-in wind speed along blade span", + "Name": "rotorse.rp.powercurve.tang_induct_regII" + }, + "tiploss": { + "Units": "Unavailable", + "Description": "include Prandtl tip loss modelInclude Prandtl tip loss model.", + "Name": "rotorse.rp.powercurve.tiploss" + }, + "usecd": { + "Units": "Unavailable", + "Description": "use drag coefficient in computing induction factorsUse drag coefficient in computing induction factors.", + "Name": "rotorse.rp.powercurve.usecd" + }, + "wakerotation": { + "Units": "Unavailable", + "Description": "include effect of wake rotation (i.e., tangential induction factor is nonzero)Iclude effect of wake rotation (i.e., tangential induction factor is nonzero).", + "Name": "rotorse.rp.powercurve.wakerotation" + } + }, + "precone": { + "Units": "deg", + "Description": "precone angleRotor precone angle", + "Name": "rotorse.rp.precone" + }, + "precurve": { + "Units": "m", + "Description": "precurve at each sectionPrecurve at each section.", + "Name": "rotorse.rp.precurve" + }, + "precurveTip": { + "Units": "m", + "Description": "precurve at tipPrecurve at tip.", + "Name": "rotorse.rp.precurveTip" + }, + "presweep": { + "Units": "m", + "Description": "presweep at each section", + "Name": "rotorse.rp.presweep" + }, + "presweepTip": { + "Units": "m", + "Description": "presweep at tip", + "Name": "rotorse.rp.presweepTip" + }, + "r": { + "Units": "m", + "Description": "radial locations where blade is defined (should be increasing and not go all the way to hub or tip)Radial locations where blade is defined. Should be increasing and not\r\ngo all the way to hub or tip.", + "Name": "rotorse.rp.r" + }, + "rated_power": { + "Units": "W", + "Description": "electrical rated power", + "Name": "rotorse.rp.rated_power" + }, + "rho": { + "Units": "kg/m**3", + "Description": "density of airDensity of the materials along the column sections.", + "Name": "rotorse.rp.rho" + }, + "theta": { + "Units": "deg", + "Description": "twist angle at each section (positive decreases angle of attack)Twist angle at each section (positive decreases angle of attack).", + "Name": "rotorse.rp.theta" + }, + "tilt": { + "Units": "deg", + "Description": "shaft tiltNacelle uptilt angle", + "Name": "rotorse.rp.tilt" + }, + "tsr_operational": { + "Units": "-", + "Description": "tip-speed ratio in Region 2 (should be optimized externally)", + "Name": "rotorse.rp.tsr_operational" + }, + "v_max": { + "Units": "m/s", + "Description": "cut-out wind speed", + "Name": "rotorse.rp.v_max" + }, + "v_min": { + "Units": "m/s", + "Description": "cut-in wind speed", + "Name": "rotorse.rp.v_min" + }, + "yaw": { + "Units": "deg", + "Description": "yaw erroryaw angle", + "Name": "rotorse.rp.yaw" + } + }, + "rs": { + "3d_curv": { + "Units": "deg", + "Description": "total cone angle from precone and curvature", + "Name": "rotorse.rs.3d_curv" + }, + "A": { + "Units": "m**2", + "Description": "airfoil cross section material areamagnitude of wave acceleration", + "Name": "rotorse.rs.A" + }, + "EA": { + "Units": "N", + "Description": "axial stiffness", + "Name": "rotorse.rs.EA" + }, + "EIxx": { + "Units": "N*m**2", + "Description": "edgewise stiffness (bending about :ref:`x-axis of airfoil aligned coordinate system `)", + "Name": "rotorse.rs.EIxx" + }, + "EIxy": { + "Units": "N*m**2", + "Description": "coupled flap-edge stiffness", + "Name": "rotorse.rs.EIxy" + }, + "EIyy": { + "Units": "N*m**2", + "Description": "flapwise stiffness (bending about y-axis of airfoil aligned coordinate system)", + "Name": "rotorse.rs.EIyy" + }, + "GJ": { + "Units": "N*m**2", + "Description": "torsional stiffness (about axial z-direction of airfoil aligned coordinate system)", + "Name": "rotorse.rs.GJ" + }, + "Omega_load": { + "Units": "rpm", + "Description": "Rotor rotation speed.", + "Name": "rotorse.rs.Omega_load" + }, + "Rhub": { + "Units": "m", + "Description": "Hub radius.", + "Name": "rotorse.rs.Rhub" + }, + "Rtip": { + "Units": "m", + "Description": "Blade tip location in z_b", + "Name": "rotorse.rs.Rtip" + }, + "aero_gust": { + "V_load": { + "Units": "m/s", + "Description": "Hub height wind speed.", + "Name": "rotorse.rs.aero_gust.V_load" + }, + "azimuth_load": { + "Units": "deg", + "Description": "Blade azimuthal location.", + "Name": "rotorse.rs.aero_gust.azimuth_load" + }, + "hubloss": { + "Units": "Unavailable", + "Description": "Include Prandtl hub loss model.", + "Name": "rotorse.rs.aero_gust.hubloss" + }, + "loads_Px": { + "Units": "N/m", + "Description": "None", + "Name": "rotorse.rs.aero_gust.loads_Px" + }, + "loads_Py": { + "Units": "N/m", + "Description": "None", + "Name": "rotorse.rs.aero_gust.loads_Py" + }, + "loads_Pz": { + "Units": "N/m", + "Description": "None", + "Name": "rotorse.rs.aero_gust.loads_Pz" + }, + "loads_r": { + "Units": "m", + "Description": "None", + "Name": "rotorse.rs.aero_gust.loads_r" + }, + "nSector": { + "Units": "Unavailable", + "Description": "Number of sectors to divide rotor face into in computing thrust and power.", + "Name": "rotorse.rs.aero_gust.nSector" + }, + "precurve": { + "Units": "m", + "Description": "Precurve at each section.", + "Name": "rotorse.rs.aero_gust.precurve" + }, + "precurveTip": { + "Units": "m", + "Description": "Precurve at tip.", + "Name": "rotorse.rs.aero_gust.precurveTip" + }, + "shearExp": { + "Units": "-", + "Description": "shear exponent", + "Name": "rotorse.rs.aero_gust.shearExp" + }, + "tiploss": { + "Units": "Unavailable", + "Description": "Include Prandtl tip loss model.", + "Name": "rotorse.rs.aero_gust.tiploss" + }, + "usecd": { + "Units": "Unavailable", + "Description": "Use drag coefficient in computing induction factors.", + "Name": "rotorse.rs.aero_gust.usecd" + }, + "wakerotation": { + "Units": "Unavailable", + "Description": "Iclude effect of wake rotation (i.e., tangential induction factor is nonzero).", + "Name": "rotorse.rs.aero_gust.wakerotation" + }, + "yaw": { + "Units": "deg", + "Description": "yaw angle", + "Name": "rotorse.rs.aero_gust.yaw" + } + }, + "aero_hub_loads": { + "Fxyz_blade_aero": { + "Units": "N", + "Description": "Forces at blade root from aerodynamic loading in the blade c.s.", + "Name": "rotorse.rs.aero_hub_loads.Fxyz_blade_aero" + }, + "Fxyz_hub_aero": { + "Units": "N", + "Description": "None", + "Name": "rotorse.rs.aero_hub_loads.Fxyz_hub_aero" + }, + "Mxyz_blade_aero": { + "Units": "N*m", + "Description": "Moments at blade root from aerodynamic loading in the blade c.s.", + "Name": "rotorse.rs.aero_hub_loads.Mxyz_blade_aero" + }, + "Mxyz_hub_aero": { + "Units": "N*m", + "Description": "None", + "Name": "rotorse.rs.aero_hub_loads.Mxyz_hub_aero" + }, + "V_load": { + "Units": "m/s", + "Description": "Hub height wind speed.", + "Name": "rotorse.rs.aero_hub_loads.V_load" + }, + "hubloss": { + "Units": "Unavailable", + "Description": "Include Prandtl hub loss model.", + "Name": "rotorse.rs.aero_hub_loads.hubloss" + }, + "precurve": { + "Units": "m", + "Description": "Precurve at each section.", + "Name": "rotorse.rs.aero_hub_loads.precurve" + }, + "precurveTip": { + "Units": "m", + "Description": "Precurve at tip.", + "Name": "rotorse.rs.aero_hub_loads.precurveTip" + }, + "shearExp": { + "Units": "-", + "Description": "shear exponent", + "Name": "rotorse.rs.aero_hub_loads.shearExp" + }, + "tiploss": { + "Units": "Unavailable", + "Description": "Include Prandtl tip loss model.", + "Name": "rotorse.rs.aero_hub_loads.tiploss" + }, + "usecd": { + "Units": "Unavailable", + "Description": "Use drag coefficient in computing induction factors.", + "Name": "rotorse.rs.aero_hub_loads.usecd" + }, + "wakerotation": { + "Units": "Unavailable", + "Description": "Iclude effect of wake rotation (i.e., tangential induction factor is nonzero).", + "Name": "rotorse.rs.aero_hub_loads.wakerotation" + }, + "yaw": { + "Units": "deg", + "Description": "yaw angle", + "Name": "rotorse.rs.aero_hub_loads.yaw" + } + }, + "airfoils_Re": { + "Units": "-", + "Description": "Reynolds numbers of polars.", + "Name": "rotorse.rs.airfoils_Re" + }, + "airfoils_aoa": { + "Units": "deg", + "Description": "Angle of attack grid for polars.", + "Name": "rotorse.rs.airfoils_aoa" + }, + "airfoils_cd": { + "Units": "-", + "Description": "Drag coefficients, spanwise.", + "Name": "rotorse.rs.airfoils_cd" + }, + "airfoils_cl": { + "Units": "-", + "Description": "Lift coefficients, spanwise.", + "Name": "rotorse.rs.airfoils_cl" + }, + "airfoils_cm": { + "Units": "-", + "Description": "Moment coefficients, spanwise.", + "Name": "rotorse.rs.airfoils_cm" + }, + "chord": { + "Units": "m", + "Description": "Chord length at each section.", + "Name": "rotorse.rs.chord" + }, + "constr": { + "blade_number": { + "Units": "Unavailable", + "Description": "number of rotor blades", + "Name": "rotorse.rs.constr.blade_number" + }, + "constr_edge_f_margin": { + "Units": "-", + "Description": "constraint on edge blade frequency such that ratio of 3P/f is above or below gamma with constraint <= 0", + "Name": "rotorse.rs.constr.constr_edge_f_margin" + }, + "constr_flap_f_margin": { + "Units": "-", + "Description": "constraint on flap blade frequency such that ratio of 3P/f is above or below gamma with constraint <= 0", + "Name": "rotorse.rs.constr.constr_flap_f_margin" + }, + "constr_max_strainL_spar": { + "Units": "-", + "Description": "constraint for maximum strain in spar cap pressure side", + "Name": "rotorse.rs.constr.constr_max_strainL_spar" + }, + "constr_max_strainU_spar": { + "Units": "-", + "Description": "constraint for maximum strain in spar cap suction side", + "Name": "rotorse.rs.constr.constr_max_strainU_spar" + }, + "edge_mode_freqs": { + "Units": "Hz", + "Description": "Frequencies associated with mode shapes in the edge direction", + "Name": "rotorse.rs.constr.edge_mode_freqs" + }, + "flap_mode_freqs": { + "Units": "Hz", + "Description": "Frequencies associated with mode shapes in the flap direction", + "Name": "rotorse.rs.constr.flap_mode_freqs" + }, + "max_strainL_spar": { + "Units": "-", + "Description": "maximum strain in spar cap pressure side", + "Name": "rotorse.rs.constr.max_strainL_spar" + }, + "max_strainU_spar": { + "Units": "-", + "Description": "minimum strain in spar cap pressure side", + "Name": "rotorse.rs.constr.max_strainU_spar" + }, + "min_strainL_spar": { + "Units": "-", + "Description": "maximum strain in spar cap suction side", + "Name": "rotorse.rs.constr.min_strainL_spar" + }, + "min_strainU_spar": { + "Units": "-", + "Description": "minimum strain in spar cap suction side", + "Name": "rotorse.rs.constr.min_strainU_spar" + }, + "rated_Omega": { + "Units": "rpm", + "Description": "rotor rotation speed at rated", + "Name": "rotorse.rs.constr.rated_Omega" + }, + "s": { + "Units": "-", + "Description": "1D array of the non-dimensional spanwise grid defined along blade axis (0-blade root, 1-blade tip)1D array of the non-dimensional grid defined along the column axis (0-column base,\r\n1-column top)", + "Name": "rotorse.rs.constr.s" + }, + "s_opt_spar_cap_ps": { + "Units": "-", + "Description": "1D array of the non-dimensional spanwise grid defined along blade axis to optimize the blade spar cap suction side", + "Name": "rotorse.rs.constr.s_opt_spar_cap_ps" + }, + "s_opt_spar_cap_ss": { + "Units": "-", + "Description": "1D array of the non-dimensional spanwise grid defined along blade axis to optimize the blade spar cap suction side", + "Name": "rotorse.rs.constr.s_opt_spar_cap_ss" + }, + "strainL_spar": { + "Units": "-", + "Description": "strain in spar cap on lower surface at location xl,yl_strain with loads P_strain", + "Name": "rotorse.rs.constr.strainL_spar" + }, + "strainU_spar": { + "Units": "-", + "Description": "strain in spar cap on upper surface at location xu,yu_strain with loads P_strain", + "Name": "rotorse.rs.constr.strainU_spar" + } + }, + "curvature": { + "s": { + "Units": "m", + "Description": "cumulative path length along blade1D array of the non-dimensional grid defined along the column axis (0-column base,\r\n1-column top)", + "Name": "rotorse.rs.curvature.s" + } + }, + "frame": { + "Px_af": { + "Units": "-", + "Description": "distributed load (force per unit length) in airfoil x-direction", + "Name": "rotorse.rs.frame.Px_af" + }, + "Py_af": { + "Units": "-", + "Description": "distributed load (force per unit length) in airfoil y-direction", + "Name": "rotorse.rs.frame.Py_af" + }, + "Pz_af": { + "Units": "-", + "Description": "distributed load (force per unit length) in airfoil z-direction", + "Name": "rotorse.rs.frame.Pz_af" + }, + "all_mode_shapes": { + "Units": "-", + "Description": "6-degree polynomial coefficients of mode shapes in the edge direction (x^2..x^6, no linear or constant term)", + "Name": "rotorse.rs.frame.all_mode_shapes" + }, + "dx": { + "Units": "m", + "Description": "deflection of blade section in airfoil x-direction", + "Name": "rotorse.rs.frame.dx" + }, + "dy": { + "Units": "m", + "Description": "deflection of blade section in airfoil y-direction", + "Name": "rotorse.rs.frame.dy" + }, + "dz": { + "Units": "m", + "Description": "deflection of blade section in airfoil z-direction", + "Name": "rotorse.rs.frame.dz" + }, + "edge_mode_freqs": { + "Units": "Hz", + "Description": "Frequencies associated with mode shapes in the edge direction", + "Name": "rotorse.rs.frame.edge_mode_freqs" + }, + "edge_mode_shapes": { + "Units": "-", + "Description": "6-degree polynomial coefficients of mode shapes in the edge direction (x^2..x^6, no linear or constant term)", + "Name": "rotorse.rs.frame.edge_mode_shapes" + }, + "flap_mode_freqs": { + "Units": "Hz", + "Description": "Frequencies associated with mode shapes in the flap direction", + "Name": "rotorse.rs.frame.flap_mode_freqs" + }, + "flap_mode_shapes": { + "Units": "-", + "Description": "6-degree polynomial coefficients of mode shapes in the flap direction (x^2..x^6, no linear or constant term)", + "Name": "rotorse.rs.frame.flap_mode_shapes" + }, + "freq_distance": { + "Units": "-", + "Description": "ration of 2nd and 1st natural frequencies, should be ratio of edgewise to flapwise", + "Name": "rotorse.rs.frame.freq_distance" + }, + "freqs": { + "Units": "Hz", + "Description": "ration of 2nd and 1st natural frequencies, should be ratio of edgewise to flapwiseNatural frequencies of the structure", + "Name": "rotorse.rs.frame.freqs" + }, + "root_F": { + "Units": "N", + "Description": "Blade root forces in blade c.s.", + "Name": "rotorse.rs.frame.root_F" + }, + "root_M": { + "Units": "N*m", + "Description": "Blade root moment in blade c.s.", + "Name": "rotorse.rs.frame.root_M" + }, + "strainL_spar": { + "Units": "-", + "Description": "strain in spar cap on lower surface at location xl,yl_strain with loads P_strain", + "Name": "rotorse.rs.frame.strainL_spar" + }, + "strainL_te": { + "Units": "-", + "Description": "strain in trailing-edge panels on lower surface at location xl,yl_te with loads P_te", + "Name": "rotorse.rs.frame.strainL_te" + }, + "strainU_spar": { + "Units": "-", + "Description": "strain in spar cap on upper surface at location xu,yu_strain with loads P_strain", + "Name": "rotorse.rs.frame.strainU_spar" + }, + "strainU_te": { + "Units": "-", + "Description": "strain in trailing-edge panels on upper surface at location xu,yu_te with loads P_te", + "Name": "rotorse.rs.frame.strainU_te" + } + }, + "hub_height": { + "Units": "m", + "Description": "hub height of wind turbine above ground / sea level", + "Name": "rotorse.rs.hub_height" + }, + "mu": { + "Units": "kg/(m*s)", + "Description": "Dynamic viscosity of air", + "Name": "rotorse.rs.mu" + }, + "nBlades": { + "Units": "Unavailable", + "Description": "Number of blades", + "Name": "rotorse.rs.nBlades" + }, + "pitch_load": { + "Units": "deg", + "Description": "Blade pitch setting.", + "Name": "rotorse.rs.pitch_load" + }, + "precone": { + "Units": "deg", + "Description": "Rotor precone angle", + "Name": "rotorse.rs.precone" + }, + "precurve": { + "Units": "m", + "Description": "location in blade x-coordinatePrecurve at each section.", + "Name": "rotorse.rs.precurve" + }, + "presweep": { + "Units": "m", + "Description": "location in blade y-coordinate", + "Name": "rotorse.rs.presweep" + }, + "r": { + "Units": "m", + "Description": "Radial locations where blade is defined. Should be increasing and not\r\ngo all the way to hub or tip.", + "Name": "rotorse.rs.r" + }, + "rho": { + "Units": "kg/m**3", + "Description": "Density of the materials along the column sections.", + "Name": "rotorse.rs.rho" + }, + "rhoA": { + "Units": "kg/m", + "Description": "mass per unit length", + "Name": "rotorse.rs.rhoA" + }, + "rhoJ": { + "Units": "kg*m", + "Description": "polar mass moment of inertia per unit length", + "Name": "rotorse.rs.rhoJ" + }, + "theta": { + "Units": "deg", + "Description": "Twist angle at each section (positive decreases angle of attack).", + "Name": "rotorse.rs.theta" + }, + "tilt": { + "Units": "deg", + "Description": "Nacelle uptilt angle", + "Name": "rotorse.rs.tilt" + }, + "tip_pos": { + "3d_curv_tip": { + "Units": "deg", + "Description": "total coning angle including precone and curvature", + "Name": "rotorse.rs.tip_pos.3d_curv_tip" + }, + "dx_tip": { + "Units": "m", + "Description": "deflection at tip in blade x-direction", + "Name": "rotorse.rs.tip_pos.dx_tip" + }, + "dy_tip": { + "Units": "m", + "Description": "deflection at tip in blade y-direction", + "Name": "rotorse.rs.tip_pos.dy_tip" + }, + "dynamicFactor": { + "Units": "-", + "Description": "a dynamic amplification factor to adjust the static deflection calculation", + "Name": "rotorse.rs.tip_pos.dynamicFactor" + }, + "dz_tip": { + "Units": "m", + "Description": "deflection at tip in blade z-direction", + "Name": "rotorse.rs.tip_pos.dz_tip" + }, + "tip_deflection": { + "Units": "m", + "Description": "deflection at tip in yaw x-directionBlade tip deflection in yaw x-direction", + "Name": "rotorse.rs.tip_pos.tip_deflection" + } + }, + "tot_loads_gust": { + "Px_af": { + "Units": "-", + "Description": "total distributed loads in airfoil x-direction", + "Name": "rotorse.rs.tot_loads_gust.Px_af" + }, + "Py_af": { + "Units": "-", + "Description": "total distributed loads in airfoil y-direction", + "Name": "rotorse.rs.tot_loads_gust.Py_af" + }, + "Pz_af": { + "Units": "-", + "Description": "total distributed loads in airfoil z-direction", + "Name": "rotorse.rs.tot_loads_gust.Pz_af" + }, + "aeroloads_Omega": { + "Units": "rpm", + "Description": "rotor rotation speed", + "Name": "rotorse.rs.tot_loads_gust.aeroloads_Omega" + }, + "aeroloads_Px": { + "Units": "N/m", + "Description": "distributed loads in blade-aligned x-direction", + "Name": "rotorse.rs.tot_loads_gust.aeroloads_Px" + }, + "aeroloads_Py": { + "Units": "N/m", + "Description": "distributed loads in blade-aligned y-direction", + "Name": "rotorse.rs.tot_loads_gust.aeroloads_Py" + }, + "aeroloads_Pz": { + "Units": "N/m", + "Description": "distributed loads in blade-aligned z-direction", + "Name": "rotorse.rs.tot_loads_gust.aeroloads_Pz" + }, + "aeroloads_azimuth": { + "Units": "deg", + "Description": "azimuthal angle", + "Name": "rotorse.rs.tot_loads_gust.aeroloads_azimuth" + }, + "aeroloads_pitch": { + "Units": "deg", + "Description": "pitch angle", + "Name": "rotorse.rs.tot_loads_gust.aeroloads_pitch" + }, + "dynamicFactor": { + "Units": "-", + "Description": "a dynamic amplification factor to adjust the static deflection calculation", + "Name": "rotorse.rs.tot_loads_gust.dynamicFactor" + } + }, + "x_az": { + "Units": "m", + "Description": "location of blade in azimuth x-coordinate system (prebend)", + "Name": "rotorse.rs.x_az" + }, + "x_ec": { + "Units": "m", + "Description": "x-distance to elastic center from point about which above structural properties are computed (airfoil aligned coordinate system)", + "Name": "rotorse.rs.x_ec" + }, + "xl_strain_spar": { + "Units": "-", + "Description": "x-position of midpoint of spar cap on lower surface for strain calculation", + "Name": "rotorse.rs.xl_strain_spar" + }, + "xl_strain_te": { + "Units": "-", + "Description": "x-position of midpoint of trailing-edge panel on lower surface for strain calculation", + "Name": "rotorse.rs.xl_strain_te" + }, + "xu_strain_spar": { + "Units": "-", + "Description": "x-position of midpoint of spar cap on upper surface for strain calculation", + "Name": "rotorse.rs.xu_strain_spar" + }, + "xu_strain_te": { + "Units": "-", + "Description": "x-position of midpoint of trailing-edge panel on upper surface for strain calculation", + "Name": "rotorse.rs.xu_strain_te" + }, + "y_az": { + "Units": "m", + "Description": "location of blade in azimuth y-coordinate system (sweep)", + "Name": "rotorse.rs.y_az" + }, + "y_ec": { + "Units": "m", + "Description": "y-distance to elastic center from point about which above structural properties are computed", + "Name": "rotorse.rs.y_ec" + }, + "yl_strain_spar": { + "Units": "-", + "Description": "y-position of midpoint of spar cap on lower surface for strain calculation", + "Name": "rotorse.rs.yl_strain_spar" + }, + "yl_strain_te": { + "Units": "-", + "Description": "y-position of midpoint of trailing-edge panel on lower surface for strain calculation", + "Name": "rotorse.rs.yl_strain_te" + }, + "yu_strain_spar": { + "Units": "-", + "Description": "y-position of midpoint of spar cap on upper surface for strain calculation", + "Name": "rotorse.rs.yu_strain_spar" + }, + "yu_strain_te": { + "Units": "-", + "Description": "y-position of midpoint of trailing-edge panel on upper surface for strain calculation", + "Name": "rotorse.rs.yu_strain_te" + }, + "z_az": { + "Units": "m", + "Description": "location of blade in azimuth z-coordinate system", + "Name": "rotorse.rs.z_az" + } + }, + "stall_check": { + "airfoils_aoa": { + "Units": "deg", + "Description": "angle of attack grid for polarsAngle of attack grid for polars.", + "Name": "rotorse.stall_check.airfoils_aoa" + }, + "airfoils_cd": { + "Units": "-", + "Description": "drag coefficients, spanwiseDrag coefficients, spanwise.", + "Name": "rotorse.stall_check.airfoils_cd" + }, + "airfoils_cl": { + "Units": "-", + "Description": "lift coefficients, spanwiseLift coefficients, spanwise.", + "Name": "rotorse.stall_check.airfoils_cl" + }, + "airfoils_cm": { + "Units": "-", + "Description": "moment coefficients, spanwiseMoment coefficients, spanwise.", + "Name": "rotorse.stall_check.airfoils_cm" + }, + "aoa_along_span": { + "Units": "deg", + "Description": "Angle of attack along blade span", + "Name": "rotorse.stall_check.aoa_along_span" + }, + "min_s": { + "Units": "-", + "Description": "Minimum nondimensional coordinate along blade span where to define the constraint (blade root typically stalls)", + "Name": "rotorse.stall_check.min_s" + }, + "no_stall_constraint": { + "Units": "-", + "Description": "Constraint, ratio between angle of attack plus a margin and stall angle", + "Name": "rotorse.stall_check.no_stall_constraint" + }, + "s": { + "Units": "-", + "Description": "1D array of the non-dimensional spanwise grid defined along blade axis (0-blade root, 1-blade tip)1D array of the non-dimensional grid defined along the column axis (0-column base,\r\n1-column top)", + "Name": "rotorse.stall_check.s" + }, + "stall_angle_along_span": { + "Units": "deg", + "Description": "Stall angle along blade span", + "Name": "rotorse.stall_check.stall_angle_along_span" + }, + "stall_margin": { + "Units": "deg", + "Description": "Minimum margin from the stall angle", + "Name": "rotorse.stall_check.stall_margin" + } + }, + "tcc": { + "bearing_mass_cost_coeff": { + "Units": "USD/kg", + "Description": "main bearing mass-cost coeff", + "Name": "tcc.bearing_mass_cost_coeff" + }, + "bedplate_cost": { + "Units": "USD", + "Description": "bedplate cost", + "Name": "tcc.bedplate_cost" + }, + "bedplate_mass": { + "Units": "kg", + "Description": "component mass", + "Name": "tcc.bedplate_mass" + }, + "bedplate_mass_cost_coeff": { + "Units": "USD/kg", + "Description": "bedplate mass-cost coeff", + "Name": "tcc.bedplate_mass_cost_coeff" + }, + "blade_cost": { + "Units": "USD", + "Description": "Individual blade cost", + "Name": "tcc.blade_cost" + }, + "blade_cost_external": { + "Units": "USD", + "Description": "Blade cost computed by RotorSE", + "Name": "tcc.blade_cost_external" + }, + "blade_mass": { + "Units": "kg", + "Description": "Total mass of one blade", + "Name": "tcc.blade_mass" + }, + "blade_mass_cost_coeff": { + "Units": "USD/kg", + "Description": "blade mass-cost coeff", + "Name": "tcc.blade_mass_cost_coeff" + }, + "blade_number": { + "Units": "Unavailable", + "Description": "number of rotor blades", + "Name": "tcc.blade_number" + }, + "brake_cost": { + "Units": "USD", + "Description": "brake cost", + "Name": "tcc.brake_cost" + }, + "brake_mass": { + "Units": "kg", + "Description": "component mass", + "Name": "tcc.brake_mass" + }, + "brake_mass_cost_coeff": { + "Units": "USD/kg", + "Description": "brake mass-cost coeff", + "Name": "tcc.brake_mass_cost_coeff" + }, + "controls_cost": { + "Units": "USD", + "Description": "controls cost", + "Name": "tcc.controls_cost" + }, + "controls_machine_rating_cost_coeff": { + "Units": "USD/kW", + "Description": "controls cost coefficient per kW", + "Name": "tcc.controls_machine_rating_cost_coeff" + }, + "converter_cost": { + "Units": "USD", + "Description": "converter cost", + "Name": "tcc.converter_cost" + }, + "converter_mass": { + "Units": "kg", + "Description": "overall component mass", + "Name": "tcc.converter_mass" + }, + "converter_mass_cost_coeff": { + "Units": "USD/kg", + "Description": "variable speed electronics mass cost coeff", + "Name": "tcc.converter_mass_cost_coeff" + }, + "cover_cost": { + "Units": "USD", + "Description": "cover cost", + "Name": "tcc.cover_cost" + }, + "cover_mass": { + "Units": "kg", + "Description": "component mass", + "Name": "tcc.cover_mass" + }, + "cover_mass_cost_coeff": { + "Units": "USD/kg", + "Description": "nacelle cover mass cost coeff", + "Name": "tcc.cover_mass_cost_coeff" + }, + "crane": { + "Units": "Unavailable", + "Description": "flag for presence of onboard crane", + "Name": "tcc.crane" + }, + "crane_cost": { + "Units": "USD", + "Description": "crane cost if present", + "Name": "tcc.crane_cost" + }, + "elec_connec_machine_rating_cost_coeff": { + "Units": "USD/kW", + "Description": "electrical connections cost coefficient per kW", + "Name": "tcc.elec_connec_machine_rating_cost_coeff" + }, + "elec_cost": { + "Units": "USD", + "Description": "elec cost", + "Name": "tcc.elec_cost" + }, + "gearbox_cost": { + "Units": "USD", + "Description": "gearbox cost", + "Name": "tcc.gearbox_cost" + }, + "gearbox_mass": { + "Units": "kg", + "Description": "Gearbox rotor mass", + "Name": "tcc.gearbox_mass" + }, + "gearbox_mass_cost_coeff": { + "Units": "USD/kg", + "Description": "gearbox mass-cost coeff", + "Name": "tcc.gearbox_mass_cost_coeff" + }, + "generator_cost": { + "Units": "USD", + "Description": "generator cost", + "Name": "tcc.generator_cost" + }, + "generator_cost_external": { + "Units": "USD", + "Description": "Generator cost computed by GeneratorSE", + "Name": "tcc.generator_cost_external" + }, + "generator_mass": { + "Units": "kg", + "Description": "Actual mass", + "Name": "tcc.generator_mass" + }, + "generator_mass_cost_coeff": { + "Units": "USD/kg", + "Description": "generator mass cost coeff", + "Name": "tcc.generator_mass_cost_coeff" + }, + "hss_cost": { + "Units": "USD", + "Description": "hss cost", + "Name": "tcc.hss_cost" + }, + "hss_mass": { + "Units": "kg", + "Description": "component mass", + "Name": "tcc.hss_mass" + }, + "hss_mass_cost_coeff": { + "Units": "USD/kg", + "Description": "high speed shaft mass-cost coeff", + "Name": "tcc.hss_mass_cost_coeff" + }, + "hub_assemblyCostMultiplier": { + "Units": "-", + "Description": "Rotor assembly cost multiplier", + "Name": "tcc.hub_assemblyCostMultiplier" + }, + "hub_cost": { + "Units": "USD", + "Description": "Cost of the hub shell, including flanges", + "Name": "tcc.hub_cost" + }, + "hub_mass": { + "Units": "kg", + "Description": "Total mass of the hub shell, including the flanges", + "Name": "tcc.hub_mass" + }, + "hub_mass_cost_coeff": { + "Units": "USD/kg", + "Description": "hub mass-cost coeff", + "Name": "tcc.hub_mass_cost_coeff" + }, + "hub_overheadCostMultiplier": { + "Units": "-", + "Description": "Rotor overhead cost multiplier", + "Name": "tcc.hub_overheadCostMultiplier" + }, + "hub_profitMultiplier": { + "Units": "-", + "Description": "Rotor profit multiplier", + "Name": "tcc.hub_profitMultiplier" + }, + "hub_system_cost": { + "Units": "USD", + "Description": "Cost for hub system", + "Name": "tcc.hub_system_cost" + }, + "hub_system_mass_tcc": { + "Units": "kg", + "Description": "Mass for hub system", + "Name": "tcc.hub_system_mass_tcc" + }, + "hub_transportMultiplier": { + "Units": "-", + "Description": "Rotor transport multiplier", + "Name": "tcc.hub_transportMultiplier" + }, + "hvac_cost": { + "Units": "USD", + "Description": "hvac cost", + "Name": "tcc.hvac_cost" + }, + "hvac_mass": { + "Units": "kg", + "Description": "component mass", + "Name": "tcc.hvac_mass" + }, + "hvac_mass_cost_coeff": { + "Units": "USD/kg", + "Description": "hydraulic and cooling system mass cost coeff", + "Name": "tcc.hvac_mass_cost_coeff" + }, + "lss_cost": { + "Units": "USD", + "Description": "lss cost", + "Name": "tcc.lss_cost" + }, + "lss_mass": { + "Units": "kg", + "Description": "LSS mass", + "Name": "tcc.lss_mass" + }, + "lss_mass_cost_coeff": { + "Units": "USD/kg", + "Description": "low speed shaft mass-cost coeff", + "Name": "tcc.lss_mass_cost_coeff" + }, + "machine_rating": { + "Units": "kW", + "Description": "Machine rating", + "Name": "tcc.machine_rating" + }, + "main_bearing_cost": { + "Units": "USD", + "Description": "main_bearing cost", + "Name": "tcc.main_bearing_cost" + }, + "main_bearing_mass": { + "Units": "kg", + "Description": "Main bearing mass", + "Name": "tcc.main_bearing_mass" + }, + "main_bearing_number": { + "Units": "Unavailable", + "Description": "number of bearings", + "Name": "tcc.main_bearing_number" + }, + "nacelle_assemblyCostMultiplier": { + "Units": "-", + "Description": "nacelle assembly cost multiplier", + "Name": "tcc.nacelle_assemblyCostMultiplier" + }, + "nacelle_cost": { + "Units": "USD", + "Description": "Nacelle cost", + "Name": "tcc.nacelle_cost" + }, + "nacelle_mass_tcc": { + "Units": "kg", + "Description": "Nacelle mass", + "Name": "tcc.nacelle_mass_tcc" + }, + "nacelle_overheadCostMultiplier": { + "Units": "-", + "Description": "nacelle overhead cost multiplier", + "Name": "tcc.nacelle_overheadCostMultiplier" + }, + "nacelle_profitMultiplier": { + "Units": "-", + "Description": "nacelle profit multiplier", + "Name": "tcc.nacelle_profitMultiplier" + }, + "nacelle_transportMultiplier": { + "Units": "-", + "Description": "nacelle transport multiplier", + "Name": "tcc.nacelle_transportMultiplier" + }, + "pitch_system_cost": { + "Units": "USD", + "Description": "pitch_system cost", + "Name": "tcc.pitch_system_cost" + }, + "pitch_system_mass": { + "Units": "kg", + "Description": "component mass", + "Name": "tcc.pitch_system_mass" + }, + "pitch_system_mass_cost_coeff": { + "Units": "USD/kg", + "Description": "pitch system mass-cost coeff", + "Name": "tcc.pitch_system_mass_cost_coeff" + }, + "platforms_cost": { + "Units": "USD", + "Description": "platforms cost", + "Name": "tcc.platforms_cost" + }, + "platforms_mass": { + "Units": "kg", + "Description": "component mass", + "Name": "tcc.platforms_mass" + }, + "platforms_mass_cost_coeff": { + "Units": "USD/kg", + "Description": "nacelle platforms mass cost coeff", + "Name": "tcc.platforms_mass_cost_coeff" + }, + "rotor_cost": { + "Units": "USD", + "Description": "Rotor cost", + "Name": "tcc.rotor_cost" + }, + "rotor_mass_tcc": { + "Units": "kg", + "Description": "Rotor mass", + "Name": "tcc.rotor_mass_tcc" + }, + "spinner_cost": { + "Units": "USD", + "Description": "Cost of the spinner", + "Name": "tcc.spinner_cost" + }, + "spinner_mass": { + "Units": "kg", + "Description": "Total mass of the spinner", + "Name": "tcc.spinner_mass" + }, + "spinner_mass_cost_coeff": { + "Units": "USD/kg", + "Description": "spinner/nose cone mass-cost coeff", + "Name": "tcc.spinner_mass_cost_coeff" + }, + "tower_assemblyCostMultiplier": { + "Units": "-", + "Description": "tower assembly cost multiplier", + "Name": "tcc.tower_assemblyCostMultiplier" + }, + "tower_cost": { + "Units": "USD", + "Description": "Tower cost", + "Name": "tcc.tower_cost" + }, + "tower_cost_external": { + "Units": "USD", + "Description": "Tower cost computed by TowerSE", + "Name": "tcc.tower_cost_external" + }, + "tower_mass": { + "Units": "kg", + "Description": "Mass of tower", + "Name": "tcc.tower_mass" + }, + "tower_mass_cost_coeff": { + "Units": "USD/kg", + "Description": "tower mass-cost coeff", + "Name": "tcc.tower_mass_cost_coeff" + }, + "tower_overheadCostMultiplier": { + "Units": "-", + "Description": "tower overhead cost multiplier", + "Name": "tcc.tower_overheadCostMultiplier" + }, + "tower_parts_cost": { + "Units": "USD", + "Description": "component cost", + "Name": "tcc.tower_parts_cost" + }, + "tower_profitMultiplier": { + "Units": "-", + "Description": "tower profit cost multiplier", + "Name": "tcc.tower_profitMultiplier" + }, + "tower_transportMultiplier": { + "Units": "-", + "Description": "tower transport cost multiplier", + "Name": "tcc.tower_transportMultiplier" + }, + "transformer_cost": { + "Units": "USD", + "Description": "transformer cost", + "Name": "tcc.transformer_cost" + }, + "transformer_mass": { + "Units": "kg", + "Description": "overall component mass", + "Name": "tcc.transformer_mass" + }, + "transformer_mass_cost_coeff": { + "Units": "USD/kg", + "Description": "transformer mass cost coeff", + "Name": "tcc.transformer_mass_cost_coeff" + }, + "turbine_assemblyCostMultiplier": { + "Units": "-", + "Description": "Turbine multiplier for assembly cost in manufacturing", + "Name": "tcc.turbine_assemblyCostMultiplier" + }, + "turbine_cost": { + "Units": "USD", + "Description": "Overall turbine costs", + "Name": "tcc.turbine_cost" + }, + "turbine_cost_kW": { + "Units": "USD/kW", + "Description": "Overall wind turbine capital costs including transportation costs per kW", + "Name": "tcc.turbine_cost_kW" + }, + "turbine_mass_tcc": { + "Units": "kg", + "Description": "Turbine mass", + "Name": "tcc.turbine_mass_tcc" + }, + "turbine_overheadCostMultiplier": { + "Units": "-", + "Description": "Turbine multiplier for overhead", + "Name": "tcc.turbine_overheadCostMultiplier" + }, + "turbine_profitMultiplier": { + "Units": "-", + "Description": "Turbine multiplier for profit markup", + "Name": "tcc.turbine_profitMultiplier" + }, + "turbine_transportMultiplier": { + "Units": "-", + "Description": "Turbine multiplier for transport costs", + "Name": "tcc.turbine_transportMultiplier" + }, + "yaw_mass": { + "Units": "kg", + "Description": "overall component mass", + "Name": "tcc.yaw_mass" + }, + "yaw_mass_cost_coeff": { + "Units": "USD/kg", + "Description": "yaw system mass cost coeff", + "Name": "tcc.yaw_mass_cost_coeff" + }, + "yaw_system_cost": { + "Units": "USD", + "Description": "yaw_system cost", + "Name": "tcc.yaw_system_cost" + } + }, + "tcons": { + "Rtip": { + "Units": "m", + "Description": "Blade tip location in z_b", + "Name": "tcons.Rtip" + }, + "blade_number": { + "Units": "Unavailable", + "Description": "number of rotor blades", + "Name": "tcons.blade_number" + }, + "blade_tip_tower_clearance": { + "Units": "m", + "Description": "None", + "Name": "tcons.blade_tip_tower_clearance" + }, + "constr_tower_f_1Pmargin": { + "Units": "-", + "Description": "constraint on tower frequency such that ratio of 1P/f is above or below gamma with constraint <= 0", + "Name": "tcons.constr_tower_f_1Pmargin" + }, + "constr_tower_f_NPmargin": { + "Units": "-", + "Description": "constraint on tower frequency such that ratio of 3P/f is above or below gamma with constraint <= 0", + "Name": "tcons.constr_tower_f_NPmargin" + }, + "d_full": { + "Units": "m", + "Description": "cylinder diameter at corresponding locations", + "Name": "tcons.d_full" + }, + "max_allowable_td_ratio": { + "Units": "-", + "Description": "Safety factor of the tip deflection to stay within the tower clearance", + "Name": "tcons.max_allowable_td_ratio" + }, + "overhang": { + "Units": "m", + "Description": "Horizontal distance between hub and tower-top axis", + "Name": "tcons.overhang" + }, + "precone": { + "Units": "deg", + "Description": "Rotor precone angle", + "Name": "tcons.precone" + }, + "rated_Omega": { + "Units": "rpm", + "Description": "rotor rotation speed at rated", + "Name": "tcons.rated_Omega" + }, + "ref_axis_blade": { + "Units": "m", + "Description": "2D array of the coordinates (x,y,z) of the blade reference axis, defined along\r\nblade span. The coordinate system is the one of BeamDyn: it is placed at blade\r\nroot with x pointing the suction side of the blade, y pointing the trailing edge\r\nand z along the blade span. A standard configuration will have negative x values\r\n(prebend), if swept positive y values, and positive z values.", + "Name": "tcons.ref_axis_blade" + }, + "ref_axis_tower": { + "Units": "m", + "Description": "2D array of the coordinates (x,y,z) of the tower reference axis. The coordinate\r\nsystem is the global coordinate system of OpenFAST: it is placed at tower base\r\nwith x pointing downwind, y pointing on the side and z pointing vertically\r\nupwards. A standard tower configuration will have zero x and y values and\r\npositive z values.", + "Name": "tcons.ref_axis_tower" + }, + "rotor_orientation": { + "Units": "Unavailable", + "Description": "Rotor orientation, either upwind or downwind.", + "Name": "tcons.rotor_orientation" + }, + "tilt": { + "Units": "deg", + "Description": "Nacelle uptilt angle", + "Name": "tcons.tilt" + }, + "tip_deflection": { + "Units": "m", + "Description": "Blade tip deflection in yaw x-direction", + "Name": "tcons.tip_deflection" + }, + "tip_deflection_ratio": { + "Units": "-", + "Description": "None", + "Name": "tcons.tip_deflection_ratio" + }, + "tower_freq": { + "Units": "Hz", + "Description": "First natural frequencies of tower (and substructure)", + "Name": "tcons.tower_freq" + } + }, + "tower": { + "cd": { + "Units": "-", + "Description": "1D array of the drag coefficients defined along the tower height.", + "Name": "tower.cd" + }, + "diameter": { + "Units": "m", + "Description": "1D array of the outer diameter values defined along the tower axis.cylinder diameter at corresponding locations", + "Name": "tower.diameter" + }, + "layer_mat": { + "Units": "Unavailable", + "Description": "1D array of the names of the materials of each layer modeled in the tower structure.", + "Name": "tower.layer_mat" + }, + "layer_name": { + "Units": "Unavailable", + "Description": "1D array of the names of the layers modeled in the tower structure.", + "Name": "tower.layer_name" + }, + "layer_thickness": { + "Units": "m", + "Description": "2D array of the thickness of the layers of the tower structure. The first dimension represents each layer, the second dimension represents each piecewise-constant entry of the tower sections.2D array of the thickness of the layers of the column structure. The first\r\ndimension represents each layer, the second dimension represents each piecewise-\r\nconstant entry of the column sections.", + "Name": "tower.layer_thickness" + }, + "outfitting_factor": { + "Units": "-", + "Description": "Multiplier that accounts for secondary structure mass inside of towerMass fraction added for outfitting", + "Name": "tower.outfitting_factor" + }, + "ref_axis": { + "Units": "m", + "Description": "2D array of the coordinates (x,y,z) of the tower reference axis. The coordinate system is the global coordinate system of OpenFAST: it is placed at tower base with x pointing downwind, y pointing on the side and z pointing vertically upwards. A standard tower configuration will have zero x and y values and positive z values.", + "Name": "tower.ref_axis" + } + }, + "tower_grid": { + "foundation_height": { + "Units": "m", + "Description": "Foundation height in respect to the ground level.starting height of tower", + "Name": "tower_grid.foundation_height" + }, + "height": { + "Units": "m", + "Description": "Scalar of the tower height computed along the z axis.Scalar of the column height computed along the z axis.", + "Name": "tower_grid.height" + }, + "length": { + "Units": "m", + "Description": "Scalar of the tower length computed along its curved axis. A standard straight tower will be as high as long.Length of a single cable connecting the OSS to the interconnection in km.", + "Name": "tower_grid.length" + }, + "ref_axis": { + "Units": "m", + "Description": "2D array of the coordinates (x,y,z) of the tower reference axis. The coordinate system is the global coordinate system of OpenFAST: it is placed at tower base with x pointing downwind, y pointing on the side and z pointing vertically upwards. A standard tower configuration will have zero x and y values and positive z values.", + "Name": "tower_grid.ref_axis" + }, + "s": { + "Units": "-", + "Description": "1D array of the non-dimensional grid defined along the tower axis (0-tower base, 1-tower top)1D array of the non-dimensional grid defined along the column axis (0-column base,\r\n1-column top)", + "Name": "tower_grid.s" + } + }, + "towerse": { + "Asx": { + "Units": "m**2", + "Description": "x shear area", + "Name": "towerse.Asx" + }, + "Asy": { + "Units": "m**2", + "Description": "y shear area", + "Name": "towerse.Asy" + }, + "Az": { + "Units": "m**2", + "Description": "cross-sectional area", + "Name": "towerse.Az" + }, + "E": { + "Units": "Pa", + "Description": "Isotropic Youngs modulus of the materials along the column sections.", + "Name": "towerse.E" + }, + "E_full": { + "Units": "N/m**2", + "Description": "modulus of elasticitymodulus of elasticity", + "Name": "towerse.E_full" + }, + "E_mat": { + "Units": "Pa", + "Description": "2D array of the Youngs moduli of the materials. Each row represents a material,\r\nthe three columns represent E11, E22 and E33.", + "Name": "towerse.E_mat" + }, + "G": { + "Units": "Pa", + "Description": "Isotropic shear modulus of the materials along the column sections.", + "Name": "towerse.G" + }, + "G_full": { + "Units": "Pa", + "Description": "Isotropic shear modulus of the materials along the tower sections.", + "Name": "towerse.G_full" + }, + "G_mat": { + "Units": "Pa", + "Description": "2D array of the shear moduli of the materials. Each row represents a material,\r\nthe three columns represent G12, G13 and G23.", + "Name": "towerse.G_mat" + }, + "G_soil": { + "Units": "Pa", + "Description": "None", + "Name": "towerse.G_soil" + }, + "Hsig_wave": { + "Units": "m", + "Description": "significant wave height", + "Name": "towerse.Hsig_wave" + }, + "Ixx": { + "Units": "m**4", + "Description": "area moment of inertia about x-axis", + "Name": "towerse.Ixx" + }, + "Iyy": { + "Units": "m**4", + "Description": "area moment of inertia about y-axis", + "Name": "towerse.Iyy" + }, + "Jz": { + "Units": "m**4", + "Description": "polar moment of inertia", + "Name": "towerse.Jz" + }, + "Tsig_wave": { + "Units": "s", + "Description": "period of maximum wave height", + "Name": "towerse.Tsig_wave" + }, + "axial_stff": { + "Units": "N", + "Description": "sectional axial stiffness", + "Name": "towerse.axial_stff" + }, + "beta_wave": { + "Units": "deg", + "Description": "corresponding wave angles relative to inertial coordinate system", + "Name": "towerse.beta_wave" + }, + "beta_wind": { + "Units": "deg", + "Description": "corresponding wind angles relative to inertial coordinate system", + "Name": "towerse.beta_wind" + }, + "cd_usr": { + "Units": "-", + "Description": "User input drag coefficient to override Reynolds number based one", + "Name": "towerse.cd_usr" + }, + "cg_offst": { + "Units": "m", + "Description": "offset from the sectional center of mass", + "Name": "towerse.cg_offst" + }, + "cm": { + "Units": "-", + "Description": "mass coefficient", + "Name": "towerse.cm", + "I_base": { + "Units": "kg*m**2", + "Description": "None", + "Name": "towerse.cm.I_base" + }, + "center_of_mass": { + "Units": "m", + "Description": "None", + "Name": "towerse.cm.center_of_mass" + }, + "cost": { + "Units": "USD", + "Description": "None", + "Name": "towerse.cm.cost" + }, + "mass": { + "Units": "kg", + "Description": "added mass", + "Name": "towerse.cm.mass" + }, + "material_cost_rate": { + "Units": "USD/kg", + "Description": "Raw material cost rate: steel $1.1/kg, aluminum $3.5/kg", + "Name": "towerse.cm.material_cost_rate" + }, + "outfitting_factor": { + "Units": "-", + "Description": "Mass fraction added for outfitting", + "Name": "towerse.cm.outfitting_factor" + }, + "rho": { + "Units": "kg/m**3", + "Description": "Density of the materials along the column sections.", + "Name": "towerse.cm.rho" + }, + "section_center_of_mass": { + "Units": "m", + "Description": "None", + "Name": "towerse.cm.section_center_of_mass" + } + }, + "constr_d_to_t": { + "Units": "-", + "Description": "None", + "Name": "towerse.constr_d_to_t" + }, + "constr_taper": { + "Units": "-", + "Description": "None", + "Name": "towerse.constr_taper" + }, + "d_full": { + "Units": "m", + "Description": "cylinder diameter at corresponding locations", + "Name": "towerse.d_full" + }, + "distLoads": { + "Px": { + "Units": "N/m", + "Description": "force per unit length in x-direction", + "Name": "towerse.distLoads.Px" + }, + "Py": { + "Units": "N/m", + "Description": "force per unit length in y-direction", + "Name": "towerse.distLoads.Py" + }, + "Pz": { + "Units": "N/m", + "Description": "force per unit length in z-direction", + "Name": "towerse.distLoads.Pz" + }, + "qdyn": { + "Units": "N/m**2", + "Description": "dynamic pressure", + "Name": "towerse.distLoads.qdyn" + }, + "waveLoads_Px": { + "Units": "N/m", + "Description": "distributed loads, force per unit length in x-direction", + "Name": "towerse.distLoads.waveLoads_Px" + }, + "waveLoads_Py": { + "Units": "N/m", + "Description": "distributed loads, force per unit length in y-direction", + "Name": "towerse.distLoads.waveLoads_Py" + }, + "waveLoads_Pz": { + "Units": "N/m", + "Description": "distributed loads, force per unit length in z-direction", + "Name": "towerse.distLoads.waveLoads_Pz" + }, + "waveLoads_beta": { + "Units": "deg", + "Description": "wind/wave angle relative to inertia c.s.", + "Name": "towerse.distLoads.waveLoads_beta" + }, + "waveLoads_d": { + "Units": "m", + "Description": "corresponding diameters", + "Name": "towerse.distLoads.waveLoads_d" + }, + "waveLoads_qdyn": { + "Units": "N/m**2", + "Description": "dynamic pressure", + "Name": "towerse.distLoads.waveLoads_qdyn" + }, + "waveLoads_z": { + "Units": "m", + "Description": "corresponding heights", + "Name": "towerse.distLoads.waveLoads_z" + }, + "windLoads_Px": { + "Units": "N/m", + "Description": "distributed loads, force per unit length in x-direction", + "Name": "towerse.distLoads.windLoads_Px" + }, + "windLoads_Py": { + "Units": "N/m", + "Description": "distributed loads, force per unit length in y-direction", + "Name": "towerse.distLoads.windLoads_Py" + }, + "windLoads_Pz": { + "Units": "N/m", + "Description": "distributed loads, force per unit length in z-direction", + "Name": "towerse.distLoads.windLoads_Pz" + }, + "windLoads_beta": { + "Units": "deg", + "Description": "wind/wave angle relative to inertia c.s.", + "Name": "towerse.distLoads.windLoads_beta" + }, + "windLoads_d": { + "Units": "m", + "Description": "corresponding diameters", + "Name": "towerse.distLoads.windLoads_d" + }, + "windLoads_qdyn": { + "Units": "N/m**2", + "Description": "dynamic pressure", + "Name": "towerse.distLoads.windLoads_qdyn" + }, + "windLoads_z": { + "Units": "m", + "Description": "corresponding heights", + "Name": "towerse.distLoads.windLoads_z" + }, + "z": { + "Units": "m", + "Description": "location along cylinder. start at bottom and go to top", + "Name": "towerse.distLoads.z" + } + }, + "foreaft_iner": { + "Units": "kg*m", + "Description": "sectional fore-aft intertia per unit length about the Y_G inertia axis", + "Name": "towerse.foreaft_iner" + }, + "foreaft_stff": { + "Units": "N*m**2", + "Description": "sectional fore-aft bending stiffness per unit length about the Y_E elastic axis", + "Name": "towerse.foreaft_stff" + }, + "geometry": { + "foundation_height": { + "Units": "m", + "Description": "starting height of tower", + "Name": "towerse.geometry.foundation_height" + } + }, + "gravity_foundation_I": { + "Units": "kg*m**2", + "Description": "None", + "Name": "towerse.gravity_foundation_I" + }, + "gravity_foundation_mass": { + "Units": "kg", + "Description": "point mass of transition piece", + "Name": "towerse.gravity_foundation_mass" + }, + "height_constraint": { + "Units": "m", + "Description": "None", + "Name": "towerse.height_constraint" + }, + "hub_height": { + "Units": "m", + "Description": "hub height of wind turbine above ground / sea level", + "Name": "towerse.hub_height" + }, + "labor_cost_rate": { + "Units": "USD/min", + "Description": "Labor cost", + "Name": "towerse.labor_cost_rate" + }, + "life": { + "Units": "-", + "Description": "fatigue life of tower", + "Name": "towerse.life" + }, + "mass_den": { + "Units": "kg/m", + "Description": "sectional mass per unit length", + "Name": "towerse.mass_den" + }, + "material_names": { + "Units": "Unavailable", + "Description": "1D array of names of materials.", + "Name": "towerse.material_names" + }, + "monopile_cost": { + "Units": "USD", + "Description": "None", + "Name": "towerse.monopile_cost" + }, + "monopile_foundation_height": { + "Units": "m", + "Description": "None", + "Name": "towerse.monopile_foundation_height" + }, + "monopile_height": { + "Units": "m", + "Description": "Scalar of the tower height computed along the z axis.", + "Name": "towerse.monopile_height" + }, + "monopile_layer_materials": { + "Units": "Unavailable", + "Description": "1D array of the names of the materials of each layer modeled in the tower\r\nstructure.", + "Name": "towerse.monopile_layer_materials" + }, + "monopile_layer_thickness": { + "Units": "m", + "Description": "2D array of the thickness of the layers of the tower structure. The first\r\ndimension represents each layer, the second dimension represents each piecewise-\r\nconstant entry of the tower sections.", + "Name": "towerse.monopile_layer_thickness" + }, + "monopile_length": { + "Units": "m", + "Description": "None", + "Name": "towerse.monopile_length" + }, + "monopile_mass": { + "Units": "kg", + "Description": "Monopile mass", + "Name": "towerse.monopile_mass" + }, + "monopile_outer_diameter_in": { + "Units": "m", + "Description": "cylinder diameter at corresponding locations", + "Name": "towerse.monopile_outer_diameter_in" + }, + "monopile_outfitting_factor": { + "Units": "-", + "Description": "Multiplier that accounts for secondary structure mass inside of cylinder", + "Name": "towerse.monopile_outfitting_factor" + }, + "monopile_s": { + "Units": "-", + "Description": "1D array of the non-dimensional grid defined along the tower axis (0-tower base,\r\n1-tower top)", + "Name": "towerse.monopile_s" + }, + "mu_air": { + "Units": "kg/(m*s)", + "Description": "dynamic viscosity of air", + "Name": "towerse.mu_air" + }, + "mu_water": { + "Units": "kg/(m*s)", + "Description": "dynamic viscosity of water", + "Name": "towerse.mu_water" + }, + "nu_soil": { + "Units": "-", + "Description": "None", + "Name": "towerse.nu_soil" + }, + "outfitting_factor": { + "Units": "-", + "Description": "Mass fraction added for outfitting", + "Name": "towerse.outfitting_factor" + }, + "outfitting_full": { + "Units": "-", + "Description": "None", + "Name": "towerse.outfitting_full" + }, + "painting_cost_rate": { + "Units": "USD/m/m", + "Description": "Painting / surface finishing cost rate", + "Name": "towerse.painting_cost_rate" + }, + "post": { + "Fz": { + "Units": "N", + "Description": "point force in z-direction", + "Name": "towerse.post.Fz" + }, + "Mxx": { + "Units": "N*m", + "Description": "point moment about x-axis", + "Name": "towerse.post.Mxx" + }, + "Myy": { + "Units": "N*m", + "Description": "point moment about y-axis", + "Name": "towerse.post.Myy" + }, + "axial_stress": { + "Units": "N/m**2", + "Description": "axial stress in tower elements", + "Name": "towerse.post.axial_stress" + }, + "fore_aft_freqs": { + "Units": "-", + "Description": "Frequencies associated with mode shapes in the tower fore-aft direction", + "Name": "towerse.post.fore_aft_freqs" + }, + "fore_aft_modes": { + "Units": "-", + "Description": "6-degree polynomial coefficients of mode shapes in the tower fore-aft direction (x^2..x^6, no linear or constant term)", + "Name": "towerse.post.fore_aft_modes" + }, + "freqs": { + "Units": "Hz", + "Description": "Natural frequencies of the structureNatural frequencies of the structure", + "Name": "towerse.post.freqs" + }, + "global_buckling": { + "Units": "-", + "Description": "Global buckling constraint. Should be < 1 for feasibility. Includes safety factors", + "Name": "towerse.post.global_buckling" + }, + "hoop_stress": { + "Units": "N/m**2", + "Description": "hoop stress in tower elements", + "Name": "towerse.post.hoop_stress" + }, + "shear_stress": { + "Units": "N/m**2", + "Description": "shear stress in tower elements", + "Name": "towerse.post.shear_stress" + }, + "shell_buckling": { + "Units": "-", + "Description": "Shell buckling constraint. Should be < 1 for feasibility. Includes safety factors", + "Name": "towerse.post.shell_buckling" + }, + "side_side_freqs": { + "Units": "-", + "Description": "Frequencies associated with mode shapes in the tower side-side direction", + "Name": "towerse.post.side_side_freqs" + }, + "side_side_modes": { + "Units": "-", + "Description": "6-degree polynomial coefficients of mode shapes in the tower side-side direction (x^2..x^6, no linear or constant term)", + "Name": "towerse.post.side_side_modes" + }, + "stress": { + "Units": "-", + "Description": "Von Mises stress utilization along tower at specified locations. incudes safety factor.", + "Name": "towerse.post.stress" + }, + "structural_frequencies": { + "Units": "Hz", + "Description": "First and second natural frequencyStructural frequencies outputted from FEM calculation", + "Name": "towerse.post.structural_frequencies" + }, + "top_deflection": { + "Units": "m", + "Description": "Deflection of tower top in yaw-aligned +x direction", + "Name": "towerse.post.top_deflection" + }, + "top_deflection_in": { + "Units": "m", + "Description": "Deflection of tower top in yaw-aligned +x direction", + "Name": "towerse.post.top_deflection_in" + }, + "turbine_F": { + "Units": "N", + "Description": "Total force on tower+rna", + "Name": "towerse.post.turbine_F" + }, + "turbine_M": { + "Units": "N*m", + "Description": "Total x-moment on tower+rna measured at base", + "Name": "towerse.post.turbine_M" + }, + "x_mode_freqs": { + "Units": "-", + "Description": "Frequencies associated with mode shapes in the x-directionFrequencies associated with mode shapes in the x-direction", + "Name": "towerse.post.x_mode_freqs" + }, + "x_mode_shapes": { + "Units": "-", + "Description": "6-degree polynomial coefficients of mode shapes in the x-direction (x^2..x^6, no linear or constant term)6-degree polynomial coefficients of mode shapes in the x-direction", + "Name": "towerse.post.x_mode_shapes" + }, + "y_mode_freqs": { + "Units": "-", + "Description": "Frequencies associated with mode shapes in the y-directionFrequencies associated with mode shapes in the y-direction", + "Name": "towerse.post.y_mode_freqs" + }, + "y_mode_shapes": { + "Units": "-", + "Description": "6-degree polynomial coefficients of mode shapes in the x-direction (x^2..x^6, no linear or constant term)6-degree polynomial coefficients of mode shapes in the x-direction", + "Name": "towerse.post.y_mode_shapes" + } + }, + "pre": { + "Fx": { + "Units": "N", + "Description": "point force in x-direction", + "Name": "towerse.pre.Fx" + }, + "Fy": { + "Units": "N", + "Description": "point force in y-direction", + "Name": "towerse.pre.Fy" + }, + "Fz": { + "Units": "N", + "Description": "point force in z-direction", + "Name": "towerse.pre.Fz" + }, + "Mxx": { + "Units": "N*m", + "Description": "point moment about x-axis", + "Name": "towerse.pre.Mxx" + }, + "Myy": { + "Units": "N*m", + "Description": "point moment about y-axis", + "Name": "towerse.pre.Myy" + }, + "Mzz": { + "Units": "N*m", + "Description": "point moment about z-axis", + "Name": "towerse.pre.Mzz" + }, + "k_monopile": { + "Units": "N/m", + "Description": "Stiffness BCs for ocean soil. Only used if monoflag inputis True", + "Name": "towerse.pre.k_monopile" + }, + "kidx": { + "Units": "-", + "Description": "indices of z where external stiffness reactions should be applied.", + "Name": "towerse.pre.kidx" + }, + "ktx": { + "Units": "N/m", + "Description": "spring stiffness in theta_x-rotation", + "Name": "towerse.pre.ktx" + }, + "kty": { + "Units": "N/m", + "Description": "spring stiffness in theta_y-rotation", + "Name": "towerse.pre.kty" + }, + "ktz": { + "Units": "N/m", + "Description": "spring stiffness in theta_z-rotation", + "Name": "towerse.pre.ktz" + }, + "kx": { + "Units": "N/m", + "Description": "spring stiffness in x-direction", + "Name": "towerse.pre.kx" + }, + "ky": { + "Units": "N/m", + "Description": "spring stiffness in y-direction", + "Name": "towerse.pre.ky" + }, + "kz": { + "Units": "N/m", + "Description": "spring stiffness in z-direction", + "Name": "towerse.pre.kz" + }, + "m": { + "Units": "kg", + "Description": "added mass", + "Name": "towerse.pre.m" + }, + "mIxx": { + "Units": "kg*m**2", + "Description": "x mass moment of inertia about some point p", + "Name": "towerse.pre.mIxx" + }, + "mIxy": { + "Units": "kg*m**2", + "Description": "xy mass moment of inertia about some point p", + "Name": "towerse.pre.mIxy" + }, + "mIxz": { + "Units": "kg*m**2", + "Description": "xz mass moment of inertia about some point p", + "Name": "towerse.pre.mIxz" + }, + "mIyy": { + "Units": "kg*m**2", + "Description": "y mass moment of inertia about some point p", + "Name": "towerse.pre.mIyy" + }, + "mIyz": { + "Units": "kg*m**2", + "Description": "yz mass moment of inertia about some point p", + "Name": "towerse.pre.mIyz" + }, + "mIzz": { + "Units": "kg*m**2", + "Description": "z mass moment of inertia about some point p", + "Name": "towerse.pre.mIzz" + }, + "midx": { + "Units": "-", + "Description": "indices where added mass should be applied.", + "Name": "towerse.pre.midx" + }, + "mrhox": { + "Units": "m", + "Description": "x-location of p relative to node", + "Name": "towerse.pre.mrhox" + }, + "mrhoy": { + "Units": "m", + "Description": "y-location of p relative to node", + "Name": "towerse.pre.mrhoy" + }, + "mrhoz": { + "Units": "m", + "Description": "z-location of p relative to node", + "Name": "towerse.pre.mrhoz" + }, + "plidx": { + "Units": "-", + "Description": "indices where point loads should be applied.", + "Name": "towerse.pre.plidx" + }, + "rna_F": { + "Units": "N", + "Description": "rna force", + "Name": "towerse.pre.rna_F" + }, + "rna_M": { + "Units": "N*m", + "Description": "rna moment", + "Name": "towerse.pre.rna_M" + } + }, + "props": { + "d": { + "Units": "m", + "Description": "Sectional tower diameters", + "Name": "towerse.props.d" + }, + "t": { + "Units": "m", + "Description": "Sectional tower wall thicknesses", + "Name": "towerse.props.t" + } + }, + "rho": { + "Units": "kg/m**3", + "Description": "Density of the materials along the column sections.", + "Name": "towerse.rho" + }, + "rho_air": { + "Units": "kg/m**3", + "Description": "air density", + "Name": "towerse.rho_air" + }, + "rho_full": { + "Units": "kg/m**3", + "Description": "Density of the materials along the tower sections.material density", + "Name": "towerse.rho_full" + }, + "rho_mat": { + "Units": "kg/m**3", + "Description": "1D array of the density of the materials. For composites, this is the density of\r\nthe laminate.", + "Name": "towerse.rho_mat" + }, + "rho_water": { + "Units": "kg/m**3", + "Description": "density of water", + "Name": "towerse.rho_water" + }, + "rna_I": { + "Units": "kg*m**2", + "Description": "Moments about turbine main", + "Name": "towerse.rna_I" + }, + "rna_cg": { + "Units": "m", + "Description": "Location of RNA center of mass relative to tower top", + "Name": "towerse.rna_cg" + }, + "rna_mass": { + "Units": "kg", + "Description": "Mass of RNA", + "Name": "towerse.rna_mass" + }, + "sc_offst": { + "Units": "m", + "Description": "offset from the sectional shear center", + "Name": "towerse.sc_offst" + }, + "sec_loc": { + "Units": "-", + "Description": "normalized sectional location", + "Name": "towerse.sec_loc" + }, + "shearExp": { + "Units": "-", + "Description": "shear exponent", + "Name": "towerse.shearExp" + }, + "sideside_iner": { + "Units": "kg*m", + "Description": "sectional side-side intertia per unit length about the Y_G inertia axis", + "Name": "towerse.sideside_iner" + }, + "sideside_stff": { + "Units": "N*m**2", + "Description": "sectional side-side bending stiffness per unit length about the Y_E elastic axis", + "Name": "towerse.sideside_stff" + }, + "sigma_y": { + "Units": "Pa", + "Description": "Isotropic yield strength of the materials along the column sections.", + "Name": "towerse.sigma_y" + }, + "sigma_y_full": { + "Units": "N/m**2", + "Description": "yield stressyield stress", + "Name": "towerse.sigma_y_full" + }, + "sigma_y_mat": { + "Units": "Pa", + "Description": "2D array of the yield strength of the materials. Each row represents a material,\r\nthe three columns represent Xt12, Xt13 and Xt23.", + "Name": "towerse.sigma_y_mat" + }, + "slope": { + "Units": "-", + "Description": "None", + "Name": "towerse.slope" + }, + "soil": { + "d0": { + "Units": "m", + "Description": "diameter of base of tower", + "Name": "towerse.soil.d0" + }, + "k": { + "Units": "N/m", + "Description": "None", + "Name": "towerse.soil.k" + }, + "k_usr": { + "Units": "N/m", + "Description": "User overrides of stiffness values. Use positive values and for rigid\r\nuse np.inf. Order is x, theta_x, y, theta_y, z, theta_z", + "Name": "towerse.soil.k_usr" + } + }, + "str_tw": { + "Units": "deg", + "Description": "structural twist of section", + "Name": "towerse.str_tw" + }, + "structural_cost": { + "Units": "USD", + "Description": "None", + "Name": "towerse.structural_cost" + }, + "structural_mass": { + "Units": "kg", + "Description": "Mass of whole turbine except for mooring lines", + "Name": "towerse.structural_mass" + }, + "suctionpile_depth": { + "Units": "m", + "Description": "None", + "Name": "towerse.suctionpile_depth" + }, + "t_full": { + "Units": "m", + "Description": "shell thickness at corresponding locations", + "Name": "towerse.t_full" + }, + "tc_offst": { + "Units": "m", + "Description": "offset from the sectional tension center", + "Name": "towerse.tc_offst" + }, + "tm": { + "cylinder_I_base": { + "Units": "kg*m**2", + "Description": "Mass moment of inertia of cylinder about base [xx yy zz xy xz yz]", + "Name": "towerse.tm.cylinder_I_base" + }, + "cylinder_center_of_mass": { + "Units": "m", + "Description": "z position of center of mass of cylinder", + "Name": "towerse.tm.cylinder_center_of_mass" + }, + "cylinder_cost": { + "Units": "USD", + "Description": "Total cylinder cost", + "Name": "towerse.tm.cylinder_cost" + }, + "cylinder_mass": { + "Units": "kg", + "Description": "Total cylinder mass", + "Name": "towerse.tm.cylinder_mass" + }, + "cylinder_section_center_of_mass": { + "Units": "m", + "Description": "z position of center of mass of each can in the cylinder", + "Name": "towerse.tm.cylinder_section_center_of_mass" + } + }, + "tor_stff": { + "Units": "N*m**2", + "Description": "sectional torsional stiffness", + "Name": "towerse.tor_stff" + }, + "tower": { + "E": { + "Units": "N/m**2", + "Description": "Isotropic Youngs modulus of the materials along the column sections.", + "Name": "towerse.tower.E" + }, + "Fx": { + "Units": "N", + "Description": "point force in x-direction", + "Name": "towerse.tower.Fx" + }, + "Fy": { + "Units": "N", + "Description": "point force in y-direction", + "Name": "towerse.tower.Fy" + }, + "Fz": { + "Units": "N", + "Description": "point force in z-direction", + "Name": "towerse.tower.Fz" + }, + "Fz_out": { + "Units": "N", + "Description": "None", + "Name": "towerse.tower.Fz_out" + }, + "G": { + "Units": "N/m**2", + "Description": "Isotropic shear modulus of the materials along the column sections.", + "Name": "towerse.tower.G" + }, + "Mxx": { + "Units": "N*m", + "Description": "point moment about x-axis", + "Name": "towerse.tower.Mxx" + }, + "Mxx_out": { + "Units": "N*m", + "Description": "None", + "Name": "towerse.tower.Mxx_out" + }, + "Myy": { + "Units": "N*m", + "Description": "point moment about y-axis", + "Name": "towerse.tower.Myy" + }, + "Myy_out": { + "Units": "N*m", + "Description": "None", + "Name": "towerse.tower.Myy_out" + }, + "Mzz": { + "Units": "N*m", + "Description": "point moment about z-axis", + "Name": "towerse.tower.Mzz" + }, + "Mzz_out": { + "Units": "N*m", + "Description": "None", + "Name": "towerse.tower.Mzz_out" + }, + "Px": { + "Units": "N/m", + "Description": "force per unit length in x-direction", + "Name": "towerse.tower.Px" + }, + "Py": { + "Units": "N/m", + "Description": "force per unit length in y-direction", + "Name": "towerse.tower.Py" + }, + "Pz": { + "Units": "N/m", + "Description": "force per unit length in z-direction", + "Name": "towerse.tower.Pz" + }, + "Vx_out": { + "Units": "N", + "Description": "None", + "Name": "towerse.tower.Vx_out" + }, + "Vy_out": { + "Units": "N", + "Description": "None", + "Name": "towerse.tower.Vy_out" + }, + "axial_stress": { + "Units": "N/m**2", + "Description": "axial stress in tower elements", + "Name": "towerse.tower.axial_stress" + }, + "base_F": { + "Units": "N", + "Description": "None", + "Name": "towerse.tower.base_F" + }, + "base_M": { + "Units": "N*m", + "Description": "None", + "Name": "towerse.tower.base_M" + }, + "d": { + "Units": "m", + "Description": "Sectional tower diameters", + "Name": "towerse.tower.d" + }, + "f1": { + "Units": "Hz", + "Description": "None", + "Name": "towerse.tower.f1" + }, + "f2": { + "Units": "Hz", + "Description": "None", + "Name": "towerse.tower.f2" + }, + "freqs": { + "Units": "Hz", + "Description": "Natural frequencies of the structure", + "Name": "towerse.tower.freqs" + }, + "hoop_stress": { + "Units": "N/m**2", + "Description": "hoop stress in tower elements", + "Name": "towerse.tower.hoop_stress" + }, + "hoop_stress_euro": { + "Units": "N/m**2", + "Description": "None", + "Name": "towerse.tower.hoop_stress_euro" + }, + "kidx": { + "Units": "-", + "Description": "indices of z where external stiffness reactions should be applied.", + "Name": "towerse.tower.kidx" + }, + "ktx": { + "Units": "N/m", + "Description": "spring stiffness in theta_x-rotation", + "Name": "towerse.tower.ktx" + }, + "kty": { + "Units": "N/m", + "Description": "spring stiffness in theta_y-rotation", + "Name": "towerse.tower.kty" + }, + "ktz": { + "Units": "N/m", + "Description": "spring stiffness in theta_z-rotation", + "Name": "towerse.tower.ktz" + }, + "kx": { + "Units": "N/m", + "Description": "spring stiffness in x-direction", + "Name": "towerse.tower.kx" + }, + "ky": { + "Units": "N/m", + "Description": "spring stiffness in y-direction", + "Name": "towerse.tower.ky" + }, + "kz": { + "Units": "N/m", + "Description": "spring stiffness in z-direction", + "Name": "towerse.tower.kz" + }, + "m": { + "Units": "kg", + "Description": "added mass", + "Name": "towerse.tower.m" + }, + "mIxx": { + "Units": "kg*m**2", + "Description": "x mass moment of inertia about some point p", + "Name": "towerse.tower.mIxx" + }, + "mIxy": { + "Units": "kg*m**2", + "Description": "xy mass moment of inertia about some point p", + "Name": "towerse.tower.mIxy" + }, + "mIxz": { + "Units": "kg*m**2", + "Description": "xz mass moment of inertia about some point p", + "Name": "towerse.tower.mIxz" + }, + "mIyy": { + "Units": "kg*m**2", + "Description": "y mass moment of inertia about some point p", + "Name": "towerse.tower.mIyy" + }, + "mIyz": { + "Units": "kg*m**2", + "Description": "yz mass moment of inertia about some point p", + "Name": "towerse.tower.mIyz" + }, + "mIzz": { + "Units": "kg*m**2", + "Description": "z mass moment of inertia about some point p", + "Name": "towerse.tower.mIzz" + }, + "mass": { + "Units": "kg", + "Description": "added mass", + "Name": "towerse.tower.mass" + }, + "midx": { + "Units": "-", + "Description": "indices where added mass should be applied.", + "Name": "towerse.tower.midx" + }, + "mrhox": { + "Units": "m", + "Description": "x-location of p relative to node", + "Name": "towerse.tower.mrhox" + }, + "mrhoy": { + "Units": "m", + "Description": "y-location of p relative to node", + "Name": "towerse.tower.mrhoy" + }, + "mrhoz": { + "Units": "m", + "Description": "z-location of p relative to node", + "Name": "towerse.tower.mrhoz" + }, + "plidx": { + "Units": "-", + "Description": "indices where point loads should be applied.", + "Name": "towerse.tower.plidx" + }, + "qdyn": { + "Units": "N/m**2", + "Description": "dynamic pressure", + "Name": "towerse.tower.qdyn" + }, + "rho": { + "Units": "kg/m**3", + "Description": "Density of the materials along the column sections.", + "Name": "towerse.tower.rho" + }, + "shear_stress": { + "Units": "N/m**2", + "Description": "shear stress in tower elements", + "Name": "towerse.tower.shear_stress" + }, + "t": { + "Units": "m", + "Description": "Sectional tower wall thicknesses", + "Name": "towerse.tower.t" + }, + "top_deflection": { + "Units": "m", + "Description": "None", + "Name": "towerse.tower.top_deflection" + }, + "x_mode_freqs": { + "Units": "-", + "Description": "Frequencies associated with mode shapes in the x-direction", + "Name": "towerse.tower.x_mode_freqs" + }, + "x_mode_shapes": { + "Units": "-", + "Description": "6-degree polynomial coefficients of mode shapes in the x-direction", + "Name": "towerse.tower.x_mode_shapes" + }, + "y_mode_freqs": { + "Units": "-", + "Description": "Frequencies associated with mode shapes in the y-direction", + "Name": "towerse.tower.y_mode_freqs" + }, + "y_mode_shapes": { + "Units": "-", + "Description": "6-degree polynomial coefficients of mode shapes in the x-direction", + "Name": "towerse.tower.y_mode_shapes" + }, + "z": { + "Units": "m", + "Description": "location along cylinder. start at bottom and go to top", + "Name": "towerse.tower.z" + } + }, + "tower_I_base": { + "Units": "kg*m**2", + "Description": "Moments about tower main", + "Name": "towerse.tower_I_base" + }, + "tower_center_of_mass": { + "Units": "m", + "Description": "z-position of center of tower mass", + "Name": "towerse.tower_center_of_mass" + }, + "tower_cost": { + "Units": "USD", + "Description": "Tower cost", + "Name": "towerse.tower_cost" + }, + "tower_foundation_height": { + "Units": "m", + "Description": "None", + "Name": "towerse.tower_foundation_height" + }, + "tower_height": { + "Units": "m", + "Description": "Scalar of the tower height computed along the z axis.", + "Name": "towerse.tower_height" + }, + "tower_layer_materials": { + "Units": "Unavailable", + "Description": "1D array of the names of the materials of each layer modeled in the tower\r\nstructure.", + "Name": "towerse.tower_layer_materials" + }, + "tower_layer_thickness": { + "Units": "m", + "Description": "2D array of the thickness of the layers of the tower structure. The first\r\ndimension represents each layer, the second dimension represents each piecewise-\r\nconstant entry of the tower sections.", + "Name": "towerse.tower_layer_thickness" + }, + "tower_mass": { + "Units": "kg", + "Description": "Mass of tower", + "Name": "towerse.tower_mass" + }, + "tower_outer_diameter": { + "Units": "m", + "Description": "None", + "Name": "towerse.tower_outer_diameter" + }, + "tower_outer_diameter_in": { + "Units": "m", + "Description": "cylinder diameter at corresponding locations", + "Name": "towerse.tower_outer_diameter_in" + }, + "tower_outfitting_factor": { + "Units": "-", + "Description": "Multiplier that accounts for secondary structure mass inside of cylinder", + "Name": "towerse.tower_outfitting_factor" + }, + "tower_s": { + "Units": "-", + "Description": "1D array of the non-dimensional grid defined along the tower axis (0-tower base,\r\n1-tower top)", + "Name": "towerse.tower_s" + }, + "tower_section_center_of_mass": { + "Units": "m", + "Description": "None", + "Name": "towerse.tower_section_center_of_mass" + }, + "tower_section_height": { + "Units": "m", + "Description": "None", + "Name": "towerse.tower_section_height" + }, + "tower_wall_thickness": { + "Units": "m", + "Description": "None", + "Name": "towerse.tower_wall_thickness" + }, + "transition_piece_I": { + "Units": "kg*m**2", + "Description": "None", + "Name": "towerse.transition_piece_I" + }, + "transition_piece_cost": { + "Units": "USD", + "Description": "Cost of transition piece", + "Name": "towerse.transition_piece_cost" + }, + "transition_piece_height": { + "Units": "m", + "Description": "height of transition piece above water line", + "Name": "towerse.transition_piece_height" + }, + "transition_piece_mass": { + "Units": "kg", + "Description": "point mass of transition piece", + "Name": "towerse.transition_piece_mass" + }, + "turb": { + "turbine_I_base": { + "Units": "kg*m**2", + "Description": "None", + "Name": "towerse.turb.turbine_I_base" + }, + "turbine_center_of_mass": { + "Units": "m", + "Description": "None", + "Name": "towerse.turb.turbine_center_of_mass" + } + }, + "turbine_mass": { + "Units": "kg", + "Description": "None", + "Name": "towerse.turbine_mass" + }, + "tw_iner": { + "Units": "deg", + "Description": "inertial twist of section", + "Name": "towerse.tw_iner" + }, + "unit_cost": { + "Units": "USD/kg", + "Description": "Unit costs of the materials along the column sections.", + "Name": "towerse.unit_cost" + }, + "unit_cost_full": { + "Units": "USD/kg", + "Description": "Raw material cost: steel $1.1/kg, aluminum $3.5/kg", + "Name": "towerse.unit_cost_full" + }, + "unit_cost_mat": { + "Units": "USD/kg", + "Description": "1D array of the unit costs of the materials.", + "Name": "towerse.unit_cost_mat" + }, + "water_depth": { + "Units": "m", + "Description": "water depth", + "Name": "towerse.water_depth" + }, + "wave": { + "A": { + "Units": "m/s**2", + "Description": "magnitude of wave acceleration", + "Name": "towerse.wave.A" + }, + "U": { + "Units": "m/s", + "Description": "magnitude of wind speed", + "Name": "towerse.wave.U" + }, + "Uc": { + "Units": "m/s", + "Description": "mean current speed", + "Name": "towerse.wave.Uc" + }, + "V": { + "Units": "m/s", + "Description": "None", + "Name": "towerse.wave.V" + }, + "W": { + "Units": "m/s", + "Description": "None", + "Name": "towerse.wave.W" + }, + "p": { + "Units": "N/m**2", + "Description": "pressure oscillation", + "Name": "towerse.wave.p" + }, + "phase_speed": { + "Units": "m/s", + "Description": "None", + "Name": "towerse.wave.phase_speed" + }, + "z": { + "Units": "m", + "Description": "location along cylinder. start at bottom and go to top", + "Name": "towerse.wave.z" + } + }, + "waveLoads": { + "A": { + "Units": "m/s**2", + "Description": "magnitude of wave acceleration", + "Name": "towerse.waveLoads.A" + }, + "U": { + "Units": "m/s", + "Description": "magnitude of wind speed", + "Name": "towerse.waveLoads.U" + }, + "d": { + "Units": "m", + "Description": "Sectional tower diameters", + "Name": "towerse.waveLoads.d" + }, + "p": { + "Units": "N/m**2", + "Description": "pressure oscillation", + "Name": "towerse.waveLoads.p" + }, + "waveLoads_Px": { + "Units": "N/m", + "Description": "distributed loads, force per unit length in x-direction", + "Name": "towerse.waveLoads.waveLoads_Px" + }, + "waveLoads_Py": { + "Units": "N/m", + "Description": "distributed loads, force per unit length in y-direction", + "Name": "towerse.waveLoads.waveLoads_Py" + }, + "waveLoads_Pz": { + "Units": "N/m", + "Description": "distributed loads, force per unit length in z-direction", + "Name": "towerse.waveLoads.waveLoads_Pz" + }, + "waveLoads_beta": { + "Units": "deg", + "Description": "wind/wave angle relative to inertia c.s.", + "Name": "towerse.waveLoads.waveLoads_beta" + }, + "waveLoads_d": { + "Units": "m", + "Description": "corresponding diameters", + "Name": "towerse.waveLoads.waveLoads_d" + }, + "waveLoads_pt": { + "Units": "N/m**2", + "Description": "None", + "Name": "towerse.waveLoads.waveLoads_pt" + }, + "waveLoads_qdyn": { + "Units": "N/m**2", + "Description": "dynamic pressure", + "Name": "towerse.waveLoads.waveLoads_qdyn" + }, + "waveLoads_z": { + "Units": "m", + "Description": "corresponding heights", + "Name": "towerse.waveLoads.waveLoads_z" + }, + "z": { + "Units": "m", + "Description": "location along cylinder. start at bottom and go to top", + "Name": "towerse.waveLoads.z" + } + }, + "wind": { + "U": { + "Units": "m/s", + "Description": "magnitude of wind speed", + "Name": "towerse.wind.U" + }, + "Uref": { + "Units": "m/s", + "Description": "reference wind speed (usually at hub height)", + "Name": "towerse.wind.Uref" + }, + "z": { + "Units": "m", + "Description": "location along cylinder. start at bottom and go to top", + "Name": "towerse.wind.z" + } + }, + "windLoads": { + "U": { + "Units": "m/s", + "Description": "magnitude of wind speed", + "Name": "towerse.windLoads.U" + }, + "d": { + "Units": "m", + "Description": "Sectional tower diameters", + "Name": "towerse.windLoads.d" + }, + "windLoads_Px": { + "Units": "N/m", + "Description": "distributed loads, force per unit length in x-direction", + "Name": "towerse.windLoads.windLoads_Px" + }, + "windLoads_Py": { + "Units": "N/m", + "Description": "distributed loads, force per unit length in y-direction", + "Name": "towerse.windLoads.windLoads_Py" + }, + "windLoads_Pz": { + "Units": "N/m", + "Description": "distributed loads, force per unit length in z-direction", + "Name": "towerse.windLoads.windLoads_Pz" + }, + "windLoads_beta": { + "Units": "deg", + "Description": "wind/wave angle relative to inertia c.s.", + "Name": "towerse.windLoads.windLoads_beta" + }, + "windLoads_d": { + "Units": "m", + "Description": "corresponding diameters", + "Name": "towerse.windLoads.windLoads_d" + }, + "windLoads_qdyn": { + "Units": "N/m**2", + "Description": "dynamic pressure", + "Name": "towerse.windLoads.windLoads_qdyn" + }, + "windLoads_z": { + "Units": "m", + "Description": "corresponding heights", + "Name": "towerse.windLoads.windLoads_z" + }, + "z": { + "Units": "m", + "Description": "location along cylinder. start at bottom and go to top", + "Name": "towerse.windLoads.z" + } + }, + "wind_reference_height": { + "Units": "m", + "Description": "None", + "Name": "towerse.wind_reference_height" + }, + "wind_z0": { + "Units": "m", + "Description": "None", + "Name": "towerse.wind_z0" + }, + "yaw": { + "Units": "deg", + "Description": "yaw angle", + "Name": "towerse.yaw" + }, + "z_full": { + "Units": "m", + "Description": "z-coordinates of section nodes", + "Name": "towerse.z_full" + }, + "z_param": { + "Units": "m", + "Description": "parameterized locations along tower, linear lofting between", + "Name": "towerse.z_param" + }, + "z_start": { + "Units": "m", + "Description": "None", + "Name": "towerse.z_start" + } + }, + "wt_class": { + "V_extreme1": { + "Units": "m/s", + "Description": "None", + "Name": "rotorse.wt_class.V_extreme1" + }, + "V_extreme50": { + "Units": "m/s", + "Description": "None", + "Name": "rotorse.wt_class.V_extreme50" + }, + "V_mean": { + "Units": "m/s", + "Description": "None", + "Name": "rotorse.wt_class.V_mean" + }, + "V_mean_overwrite": { + "Units": "-", + "Description": "overwrite value for mean velocity for using user defined CDFs", + "Name": "rotorse.wt_class.V_mean_overwrite" + }, + "turbine_class": { + "Units": "Unavailable", + "Description": "IEC turbine class", + "Name": "rotorse.wt_class.turbine_class" + } + } +} \ No newline at end of file diff --git a/WISDEM/docs/installation.rst b/WISDEM/docs/installation.rst index 2392fefab..8e8f48ae5 100644 --- a/WISDEM/docs/installation.rst +++ b/WISDEM/docs/installation.rst @@ -1,7 +1,13 @@ WISDEM Installation ------------------- -Installation with `Anaconda `_ is the recommended approach because of the ability to create self-contained environments suitable for testing and analysis. WISDEM requires `Anaconda 64-bit `_. +Installation with `Anaconda `_ is the recommended approach because of the ability to create self-contained environments suitable for testing and analysis. WISDEM requires `Anaconda 64-bit `_. However, the `conda` command has begun to show its age and we now recommend the one-for-one replacement with `mamba` via the `Miniforge distribution `_, which is much more lightweight and more easily solves for the WISDEM package dependencies. + +Install WISDEM as a "Library" +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +To use WISDEM's modules as a library for incorporation into other scripts or tools, WISDEM is available via `mamba install wisdem` or `pip install wisdem`, assuming that you have already setup your python environment. Note that on Windows platforms, we suggest using `conda/mamba` exclusively. + Configure Anaconda Environment ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -12,14 +18,14 @@ Setup and activate the Anaconda environment from a prompt (Anaconda3 Power Shell .. code-block:: bash - conda config --add channels conda-forge - conda env create --name wisdem-env -f https://raw.githubusercontent.com/WISDEM/WISDEM/master/environment.yml python=3.10 - conda activate wisdem-env + mamba config --add channels conda-forge + mamba env create --name wisdem-env -f https://raw.githubusercontent.com/WISDEM/WISDEM/master/environment.yml python=3.10 + mamba activate wisdem-env -Note that any future occasion on which you wish to use WISDEM, you will only have to start with ``conda activate wisdem-env``. For those working behind company firewalls, you may have to change the conda authentication with ``conda config --set ssl_verify no``. Proxy servers can also be set with ``conda config --set proxy_servers.http http://id:pw@address:port`` and ``conda config --set proxy_servers.https https://id:pw@address:port``. To setup an environment based on a different Github branch of WISDEM, simply substitute the branch name for `master` in the line above. +Note that any future occasion on which you wish to use WISDEM, you will only have to start with ``mamba activate wisdem-env``. For those working behind company firewalls, you may have to change the conda authentication with ``conda config --set ssl_verify no``. Proxy servers can also be set with ``conda config --set proxy_servers.http http://id:pw@address:port`` and ``conda config --set proxy_servers.https https://id:pw@address:port``. To setup an environment based on a different Github branch of WISDEM, simply substitute the branch name for `master` in the line above. -Install WISDEM -^^^^^^^^^^^^^^ +Install WISDEM for Direct Use +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ In order to directly use the examples in the repository and peek at the code when necessary, we recommend all users install WISDEM in *developer/editable* mode (`pip` has been unreliable for this type of install, so we recommend a slightly outdated approach). This is done by first installing WISDEM dependencies and then installing WISDEM from the Github source code. Note the differences between Windows and Mac build systems. For Linux, we recommend using the native compilers (for example, gcc and gfortran in the default GNU suite). @@ -27,19 +33,19 @@ For Linux and Mac systems: .. code-block:: bash - conda install petsc4py mpi4py + mamba install petsc4py mpi4py For Mac systems that *are not* using Homebrew or Macports compilers: .. code-block:: bash - conda install gfortran + mamba install gfortran For Windows systems: .. code-block:: bash - conda install m2w64-toolchain libpython + mamba install m2w64-toolchain libpython Finally, for all systems: diff --git a/WISDEM/docs/outputs.rst b/WISDEM/docs/outputs.rst index 0338a8331..cb0bd53db 100644 --- a/WISDEM/docs/outputs.rst +++ b/WISDEM/docs/outputs.rst @@ -3,7 +3,8 @@ WISDEM Outputs ========================== -This table may be downloaded as a csv-file :download:`here ` +This table may be downloaded as a :download:`CSV file ` +or :download:`JSON file ` .. csv-table:: WISDEM Variable List :file: docstrings/variable_guide.csv diff --git a/WISDEM/docs/wisdem/nrelcsm/theory.rst b/WISDEM/docs/wisdem/nrelcsm/theory.rst index 580b58e43..c403c8975 100644 --- a/WISDEM/docs/wisdem/nrelcsm/theory.rst +++ b/WISDEM/docs/wisdem/nrelcsm/theory.rst @@ -170,12 +170,12 @@ To obtain the main bearings mass in kilograms and cost in USD from the rotor tor b &= 0.71\\ k_c &= 12.9 -Where :math:`Q_{rotor}` is the rotor torque and is approximated by, +Where :math:`Q_{rotor}` is the rotor torque in kilo-Newton meters and is approximated by, .. math:: Q_{rotor} = \frac{0.5 P_{turbine} D_{rotor}}{\eta V_{tip}} -Where :math:`P_{turbine}` is the machine rating, :math:`D_{rotor}` is the rotor diameter, :math:`V_{tip}` is the max tip speed, and :math:`\eta` is the drivetrain efficiency. +Where :math:`P_{turbine}` is the machine rating in kilowatts, :math:`D_{rotor}` is the rotor diameter in meters, :math:`V_{tip}` is the max tip speed in meters per second, and :math:`\eta` is the drivetrain efficiency (as a fraction between zero and one). For variable names access to override the default values see the :ref:`csmsource`. @@ -215,12 +215,12 @@ For variable names access to override the default values see the :ref:`csmsource Generator ~~~~~~~~~ -To obtain the generator mass in kilograms and cost in USD from the machine rating in megawatts, +To obtain the generator mass in kilograms and cost in USD from the machine rating in kilowatts, .. math:: m_{generator} &= k_m P_{turbine} + b\\ c_{generator} &= k_c m_{generator}\\ - k_m &= 2300\\ + k_m &= 2.3\\ b &= 3400\\ k_c &= 12.4 @@ -241,7 +241,7 @@ To obtain the yaw system mass in kilograms and cost in USD from the rotor diamet .. math:: m_{yaw} &= k_m D_{rotor}^b\\ c_{yaw} &= k_c m_{yaw}\\ - k_m &= 0.00135\\ + k_m &= 0.0009\\ b &= 3.314\\ k_c &= 8.3 @@ -265,12 +265,12 @@ For variable names access to override the default values see the :ref:`csmsource Transformer ~~~~~~~~~~~ -To obtain the transformer mass in kilograms and cost in USD from the machine rating in megawatts, +To obtain the transformer mass in kilograms and cost in USD from the machine rating in kilowatts, .. math:: - m_{transformer} &= k_m P_{rotor} + b\\ + m_{transformer} &= k_m P_{turbine} + b\\ c_{transformer} &= k_c m_{transformer}\\ - k_m &= 1915\\ + k_m &= 1.915\\ b &= 1910\\ k_c &= 18.8 @@ -287,7 +287,7 @@ Cabling and Electrical Connections To obtain the cabling and electrical connections cost in USD (there is no mass calculated) from the machine rating in megawatts, .. math:: - c_{connect} &= k_c P_{rotor}\\ + c_{connect} &= k_c P_{turbine}\\ k_c &= 41850 Where :math:`P_{turbine}` is the machine rating. @@ -299,7 +299,7 @@ Control System To obtain the control system cost in USD (there is no mass calculated) from the machine rating in megawatts, .. math:: - c_{control} &= k_c P_{rotor}\\ + c_{control} &= k_c P_{turbine}\\ k_c &= 21150 Where :math:`P_{turbine}` is the machine rating. @@ -344,7 +344,7 @@ For variable names access to override the default values see the :ref:`csmsource Nacelle Cover ~~~~~~~~~~~~~ -To obtain the nacelle cover mass in kilograms and cost in USD from the machine rating in megawatts, +To obtain the nacelle cover mass in kilograms and cost in USD from the machine rating in kilowatts, .. math:: m_{cover} &= k_m P_{turbine} + b\\ @@ -360,16 +360,16 @@ For variable names access to override the default values see the :ref:`csmsource Tower ~~~~~ -To obtain the tower mass in kilograms and cost in USD from the hub height in meters, +To obtain the tower mass in kilograms and cost in USD from the tower length in meters, .. math:: - m_{tower} &= k_m L_{hub}^b\\ + m_{tower} &= k_m L_{tower}^b\\ c_{tower} &= k_c m_{tower}\\ k_m &= 19.828\\ b &= 2.0282\\ k_c &= 2.9 -Where :math:`L_{hub}` is the hub height. +Where :math:`L_{tower}` is the hub height for onshore turbines and the distance from transition piece to hub height offshore. For variable names access to override the default values see the :ref:`csmsource`. diff --git a/WISDEM/environment.yml b/WISDEM/environment.yml index e45591bb9..747f85c3c 100644 --- a/WISDEM/environment.yml +++ b/WISDEM/environment.yml @@ -10,23 +10,23 @@ dependencies: - make - matplotlib - meson + - moorpy - mpi4py - ninja - nlopt - - numpy + - numpy>=1.26 - numpydoc - - openmdao>=3.18 - - openpyxl==3.1.0 + - openmdao<3.28 + - openpyxl - pandas - pip - pydoe2 - pyoptsparse - pytest - pytest-cov - - python - python-benedict - pyyaml - - ruamel_yaml + - ruamel.yaml - scipy - setuptools - simpy diff --git a/WISDEM/examples/01_nrel_csm/mass.py b/WISDEM/examples/01_nrel_csm/mass.py index 466b8298e..2efdfc2b8 100644 --- a/WISDEM/examples/01_nrel_csm/mass.py +++ b/WISDEM/examples/01_nrel_csm/mass.py @@ -17,7 +17,7 @@ prob["machine_rating"] = 5000.0 prob["rotor_diameter"] = 126.0 prob["turbine_class"] = 2 -prob["hub_height"] = 90.0 +prob["tower_length"] = 90.0 prob["blade_number"] = 3 prob["blade_has_carbon"] = False prob["max_tip_speed"] = 80.0 diff --git a/WISDEM/examples/01_nrel_csm/mass_and_cost.py b/WISDEM/examples/01_nrel_csm/mass_and_cost.py index 3642ad1fd..ca84e9261 100644 --- a/WISDEM/examples/01_nrel_csm/mass_and_cost.py +++ b/WISDEM/examples/01_nrel_csm/mass_and_cost.py @@ -17,7 +17,7 @@ prob["machine_rating"] = 5000.0 prob["rotor_diameter"] = 126.0 prob["turbine_class"] = 2 -prob["hub_height"] = 90.0 +prob["tower_length"] = 90.0 prob["blade_number"] = 3 prob["blade_has_carbon"] = False prob["max_tip_speed"] = 80.0 diff --git a/WISDEM/examples/01_nrel_csm/parametric.py b/WISDEM/examples/01_nrel_csm/parametric.py index b16b73bdb..847141f72 100644 --- a/WISDEM/examples/01_nrel_csm/parametric.py +++ b/WISDEM/examples/01_nrel_csm/parametric.py @@ -81,7 +81,7 @@ prob["machine_rating"] = Rating[k] prob["rotor_diameter"] = Diameter[k] prob["blade_user_exp"] = Bladeexp[k] - prob["hub_height"] = hub_height = 0.5 * Diameter[k] + 30.0 + prob["tower_length"] = hub_height = 0.5 * Diameter[k] + 30.0 # Compute Turbine capital cost using the NREL CSM (2015) and store the result prob.run_model() diff --git a/WISDEM/examples/05_tower_monopile/analysis_options_monopile.yaml b/WISDEM/examples/05_tower_monopile/analysis_options_monopile.yaml index a4af2f139..a9e4e39c5 100644 --- a/WISDEM/examples/05_tower_monopile/analysis_options_monopile.yaml +++ b/WISDEM/examples/05_tower_monopile/analysis_options_monopile.yaml @@ -37,16 +37,16 @@ constraints: shell_buckling: flag: True d_to_t: - flag: True + flag: False lower_bound: 120.0 upper_bound: 2000.0 taper: - flag: True + flag: False lower_bound: 0.2 slope: flag: True frequency_1: - flag: True + flag: False lower_bound: 0.13 upper_bound: 0.40 monopile: @@ -57,18 +57,20 @@ constraints: shell_buckling: flag: True d_to_t: - flag: True + flag: False lower_bound: 120.0 upper_bound: 2000.0 taper: - flag: True + flag: False lower_bound: 0.2 slope: flag: True + thickness_slope: + flag: True frequency_1: flag: True lower_bound: 0.13 - upper_bound: 0.40 + upper_bound: 0.20 pile_depth: flag: True lower_bound: 0.0 diff --git a/WISDEM/examples/09_floating/nrel5mw-semi_oc4.yaml b/WISDEM/examples/09_floating/nrel5mw-semi_oc4.yaml index 47cf9867c..5b5bbcbd2 100644 --- a/WISDEM/examples/09_floating/nrel5mw-semi_oc4.yaml +++ b/WISDEM/examples/09_floating/nrel5mw-semi_oc4.yaml @@ -343,15 +343,15 @@ components: cylindrical: True - name: anchor1 - location: [837.6, 0.0, -200.0] + location: [837.6, 3.14159265, -200.0] cylindrical: True - name: anchor2 - location: [837.6, 2.0943951023931953, -200.0] # 120deg + location: [837.6, 1.0471976, -200.0] # 120deg cylindrical: True - name: anchor3 - location: [837.6, 4.1887902047863905, -200.0] # 240deg + location: [837.6, -1.0471976, -200.0] # 240deg cylindrical: True members: diff --git a/WISDEM/examples/19_rotor_drivetrain_tower/analysis_options.yaml b/WISDEM/examples/19_rotor_drivetrain_tower/analysis_options.yaml new file mode 100644 index 000000000..1295dccd0 --- /dev/null +++ b/WISDEM/examples/19_rotor_drivetrain_tower/analysis_options.yaml @@ -0,0 +1,148 @@ +general: + folder_output: outputs_rotor_drivetrain_tower_lcoe + fname_output: lcoe_output + +design_variables: + rotor_diameter: + flag: True + minimum: 100.0 + maximum: 180.0 + scaler: 1.e-2 + blade: + aero_shape: + twist: + flag: True + inverse: False + n_opt: 8 + max_decrease: 0.08722222222222223 + max_increase: 0.08722222222222223 + index_start: 2 + index_end: 8 + chord: + flag: True + n_opt: 8 + max_decrease: 0.2 + max_increase: 2.0 + index_start: 1 + index_end: 7 + structure: + spar_cap_ss: + flag: True + n_opt: 8 + max_decrease: 0.2 + max_increase: 2.0 + index_start: 1 + index_end: 7 + spar_cap_ps: + flag: True + equal_to_suction: True + n_opt: 8 + max_decrease: 0.2 + max_increase: 2.0 + index_start: 1 + index_end: 7 + drivetrain: + lss_diameter: + flag: True + lower_bound: 0.1 + upper_bound: 2.0 + hss_diameter: + flag: True + lower_bound: 0.1 + upper_bound: 2.0 + lss_wall_thickness: + flag: True + lower_bound: 0.001 + upper_bound: 0.5 + hss_wall_thickness: + flag: True + lower_bound: 0.001 + upper_bound: 0.5 + bedplate_web_thickness: + flag: True + lower_bound: 0.001 + upper_bound: 0.5 + bedplate_flange_thickness: + flag: True + lower_bound: 0.001 + upper_bound: 0.5 + bedplate_flange_width: + flag: True + lower_bound: 0.01 + upper_bound: 2.0 + tower: + outer_diameter: + flag: False + lower_bound: 3.87 + upper_bound: 4.3 + layer_thickness: + flag: True + lower_bound: 4.e-3 + upper_bound: 2.e-1 + +merit_figure: LCOE + +constraints: + blade: + stall: + flag: True + margin: 0.05233 + chord: + flag: True + max: 4.3 + root_circle_diameter: + flag: False + max_ratio: 1. + strains_spar_cap_ss: + flag: True + max: 3500.e-6 + index_start: 1 + index_end: 7 + strains_spar_cap_ps: + flag: True + max: 3500.e-6 + index_start: 1 + index_end: 7 + tip_deflection: + flag: True + margin: 1.41 + drivetrain: + lss: + flag: True + hss: + flag: True + bedplate: + flag: True + shaft_deflection: + flag: True + shaft_angle: + flag: True + tower: + stress: + flag: True + global_buckling: + flag: True + shell_buckling: + flag: True + thickness_slope: + flag: True + slope: + flag: True + frequency: + flag: True + +driver: + optimization: + flag: True # Flag to enable optimization + tol: 1.e-3 # Optimality tolerance + # max_major_iter: 100 # Maximum number of major design iterations (SNOPT) + # max_minor_iter: 1000 # Maximum number of minor design iterations (SNOPT) + max_iter: 2 # Maximum number of iterations (SLSQP) + solver: SLSQP # Optimization solver. Other options are 'SLSQP' - 'CONMIN' + # step_size: 1.e-3 # Step size for finite differencing + form: central # Finite differencing mode, either forward or central + verify_level: -1 # SNOPT check derivatives (-1 means no deriv checks) + +recorder: + flag: True # Flag to activate OpenMDAO recorder + file_name: log_opt_lcoe.sql # Name of OpenMDAO recorder diff --git a/WISDEM/examples/19_rotor_drivetrain_tower/modeling_options.yaml b/WISDEM/examples/19_rotor_drivetrain_tower/modeling_options.yaml new file mode 100644 index 000000000..9db9fd44a --- /dev/null +++ b/WISDEM/examples/19_rotor_drivetrain_tower/modeling_options.yaml @@ -0,0 +1,13 @@ +General: + verbosity: False +WISDEM: + RotorSE: + flag: True + spar_cap_ss: Spar_Cap_SS + spar_cap_ps: Spar_Cap_PS + TowerSE: + flag: True + DriveSE: + flag: True + BOS: + flag: True \ No newline at end of file diff --git a/WISDEM/examples/19_rotor_drivetrain_tower/wisdem_driver.py b/WISDEM/examples/19_rotor_drivetrain_tower/wisdem_driver.py new file mode 100644 index 000000000..b3cd24f62 --- /dev/null +++ b/WISDEM/examples/19_rotor_drivetrain_tower/wisdem_driver.py @@ -0,0 +1,25 @@ +import os + +from wisdem import run_wisdem +from wisdem.commonse.mpi_tools import MPI +from wisdem.postprocessing.compare_designs import run + +mydir = os.path.dirname(os.path.realpath(__file__)) # get path to this file +fname_wt_input = os.path.join(os.path.dirname(mydir), "02_reference_turbines", "IEA-3p4-130-RWT.yaml") +fname_modeling_options = mydir + os.sep + "modeling_options.yaml" +fname_analysis_options = mydir + os.sep + "analysis_options.yaml" + +wt_opt, modeling_options, analysis_options = run_wisdem( + fname_wt_input, fname_modeling_options, fname_analysis_options +) + +if MPI: + rank = MPI.COMM_WORLD.Get_rank() +else: + rank = 0 + +if rank == 0: + print( + "RUN COMPLETED. RESULTS ARE AVAILABLE HERE: " + + os.path.join(mydir, analysis_options["general"]["folder_output"]) + ) diff --git a/WISDEM/pyproject.toml b/WISDEM/pyproject.toml index 7b036825a..bef57c335 100644 --- a/WISDEM/pyproject.toml +++ b/WISDEM/pyproject.toml @@ -1,10 +1,10 @@ [build-system] -requires = ["setuptools", "numpy", "ninja", "meson>=0.60.0", "wheel"] +requires = ["setuptools", "numpy", "ninja", "meson>=1.1", "wheel"] build-backend = "setuptools.build_meta" [project] name = "wisdem" -version = "3.9.2" +version = "3.11.0" description = "Wind-Plant Integrated System Design & Engineering Model" readme = "README.md" requires-python = ">=3.9" @@ -33,7 +33,6 @@ classifiers = [ # Optional # that you indicate you support Python 3. These classifiers are *not* # checked by "pip install". See instead "python_requires" below. "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", @@ -46,13 +45,13 @@ dependencies = [ "dearpygui", "jsonschema", "marmot-agents>=0.2.5", + "moorpy", "nlopt", "numpy", "openmdao>=3.18", "openpyxl", "pandas", "pydoe2", - "pyoptsparse", "python-benedict", "pyyaml", "ruamel.yaml", @@ -74,6 +73,7 @@ dependencies = [ dev = ["meson", "ninja", "swig"] test = ["coveralls", "pytest", "pytest-cov"] docs = ["sphinx", "sphinxcontrib-bibtex", "sphinx_rtd_theme"] +opt = ["pyoptsparse"] # List URLs that are relevant to your project # @@ -111,7 +111,7 @@ namespaces = true [tool.setuptools.package-data] # If there are data files included in your packages that need to be # installed, specify them here. -"*" = ["*.yaml", "*.xlsx", "*.txt", "*.so", "*.lib", "*.pyd", "*.pdb", "*.dylib", "*.dll"] +"*" = ["meson*", "*.yaml", "*.yml", "*.xlsx", "*.txt", "*.so", "*.lib", "*.pyd", "*.pdb", "*.dylib", "*.dll"] [tool.black] line-length = 120 @@ -153,5 +153,5 @@ source = ["wisdem"] omit = ["wisdem/test/*", "wisdem/floating/visualize.py"] [tool.cibuildwheel] -skip = ["cp36-*", "cp37-*", "cp38-*", "*-win32", "*arm64", "pp*"] +skip = ["cp36-*", "cp37-*", "cp38-*", "*win32*", "*arm64*", "pp*", "*i686*"] build-frontend = "build" diff --git a/WISDEM/setup.py b/WISDEM/setup.py index 1cde62465..1a687b79a 100644 --- a/WISDEM/setup.py +++ b/WISDEM/setup.py @@ -8,8 +8,10 @@ import shutil import platform import subprocess - import setuptools + +####### +# This forces wheels to be platform specific from setuptools.dist import Distribution from wheel.bdist_wheel import bdist_wheel as _bdist_wheel @@ -22,6 +24,7 @@ class BinaryDistribution(Distribution): """Distribution which always forces a binary package with platform name""" def has_ext_modules(foo): return True +####### def run_meson_build(staging_dir): prefix = os.path.join(os.getcwd(), staging_dir) @@ -43,14 +46,12 @@ def run_meson_build(staging_dir): if meson_path is None: raise OSError("The meson command cannot be found on the system") - meson_call = ( - f"{meson_path} setup {staging_dir} --wipe --prefix={prefix} " - + f"-Dpython.purelibdir={purelibdir} -Dpython.platlibdir={purelibdir} {meson_args}" - ) - sysargs = meson_call.split(" ") - sysargs = [arg for arg in sysargs if arg != ""] - print(sysargs) - p1 = subprocess.run(sysargs, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + meson_call = [meson_path, "setup", staging_dir, "--wipe", + f"--prefix={prefix}", f"-Dpython.purelibdir={purelibdir}", + f"-Dpython.platlibdir={purelibdir}"] + meson_args.split() + meson_call = [m for m in meson_call if m.strip() != ""] + print(meson_call) + p1 = subprocess.run(meson_call, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) os.makedirs(staging_dir, exist_ok=True) setup_log = os.path.join(staging_dir, "setup.log") with open(setup_log, "wb") as f: @@ -58,23 +59,20 @@ def run_meson_build(staging_dir): if p1.returncode != 0: with open(setup_log, "r") as f: print(f.read()) - raise OSError(sysargs, f"The meson setup command failed! Check the log at {setup_log} for more information.") + raise OSError(meson_call, f"The meson setup command failed! Check the log at {setup_log} for more information.") # build - meson_call = f"{meson_path} compile -vC {staging_dir}" - sysargs = meson_call.split(" ") - sysargs = [arg for arg in sysargs if arg != ""] - print(sysargs) - p2 = subprocess.run(sysargs, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + meson_call = [meson_path, "compile", "-vC", staging_dir] + meson_call = [m for m in meson_call if m != ""] + print(meson_call) + p2 = subprocess.run(meson_call, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) compile_log = os.path.join(staging_dir, "compile.log") with open(compile_log, "wb") as f: f.write(p2.stdout) if p2.returncode != 0: with open(compile_log, "r") as f: print(f.read()) - raise OSError( - sysargs, f"The meson compile command failed! Check the log at {compile_log} for more information." - ) + raise OSError(meson_call, f"The meson compile command failed! Check the log at {compile_log} for more information.") def copy_shared_libraries(): @@ -111,7 +109,7 @@ def copy_shared_libraries(): # with open(req_txt) as f: # docs_require = f.read().splitlines() - init_file = os.path.join("wisdem", "__init__.py") + #init_file = os.path.join("wisdem", "__init__.py") # __version__ = re.findall( # r"""__version__ = ["']+([0-9\.]*)["']+""", # open(init_file).read(), diff --git a/WISDEM/wisdem/airfoilprep/airfoilprep.py b/WISDEM/wisdem/airfoilprep/airfoilprep.py index 21b3777a7..b7dde1f82 100644 --- a/WISDEM/wisdem/airfoilprep/airfoilprep.py +++ b/WISDEM/wisdem/airfoilprep/airfoilprep.py @@ -300,8 +300,9 @@ def extrapolate(self, cdmax, AR=None, cdmin=0.001, nalpha=15): cd = np.maximum(cd, cdmin) # don't allow negative drag coefficients # Setup alpha and cm to be used in extrapolation - cm1_alpha = np.floor(self.alpha[0] / 10.0) * 10.0 - cm2_alpha = np.ceil(self.alpha[-1] / 10.0) * 10.0 + eps = 1e-13 + cm1_alpha = np.floor(self.alpha[0] / 10.0 - eps) * 10.0 + cm2_alpha = np.ceil(self.alpha[-1] / 10.0 + eps) * 10.0 alpha_num = abs(int((-180.0 - cm1_alpha) / 10.0 - 1)) alpha_cm1 = np.linspace(-180.0, cm1_alpha, alpha_num) alpha_cm2 = np.linspace(cm2_alpha, 180.0, int((180.0 - cm2_alpha) / 10.0 + 1)) diff --git a/WISDEM/wisdem/ccblade/Polar.py b/WISDEM/wisdem/ccblade/Polar.py index ff7b7e1b8..bfcdf0285 100644 --- a/WISDEM/wisdem/ccblade/Polar.py +++ b/WISDEM/wisdem/ccblade/Polar.py @@ -350,6 +350,8 @@ def extrapolate(self, cdmax, AR=None, cdmin=0.001, nalpha=15): # -90 <-> -alpha_high alpha5 = np.linspace(-np.pi / 2, alpha5max, nalpha) alpha5 = alpha5[1:] + if alpha_low == -alpha_high: + alpha5 = alpha5[:-1] cl5, cd5 = self.__Viterna(-alpha5, -cl_adj) # -180+alpha_high <-> -90 diff --git a/WISDEM/wisdem/commonse/cylinder_member.py b/WISDEM/wisdem/commonse/cylinder_member.py index bde7ac11b..f82ac358c 100644 --- a/WISDEM/wisdem/commonse/cylinder_member.py +++ b/WISDEM/wisdem/commonse/cylinder_member.py @@ -1,7 +1,5 @@ import copy -from sortedcontainers import SortedDict - import numpy as np import openmdao.api as om from sortedcontainers import SortedDict @@ -321,6 +319,7 @@ def compute(self, inputs, outputs, discrete_inputs, discrete_outputs): E_param[k, :] = inputs["E_user"] else: E_param[k, :] = E[imat] + G_param[k, :] = G[imat] sigy_param[k, :] = sigy[imat] sigu_param[k, :] = sigu[imat] @@ -614,6 +613,7 @@ def setup(self): self.add_input("labor_cost_rate", 0.0, units="USD/min") self.add_input("painting_cost_rate", 0.0, units="USD/m/m") + self.add_output("labor_hours", val=0.0, units="h") self.add_output("shell_cost", val=0.0, units="USD") self.add_output("shell_mass", val=0.0, units="kg") self.add_output("shell_z_cg", val=0.0, units="m") @@ -748,14 +748,18 @@ def compute(self, inputs, outputs): # Cost Step 4) Circumferential welds to join cans together theta_A = 2.0 - # Labor-based expenses - K_f = k_f * ( + # Labor hours + labor_minutes = ( manufacture.steel_cutting_plasma_time(cutLengths, t_full) + manufacture.steel_rolling_time(theta_F, R_ave, t_full) + manufacture.steel_butt_welding_time(theta_A, nsec, mshell_tot, cutLengths, t_full) + manufacture.steel_butt_welding_time(theta_A, nsec, mshell_tot, 2 * np.pi * Rb[1:], t_full[1:]) ) - + outputs["labor_hours"] = labor_minutes / 60.0 + + # Labor-based expenses + K_f = k_f * labor_minutes + # Cost step 5) Painting- outside and inside theta_p = 2 K_p = k_p * theta_p * 2 * (2 * np.pi * R_ave * H).sum() @@ -2124,12 +2128,11 @@ class CylinderPostFrame(om.ExplicitComponent): def initialize(self): self.options.declare("modeling_options") self.options.declare("n_dlc") + self.options.declare("n_full") def setup(self): - n_height = self.options["modeling_options"]["n_height"] - n_refine = self.options["modeling_options"]["n_refine"] - n_full = get_nfull(n_height, nref=n_refine) n_dlc = self.options["n_dlc"] + n_full = self.options["n_full"] # effective geometry -- used for handbook methods to estimate hoop stress, buckling, fatigue self.add_input("z_full", np.zeros(n_full), units="m") diff --git a/WISDEM/wisdem/commonse/distribution.py b/WISDEM/wisdem/commonse/distribution.py index ae556e224..4b0293598 100644 --- a/WISDEM/wisdem/commonse/distribution.py +++ b/WISDEM/wisdem/commonse/distribution.py @@ -30,8 +30,7 @@ def setup(self): self.add_input("A", shape=1, desc="scale factor") - arange = np.arange(self.options["nspline"]) - self.declare_partials("F", "x", rows=arange, cols=arange) + self.declare_partials("F", "x") self.declare_partials("F", ["A", "k"]) def compute(self, inputs, outputs): @@ -42,7 +41,7 @@ def compute_partials(self, inputs, J): A = inputs["A"] k = inputs["k"] - J["F", "x"] = np.exp(-((x / A) ** k)) * (x / A) ** (k - 1) * k / A + J["F", "x"] = np.diag(np.exp(-((x / A) ** k)) * (x / A) ** (k - 1) * k / A) J["F", "A"] = -k / A * np.exp(-((x / A) ** k)) * (x / A) ** k J["F", "k"] = np.exp(-((x / A) ** k)) * (x / A) ** k * np.log(x / A) diff --git a/WISDEM/wisdem/commonse/utilities.py b/WISDEM/wisdem/commonse/utilities.py index 22794cadd..5babe1122 100644 --- a/WISDEM/wisdem/commonse/utilities.py +++ b/WISDEM/wisdem/commonse/utilities.py @@ -40,7 +40,7 @@ def get_modal_coefficients(x, y, deg=[2, 3, 4, 5, 6], idx0=None, base_slope0=Tru # Get coefficients to 2-6th order polynomial p6 = np.polynomial.polynomial.polyfit(xn, y, deg) - + # Normalize for Elastodyn # The normalization shouldn't be less than 1e-5 otherwise OpenFAST has trouble in single prec if y.ndim > 1: @@ -55,7 +55,6 @@ def get_modal_coefficients(x, y, deg=[2, 3, 4, 5, 6], idx0=None, base_slope0=Tru normval = np.maximum(np.abs(tempsum), 1e-5) normval *= np.sign(tempsum) p6 /= normval - return p6 @@ -204,6 +203,7 @@ def record_used_freqs(polyidx, i, used_freq_idx): mshapes_z[i, :] = zpolys[freqs > 1e-1, :][z_polyidx, :] freq_z[i] = freqs_dyn[z_polyidx] used_freq_idx = record_used_freqs(z_polyidx, i, used_freq_idx) + return freq_x, freq_y, freq_z, mshapes_x, mshapes_y, mshapes_z diff --git a/WISDEM/wisdem/drivetrainse/drive_components.py b/WISDEM/wisdem/drivetrainse/drive_components.py index c4f31d989..aca6eaf88 100644 --- a/WISDEM/wisdem/drivetrainse/drive_components.py +++ b/WISDEM/wisdem/drivetrainse/drive_components.py @@ -534,6 +534,12 @@ class MiscNacelleComponents(om.ExplicitComponent): component center of mass platform_I : numpy array[3], [m] component mass moments of inertia + cover_length : float, [m] + length of cover and outer nacelle + cover_height : float, [m] + height of cover and outer nacelle + cover_width : float, [m] + width of cover and outer nacelle cover_mass : float, [kg] component mass cover_cm : numpy array[3], [m] @@ -565,6 +571,9 @@ def setup(self): self.add_output("platform_mass", 0.0, units="kg") self.add_output("platform_cm", np.zeros(3), units="m") self.add_output("platform_I", np.zeros(3), units="m") + self.add_output("cover_length", 0.0, units="m") + self.add_output("cover_height", 0.0, units="m") + self.add_output("cover_width", 0.0, units="m") self.add_output("cover_mass", 0.0, units="kg") self.add_output("cover_cm", np.zeros(3), units="m") self.add_output("cover_I", np.zeros(3), units="m") @@ -605,6 +614,9 @@ def compute(self, inputs, outputs, discrete_inputs, discrete_outputs): ) if upwind: cm_cover[0] *= -1.0 + outputs["cover_length"] = L_cover + outputs["cover_height"] = H_cover + outputs["cover_width"] = W_cover outputs["cover_mass"] = m_cover outputs["cover_cm"] = cm_cover outputs["cover_I"] = I_cover @@ -1020,6 +1032,8 @@ class RNA_Adder(om.ExplicitComponent): Mass of hub system (hub + spinner + pitch) nacelle_mass : float, [kg] Mass of nacelle system + blades_cm : float, [m] + Center of mass for all blades from blade attachment centerpoint in hub c.s. hub_system_cm : float, [m] Hub center of mass from hub flange in hub c.s. nacelle_cm : numpy array[3], [m] @@ -1051,6 +1065,7 @@ def setup(self): self.add_input("blades_mass", 0.0, units="kg") self.add_input("hub_system_mass", 0.0, units="kg") self.add_input("nacelle_mass", 0.0, units="kg") + self.add_input("blades_cm", 0.0, units="m") self.add_input("hub_system_cm", 0.0, units="m") self.add_input("nacelle_cm", np.zeros(3), units="m") self.add_input("blades_I", np.zeros(6), units="kg*m**2") @@ -1066,29 +1081,38 @@ def compute(self, inputs, outputs, discrete_inputs, discrete_outputs): Cup = -1.0 if discrete_inputs["upwind"] else 1.0 tilt = float(np.deg2rad(inputs["tilt"])) - rotor_mass = inputs["blades_mass"] + inputs["hub_system_mass"] + hub_mass = inputs["hub_system_mass"] + blades_mass = inputs["blades_mass"] nac_mass = inputs["nacelle_mass"] # rna mass - outputs["rotor_mass"] = rotor_mass + outputs["rotor_mass"] = rotor_mass = hub_mass + blades_mass outputs["rna_mass"] = rotor_mass + nac_mass # rna cm shaft0 = inputs["shaft_start"] - hub_cm = inputs["hub_system_cm"] + hub_cm_in = inputs["hub_system_cm"] + blades_cm_in = inputs["blades_cm"] L_drive = inputs["L_drive"] - hub_cm = shaft0 + (L_drive + hub_cm) * np.array([Cup * np.cos(tilt), 0.0, np.sin(tilt)]) - outputs["rna_cm"] = (rotor_mass * hub_cm + nac_mass * inputs["nacelle_cm"]) / outputs["rna_mass"] + cm_array = np.array([Cup * np.cos(tilt), 0.0, np.sin(tilt)]) + hub_cm = shaft0 + (L_drive + hub_cm_in) * cm_array + blades_cm = shaft0 + (L_drive + hub_cm_in + blades_cm_in) * cm_array + outputs["rna_cm"] = (hub_mass * hub_cm + + blades_mass * blades_cm + + nac_mass * inputs["nacelle_cm"]) / outputs["rna_mass"] # rna I hub_I = util.assembleI(util.rotateI(inputs["hub_system_I"], -Cup * tilt, axis="y")) blades_I = util.assembleI(util.rotateI(inputs["blades_I"], -Cup * tilt, axis="y")) nac_I_TT = util.assembleI(inputs["nacelle_I_TT"]) - rotor_I = blades_I + hub_I R = hub_cm - rotor_I_TT = rotor_I + rotor_mass * (np.dot(R, R) * np.eye(3) - np.outer(R, R)) - outputs["rna_I_TT"] = util.unassembleI(rotor_I_TT + nac_I_TT) + hub_I_TT = hub_I + hub_mass * (np.dot(R, R) * np.eye(3) - np.outer(R, R)) + + R = blades_cm + blades_I_TT = blades_I + blades_mass * (np.dot(R, R) * np.eye(3) - np.outer(R, R)) + + outputs["rna_I_TT"] = util.unassembleI(hub_I_TT + blades_I_TT + nac_I_TT) # -------------------------------------------- diff --git a/WISDEM/wisdem/drivetrainse/drive_structure.py b/WISDEM/wisdem/drivetrainse/drive_structure.py index 12589f212..a9da82773 100644 --- a/WISDEM/wisdem/drivetrainse/drive_structure.py +++ b/WISDEM/wisdem/drivetrainse/drive_structure.py @@ -172,46 +172,46 @@ def compute(self, inputs, outputs, discrete_inputs, discrete_outputs): # Unpack inputs upwind = discrete_inputs["upwind"] Cup = -1.0 if upwind else 1.0 - tilt = float(np.deg2rad(inputs["tilt"])) + tilt = float(np.deg2rad(inputs["tilt"][0])) s_lss = inputs["s_lss"] D_lss = inputs["lss_diameter"] t_lss = inputs["lss_wall_thickness"] - s_mb1 = float(inputs["s_mb1"]) - s_mb2 = float(inputs["s_mb2"]) + s_mb1 = float(inputs["s_mb1"][0]) + s_mb2 = float(inputs["s_mb2"][0]) if self.options["direct_drive"]: - s_rotor = float(inputs["s_rotor"]) - m_rotor = float(inputs["generator_rotor_mass"]) + s_rotor = float(inputs["s_rotor"][0]) + m_rotor = float(inputs["generator_rotor_mass"][0]) I_rotor = inputs["generator_rotor_I"] - m_brake = float(inputs["brake_mass"]) + m_brake = float(inputs["brake_mass"][0]) I_brake = inputs["brake_I"] else: - m_gearbox = float(inputs["gearbox_mass"]) + m_gearbox = float(inputs["gearbox_mass"][0]) I_gearbox = inputs["gearbox_I"] - m_carrier = float(inputs["carrier_mass"]) + m_carrier = float(inputs["carrier_mass"][0]) I_carrier = inputs["carrier_I"] - rho = float(inputs["lss_rho"]) - E = float(inputs["lss_E"]) - G = float(inputs["lss_G"]) - sigma_y = float(inputs["lss_Xy"]) + rho = float(inputs["lss_rho"][0]) + E = float(inputs["lss_E"][0]) + G = float(inputs["lss_G"][0]) + sigma_y = float(inputs["lss_Xy"][0]) gamma_f = float(self.options["modeling_options"]["gamma_f"]) gamma_m = float(self.options["modeling_options"]["gamma_m"]) gamma_n = float(self.options["modeling_options"]["gamma_n"]) gamma = gamma_f * gamma_m * gamma_n - m_hub = float(inputs["hub_system_mass"]) - cm_hub = float(inputs["hub_system_cm"]) + m_hub = float(inputs["hub_system_mass"][0]) + cm_hub = float(inputs["hub_system_cm"][0]) I_hub = inputs["hub_system_I"] F_hub = inputs["F_hub"] M_hub = inputs["M_hub"] - torq_defl_allow = float(inputs["shaft_deflection_allowable"]) - torq_angle_allow = float(inputs["shaft_angle_allowable"]) + torq_defl_allow = float(inputs["shaft_deflection_allowable"][0]) + torq_angle_allow = float(inputs["shaft_angle_allowable"][0]) # ------- node data ---------------- n = len(s_lss) @@ -482,30 +482,30 @@ def setup(self): def compute(self, inputs, outputs): # Unpack inputs - tilt = float(np.deg2rad(inputs["tilt"])) + tilt = float(np.deg2rad(inputs["tilt"][0])) s_hss = inputs["s_hss"] D_hss = inputs["hss_diameter"] t_hss = inputs["hss_wall_thickness"] - s_generator = float(inputs["s_generator"]) - m_generator = float(inputs["generator_mass"]) + s_generator = float(inputs["s_generator"][0]) + m_generator = float(inputs["generator_mass"][0]) I_generator = inputs["generator_I"] - m_brake = float(inputs["brake_mass"]) + m_brake = float(inputs["brake_mass"][0]) I_brake = inputs["brake_I"] - rho = float(inputs["hss_rho"]) - E = float(inputs["hss_E"]) - G = float(inputs["hss_G"]) - sigma_y = float(inputs["hss_Xy"]) + rho = float(inputs["hss_rho"][0]) + E = float(inputs["hss_E"][0]) + G = float(inputs["hss_G"][0]) + sigma_y = float(inputs["hss_Xy"][0]) gamma_f = float(self.options["modeling_options"]["gamma_f"]) gamma_m = float(self.options["modeling_options"]["gamma_m"]) gamma_n = float(self.options["modeling_options"]["gamma_n"]) gamma = gamma_f * gamma_m * gamma_n M_hub = inputs["M_hub"] - gear_ratio = float(inputs["gear_ratio"]) + gear_ratio = float(inputs["gear_ratio"][0]) # ------- node data ---------------- n = len(s_hss) @@ -799,7 +799,7 @@ def compute(self, inputs, outputs, discrete_inputs, discrete_outputs): # Unpack inputs upwind = discrete_inputs["upwind"] Cup = -1.0 if upwind else 1.0 - tiltD = float(inputs["tilt"]) + tiltD = float(inputs["tilt"][0]) tiltR = np.deg2rad(tiltD) x_c = inputs["x_bedplate"] @@ -818,21 +818,21 @@ def compute(self, inputs, outputs, discrete_inputs, discrete_outputs): x_nose *= Cup x_nose += x_c[-1] - s_mb1 = float(inputs["s_mb1"]) - s_mb2 = float(inputs["s_mb2"]) - m_mb1 = float(inputs["mb1_mass"]) - m_mb2 = float(inputs["mb2_mass"]) + s_mb1 = float(inputs["s_mb1"][0]) + s_mb2 = float(inputs["s_mb2"][0]) + m_mb1 = float(inputs["mb1_mass"][0]) + m_mb2 = float(inputs["mb2_mass"][0]) I_mb1 = inputs["mb1_I"] I_mb2 = inputs["mb2_I"] - s_stator = float(inputs["s_stator"]) - m_stator = float(inputs["generator_stator_mass"]) + s_stator = float(inputs["s_stator"][0]) + m_stator = float(inputs["generator_stator_mass"][0]) I_stator = inputs["generator_stator_I"] - rho = float(inputs["bedplate_rho"]) - E = float(inputs["bedplate_E"]) - G = float(inputs["bedplate_G"]) - sigma_y = float(inputs["bedplate_Xy"]) + rho = float(inputs["bedplate_rho"][0]) + E = float(inputs["bedplate_E"][0]) + G = float(inputs["bedplate_G"][0]) + sigma_y = float(inputs["bedplate_Xy"][0]) gamma_f = float(self.options["modeling_options"]["gamma_f"]) gamma_m = float(self.options["modeling_options"]["gamma_m"]) gamma_n = float(self.options["modeling_options"]["gamma_n"]) @@ -843,9 +843,9 @@ def compute(self, inputs, outputs, discrete_inputs, discrete_outputs): M_mb1 = inputs["M_mb1"] M_mb2 = inputs["M_mb2"] - m_other = float(inputs["other_mass"]) - stator_defl_allow = float(inputs["stator_deflection_allowable"]) - stator_angle_allow = float(inputs["stator_angle_allowable"]) + m_other = float(inputs["other_mass"][0]) + stator_defl_allow = float(inputs["stator_deflection_allowable"][0]) + stator_angle_allow = float(inputs["stator_angle_allowable"][0]) # ------- node data ---------------- n = len(x_c) + len(x_nose) @@ -1032,7 +1032,7 @@ def compute(self, inputs, outputs, discrete_inputs, discrete_outputs): outputs["constr_mb1_defl"] = np.abs(outputs["mb1_angle"] / inputs["mb1_max_defl_ang"]) outputs["constr_mb2_defl"] = np.abs(outputs["mb2_angle"] / inputs["mb2_max_defl_ang"]) outputs["stator_deflection"] = stator_deflection.max() - outputs["stator_angle"] = stator_angle.max() + outputs["stator_angle"] = np.abs(stator_angle).max() outputs["constr_stator_deflection"] = gamma * outputs["stator_deflection"] / stator_defl_allow outputs["constr_stator_angle"] = gamma * outputs["stator_angle"] / stator_angle_allow @@ -1186,30 +1186,30 @@ def compute(self, inputs, outputs, discrete_inputs, discrete_outputs): # Unpack inputs upwind = discrete_inputs["upwind"] Cup = -1.0 if upwind else 1.0 - D_top = float(inputs["D_top"]) - tiltD = float(inputs["tilt"]) + D_top = float(inputs["D_top"][0]) + tiltD = float(inputs["tilt"][0]) tiltR = np.deg2rad(tiltD) s_drive = inputs["s_drive"] - s_gear = float(inputs["s_gearbox"]) - s_gen = float(inputs["s_generator"]) + s_gear = float(inputs["s_gearbox"][0]) + s_gen = float(inputs["s_generator"][0]) - s_mb1 = float(inputs["s_mb1"]) - s_mb2 = float(inputs["s_mb2"]) - m_mb1 = float(inputs["mb1_mass"]) - m_mb2 = float(inputs["mb2_mass"]) + s_mb1 = float(inputs["s_mb1"][0]) + s_mb2 = float(inputs["s_mb2"][0]) + m_mb1 = float(inputs["mb1_mass"][0]) + m_mb2 = float(inputs["mb2_mass"][0]) I_mb1 = inputs["mb1_I"] I_mb2 = inputs["mb2_I"] - bed_w_flange = float(inputs["bedplate_flange_width"]) - bed_t_flange = float(inputs["bedplate_flange_thickness"]) - bed_h_web = float(inputs["bedplate_web_height"]) - bed_t_web = float(inputs["bedplate_web_thickness"]) + bed_w_flange = float(inputs["bedplate_flange_width"][0]) + bed_t_flange = float(inputs["bedplate_flange_thickness"][0]) + bed_h_web = float(inputs["bedplate_web_height"][0]) + bed_t_web = float(inputs["bedplate_web_thickness"][0]) - rho = float(inputs["bedplate_rho"]) - E = float(inputs["bedplate_E"]) - G = float(inputs["bedplate_G"]) - sigma_y = float(inputs["bedplate_Xy"]) + rho = float(inputs["bedplate_rho"][0]) + E = float(inputs["bedplate_E"][0]) + G = float(inputs["bedplate_G"][0]) + sigma_y = float(inputs["bedplate_Xy"][0]) gamma_f = float(self.options["modeling_options"]["gamma_f"]) gamma_m = float(self.options["modeling_options"]["gamma_m"]) gamma_n = float(self.options["modeling_options"]["gamma_n"]) @@ -1224,9 +1224,9 @@ def compute(self, inputs, outputs, discrete_inputs, discrete_outputs): M_gear = inputs["M_torq"] M_gen = inputs["M_generator"] - m_other = float(inputs["other_mass"]) - stator_defl_allow = float(inputs["stator_deflection_allowable"]) - stator_angle_allow = float(inputs["stator_angle_allowable"]) + m_other = float(inputs["other_mass"][0]) + stator_defl_allow = float(inputs["stator_deflection_allowable"][0]) + stator_angle_allow = float(inputs["stator_angle_allowable"][0]) # ------- node data ---------------- n = len(s_drive) diff --git a/WISDEM/wisdem/fixed_bottomse/jacket.py b/WISDEM/wisdem/fixed_bottomse/jacket.py index 318245ba8..8ff030e0b 100644 --- a/WISDEM/wisdem/fixed_bottomse/jacket.py +++ b/WISDEM/wisdem/fixed_bottomse/jacket.py @@ -675,6 +675,7 @@ def setup(self): self.add_input("tower_cost", val=0.0, units="USD") self.add_input("transition_piece_cost", 0.0, units="USD") + self.add_output("labor_hours", 0.0, units="h") self.add_output("jacket_cost", 0.0, units="USD") self.add_output("structural_cost", val=0.0, units="USD") @@ -737,7 +738,8 @@ def compute(self, inputs, outputs, discrete_inputs, discrete_outputs): t_weld = manu.steel_tube_welding_time(theta, n_pieces, m_total, weld_L, t) t_manufacture = t_cut + t_weld K_f = k_f * t_manufacture - + outputs["labor_hours"] = t_manufacture / 60.0 + # Cost step 5) Painting by surface area theta_p = 2 K_p = k_p * theta_p * np.pi * np.sum(D[:-n_legs] * L[:-n_legs]) diff --git a/WISDEM/wisdem/fixed_bottomse/monopile.py b/WISDEM/wisdem/fixed_bottomse/monopile.py index fa5261a1c..5c8925c4f 100644 --- a/WISDEM/wisdem/fixed_bottomse/monopile.py +++ b/WISDEM/wisdem/fixed_bottomse/monopile.py @@ -285,6 +285,11 @@ def setup(self): self.add_input("section_E", np.zeros(n_full - 1), units="Pa") self.add_input("section_G", np.zeros(n_full - 1), units="Pa") self.add_output("section_L", np.zeros(n_full - 1 + ntow_sec), units="m") + self.add_input("d_full", np.zeros(n_full), units="m") + self.add_input("t_full", np.zeros(n_full - 1), units="m") + self.add_input("sigma_y_full", np.zeros(n_full -1), units="Pa") + self.add_input("qdyn", np.zeros((n_full,nLC)), units="Pa") + self.add_input("bending_height", 0.0, units="m") # cross-sectional data along tower self.add_input("tower_xyz", np.zeros((n_full_tow, 3)), units="m") @@ -297,6 +302,11 @@ def setup(self): self.add_input("tower_rho", np.zeros(ntow_sec), units="kg/m**3") self.add_input("tower_E", np.zeros(ntow_sec), units="Pa") self.add_input("tower_G", np.zeros(ntow_sec), units="Pa") + self.add_input("tower_d_full", np.zeros(n_full_tow), units="m") + self.add_input("tower_t_full", np.zeros(ntow_sec), units="m") + self.add_input("tower_sigma_y_full", np.zeros(ntow_sec), units="Pa") + self.add_input("tower_qdyn", np.zeros((n_full_tow,nLC)), units="Pa") + self.add_input("tower_bending_height", 0.0, units="m") # point loads self.add_input("rna_F", np.zeros((3, nLC)), units="N") @@ -354,6 +364,24 @@ def setup(self): self.add_output("mudline_F", val=np.zeros((3, nLC)), units="N") self.add_output("mudline_M", val=np.zeros((3, nLC)), units="N*m") + + # Tower and monopile combined + self.add_output("monopile_tower_z_full", val=np.zeros(n_full + n_full_tow - 1), units="m") + self.add_output("monopile_tower_d_full", val=np.zeros(n_full + n_full_tow - 1), units="m") + self.add_output("monopile_tower_t_full", val=np.zeros(n_full + ntow_sec - 1), units="m") + self.add_output("monopile_tower_rho_full", val=np.zeros(n_full + ntow_sec -1), units="kg/m**3") + self.add_output("monopile_tower_E_full", val=np.zeros(n_full + ntow_sec -1), units="Pa") + self.add_output("monopile_tower_G_full", val=np.zeros(n_full + ntow_sec -1), units="Pa") + self.add_output("monopile_tower_sigma_y_full", val=np.zeros(n_full + ntow_sec -1), units="Pa") + self.add_output("monopile_tower_bending_height", val=0.0, units="m") + self.add_output("monopile_tower_qdyn", val=np.zeros((n_full + n_full_tow - 1, nLC)), units="Pa") + self.add_output("monopile_tower_Fz", val=np.zeros((n_full + ntow_sec -1, nLC)), units="N") + self.add_output("monopile_tower_Vx", val=np.zeros((n_full + ntow_sec -1, nLC)), units="N") + self.add_output("monopile_tower_Vy", val=np.zeros((n_full + ntow_sec -1, nLC)), units="N") + self.add_output("monopile_tower_Mxx", val=np.zeros((n_full + ntow_sec -1, nLC)), units="N*m") + self.add_output("monopile_tower_Myy", val=np.zeros((n_full + ntow_sec -1, nLC)), units="N*m") + self.add_output("monopile_tower_Mzz", val=np.zeros((n_full + ntow_sec -1, nLC)), units="N*m") + def compute(self, inputs, outputs): frame3dd_opt = self.options["frame3dd_opt"] nLC = self.options["nLC"] @@ -437,6 +465,23 @@ def compute(self, inputs, outputs): E = np.r_[inputs["section_E"], inputs["tower_E"]] G = np.r_[inputs["section_G"], inputs["tower_G"]] rho = np.r_[inputs["section_rho"], inputs["tower_rho"]] + d = np.r_[inputs["d_full"][:-1], inputs["tower_d_full"]] + t = np.r_[inputs["t_full"], inputs["tower_t_full"]] + sigma_y = np.r_[inputs["sigma_y_full"], inputs["tower_sigma_y_full"]] + + outputs["monopile_tower_z_full"] = z + outputs["monopile_tower_d_full"] = d + outputs["monopile_tower_t_full"] = t + outputs["monopile_tower_rho_full"] = rho + outputs["monopile_tower_E_full"] = E + outputs["monopile_tower_G_full"] = G + outputs["monopile_tower_sigma_y_full"] = sigma_y + outputs["monopile_tower_bending_height"] = inputs['bending_height'] + inputs['tower_bending_height'] + for ic in range(nLC): + qdyn = np.r_[inputs["qdyn"][:-1,ic], inputs["tower_qdyn"][:,ic]] + outputs["monopile_tower_qdyn"][:, ic] = qdyn + + else: Area = inputs["section_A"] Asx = inputs["section_Asx"] @@ -482,7 +527,7 @@ def compute(self, inputs, outputs): rna_F = inputs["rna_F"][:, k] rna_M = inputs["rna_M"][:, k] load.changePointLoads( - np.array([n], dtype=np.int_), # -1 b/c same reason as above + np.array([n-1], dtype=np.int_), # -1 b/c same reason as above np.array([rna_F[0]]).flatten(), np.array([rna_F[1]]).flatten(), np.array([rna_F[2]]).flatten(), @@ -500,7 +545,7 @@ def compute(self, inputs, outputs): turb_F = inputs["turbine_F"][:, k] turb_M = inputs["turbine_M"][:, k] load.changePointLoads( - np.array([n], dtype=np.int_), # -1 b/c same reason as above + np.array([n-1], dtype=np.int_), # -1 b/c same reason as above np.array([turb_F[0]]).flatten(), np.array([turb_F[1]]).flatten(), np.array([turb_F[2]]).flatten(), @@ -546,7 +591,7 @@ def compute(self, inputs, outputs): # Note, need len()-1 because Frame3DD crashes if mass add at end if tower_flag: - midx = np.array([n, n_mono, 1], dtype=np.int_) + midx = np.array([n-1, n_mono, 1], dtype=np.int_) m_add = np.r_[m_rna, m_trans, m_grav] mI = np.c_[I_rna, I_trans, I_grav] mrho = np.c_[cg_rna, np.zeros(3), np.zeros(3)] @@ -650,6 +695,14 @@ def compute(self, inputs, outputs): outputs["monopile_Mxx"] = Mxx[: (n_mono - 1)] outputs["monopile_Myy"] = Myy[: (n_mono - 1)] outputs["monopile_Mzz"] = Mzz[: (n_mono - 1)] + + + outputs["monopile_tower_Fz"] = Fz + outputs["monopile_tower_Vx"] = Vx + outputs["monopile_tower_Vy"] = Vy + outputs["monopile_tower_Mxx"] = Mxx + outputs["monopile_tower_Myy"] = Myy + outputs["monopile_tower_Mzz"] = Mzz class MonopileSE(om.Group): @@ -728,7 +781,7 @@ def setup(self): ("wall_thickness", "monopile_wall_thickness"), ] if n_height > 2: - promlist + ["thickness_slope"] + promlist += ["thickness_slope"] temp_opt = mod_opt.copy() temp_opt["n_height"] = [n_height] @@ -778,13 +831,10 @@ def setup(self): self.add_subsystem("loads", mem.MemberLoads(n_full=n_full, n_lc=nLC, wind=wind, hydro=True), promotes=["*"]) n_full_tow = 0 - try: - if self.options["modeling_options"]["flags"]["tower"]: - tow_opt = self.options["modeling_options"]["WISDEM"]["TowerSE"] - n_height = tow_opt["n_height"] - n_full_tow = mem.get_nfull(n_height, nref=tow_opt["n_refine"]) - except: - pass + if self.options["modeling_options"]["flags"]["tower"]: + tow_opt = self.options["modeling_options"]["WISDEM"]["TowerSE"] + n_height = tow_opt["n_height"] + n_full_tow = mem.get_nfull(n_height, nref=tow_opt["n_refine"]) self.add_subsystem( "monopile", @@ -808,6 +858,16 @@ def setup(self): "section_rho", "section_E", "section_G", + "d_full", + "t_full", + "sigma_y_full", + "tower_d_full", + "tower_t_full", + "tower_sigma_y_full", + "bending_height", + "tower_bending_height", + "qdyn", + "tower_qdyn", "tower_A", "tower_Asx", "tower_Asy", @@ -849,12 +909,14 @@ def setup(self): "tower_torsion_modes", "f1", "f2", + "water_depth" ], ) + # Compute stress and buckling constraints for monopile alone self.add_subsystem( "post", - mem.CylinderPostFrame(modeling_options=mod_opt, n_dlc=nLC), + mem.CylinderPostFrame(modeling_options=mod_opt, n_dlc=nLC, n_full = n_full), promotes=[ "z_full", "d_full", @@ -878,3 +940,26 @@ def setup(self): self.connect("monopile.monopile_Mxx", "post.cylinder_Mxx") self.connect("monopile.monopile_Myy", "post.cylinder_Myy") self.connect("monopile.monopile_Mzz", "post.cylinder_Mzz") + + if self.options["modeling_options"]["flags"]["tower"]: + # Compute stress and buckling constraints for monopile and tower combined + self.add_subsystem( + "post_monopile_tower", + mem.CylinderPostFrame(modeling_options=mod_opt, n_dlc=nLC, n_full = n_full + n_full_tow - 1), + ) + + self.connect("monopile.monopile_tower_z_full", "post_monopile_tower.z_full") + self.connect("monopile.monopile_tower_d_full", "post_monopile_tower.d_full") + self.connect("monopile.monopile_tower_t_full", "post_monopile_tower.t_full") + self.connect("monopile.monopile_tower_rho_full", "post_monopile_tower.rho_full") + self.connect("monopile.monopile_tower_E_full", "post_monopile_tower.E_full") + self.connect("monopile.monopile_tower_G_full", "post_monopile_tower.G_full") + self.connect("monopile.monopile_tower_sigma_y_full", "post_monopile_tower.sigma_y_full") + self.connect("monopile.monopile_tower_bending_height", "post_monopile_tower.bending_height") + self.connect("monopile.monopile_tower_qdyn", "post_monopile_tower.qdyn") + self.connect("monopile.monopile_tower_Fz", "post_monopile_tower.cylinder_Fz") + self.connect("monopile.monopile_tower_Vx", "post_monopile_tower.cylinder_Vx") + self.connect("monopile.monopile_tower_Vy", "post_monopile_tower.cylinder_Vy") + self.connect("monopile.monopile_tower_Mxx", "post_monopile_tower.cylinder_Mxx") + self.connect("monopile.monopile_tower_Myy", "post_monopile_tower.cylinder_Myy") + self.connect("monopile.monopile_tower_Mzz", "post_monopile_tower.cylinder_Mzz") diff --git a/WISDEM/wisdem/floatingse/constraints.py b/WISDEM/wisdem/floatingse/constraints.py index 908ba9213..6ae656b34 100644 --- a/WISDEM/wisdem/floatingse/constraints.py +++ b/WISDEM/wisdem/floatingse/constraints.py @@ -69,8 +69,8 @@ def compute(self, inputs, outputs): xyz = inputs[f"member{k}:nodes_xyz"] inodes = np.where(xyz[:, 0] == NULL)[0][0] xyz = xyz[:inodes, :] - xyz1 = xyz[0, :] - xyz2 = xyz[-1, :] + xyz1 = xyz[0, :] # Should be the draft + xyz2 = xyz[-1, :] # Should be the freeboard # Get xp-zp coplanar coordinates relative to cg xp1 = np.sqrt(np.sum((xyz1[:2] - cg[:2]) ** 2)) @@ -78,22 +78,26 @@ def compute(self, inputs, outputs): xp2 = np.sqrt(np.sum((xyz2[:2] - cg[:2]) ** 2)) zp2 = xyz2[2] - cg[2] + # Only check this for partially submerged members + if xyz1[2] * xyz2[2] > 0: # pos * neg + continue + + # Simplify by making zp1 above zp2 + if zp2 < zp1: # Our assumption that z1 is draft is incorrect + # Swap variables + zp1, zp2 = zp2, zp1 + xp1, xp2 = xp2, xp1 + xyz1, xyz2 = xyz2, xyz1 + # Coordinate transformation about CG and change in z-position - xp1_h, zp1_h = util.rotate(0.0, 0.0, xp1, zp1, max_heel) - xp2_h, zp2_h = util.rotate(0.0, 0.0, xp2, zp2, max_heel) - dz1 = np.abs((zp1 - zp1_h) / xyz1[2]) - dz2 = np.abs((zp2 - zp2_h) / xyz2[2]) - - # See if change in z-coordinate is bigger than freeboard or draft, should be <1 - if xyz1[2] > 0.0 and xyz1[2] > xyz2[2]: - freeboard_margin[k] = dz1 - elif xyz2[2] > 0.0 and xyz2[2] > xyz1[2]: - freeboard_margin[k] = dz2 - - if xyz1[2] < 0.0 and xyz1[2] < xyz2[2]: - draft_margin[k] = dz1 - elif xyz2[2] < 0.0 and xyz2[2] < xyz1[2]: - draft_margin[k] = dz2 + _, zp1_h = util.rotate(0.0, 0.0, xp1, zp1, max_heel) # Bottom point, we care about it going up + _, zp2_h = util.rotate(0.0, 0.0, xp2, zp2, -max_heel) # Top point, we care about it going down + + dz1 = zp1_h - zp1 # change in keel/draft + dz2 = zp2 - zp2_h # change in freeboard + + draft_margin[k] = -dz1 / xyz1[2] # Adding negative because assume xyz1[2] is negative below water + freeboard_margin[k] = dz2 / xyz2[2] # Ensure members have enough clearance from the waterline outputs["constr_freeboard_heel_margin"] = freeboard_margin diff --git a/WISDEM/wisdem/floatingse/floating_frame.py b/WISDEM/wisdem/floatingse/floating_frame.py index 1d36e6bcd..4575311b4 100644 --- a/WISDEM/wisdem/floatingse/floating_frame.py +++ b/WISDEM/wisdem/floatingse/floating_frame.py @@ -422,9 +422,8 @@ def compute(self, inputs, outputs): E = inputs["tower_E"] G = inputs["tower_G"] rho = inputs["tower_rho"] - + elements = pyframe3dd.ElementData(element, N1, N2, Area, Asx, Asy, J0, Ixx, Iyy, E, G, roll, rho) - # ----------------------------------- # ------ options ------------ @@ -487,9 +486,6 @@ def compute(self, inputs, outputs): outputs["f1"] = freq[0] outputs["f2"] = freq[1] outputs["structural_frequencies"] = freq[:NFREQ] - - # myframe.draw(savefig=True) - # Get all mode shapes in batch NFREQ2 = int(NFREQ / 2) diff --git a/WISDEM/wisdem/floatingse/floating_system.py b/WISDEM/wisdem/floatingse/floating_system.py index da3acabf1..95c42e2c3 100644 --- a/WISDEM/wisdem/floatingse/floating_system.py +++ b/WISDEM/wisdem/floatingse/floating_system.py @@ -5,8 +5,8 @@ from wisdem.commonse import gravity from wisdem.commonse.cylinder_member import NULL, MEMMAX -NNODES_MAX = 200 # 1000 -NELEM_MAX = 200 # 1000 +NNODES_MAX = 500 # 1000 +NELEM_MAX = 500 # 1000 RIGID = 1e30 EPS = 1e-6 diff --git a/WISDEM/wisdem/floatingse/mooring.py b/WISDEM/wisdem/floatingse/mooring.py index 870bba6d1..c88bd3f69 100644 --- a/WISDEM/wisdem/floatingse/mooring.py +++ b/WISDEM/wisdem/floatingse/mooring.py @@ -1,8 +1,8 @@ import numpy as np import openmdao.api as om -import wisdem.moorpy as mp -import wisdem.moorpy.MoorProps as props +import moorpy as mp +import moorpy.MoorProps as props NLINES_MAX = 15 NPTS_PLOT = 101 @@ -307,7 +307,7 @@ def evaluate_mooring(self, inputs, outputs): fbody = ms.mooringEq([surge, sway, 0, 0, 0, 0], DOFtype="coupled") Frestore[ia] = np.dot(fbody[:2], idir) for k in range(n_lines): - f = ms.lineList[0].getEndForce(endB=0) + f = ms.lineList[0].TB Fa[k] = np.sqrt(np.sum(f**2)) Tmax[ia] = np.abs(Fa).max() diff --git a/WISDEM/wisdem/glue_code/gc_LoadInputs.py b/WISDEM/wisdem/glue_code/gc_LoadInputs.py index cfcaf119e..00580dc87 100644 --- a/WISDEM/wisdem/glue_code/gc_LoadInputs.py +++ b/WISDEM/wisdem/glue_code/gc_LoadInputs.py @@ -1,4 +1,5 @@ import numpy as np + import wisdem.inputs as sch @@ -1080,6 +1081,9 @@ def write_ontology(self, wt_opt, fname_output): self.wt_init["components"]["hub"]["pitch_system_scaling_factor"] = float( wt_opt["hub.pitch_system_scaling_factor"] ) + self.wt_init["components"]["hub"]["elastic_properties_mb"]['system_mass'] = float(wt_opt["drivese.hub_system_mass"]) + self.wt_init["components"]["hub"]["elastic_properties_mb"]['system_inertia'] = wt_opt["drivese.hub_system_I"].tolist() + # self.wt_init["components"]["hub"]["elastic_properties_mb"]['system_center_mass'] = wt_opt["drivese.hub_system_cm"].tolist() # Update nacelle if self.modeling_options["flags"]["nacelle"]: @@ -1129,6 +1133,11 @@ def write_ontology(self, wt_opt, fname_output): self.wt_init["components"]["nacelle"]["drivetrain"]["bedplate_material"] = wt_opt[ "nacelle.bedplate_material" ] + self.wt_init["components"]["nacelle"]["elastic_properties_mb"]["system_mass"] = float(wt_opt["drivese.above_yaw_mass"]) + self.wt_init["components"]["nacelle"]["elastic_properties_mb"]["yaw_mass"] = float(wt_opt["drivese.yaw_mass"]) + self.wt_init["components"]["nacelle"]["elastic_properties_mb"]["system_inertia"] = wt_opt["drivese.above_yaw_I"].tolist() + self.wt_init["components"]["nacelle"]["elastic_properties_mb"]["system_inertia_tt"] = wt_opt["drivese.above_yaw_I_TT"].tolist() + self.wt_init["components"]["nacelle"]["elastic_properties_mb"]["system_center_mass"] = wt_opt["drivese.above_yaw_cm"].tolist() if self.modeling_options["WISDEM"]["DriveSE"]["direct"]: # Direct only diff --git a/WISDEM/wisdem/glue_code/gc_PoseOptimization.py b/WISDEM/wisdem/glue_code/gc_PoseOptimization.py index 7abed455e..2d36c41e5 100644 --- a/WISDEM/wisdem/glue_code/gc_PoseOptimization.py +++ b/WISDEM/wisdem/glue_code/gc_PoseOptimization.py @@ -37,6 +37,9 @@ def __init__(self, wt_init, modeling_options, analysis_options): "NSGA2", ] + self.floating_solve_component = 'floatingse' + self.floating_period_solve_component = 'floatingse' + def get_number_design_variables(self): # Determine the number of design variables n_DV = 0 @@ -433,7 +436,7 @@ def set_objective(self, wt_opt): wt_opt.model.add_objective("rotorse.rp.AEP", ref=-1.0e6) elif self.opt["merit_figure"] == "blade_mass": - wt_opt.model.add_objective("rotorse.re.precomp.blade_mass", ref=1.0e4) + wt_opt.model.add_objective("rotorse.blade_mass", ref=1.0e4) elif self.opt["merit_figure"] == "LCOE": wt_opt.model.add_objective("financese.lcoe", ref=0.1) @@ -577,38 +580,6 @@ def set_design_variables(self, wt_opt, wt_init): "blade.opt_var.af_position", indices=indices_af, lower=lb_af[indices_af], upper=ub_af[indices_af] ) - spar_cap_ss_options = blade_opt["structure"]["spar_cap_ss"] - if spar_cap_ss_options["flag"]: - if blade_opt["structure"]["spar_cap_ss"]["index_end"] > blade_opt["structure"]["spar_cap_ss"]["n_opt"]: - raise Exception( - "Check the analysis options yaml, index_end of the blade spar_cap_ss is higher than the number of DVs n_opt" - ) - elif blade_opt["structure"]["spar_cap_ss"]["index_end"] == 0: - blade_opt["structure"]["spar_cap_ss"]["index_end"] = blade_opt["structure"]["spar_cap_ss"]["n_opt"] - indices_spar_cap_ss = range(spar_cap_ss_options["index_start"], spar_cap_ss_options["index_end"]) - s_opt_spar_cap_ss = np.linspace(0.0, 1.0, blade_opt["structure"]["spar_cap_ss"]["n_opt"]) - spar_cap_ss_name = self.modeling["WISDEM"]["RotorSE"]["spar_cap_ss"].lower() - layer_name = self.modeling["WISDEM"]["RotorSE"]["layer_name"] - n_layers = self.modeling["WISDEM"]["RotorSE"]["n_layers"] - for i in range(n_layers): - if layer_name[i].lower() == spar_cap_ss_name: - spar_cap_ss_interpolator = PchipInterpolator( - wt_init["components"]["blade"]["internal_structure_2d_fem"]["layers"][i]["thickness"]["grid"], - wt_init["components"]["blade"]["internal_structure_2d_fem"]["layers"][i]["thickness"]["values"], - extrapolate=False - ) - init_spar_cap_ss_opt = spar_cap_ss_interpolator(s_opt_spar_cap_ss) - for j in range(len(init_spar_cap_ss_opt)): - if np.isnan(init_spar_cap_ss_opt[j]): - init_spar_cap_ss_opt[j] = 0. - wt_opt.model.add_design_var( - "blade.opt_var.spar_cap_ss_opt", - indices=indices_spar_cap_ss, - lower=init_spar_cap_ss_opt[indices_spar_cap_ss] * spar_cap_ss_options["max_decrease"], - upper=init_spar_cap_ss_opt[indices_spar_cap_ss] * spar_cap_ss_options["max_increase"], - ref=1.0e-2, - ) - L_D_options = blade_opt["aero_shape"]["L/D"] if L_D_options["flag"]: n_opt = L_D_options["n_opt"] @@ -689,6 +660,44 @@ def set_design_variables(self, wt_opt, wt_init): upper=z_options["upper_bound"], ) + spar_cap_ss_options = blade_opt["structure"]["spar_cap_ss"] + if spar_cap_ss_options["flag"]: + if blade_opt["structure"]["spar_cap_ss"]["index_end"] > blade_opt["structure"]["spar_cap_ss"]["n_opt"]: + raise Exception( + "Check the analysis options yaml, index_end of the blade spar_cap_ss is higher than the number of DVs n_opt" + ) + elif blade_opt["structure"]["spar_cap_ss"]["index_end"] == 0: + blade_opt["structure"]["spar_cap_ss"]["index_end"] = blade_opt["structure"]["spar_cap_ss"]["n_opt"] + indices_spar_cap_ss = range(spar_cap_ss_options["index_start"], spar_cap_ss_options["index_end"]) + s_opt_spar_cap_ss = np.linspace(0.0, 1.0, blade_opt["structure"]["spar_cap_ss"]["n_opt"]) + spar_cap_ss_name = self.modeling["WISDEM"]["RotorSE"]["spar_cap_ss"].lower() + layer_name = self.modeling["WISDEM"]["RotorSE"]["layer_name"] + n_layers = self.modeling["WISDEM"]["RotorSE"]["n_layers"] + spar_cap_ss_found = False + for i in range(n_layers): + if layer_name[i].lower() == spar_cap_ss_name: + spar_cap_ss_found = True + spar_cap_ss_interpolator = PchipInterpolator( + wt_init["components"]["blade"]["internal_structure_2d_fem"]["layers"][i]["thickness"]["grid"], + wt_init["components"]["blade"]["internal_structure_2d_fem"]["layers"][i]["thickness"]["values"], + extrapolate=False + ) + init_spar_cap_ss_opt = spar_cap_ss_interpolator(s_opt_spar_cap_ss) + for j in range(len(init_spar_cap_ss_opt)): + if np.isnan(init_spar_cap_ss_opt[j]): + init_spar_cap_ss_opt[j] = 0. + if not spar_cap_ss_found: + raise Exception( + "Please set the spar cap name for suction side among the RotorSE modeling options" + ) + wt_opt.model.add_design_var( + "blade.opt_var.spar_cap_ss_opt", + indices=indices_spar_cap_ss, + lower=init_spar_cap_ss_opt[indices_spar_cap_ss] * spar_cap_ss_options["max_decrease"], + upper=init_spar_cap_ss_opt[indices_spar_cap_ss] * spar_cap_ss_options["max_increase"], + ref=1.0e-2, + ) + # Only add the pressure side design variables if we do set # `equal_to_suction` as False in the optimization yaml. spar_cap_ps_options = blade_opt["structure"]["spar_cap_ps"] @@ -704,8 +713,10 @@ def set_design_variables(self, wt_opt, wt_init): spar_cap_ps_name = self.modeling["WISDEM"]["RotorSE"]["spar_cap_ps"] layer_name = self.modeling["WISDEM"]["RotorSE"]["layer_name"] n_layers = self.modeling["WISDEM"]["RotorSE"]["n_layers"] + spar_cap_ps_found = False for i in range(n_layers): if layer_name[i] == spar_cap_ps_name: + spar_cap_ps_found = True spar_cap_ps_interpolator = PchipInterpolator( wt_init["components"]["blade"]["internal_structure_2d_fem"]["layers"][i]["thickness"]["grid"], wt_init["components"]["blade"]["internal_structure_2d_fem"]["layers"][i]["thickness"]["values"], @@ -715,6 +726,10 @@ def set_design_variables(self, wt_opt, wt_init): for j in range(len(init_spar_cap_ps_opt)): if np.isnan(init_spar_cap_ps_opt[j]): init_spar_cap_ps_opt[j] = 0. + if not spar_cap_ps_found: + raise Exception( + "Please set the spar cap name for pressure side among the RotorSE modeling options" + ) wt_opt.model.add_design_var( "blade.opt_var.spar_cap_ps_opt", indices=indices_spar_cap_ps, @@ -1293,8 +1308,10 @@ def set_constraints(self, wt_opt): else: raise Exception("thrust coefficient constraint requested but now upper or lower constraint found.") - # Tower contraints + # Tower and monopile contraints tower_constr = self.opt["constraints"]["tower"] + monopile_constr = self.opt["constraints"]["monopile"] + if tower_constr["height_constraint"]["flag"]: wt_opt.model.add_constraint( "towerse.height_constraint", @@ -1302,13 +1319,13 @@ def set_constraints(self, wt_opt): upper=tower_constr["height_constraint"]["upper_bound"], ) - if tower_constr["stress"]["flag"]: + if tower_constr["stress"]["flag"] and not monopile_constr["stress"]["flag"]: wt_opt.model.add_constraint("towerse.post.constr_stress", upper=1.0) - if tower_constr["global_buckling"]["flag"]: + if tower_constr["global_buckling"]["flag"] and not monopile_constr["global_buckling"]["flag"]: wt_opt.model.add_constraint("towerse.post.constr_global_buckling", upper=1.0) - if tower_constr["shell_buckling"]["flag"]: + if tower_constr["shell_buckling"]["flag"] and not monopile_constr["shell_buckling"]["flag"]: wt_opt.model.add_constraint("towerse.post.constr_shell_buckling", upper=1.0) if tower_constr["d_to_t"]["flag"]: @@ -1345,16 +1362,19 @@ def set_constraints(self, wt_opt): upper=tower_constr["frequency_1"]["upper_bound"], ) - # Monopile constraints - monopile_constr = self.opt["constraints"]["monopile"] - - if monopile_constr["stress"]["flag"]: + if monopile_constr["stress"]["flag"] and tower_constr["stress"]["flag"]: + wt_opt.model.add_constraint("fixedse.post_monopile_tower.constr_stress", upper=1.0) + elif monopile_constr["stress"]["flag"]: wt_opt.model.add_constraint("fixedse.post.constr_stress", upper=1.0) - if monopile_constr["global_buckling"]["flag"]: + if monopile_constr["global_buckling"]["flag"] and tower_constr["global_buckling"]["flag"]: + wt_opt.model.add_constraint("fixedse.post_monopile_tower.constr_global_buckling", upper=1.0) + elif monopile_constr["global_buckling"]["flag"]: wt_opt.model.add_constraint("fixedse.post.constr_global_buckling", upper=1.0) - if monopile_constr["shell_buckling"]["flag"]: + if monopile_constr["shell_buckling"]["flag"] and tower_constr["shell_buckling"]["flag"]: + wt_opt.model.add_constraint("fixedse.post_monopile_tower.constr_shell_buckling", upper=1.0) + elif monopile_constr["shell_buckling"]["flag"]: wt_opt.model.add_constraint("fixedse.post.constr_shell_buckling", upper=1.0) if monopile_constr["d_to_t"]["flag"]: @@ -1487,7 +1507,7 @@ def set_constraints(self, wt_opt): for modestr in ["surge", "sway", "heave", "roll", "pitch", "yaw"]: if float_constr[f"{modestr}_period"]["flag"]: wt_opt.model.add_constraint( - f"floatingse.{modestr}_period", + f"{self.floating_period_solve_component}.{modestr}_period", lower=float_constr[f"{modestr}_period"]["lower_bound"], upper=float_constr[f"{modestr}_period"]["upper_bound"], ) @@ -1582,6 +1602,7 @@ def set_initial(self, wt_opt, wt_init): layer_name = self.modeling["WISDEM"]["RotorSE"]["layer_name"] n_layers = self.modeling["WISDEM"]["RotorSE"]["n_layers"] ss_before_ps = False + spar_cap_ps_found = False for i in range(n_layers): if layer_name[i].lower() == spar_cap_ss_name: spar_cap_ss_interpolator = PchipInterpolator( @@ -1598,6 +1619,7 @@ def set_initial(self, wt_opt, wt_init): init_spar_cap_ss_opt[j] = 0. ss_before_ps = True elif layer_name[i].lower() == spar_cap_ps_name: + spar_cap_ps_found = True if ( self.opt["design_variables"]["blade"]["structure"]["spar_cap_ps"]["equal_to_suction"] == False @@ -1616,7 +1638,7 @@ def set_initial(self, wt_opt, wt_init): init_spar_cap_ps_opt[j] = 0. else: init_spar_cap_ps_opt = init_spar_cap_ss_opt - if not ss_before_ps: + if not ss_before_ps or not spar_cap_ps_found: raise Exception( "Please set the spar cap names for suction and pressure sides among the RotorSE modeling options" ) diff --git a/WISDEM/wisdem/glue_code/gc_RunTools.py b/WISDEM/wisdem/glue_code/gc_RunTools.py index 1187356d9..f56164450 100644 --- a/WISDEM/wisdem/glue_code/gc_RunTools.py +++ b/WISDEM/wisdem/glue_code/gc_RunTools.py @@ -2,7 +2,6 @@ import openmdao.api as om import matplotlib.pyplot as plt -import numpy as np from wisdem.commonse.mpi_tools import MPI diff --git a/WISDEM/wisdem/glue_code/gc_WT_DataStruc.py b/WISDEM/wisdem/glue_code/gc_WT_DataStruc.py index 289edec25..97ec393f5 100644 --- a/WISDEM/wisdem/glue_code/gc_WT_DataStruc.py +++ b/WISDEM/wisdem/glue_code/gc_WT_DataStruc.py @@ -3,8 +3,9 @@ import numpy as np import openmdao.api as om -import wisdem.moorpy.MoorProps as mp from scipy.interpolate import PchipInterpolator, interp1d + +import moorpy.MoorProps as mp from wisdem.ccblade.Polar import Polar from wisdem.commonse.utilities import arc_length, arc_length_deriv from wisdem.rotorse.parametrize_rotor import ComputeReynolds, ParametrizeBladeAero, ParametrizeBladeStruct @@ -753,6 +754,8 @@ def setup(self): "compute_coord_xy_dim", Compute_Coord_XY_Dim(rotorse_options=rotorse_options), ) + self.connect("pa.twist_param", "compute_coord_xy_dim.twist") + self.connect("high_level_blade_props.blade_ref_axis", "compute_coord_xy_dim.ref_axis") if rotorse_options["inn_af"]: self.connect("run_inn_af.coord_xy_interp", "compute_coord_xy_dim.coord_xy_interp") @@ -765,9 +768,7 @@ def setup(self): "blade_lofted", Blade_Lofted_Shape(rotorse_options=rotorse_options), ) - self.connect("compute_coord_xy_dim.coord_xy_dim", "blade_lofted.coord_xy_dim") - self.connect("pa.twist_param", "blade_lofted.twist") - self.connect("outer_shape_bem.s", "blade_lofted.s") + self.connect("compute_coord_xy_dim.coord_xy_dim_twisted", "blade_lofted.coord_xy_dim_twisted") self.connect("high_level_blade_props.blade_ref_axis", "blade_lofted.ref_axis") # Import blade internal structure data and remap composites on the outer blade shape @@ -1176,11 +1177,23 @@ def setup(self): val=np.zeros(n_span), desc="1D array of the chordwise position of the pitch axis (0-LE, 1-TE), defined along blade span.", ) + self.add_input( + "twist", + val=np.zeros(n_span), + units="rad", + desc="1D array of the twist values defined along blade span. The twist is defined positive for negative rotations around the z axis (the same as in BeamDyn).", + ) self.add_input( "coord_xy_interp", val=np.zeros((n_span, n_xy, 2)), desc="3D array of the non-dimensional x and y airfoil coordinates of the airfoils interpolated along span for n_span stations. The leading edge is place at x=0 and y=0.", ) + self.add_input( + "ref_axis", + val=np.zeros((n_span, 3)), + units="m", + desc="2D array of the coordinates (x,y,z) of the blade reference axis, defined along blade span. The coordinate system is the one of BeamDyn: it is placed at blade root with x pointing the suction side of the blade, y pointing the trailing edge and z along the blade span. A standard configuration will have negative x values (prebend), if swept positive y values, and positive z values.", + ) self.add_output( "coord_xy_dim", @@ -1188,10 +1201,19 @@ def setup(self): units="m", desc="3D array of the dimensional x and y airfoil coordinates of the airfoils interpolated along span for n_span stations. The origin is placed at the pitch axis.", ) + self.add_output( + "coord_xy_dim_twisted", + val=np.zeros((n_span, n_xy, 2)), + units="m", + desc="3D array of the dimensional x and y airfoil coordinates of the airfoils interpolated along span for n_span stations. The origin is placed at the pitch axis.", + ) + self.add_output("wetted_area", val=0.0, units="m**2", desc="The wetted (painted) surface area of the blade") + self.add_output("projected_area", val=0.0, units="m**2", desc="The projected surface area of the blade") def compute(self, inputs, outputs): pitch_axis = inputs["pitch_axis"] chord = inputs["chord"] + twist = inputs["twist"] coord_xy_interp = inputs["coord_xy_interp"] coord_xy_dim = copy.copy(coord_xy_interp) @@ -1200,6 +1222,21 @@ def compute(self, inputs, outputs): outputs["coord_xy_dim"] = coord_xy_dim + coord_xy_twist = copy.copy(coord_xy_interp) + x = coord_xy_dim[:, :, 0] + y = coord_xy_dim[:, :, 1] + coord_xy_twist[:, :, 0] = x * np.cos(twist[:,np.newaxis]) - y * np.sin(twist[:,np.newaxis]) + coord_xy_twist[:, :, 1] = y * np.cos(twist[:,np.newaxis]) + x * np.sin(twist[:,np.newaxis]) + outputs["coord_xy_dim_twisted"] = coord_xy_twist + + # Integrate along span for surface area + wetted_chord = coord_xy_dim[:,:,1].max(axis=1) - coord_xy_dim[:,:,1].min(axis=1) + outputs["wetted_area"] = np.trapz(wetted_chord, inputs["ref_axis"][:,2]) + + projected_chord = coord_xy_twist[:,:,1].max(axis=1) - coord_xy_twist[:,:,1].min(axis=1) + outputs["projected_area"] = np.trapz(projected_chord, inputs["ref_axis"][:,2]) + + class INN_Airfoils(om.ExplicitComponent): # Openmdao component to run the inverted neural network framework for airfoil design @@ -1447,17 +1484,6 @@ def setup(self): self.n_span = n_span = rotorse_options["n_span"] self.n_xy = n_xy = rotorse_options["n_xy"] # Number of coordinate points to describe the airfoil geometry - self.add_input( - "s", - val=np.zeros(n_span), - desc="1D array of the non-dimensional spanwise grid defined along blade axis (0-blade root, 1-blade tip)", - ) - self.add_input( - "twist", - val=np.zeros(n_span), - units="rad", - desc="1D array of the twist values defined along blade span. The twist is defined positive for negative rotations around the z axis (the same as in BeamDyn).", - ) self.add_input( "ref_axis", val=np.zeros((n_span, 3)), @@ -1466,13 +1492,6 @@ def setup(self): ) self.add_input( - "coord_xy_dim", - val=np.zeros((n_span, n_xy, 2)), - units="m", - desc="3D array of the dimensional x and y airfoil coordinates of the airfoils interpolated along span for n_span stations. The origin is placed at the pitch axis.", - ) - - self.add_output( "coord_xy_dim_twisted", val=np.zeros((n_span, n_xy, 2)), units="m", @@ -1486,25 +1505,20 @@ def setup(self): ) def compute(self, inputs, outputs): - for i in range(self.n_span): - x = inputs["coord_xy_dim"][i, :, 0] - y = inputs["coord_xy_dim"][i, :, 1] - outputs["coord_xy_dim_twisted"][i, :, 0] = x * np.cos(inputs["twist"][i]) - y * np.sin(inputs["twist"][i]) - outputs["coord_xy_dim_twisted"][i, :, 1] = y * np.cos(inputs["twist"][i]) + x * np.sin(inputs["twist"][i]) - k = 0 for i in range(self.n_span): for j in range(self.n_xy): outputs["3D_shape"][k, :] = np.array( - [k, outputs["coord_xy_dim_twisted"][i, j, 1], outputs["coord_xy_dim_twisted"][i, j, 0], 0.0] + [k, inputs["coord_xy_dim_twisted"][i, j, 1], inputs["coord_xy_dim_twisted"][i, j, 0], 0.0] ) + np.hstack([0, inputs["ref_axis"][i, :]]) k = k + 1 - np.savetxt( - "3d_xyz_nrel5mw.dat", - outputs["3D_shape"], - header="\t point number [-]\t\t\t\t x [m] \t\t\t\t\t y [m] \t\t\t\t z [m] \t\t\t\t The coordinate system follows the BeamDyn one.", - ) + # Debug output + np.savetxt( + "3d_xyz_blade_lofted.dat", + outputs["3D_shape"], + header="\t point number [-]\t\t\t\t x [m] \t\t\t\t\t y [m] \t\t\t\t z [m] \t\t\t\t The coordinate system follows the BeamDyn one.", + ) class Blade_Internal_Structure_2D_FEM(om.Group): diff --git a/WISDEM/wisdem/glue_code/glue_code.py b/WISDEM/wisdem/glue_code/glue_code.py index 0fdaa9b18..66d6c8016 100644 --- a/WISDEM/wisdem/glue_code/glue_code.py +++ b/WISDEM/wisdem/glue_code/glue_code.py @@ -131,10 +131,14 @@ def setup(self): self.connect("blade.internal_structure_2d_fem.web_start_nd", "rotorse.re.precomp.web_start_nd") self.connect("blade.internal_structure_2d_fem.web_end_nd", "rotorse.re.precomp.web_end_nd") self.connect("blade.internal_structure_2d_fem.joint_position", "rotorse.re.precomp.joint_position") - self.connect("blade.internal_structure_2d_fem.joint_mass", "rotorse.re.precomp.joint_mass") if modeling_options["WISDEM"]["RotorSE"]["bjs"]: - # self.connect("rotorse.rs.bjs.joint_mass", "rotorse.re.precomp.joint_mass") self.connect("blade.internal_structure_2d_fem.joint_bolt", "rotorse.rs.bjs.joint_bolt") + # Let wisdem estimate the joint mass, although + # this generates an implicit loop since the bjs modules requires loads among the inputs + self.connect("rotorse.rs.bjs.joint_mass", "rotorse.re.precomp.joint_mass") + else: + # joint mass as user input from yaml + self.connect("blade.internal_structure_2d_fem.joint_mass", "rotorse.re.precomp.joint_mass") self.connect("materials.name", "rotorse.re.precomp.mat_name") self.connect("materials.orth", "rotorse.re.precomp.orth") self.connect("materials.E", "rotorse.re.precomp.E") @@ -208,9 +212,7 @@ def setup(self): self.connect("blade.pa.twist_param", "rotorse.rs.bjs.twist") self.connect("blade.outer_shape_bem.pitch_axis", "rotorse.rs.bjs.pitch_axis") self.connect("materials.unit_cost", "rotorse.rs.bjs.unit_cost") - - # Connections to RotorCost - if modeling_options["WISDEM"]["RotorSE"]["bjs"]: + # Connections to RotorCost # Inputs to be split between inner and outer blade portions self.connect("blade.high_level_blade_props.blade_length", "rotorse.split.blade_length") self.connect("blade.outer_shape_bem.s", "rotorse.split.s") @@ -304,12 +306,10 @@ def setup(self): self.connect("rotorse.rs.frame.root_M", "drivese.pitch_system.BRFM", src_indices=[1]) self.connect("blade.pa.chord_param", "drivese.blade_root_diameter", src_indices=[0]) - if modeling_options["WISDEM"]["RotorSE"]["bjs"]: - self.connect("rotorse.rs.bjs.blade_mass", "drivese.blade_mass") - else: - self.connect("rotorse.re.precomp.blade_mass", "drivese.blade_mass") - self.connect("rotorse.re.precomp.mass_all_blades", "drivese.blades_mass") - self.connect("rotorse.re.precomp.I_all_blades", "drivese.blades_I") + self.connect("rotorse.rs.curvature.blades_cg_hubcc", "drivese.blades_cm") + self.connect("rotorse.blade_mass", "drivese.blade_mass") + self.connect("rotorse.mass_all_blades", "drivese.blades_mass") + self.connect("rotorse.I_all_blades", "drivese.blades_I") self.connect("nacelle.distance_hub2mb", "drivese.L_h1") self.connect("nacelle.distance_mb2mb", "drivese.L_12") @@ -548,6 +548,12 @@ def setup(self): self.connect("monopile.gravity_foundation_mass", "fixedse.gravity_foundation_mass") if modeling_options["flags"]["tower"]: self.connect("towerse.nodes_xyz", "fixedse.tower_xyz") + self.connect("towerse.d_full", "fixedse.tower_d_full") + self.connect("towerse.t_full", "fixedse.tower_t_full") + self.connect("towerse.sigma_y_full", "fixedse.tower_sigma_y_full") + self.connect("towerse.qdyn", "fixedse.tower_qdyn") + self.connect("tower_grid.height", "fixedse.tower_bending_height") + for var in ["A", "Asx", "Asy", "Ixx", "Iyy", "J0", "rho", "E", "G"]: self.connect(f"towerse.section_{var}", f"fixedse.tower_{var}") for var in ["Px", "Py", "Pz"]: @@ -686,10 +692,7 @@ def setup(self): self.connect("configuration.n_blades", "tcc.blade_number") self.connect("configuration.rated_power", "tcc.machine_rating") if modeling_options["flags"]["blade"]: - if modeling_options["WISDEM"]["RotorSE"]["bjs"]: - self.connect("rotorse.rs.bjs.blade_mass", "tcc.blade_mass") - else: - self.connect("rotorse.re.precomp.blade_mass", "tcc.blade_mass") + self.connect("rotorse.blade_mass", "tcc.blade_mass") self.connect("rotorse.total_bc.total_blade_cost", "tcc.blade_cost_external") if modeling_options["flags"]["nacelle"]: @@ -886,13 +889,10 @@ def setup(self): self.connect("floating.transition_piece_mass", "orbit.transition_piece_mass") self.connect("floating.transition_piece_cost", "orbit.transition_piece_cost") self.connect("floatingse.platform_cost", "orbit.floating_substructure_cost") - if modeling_options["WISDEM"]["RotorSE"]["bjs"]: - self.connect("rotorse.rs.bjs.blade_mass", "orbit.blade_mass") - else: - self.connect("rotorse.re.precomp.blade_mass", "orbit.blade_mass") - self.connect("tcc.turbine_cost_kW", "orbit.turbine_capex") if modeling_options["flags"]["nacelle"]: self.connect("drivese.nacelle_mass", "orbit.nacelle_mass") + self.connect("rotorse.blade_mass", "orbit.blade_mass") + self.connect("tcc.turbine_cost_kW", "orbit.turbine_capex") self.connect("rotorse.wt_class.V_mean", "orbit.site_mean_windspeed") self.connect("rotorse.rp.powercurve.rated_V", "orbit.turbine_rated_windspeed") self.connect("bos.plant_turbine_spacing", "orbit.plant_turbine_spacing") @@ -921,14 +921,12 @@ def setup(self): if modeling_options["flags"]["blade"]: self.connect("rotorse.rp.powercurve.rated_T", "landbosse.rated_thrust_N") self.connect("rotorse.wt_class.V_extreme50", "landbosse.gust_velocity_m_per_s") + self.connect("blade.compute_coord_xy_dim.projected_area", "landbosse.blade_surface_area") self.connect("towerse.tower_mass", "landbosse.tower_mass") if modeling_options["flags"]["nacelle"]: self.connect("drivese.nacelle_mass", "landbosse.nacelle_mass") self.connect("drivese.hub_system_mass", "landbosse.hub_mass") - if modeling_options["WISDEM"]["RotorSE"]["bjs"]: - self.connect("rotorse.rs.bjs.blade_mass", "landbosse.blade_mass") - else: - self.connect("rotorse.re.precomp.blade_mass", "landbosse.blade_mass") + self.connect("rotorse.blade_mass", "landbosse.blade_mass") self.connect("tower_grid.foundation_height", "landbosse.foundation_height") self.connect("bos.plant_turbine_spacing", "landbosse.turbine_spacing_rotor_diameters") self.connect("bos.plant_row_spacing", "landbosse.row_spacing_rotor_diameters") @@ -968,8 +966,5 @@ def setup(self): if modeling_options["flags"]["blade"]: self.connect("rotorse.rp.AEP", "outputs_2_screen.aep") self.connect("financese.lcoe", "outputs_2_screen.lcoe") - if modeling_options["WISDEM"]["RotorSE"]["bjs"]: - self.connect("rotorse.rs.bjs.blade_mass", "outputs_2_screen.blade_mass") - else: - self.connect("rotorse.re.precomp.blade_mass", "outputs_2_screen.blade_mass") + self.connect("rotorse.blade_mass", "outputs_2_screen.blade_mass") self.connect("rotorse.rs.tip_pos.tip_deflection", "outputs_2_screen.tip_deflection") diff --git a/WISDEM/wisdem/glue_code/runWISDEM.py b/WISDEM/wisdem/glue_code/runWISDEM.py index af66ee43b..ab1d458d8 100644 --- a/WISDEM/wisdem/glue_code/runWISDEM.py +++ b/WISDEM/wisdem/glue_code/runWISDEM.py @@ -195,7 +195,9 @@ def run_wisdem(fname_wt_input, fname_modeling_options, fname_opt_options, overri def load_wisdem(frootin): - froot = os.path.splitext(frootin)[0] + froot,fext = os.path.splitext(frootin) + if fext not in ['.yaml','.pkl']: + froot = frootin fgeom = froot + ".yaml" fmodel = froot + "-modeling.yaml" fopt = froot + "-analysis.yaml" diff --git a/WISDEM/wisdem/inputs/geometry_schema.yaml b/WISDEM/wisdem/inputs/geometry_schema.yaml index 80f3a2a04..d974c3ea7 100644 --- a/WISDEM/wisdem/inputs/geometry_schema.yaml +++ b/WISDEM/wisdem/inputs/geometry_schema.yaml @@ -56,6 +56,7 @@ properties: drivetrain: type: string default: geared + enum: [Geared, geared, Direct_drive, Direct_Drive, Direct, direct_drive, direct, pm_direct_drive, Constant_eff] description: String characterizing the drivetrain configuration rotor_orientation: type: string @@ -399,37 +400,108 @@ properties: # TODO hub: type: object + required: + - diameter + - cone_angle properties: - outer_shape_bem: - type: object - required: - - diameter - - cone_angle - - drag_coefficient - properties: - diameter: - type: number - description: Diameter of the hub measured at the blade root positions. - unit: meter - minimum: 0. - maximum: 10. - cone_angle: - type: number - description: Rotor precone angle, defined positive for both upwind and downwind rotors. - unit: rad - minimum: 0 - maximum: 0.4 - drag_coefficient: - type: number - description: Equivalent drag coefficient to compute the aerodynamic forces generated on the hub. - unit: none - minimum: 0 - maximum: 2. + diameter: + type: number + description: Diameter of the hub measured at the blade root positions. + unit: meter + minimum: 0. + maximum: 20. + cone_angle: + type: number + description: Rotor precone angle, defined positive for both upwind and downwind rotors. + unit: rad + minimum: 0 + maximum: 0.4 + drag_coefficient: + type: number + description: Equivalent drag coefficient to compute the aerodynamic forces generated on the hub. + default: 0.5 + unit: none + minimum: 0 + maximum: 2. + flange_t2shell_t: + type: number + description: Ratio of flange thickness to shell thickness + default: 6. + unit: none + minimum: 0 + maximum: 20. + flange_OD2hub_D: + type: number + description: Ratio of flange outer diameter to hub diameter + default: 0.6 + unit: none + minimum: 0 + maximum: 10. + flange_ID2OD: + type: number + description: Check this + unit: none + default: 0.8 + minimum: 0 + maximum: 10. + hub_blade_spacing_margin: + type: number + description: Ratio of flange thickness to shell thickness + default: 1.2 + unit: none + minimum: 0 + maximum: 20. + hub_stress_concentration: + type: number + description: Stress concentration factor. Stress concentration occurs at all fillets,notches, lifting lugs, hatches and are accounted for by assigning a stress concentration factor + unit: none + default: 3. + minimum: 0 + maximum: 20. + n_front_brackets: + type: integer + description: Number of front spinner brackets + unit: none + default: 5 + minimum: 0 + maximum: 20 + n_rear_brackets: + type: integer + description: Number of rear spinner brackets + unit: none + default: 5 + minimum: 0 + maximum: 20 + clearance_hub_spinner: + type: number + description: Clearance between spinner and hub + default: 0.5 + unit: m + minimum: 0 + maximum: 20. + spin_hole_incr: + type: number + description: Ratio between access hole diameter in the spinner and blade root diameter. Typical value 1.2 + unit: none + default: 1.2 + minimum: 0 + maximum: 20. + pitch_system_scaling_factor: + type: number + description: Scaling factor to tune the total mass (0.54 is recommended for modern designs) + unit: none + default: 0.54 + minimum: 0 + maximum: 2. + hub_material: + type: string + description: Material of the shell of the hub + spinner_material: + type: string + description: Material of the spinner elastic_properties_mb: type: object - required: - - system_mass - - system_inertia + default: {} properties: system_mass: type: number @@ -1109,6 +1181,47 @@ properties: minimum: 0.0 maximum: 100.0 description: Permanent magnet cost + elastic_properties_mb: + type: object + default: {} + properties: + system_mass: + type: number + description: Mass of the nacelle system, including the entire drivetrain system (shafts, gearbox if present, break, bearings, generator). It excludes the turbine rotor, the hub, and the yaw system. + unit: kg + minimum: 0 + yaw_mass: + type: number + description: Mass of the yaw system. + unit: kg + minimum: 0 + system_inertia: + type: array + description: Inertia of the nacelle system with respect to the center of mass. The sum includes the entire drivetrain system (shafts, gearbox if present, break, bearings, generator). It excludes the turbine rotor, the hub, and the yaw system. + items: + type: number + unit: kgm2 + minItems: 6 + maxItems: 6 + uniqueItems: false + system_inertia_tt: + type: array + description: Inertia of the nacelle system with respect to the tower top. The sum includes the entire drivetrain system (shafts, gearbox if present, break, bearings, generator). It excludes the turbine rotor, the hub, and the yaw system. + items: + type: number + unit: kgm2 + minItems: 6 + maxItems: 6 + uniqueItems: false + system_center_mass: + type: array + description: Center of mass of the nacelle system, including the entire drivetrain system (shafts, gearbox if present, break, bearings, generator). It excludes the turbine rotor, the hub, and the yaw system. + items: + type: number + unit: m + minItems: 3 + maxItems: 3 + uniqueItems: false tower: type: object required: @@ -2013,7 +2126,6 @@ properties: unit: Newton description: Maximum vertical load (perpendicular to the sea floor) that the anchor can support minimum: 0.0 - airfoils: type: array description: Database of airfoils @@ -2443,7 +2555,6 @@ properties: unit: rad/s minimum: 0 default: 10. - environment: type: object required: @@ -3108,7 +3219,7 @@ definitions: description: Name of the layer to lock the edge axis_coordinates: type: object - description: The reference system is located at blade root, with z aligned with the pitch axis, x pointing towards the suction sides of the airfoils (standard prebend will be negative) and y pointing to the trailing edge (standard sweep will be positive) + description: The reference system is used across wind turbine components. For the blade, the reference system is located at blade root, with z aligned with the pitch axis, x pointing towards the suction sides of the airfoils (standard prebend will be negative) and y pointing to the trailing edge (standard sweep will be positive). For tower and monopile, the reference system is located at tower/monopile base, with z aligned along the height pointing upwards, x aligned with the main wind direction, and y pointing to the side following the right hand rule. required: - x - y diff --git a/WISDEM/wisdem/inputs/modeling_schema.yaml b/WISDEM/wisdem/inputs/modeling_schema.yaml index b86cdab0f..aa7479fc8 100644 --- a/WISDEM/wisdem/inputs/modeling_schema.yaml +++ b/WISDEM/wisdem/inputs/modeling_schema.yaml @@ -223,7 +223,7 @@ properties: type: number description: Partial safety factor for hub sizing minimum: 1.0 - maximum: 5.0 + maximum: 7.0 default: 2.0 unit: none spinner_gamma: diff --git a/WISDEM/wisdem/inputs/validation.py b/WISDEM/wisdem/inputs/validation.py index 02cdc7479..eb3293bda 100644 --- a/WISDEM/wisdem/inputs/validation.py +++ b/WISDEM/wisdem/inputs/validation.py @@ -2,14 +2,7 @@ import numpy as np import jsonschema as json - -try: - import ruamel_yaml as ry -except: - try: - import ruamel.yaml as ry - except: - raise ImportError("No module named ruamel.yaml or ruamel_yaml") +import ruamel.yaml as ry fschema_geom = os.path.join(os.path.dirname(os.path.realpath(__file__)), "geometry_schema.yaml") diff --git a/WISDEM/wisdem/landbosse/landbosse_omdao/OpenMDAODataframeCache.py b/WISDEM/wisdem/landbosse/landbosse_omdao/OpenMDAODataframeCache.py index 3ca20eaed..466328344 100644 --- a/WISDEM/wisdem/landbosse/landbosse_omdao/OpenMDAODataframeCache.py +++ b/WISDEM/wisdem/landbosse/landbosse_omdao/OpenMDAODataframeCache.py @@ -1,4 +1,5 @@ import os + import warnings with warnings.catch_warnings(): @@ -8,7 +9,7 @@ # The library path is where to find the default input data for LandBOSSE. ROOT = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../..")) -if ROOT.endswith("wisdem"): +if ROOT.endswith('wisdem'): library_path = os.path.join(ROOT, "library", "landbosse") else: library_path = os.path.join(ROOT, "project_input_template", "project_data") @@ -81,10 +82,10 @@ def read_all_sheets_from_xlsx(cls, xlsx_basename, xlsx_path=None): else: xlsx_filename = os.path.join(xlsx_path, f"{xlsx_basename}.xlsx") - xlsx = pd.ExcelFile(xlsx_filename, engine="openpyxl") + xlsx = pd.ExcelFile(xlsx_filename, engine='openpyxl') sheets_dict = {sheet_name: xlsx.parse(sheet_name) for sheet_name in xlsx.sheet_names} for sheet_name in xlsx.sheet_names: - sheets_dict[sheet_name].dropna(inplace=True, how="all") + sheets_dict[sheet_name].dropna(inplace=True, how='all') cls._cache[xlsx_basename] = sheets_dict return cls.copy_dataframes(sheets_dict) diff --git a/WISDEM/wisdem/landbosse/landbosse_omdao/WeatherWindowCSVReader.py b/WISDEM/wisdem/landbosse/landbosse_omdao/WeatherWindowCSVReader.py index 84add776a..bc5c93f72 100644 --- a/WISDEM/wisdem/landbosse/landbosse_omdao/WeatherWindowCSVReader.py +++ b/WISDEM/wisdem/landbosse/landbosse_omdao/WeatherWindowCSVReader.py @@ -2,6 +2,7 @@ import pandas as pd + SEASON_WINTER = "winter" SEASON_SPRING = "spring" SEASON_SUMMER = "summer" @@ -113,7 +114,7 @@ def read_weather_window(weather_data, local_timezone="America/Denver"): weather_data.drop(columns=["Date", "Date UTC"]) # create time window for normal (8am to 6pm) versus long (24 hour) time window for operation - weather_data["Time window"] = weather_data["Hour"].between(8, 18, inclusive="both") + weather_data["Time window"] = weather_data["Hour"].between(8, 18, inclusive='both') boolean_dictionary = {True: "normal", False: "long"} weather_data["Time window"] = weather_data["Time window"].map(boolean_dictionary) diff --git a/WISDEM/wisdem/landbosse/landbosse_omdao/XlsxValidator.py b/WISDEM/wisdem/landbosse/landbosse_omdao/XlsxValidator.py index 00878a87f..5d4fc220d 100644 --- a/WISDEM/wisdem/landbosse/landbosse_omdao/XlsxValidator.py +++ b/WISDEM/wisdem/landbosse/landbosse_omdao/XlsxValidator.py @@ -1,6 +1,5 @@ import pandas as pd - class XlsxValidator: """ XlsxValidator is for comparing the results of a previous model run @@ -36,66 +35,54 @@ def compare_expected_to_actual(self, expected_xlsx, actual_module_type_operation # First, make the list of dictionaries into a dataframe, and drop # the raw_cost and raw_cost_total_or_per_turbine columns. actual_df = pd.DataFrame(actual_module_type_operation_list) - actual_df.drop(["raw_cost", "raw_cost_total_or_per_turbine"], axis=1, inplace=True) - expected_df = pd.read_excel(expected_xlsx, "costs_by_module_type_operation", engine="openpyxl") - # expected_df = expected_df.dropna(inplace=True, how='all') - expected_df.rename( - columns={ - "Project ID with serial": "project_id_with_serial", - "Number of turbines": "num_turbines", - "Turbine rating MW": "turbine_rating_MW", - "Module": "module", - "Operation ID": "operation_id", - "Type of cost": "type_of_cost", - "Cost per turbine": "cost_per_turbine", - "Cost per project": "cost_per_project", - "USD/kW per project": "usd_per_kw_per_project", - }, - inplace=True, - ) + actual_df.drop(['raw_cost', 'raw_cost_total_or_per_turbine'], axis=1, inplace=True) + expected_df = pd.read_excel(expected_xlsx, 'costs_by_module_type_operation', engine='openpyxl') + #expected_df = expected_df.dropna(inplace=True, how='all') + expected_df.rename(columns={ + 'Project ID with serial': 'project_id_with_serial', + 'Number of turbines': 'num_turbines', + 'Turbine rating MW': 'turbine_rating_MW', + 'Module': 'module', + 'Operation ID': 'operation_id', + 'Type of cost': 'type_of_cost', + 'Cost per turbine': 'cost_per_turbine', + 'Cost per project': 'cost_per_project', + 'USD/kW per project': 'usd_per_kw_per_project' + }, inplace=True) cost_per_project_actual = actual_df[ - ["cost_per_project", "project_id_with_serial", "module", "operation_id", "type_of_cost"] - ] + ['cost_per_project', 'project_id_with_serial', 'module', 'operation_id', 'type_of_cost']] cost_per_project_expected = expected_df[ - ["cost_per_project", "project_id_with_serial", "module", "operation_id", "type_of_cost"] - ] + ['cost_per_project', 'project_id_with_serial', 'module', 'operation_id', 'type_of_cost']] comparison = cost_per_project_actual.merge( - cost_per_project_expected, on=["project_id_with_serial", "module", "operation_id", "type_of_cost"] - ) + cost_per_project_expected, + on=['project_id_with_serial', 'module', 'operation_id', 'type_of_cost']) - comparison.rename( - columns={ - "cost_per_project_x": "cost_per_project_actual", - "cost_per_project_y": "cost_per_project_expected", - }, - inplace=True, - ) + comparison.rename(columns={'cost_per_project_x': 'cost_per_project_actual', + 'cost_per_project_y': 'cost_per_project_expected'}, inplace=True) - comparison["difference_validation"] = ( - comparison["cost_per_project_actual"] - comparison["cost_per_project_expected"] - ) + comparison['difference_validation'] = comparison['cost_per_project_actual'] - comparison['cost_per_project_expected'] # Regardless of the outcome, write the end result of the comparison # to the validation output file. columns_for_comparison_output = [ - "project_id_with_serial", - "module", - "operation_id", - "type_of_cost", - "cost_per_project_actual", - "cost_per_project_expected", - "difference_validation", + 'project_id_with_serial', + 'module', + 'operation_id', + 'type_of_cost', + 'cost_per_project_actual', + 'cost_per_project_expected', + 'difference_validation' ] comparison.to_excel(validation_output_xlsx, index=False, columns=columns_for_comparison_output) # If the comparison dataframe is empty, that means there are no common # projects in the expected data that match the actual data. if len(comparison) < 1: - print("=" * 80) - print("Validation error: There are no common projects between actual and expected data.") - print("=" * 80) + print('=' * 80) + print('Validation error: There are no common projects between actual and expected data.') + print('=' * 80) return False # Find all rows where the difference is unequal to 0. These are rows @@ -103,13 +90,13 @@ def compare_expected_to_actual(self, expected_xlsx, actual_module_type_operation # in a different order than the originals. # # Round the difference to a given number of decimal places. - failed_rows = comparison[comparison["difference_validation"].round(decimals=4) != 0] + failed_rows = comparison[comparison['difference_validation'].round(decimals=4) != 0] if len(failed_rows) > 0: - print("=" * 80) - print("The following rows failed validation:") + print('=' * 80) + print('The following rows failed validation:') print(failed_rows) - print("=" * 80) + print('=' * 80) return False else: return True diff --git a/WISDEM/wisdem/landbosse/landbosse_omdao/landbosse.py b/WISDEM/wisdem/landbosse/landbosse_omdao/landbosse.py index 49fb77f7c..47a8afe83 100644 --- a/WISDEM/wisdem/landbosse/landbosse_omdao/landbosse.py +++ b/WISDEM/wisdem/landbosse/landbosse_omdao/landbosse.py @@ -27,6 +27,7 @@ def setup(self): self.set_input_defaults("blade_offload_hook_height", use_default_component_data, units="m") self.set_input_defaults("blade_offload_cycle_time", use_default_component_data, units="h") self.set_input_defaults("blade_drag_multiplier", use_default_component_data) # Unitless + self.set_input_defaults("blade_surface_area", use_default_component_data, units="m**2") self.set_input_defaults("turbine_spacing_rotor_diameters", 4) self.set_input_defaults("row_spacing_rotor_diameters", 10) @@ -66,6 +67,7 @@ def setup_inputs(self): self.add_input("blade_offload_hook_height", use_default_component_data, units="m") self.add_input("blade_offload_cycle_time", use_default_component_data, units="h") self.add_input("blade_drag_multiplier", use_default_component_data) # Unitless + self.add_input("blade_surface_area", use_default_component_data, units="m**2") # Even though LandBOSSE doesn't use foundation height, TowerSE does, # and foundation height can be used with hub height to calculate @@ -649,21 +651,21 @@ def modify_component_lists(self, inputs, discrete_inputs): kg_per_tonne = 1000 # Get the hub height - hub_height_meters = inputs["hub_height_meters"][0] + hub_height_meters = float(inputs["hub_height_meters"]) # Make the nacelle. This does not include the hub or blades. - nacelle_mass_kg = inputs["nacelle_mass"][0] + nacelle_mass_kg = float(inputs["nacelle_mass"]) nacelle = input_components[input_components["Component"].str.startswith("Nacelle")].iloc[0].copy() if inputs["nacelle_mass"] != use_default_component_data: nacelle["Mass tonne"] = nacelle_mass_kg / kg_per_tonne nacelle["Component"] = "Nacelle" - nacelle["Lift height m"] = hub_height_meters + nacelle["Lift height m"] = nacelle["Lever arm m"] = hub_height_meters output_components_list.append(nacelle) # Make the hub - hub_mass_kg = inputs["hub_mass"][0] + hub_mass_kg = float(inputs["hub_mass"]) hub = input_components[input_components["Component"].str.startswith("Hub")].iloc[0].copy() - hub["Lift height m"] = hub_height_meters + hub["Lift height m"] = hub["Lever arm m"] = hub_height_meters if hub_mass_kg != use_default_component_data: hub["Mass tonne"] = hub_mass_kg / kg_per_tonne output_components_list.append(hub) @@ -672,33 +674,35 @@ def modify_component_lists(self, inputs, discrete_inputs): blade = input_components[input_components["Component"].str.startswith("Blade")].iloc[0].copy() # There is always a hub height, so use that as the lift height - blade["Lift height m"] = hub_height_meters + blade["Lift height m"] = blade["Lever arm m"] = hub_height_meters - if inputs["blade_drag_coefficient"][0] != use_default_component_data: - blade["Coeff drag"] = inputs["blade_drag_coefficient"][0] + if float(inputs["blade_drag_coefficient"]) != use_default_component_data: + blade["Coeff drag"] = float(inputs["blade_drag_coefficient"]) - if inputs["blade_lever_arm"][0] != use_default_component_data: - blade["Lever arm m"] = inputs["blade_lever_arm"][0] + if float(inputs["blade_lever_arm"]) != use_default_component_data: + blade["Lever arm m"] = float(inputs["blade_lever_arm"]) - if inputs["blade_install_cycle_time"][0] != use_default_component_data: - blade["Cycle time installation hrs"] = inputs["blade_install_cycle_time"][0] + if float(inputs["blade_install_cycle_time"]) != use_default_component_data: + blade["Cycle time installation hrs"] = float(inputs["blade_install_cycle_time"]) - if inputs["blade_offload_hook_height"][0] != use_default_component_data: + if float(inputs["blade_offload_hook_height"]) != use_default_component_data: blade["Offload hook height m"] = hub_height_meters - if inputs["blade_offload_cycle_time"][0] != use_default_component_data: + if float(inputs["blade_offload_cycle_time"]) != use_default_component_data: blade["Offload cycle time hrs"] = inputs["blade_offload_cycle_time"] - if inputs["blade_drag_multiplier"][0] != use_default_component_data: + if float(inputs["blade_drag_multiplier"]) != use_default_component_data: blade["Multiplier drag rotor"] = inputs["blade_drag_multiplier"] - if inputs["blade_mass"][0] != use_default_component_data: - blade["Mass tonne"] = inputs["blade_mass"][0] / kg_per_tonne + if float(inputs["blade_mass"]) != use_default_component_data: + blade["Mass tonne"] = float(inputs["blade_mass"]) / kg_per_tonne + + if float(inputs["blade_surface_area"]) != use_default_component_data: + blade["Surface area sq m"] = float(inputs["blade_surface_area"]) # Assume that number_of_blades always has a reasonable value. It's # default count when the discrete input is declared of 3 is always # reasonable unless overridden by another input. - number_of_blades = discrete_inputs["number_of_blades"] for i in range(number_of_blades): component = f"Blade {i + 1}" @@ -707,8 +711,8 @@ def modify_component_lists(self, inputs, discrete_inputs): output_components_list.append(blade_i) # Make tower sections - tower_mass_tonnes = inputs["tower_mass"][0] / kg_per_tonne - tower_height_m = hub_height_meters - inputs["foundation_height"][0] + tower_mass_tonnes = float(inputs["tower_mass"]) / kg_per_tonne + tower_height_m = hub_height_meters - float(inputs["foundation_height"]) default_tower_section = input_components[input_components["Component"].str.startswith("Tower")].iloc[0] tower_sections = self.make_tower_sections(tower_mass_tonnes, tower_height_m, default_tower_section) output_components_list.extend(tower_sections) diff --git a/WISDEM/wisdem/landbosse/model/CollectionCost.py b/WISDEM/wisdem/landbosse/model/CollectionCost.py index 31add81f0..c6f873e88 100644 --- a/WISDEM/wisdem/landbosse/model/CollectionCost.py +++ b/WISDEM/wisdem/landbosse/model/CollectionCost.py @@ -13,9 +13,8 @@ """ import math -import traceback - import numpy as np +import traceback import pandas as pd from wisdem.landbosse.model.CostModule import CostModule @@ -71,13 +70,14 @@ class documentation """ - self.current_capacity = cable_specs["Current Capacity (A)"] - self.rated_voltage = cable_specs["Rated Voltage (V)"] - self.ac_resistance = cable_specs["AC Resistance (Ohms/km)"] - self.inductance = cable_specs["Inductance (mH/km)"] - self.capacitance = cable_specs["Capacitance (nF/km)"] - self.cost = cable_specs["Cost (USD/LF)"] - self.line_frequency_hz = addl_specs["line_frequency_hz"] + self.current_capacity = cable_specs['Current Capacity (A)'] + self.rated_voltage = cable_specs['Rated Voltage (V)'] + self.ac_resistance = cable_specs['AC Resistance (Ohms/km)'] + self.inductance = cable_specs['Inductance (mH/km)'] + self.capacitance = cable_specs['Capacitance (nF/km)'] + self.cost = cable_specs['Cost (USD/LF)'] + self.line_frequency_hz = addl_specs['line_frequency_hz'] + # Calc additional cable specs self.calc_char_impedance(self.line_frequency_hz) @@ -104,7 +104,8 @@ def calc_power_factor(self): Calculate power factor """ - phase_angle = math.atan(np.imag(self.char_impedance) / np.real(self.char_impedance)) + phase_angle = math.atan(np.imag(self.char_impedance) / + np.real(self.char_impedance)) self.power_factor = math.cos(phase_angle) def calc_cable_power(self): @@ -113,7 +114,7 @@ def calc_cable_power(self): """ # TODO: Verify eqn is correct - self.cable_power = np.sqrt(3) * self.rated_voltage * self.current_capacity * self.power_factor / 1000 + self.cable_power = (np.sqrt(3) * self.rated_voltage * self.current_capacity * self.power_factor / 1000) class Array(Cable): @@ -158,7 +159,7 @@ def __init__(self, cable_specs, addl_inputs): """ super().__init__(cable_specs, addl_inputs) - self.line_frequency_hz = addl_inputs["line_frequency_hz"] + self.line_frequency_hz = addl_inputs['line_frequency_hz'] self.calc_max_turb_per_cable(addl_inputs) self.calc_num_turb_per_cable(addl_inputs) self.calc_array_cable_len(addl_inputs) @@ -173,7 +174,7 @@ def calc_max_turb_per_cable(self, addl_inputs): Nameplate capacity of individual turbines """ - turbine_rating_MW = addl_inputs["turbine_rating_MW"] + turbine_rating_MW = addl_inputs['turbine_rating_MW'] self.max_turb_per_cable = np.floor(self.cable_power / turbine_rating_MW) @@ -188,8 +189,8 @@ def calc_num_turb_per_cable(self, addl_inputs): Number of turbines on upstream cables in string """ - upstream_turb = addl_inputs["upstream_turb"] - self.turb_sequence = addl_inputs["turb_sequence"] + upstream_turb = addl_inputs['upstream_turb'] + self.turb_sequence = addl_inputs['turb_sequence'] self.num_turb_per_cable = self.max_turb_per_cable - upstream_turb @@ -210,12 +211,12 @@ def calc_array_cable_len(self, addl_inputs): Rotor diameter, m """ - turbine_spacing_rotor_diameters = addl_inputs["turbine_spacing_rotor_diameters"] - rotor_diameter_m = addl_inputs["rotor_diameter_m"] + turbine_spacing_rotor_diameters = addl_inputs['turbine_spacing_rotor_diameters'] + rotor_diameter_m = addl_inputs['rotor_diameter_m'] self.calc_turb_section_len(turbine_spacing_rotor_diameters, rotor_diameter_m) - self.array_cable_len = (self.num_turb_per_cable + self.downstream_connection) * self.turb_section_length + self.array_cable_len = ((self.num_turb_per_cable + self.downstream_connection) * self.turb_section_length) # @staticmethod def calc_turb_section_len(self, turbine_spacing_rotor_diameters, rotor_diameter_m): @@ -272,17 +273,19 @@ class ArraySystem(CostModule): """ def __init__(self, input_dict, output_dict, project_name): + self.input_dict = input_dict self.output_dict = output_dict self.project_name = project_name - self.output_dict["total_cable_len_km"] = 0 - self._km_to_LF = 0.0003048 # Units: [km/LF] Conversion factor for converting from km to linear foot. + self.output_dict['total_cable_len_km'] = 0 + self._km_to_LF = 0.0003048 #Units: [km/LF] Conversion factor for converting from km to linear foot. self._total_cable_cost = 0 self._total_turbine_counter = 0 self.turbines_on_cable = [] self._cable_length_km = dict() self.check_terminal = 0 + def calc_num_strings(self): """ Calculate number of full and partial strings to support full plant @@ -315,22 +318,18 @@ def calc_num_strings(self): """ # Calculate total number of individual turbines in wind plant - self.output_dict["total_turb"] = self.input_dict["num_turbines"] + self.output_dict['total_turb'] = self.input_dict['num_turbines'] # Calculate the number of turbines on each cable type in a string - self.output_dict["num_turb_per_cable"] = [cable.num_turb_per_cable for cable in self.cables.values()] + self.output_dict['num_turb_per_cable'] = [cable.num_turb_per_cable for cable in self.cables.values()] # Calculate the total number of turbines per string - self.output_dict["total_turb_per_string"] = sum(self.output_dict["num_turb_per_cable"]) + self.output_dict['total_turb_per_string'] = sum(self.output_dict['num_turb_per_cable']) # Calculate number of full strings and any remainder required to # support the total number of turbines - self.output_dict["num_full_strings"] = np.floor( - self.output_dict["total_turb"] / self.output_dict["total_turb_per_string"] - ) - self.output_dict["num_leftover_turb"] = ( - self.output_dict["total_turb"] % self.output_dict["total_turb_per_string"] - ) + self.output_dict['num_full_strings'] = np.floor(self.output_dict['total_turb'] / self.output_dict['total_turb_per_string']) + self.output_dict['num_leftover_turb'] = self.output_dict['total_turb'] % self.output_dict['total_turb_per_string'] # Calculate number of turbines on a remaining partial string @@ -341,22 +340,17 @@ def calc_num_strings(self): # This means that self.output_dict['turb_per_partial_string'] cannot # be used an output value for the details output. - if self.output_dict["num_leftover_turb"] > 0: - self.output_dict["num_partial_strings"] = 1 - self.output_dict["perc_partial_string"] = self.calc_num_turb_partial_strings( - self.output_dict["num_leftover_turb"], self.output_dict["num_turb_per_cable"] - ) + if self.output_dict['num_leftover_turb'] > 0: + self.output_dict['num_partial_strings'] = 1 + self.output_dict['perc_partial_string'] = self.calc_num_turb_partial_strings(self.output_dict['num_leftover_turb'], self.output_dict['num_turb_per_cable']) else: - self.output_dict["num_partial_strings"] = 0 - self.output_dict["perc_partial_string"] = np.zeros(len(self.output_dict["num_turb_per_cable"])) + self.output_dict['num_partial_strings'] = 0 + self.output_dict['perc_partial_string'] = np.zeros(len(self.output_dict['num_turb_per_cable'])) + + - return ( - self.output_dict["total_turb_per_string"], - self.output_dict["num_full_strings"], - self.output_dict["num_partial_strings"], - self.output_dict["perc_partial_string"], - self.output_dict["num_turb_per_cable"], - ) + return (self.output_dict['total_turb_per_string'], self.output_dict['num_full_strings'], self.output_dict['num_partial_strings'], + self.output_dict['perc_partial_string'], self.output_dict['num_turb_per_cable']) def calc_num_turb_partial_strings(self, num_leftover_turb, num_turb_per_cable): """ @@ -396,22 +390,20 @@ def calc_num_turb_partial_strings(self, num_leftover_turb, num_turb_per_cable): # If there is a zero, then print a warning and change NaN to 0 in perc_partial_string. if 0.0 in num_turb_per_cable: print( - f"Warning: {self.project_name} CollectionCost module generates number of turbines per string that " - f"includes a zero entry. Please confirm that there not all cable types need to be used for the number of turbines that are being run." + f'Warning: {self.project_name} CollectionCost module generates number of turbines per string that ' + f'includes a zero entry. Please confirm that there not all cable types need to be used for the number of turbines that are being run.' f' num_turbines={self.input_dict["num_turbines"]} rating_MW={self.input_dict["turbine_rating_MW"]}' - f" num_turb_per_cable: {num_turb_per_cable}" - ) + f' num_turb_per_cable: {num_turb_per_cable}') perc_partial_string = np.nan_to_num(perc_partial_string) - self.output_dict["turb_per_partial_string"] = turb_per_partial_string + self.output_dict['turb_per_partial_string'] = turb_per_partial_string return perc_partial_string - # TODO: change length_to_substation calculation as a user defined input? + #TODO: change length_to_substation calculation as a user defined input? @staticmethod - def calc_cable_len_to_substation( - distance_to_grid, turbine_spacing_rotor_diameters, row_spacing_rotor_diameters, num_strings - ): + def calc_cable_len_to_substation(distance_to_grid, turbine_spacing_rotor_diameters, row_spacing_rotor_diameters, + num_strings): """ Calculate the distance for the largest cable run to substation Assumes substation is in the center of the layout, 1 row spacing in @@ -455,13 +447,9 @@ def calc_cable_len_to_substation( c = 1 else: c = 2 - string_to_substation_length.append( - c - * np.sqrt( - row_spacing_rotor_diameters**2 - + (turb_space_scaling * idx * turbine_spacing_rotor_diameters) ** 2 - ) - ) + string_to_substation_length.append(c * np.sqrt(row_spacing_rotor_diameters ** 2 + + (turb_space_scaling * idx * + turbine_spacing_rotor_diameters) ** 2)) else: string_to_substation_length.append(distance_to_grid) @@ -471,20 +459,11 @@ def calc_cable_len_to_substation( return len_to_substation - # TODO: Add parameter info in docstrings + + #TODO: Add parameter info in docstrings @staticmethod - def calc_total_cable_length( - total_turbines, - count, - check_terminal, - turbines_per_cable, - cable, - cable_specs, - num_full_strings, - num_partial_strings, - len_to_substation, - perc_partial_string, - ): + def calc_total_cable_length(total_turbines, count, check_terminal, turbines_per_cable, cable, cable_specs, + num_full_strings, num_partial_strings, len_to_substation, perc_partial_string): """ Calculate total length of each cable type, km @@ -525,6 +504,7 @@ def calc_total_cable_length( # This 'elif' is essentially a switch for distributed wind: elif num_full_strings < 1 and num_partial_strings >= 0: + # if number of turbines is less than total string capacity, # find the terminal cable and find total cable len # up till that cable. @@ -539,38 +519,33 @@ def calc_total_cable_length( # more turbines than specified by user, it is the terminal cable cable.num_turb_per_cable = total_turbines - cable.array_cable_len = ( - cable.num_turb_per_cable + cable.downstream_connection - ) * cable.turb_section_length + cable.array_cable_len = ((cable.num_turb_per_cable + cable.downstream_connection) + * cable.turb_section_length) - total_cable_len = ( - (num_full_strings * cable.array_cable_len) + (num_partial_strings * cable.array_cable_len) - ) + len_to_substation + total_cable_len = ((num_full_strings * cable.array_cable_len) + + (num_partial_strings * cable.array_cable_len)) + len_to_substation else: + cable.num_turb_per_cable = total_turbines - turbines_per_cable[(count - 1)] - cable.array_cable_len = ( - cable.num_turb_per_cable + cable.downstream_connection - ) * cable.turb_section_length + cable.array_cable_len = ((cable.num_turb_per_cable + cable.downstream_connection) * + cable.turb_section_length) - total_cable_len = ( - (num_full_strings * cable.array_cable_len) + (num_partial_strings * cable.array_cable_len) - ) + len_to_substation + total_cable_len = ((num_full_strings * cable.array_cable_len) + + (num_partial_strings * cable.array_cable_len)) + len_to_substation return total_cable_len, terminal_string else: # Switch for utility scale landbosse if cable.turb_sequence == len(cable_specs): + # Only add len_to_substation to the final cable in the string - total_cable_len = ( - num_full_strings * cable.array_cable_len - + num_partial_strings * (cable.array_cable_len * perc_partial_string) - + len_to_substation - ) + total_cable_len = (num_full_strings * cable.array_cable_len + + num_partial_strings * (cable.array_cable_len * perc_partial_string) + + len_to_substation) else: - total_cable_len = num_full_strings * cable.array_cable_len + num_partial_strings * ( - cable.array_cable_len * perc_partial_string - ) + total_cable_len = (num_full_strings * cable.array_cable_len + + num_partial_strings * (cable.array_cable_len * perc_partial_string)) # here 9999 == flag to announce that the terminal cable has NOT been reached # and to continue calculations for each cable @@ -579,70 +554,72 @@ def calc_total_cable_length( def create_ArraySystem(self): # data used in parent classes: self.addl_specs = dict() - self.addl_specs["turbine_rating_MW"] = self.input_dict["turbine_rating_MW"] - self.addl_specs["upstream_turb"] = 0 - self.addl_specs["turb_sequence"] = 1 - self.addl_specs["turbine_spacing_rotor_diameters"] = self.input_dict["turbine_spacing_rotor_diameters"] - self.addl_specs["rotor_diameter_m"] = self.input_dict["rotor_diameter_m"] - self.addl_specs["line_frequency_hz"] = self.input_dict["line_frequency_hz"] + self.addl_specs['turbine_rating_MW'] = self.input_dict['turbine_rating_MW'] + self.addl_specs['upstream_turb'] = 0 + self.addl_specs['turb_sequence'] = 1 + self.addl_specs['turbine_spacing_rotor_diameters'] = self.input_dict['turbine_spacing_rotor_diameters'] + self.addl_specs['rotor_diameter_m'] = self.input_dict['rotor_diameter_m'] + self.addl_specs['line_frequency_hz'] = self.input_dict['line_frequency_hz'] + + + system = { - "upstream_turb": self.addl_specs["upstream_turb"], - "turb_sequence": self.addl_specs["turb_sequence"], - "turbine_rating_MW": self.addl_specs["turbine_rating_MW"], - "turbine_spacing_rotor_diameters": self.addl_specs["turbine_spacing_rotor_diameters"], - "rotor_diameter_m": self.addl_specs["rotor_diameter_m"], + 'upstream_turb': self.addl_specs['upstream_turb'], + 'turb_sequence': self.addl_specs['turb_sequence'], + 'turbine_rating_MW' : self.addl_specs['turbine_rating_MW'], + 'turbine_spacing_rotor_diameters': self.addl_specs['turbine_spacing_rotor_diameters'], + 'rotor_diameter_m': self.addl_specs['rotor_diameter_m'] } # Loops through all user defined array cable types, composing them # in ArraySystem + self.cables = {} - self.input_dict["cable_specs"] = self.input_dict["cable_specs_pd"].T.to_dict() - n = 0 # to keep tab of number of cables input by user. - while n < len(self.input_dict["cable_specs"]): - specs = self.input_dict["cable_specs"][n] + self.input_dict['cable_specs'] = self.input_dict['cable_specs_pd'].T.to_dict() + n=0 #to keep tab of number of cables input by user. + while n 4)] = 10 - weather_delay_output_data["wind_delay_time"] = float(wind_delay.sum()) + weather_delay_output_data['wind_delay_time'] = float(wind_delay.sum().iloc[0]) return weather_delay_output_data @@ -728,259 +704,170 @@ def estimate_construction_time(self, construction_time_input_data, construction_ """ - collection_construction_time = ( - construction_time_input_data["construct_duration"] * 1 / 3 - ) # assumes collection construction occurs for one-third of project duration + collection_construction_time = construction_time_input_data['construct_duration'] * 1 / 3 # assumes collection construction occurs for one-third of project duration - throughput_operations = construction_time_input_data["rsmeans"] - trench_length_km = construction_time_output_data["trench_length_km"] - if construction_time_input_data["turbine_rating_MW"] >= 0.1: - operation_data = throughput_operations.where(throughput_operations["Module"] == "Collection").dropna( - thresh=4 - ) + throughput_operations = construction_time_input_data['rsmeans'] + trench_length_km = construction_time_output_data['trench_length_km'] + if construction_time_input_data['turbine_rating_MW'] >= 0.1: + operation_data = throughput_operations.where(throughput_operations['Module'] == 'Collection').dropna( + thresh=4) # from rsmeans data, only read in Collection related data and filter out the rest: - cable_trenching = throughput_operations[throughput_operations.Module == "Collection"] - else: # switch for small DW + cable_trenching = throughput_operations[throughput_operations.Module == 'Collection'] + else: #switch for small DW operation_data = throughput_operations.where( - throughput_operations["Module"] == "Small DW Collection" - ).dropna(thresh=4) + throughput_operations['Module'] == 'Small DW Collection').dropna(thresh=4) # from rsmeans data, only read in Collection related data and filter out the rest: - cable_trenching = throughput_operations[throughput_operations.Module == "Small DW Collection"] + cable_trenching = throughput_operations[throughput_operations.Module == 'Small DW Collection'] # operation_data = pd.merge() # from rsmeans data, only read in Collection related data and filter out the rest: - cable_trenching = throughput_operations[throughput_operations.Module == "Collection"] + cable_trenching = throughput_operations[throughput_operations.Module == 'Collection'] # Storing data with labor related inputs: - trenching_labor = cable_trenching[cable_trenching.values == "Labor"] - trenching_labor_usd_per_hr = trenching_labor["Rate USD per unit"].sum() + trenching_labor = cable_trenching[cable_trenching.values == 'Labor'] + trenching_labor_usd_per_hr = trenching_labor['Rate USD per unit'].sum() - construction_time_output_data["trenching_labor_usd_per_hr"] = trenching_labor_usd_per_hr - trenching_labor_daily_output = trenching_labor["Daily output"].values[ - 0 - ] # Units: LF/day -> where LF = Linear Foot - trenching_labor_num_workers = trenching_labor["Number of workers"].sum() + construction_time_output_data['trenching_labor_usd_per_hr']=trenching_labor_usd_per_hr + trenching_labor_daily_output = trenching_labor['Daily output'].values[0] # Units: LF/day -> where LF = Linear Foot + trenching_labor_num_workers = trenching_labor['Number of workers'].sum() # Storing data with equipment related inputs: - trenching_equipment = cable_trenching[cable_trenching.values == "Equipment"] - trenching_cable_equipment_usd_per_hr = trenching_equipment["Rate USD per unit"].sum() - construction_time_output_data["trenching_cable_equipment_usd_per_hr"] = trenching_cable_equipment_usd_per_hr - trenching_equipment_daily_output = trenching_equipment["Daily output"].values[ - 0 - ] # Units: LF/day -> where LF = Linear Foot - construction_time_output_data["trenching_labor_daily_output"] = trenching_labor_daily_output - construction_time_output_data["trenching_equipment_daily_output"] = trenching_equipment_daily_output - - operation_data["Number of days taken by single crew"] = ( - trench_length_km / self._km_to_LF - ) / trenching_labor_daily_output - operation_data["Number of crews"] = np.ceil( - (operation_data["Number of days taken by single crew"] / 30) / collection_construction_time - ) - operation_data["Cost USD without weather delays"] = ( - (trench_length_km / self._km_to_LF) / trenching_labor_daily_output - ) * (operation_data["Rate USD per unit"] * construction_time_input_data["operational_hrs_per_day"]) - alpha = operation_data[operation_data["Type of cost"] == "Collection"] - operation_data_id_days_crews_workers = alpha[ - ["Operation ID", "Number of days taken by single crew", "Number of crews", "Number of workers"] - ] - - alpha = operation_data[operation_data["Type of cost"] == "Labor"] - operation_data_id_days_crews_workers = alpha[ - ["Operation ID", "Number of days taken by single crew", "Number of crews", "Number of workers"] - ] + trenching_equipment = cable_trenching[cable_trenching.values == 'Equipment'] + trenching_cable_equipment_usd_per_hr = trenching_equipment['Rate USD per unit'].sum() + construction_time_output_data['trenching_cable_equipment_usd_per_hr']=trenching_cable_equipment_usd_per_hr + trenching_equipment_daily_output = trenching_equipment['Daily output'].values[0] # Units: LF/day -> where LF = Linear Foot + construction_time_output_data['trenching_labor_daily_output'] = trenching_labor_daily_output + construction_time_output_data['trenching_equipment_daily_output'] = trenching_equipment_daily_output + + operation_data['Number of days taken by single crew'] = ((trench_length_km / self._km_to_LF) / trenching_labor_daily_output) + operation_data['Number of crews'] = np.ceil((operation_data['Number of days taken by single crew'] / 30) / collection_construction_time) + operation_data['Cost USD without weather delays'] = ((trench_length_km / self._km_to_LF) / trenching_labor_daily_output) * (operation_data['Rate USD per unit'] * construction_time_input_data['operational_hrs_per_day']) + alpha = operation_data[operation_data['Type of cost'] == 'Collection'] + operation_data_id_days_crews_workers = alpha[['Operation ID', 'Number of days taken by single crew', 'Number of crews', 'Number of workers']] + + alpha = operation_data[operation_data['Type of cost'] == 'Labor'] + operation_data_id_days_crews_workers = alpha[['Operation ID', 'Number of days taken by single crew', 'Number of crews', 'Number of workers']] # if more than one crew needed to complete within construction duration then assume that all construction # happens within that window and use that timeframe for weather delays; # if not, use the number of days calculated - operation_data["time_construct_bool"] = ( - operation_data["Number of days taken by single crew"] > collection_construction_time * 30 - ) + operation_data['time_construct_bool'] = operation_data['Number of days taken by single crew'] > collection_construction_time * 30 boolean_dictionary = {True: collection_construction_time * 30, False: np.NAN} - operation_data["time_construct_bool"] = operation_data["time_construct_bool"].map(boolean_dictionary) - operation_data["Time construct days"] = operation_data[ - ["time_construct_bool", "Number of days taken by single crew"] - ].min(axis=1) - num_days = operation_data["Time construct days"].max() + operation_data['time_construct_bool'] = operation_data['time_construct_bool'].map(boolean_dictionary) + operation_data['Time construct days'] = operation_data[['time_construct_bool', 'Number of days taken by single crew']].min(axis=1) + num_days = operation_data['Time construct days'].max() + # No 'management crew' in small DW - if construction_time_input_data["turbine_rating_MW"] >= 0.1: + if construction_time_input_data['turbine_rating_MW'] >= 0.1: # pull out management data - crew_cost = self.input_dict["crew_cost"] - crew = self.input_dict["crew"][self.input_dict["crew"]["Crew type ID"].str.contains("M0")] - management_crew = pd.merge(crew_cost, crew, on=["Labor type ID"]) - management_crew = management_crew.assign( - per_diem_total=management_crew["Per diem USD per day"] * management_crew["Number of workers"] * num_days - ) - management_crew = management_crew.assign( - hourly_costs_total=management_crew["Hourly rate USD per hour"] - * self.input_dict["hour_day"][self.input_dict["time_construct"]] - * num_days - ) - management_crew = management_crew.assign( - total_crew_cost_before_wind_delay=management_crew["per_diem_total"] - + management_crew["hourly_costs_total"] - ) - self.output_dict["management_crew"] = management_crew - self.output_dict["managament_crew_cost_before_wind_delay"] = management_crew[ - "total_crew_cost_before_wind_delay" - ].sum() + crew_cost = self.input_dict['crew_cost'] + crew = self.input_dict['crew'][self.input_dict['crew']['Crew type ID'].str.contains('M0')] + management_crew = pd.merge(crew_cost, crew, on=['Labor type ID']) + management_crew = management_crew.assign(per_diem_total=management_crew['Per diem USD per day'] * management_crew['Number of workers'] * num_days) + management_crew = management_crew.assign(hourly_costs_total=management_crew['Hourly rate USD per hour'] * self.input_dict['hour_day'][self.input_dict['time_construct']] * num_days) + management_crew = management_crew.assign(total_crew_cost_before_wind_delay=management_crew['per_diem_total'] + management_crew['hourly_costs_total']) + self.output_dict['management_crew'] = management_crew + self.output_dict['managament_crew_cost_before_wind_delay'] = management_crew['total_crew_cost_before_wind_delay'].sum() else: - self.output_dict["managament_crew_cost_before_wind_delay"] = 0.0 + self.output_dict['managament_crew_cost_before_wind_delay'] = 0.0 + + construction_time_output_data['operation_data_id_days_crews_workers'] = operation_data_id_days_crews_workers + construction_time_output_data['operation_data_entire_farm'] = operation_data - construction_time_output_data["operation_data_id_days_crews_workers"] = operation_data_id_days_crews_workers - construction_time_output_data["operation_data_entire_farm"] = operation_data + return construction_time_output_data['operation_data_entire_farm'] - return construction_time_output_data["operation_data_entire_farm"] def calculate_costs(self, calculate_costs_input_dict, calculate_costs_output_dict): - # read in rsmeans data: + + #read in rsmeans data: # rsmeans = calculate_costs_input_dict['rsmeans'] - operation_data = calculate_costs_output_dict["operation_data_entire_farm"] - - per_diem = ( - operation_data["Number of workers"] - * operation_data["Number of crews"] - * (operation_data["Time construct days"] + np.ceil(operation_data["Time construct days"] / 7)) - * calculate_costs_input_dict["rsmeans_per_diem"] - ) + operation_data = calculate_costs_output_dict['operation_data_entire_farm'] + + per_diem = operation_data['Number of workers'] * operation_data['Number of crews'] * (operation_data['Time construct days'] + np.ceil(operation_data['Time construct days'] / 7)) * calculate_costs_input_dict['rsmeans_per_diem'] per_diem = per_diem.dropna() - calculate_costs_output_dict["time_construct_days"] = ( - calculate_costs_output_dict["trench_length_km"] / self._km_to_LF - ) / calculate_costs_output_dict["trenching_labor_daily_output"] - wind_delay_fraction = ( - calculate_costs_output_dict["wind_delay_time"] / calculate_costs_input_dict["operational_hrs_per_day"] - ) / calculate_costs_output_dict["time_construct_days"] + calculate_costs_output_dict['time_construct_days'] = (calculate_costs_output_dict['trench_length_km'] / self._km_to_LF) / calculate_costs_output_dict['trenching_labor_daily_output'] + wind_delay_fraction = (calculate_costs_output_dict['wind_delay_time'] / calculate_costs_input_dict['operational_hrs_per_day']) / calculate_costs_output_dict['time_construct_days'] # check if wind_delay_fraction is greater than 1, which would mean weather delays are longer than they can possibily be for the input data if wind_delay_fraction > 1: - raise ValueError("{}: Error: Wind delay greater than 100%".format(type(self).__name__)) - calculate_costs_output_dict["wind_multiplier"] = 1 / (1 - wind_delay_fraction) - - # Calculating trenching cost: - calculate_costs_output_dict["Days taken for trenching (equipment)"] = ( - calculate_costs_output_dict["trench_length_km"] / self._km_to_LF - ) / calculate_costs_output_dict["trenching_equipment_daily_output"] - calculate_costs_output_dict["Equipment cost of trenching per day {usd/day)"] = ( - calculate_costs_output_dict["trenching_cable_equipment_usd_per_hr"] - * calculate_costs_input_dict["operational_hrs_per_day"] - ) - calculate_costs_output_dict["Equipment Cost USD without weather delays"] = ( - calculate_costs_output_dict["Days taken for trenching (equipment)"] - * calculate_costs_output_dict["Equipment cost of trenching per day {usd/day)"] - ) - calculate_costs_output_dict["Equipment Cost USD with weather delays"] = ( - calculate_costs_output_dict["Equipment Cost USD without weather delays"] - * calculate_costs_output_dict["wind_multiplier"] - ) - - if calculate_costs_input_dict["turbine_rating_MW"] >= 0.1: - trenching_equipment_rental_cost_df = pd.DataFrame( - [ - [ - "Equipment rental", - calculate_costs_output_dict["Equipment Cost USD with weather delays"], - "Collection", - ] - ], - columns=["Type of cost", "Cost USD", "Phase of construction"], - ) + raise ValueError('{}: Error: Wind delay greater than 100%'.format(type(self).__name__)) + calculate_costs_output_dict['wind_multiplier'] = 1 / (1 - wind_delay_fraction) + + #Calculating trenching cost: + calculate_costs_output_dict['Days taken for trenching (equipment)'] = (calculate_costs_output_dict['trench_length_km'] / self._km_to_LF) / calculate_costs_output_dict['trenching_equipment_daily_output'] + calculate_costs_output_dict['Equipment cost of trenching per day {usd/day)'] = calculate_costs_output_dict['trenching_cable_equipment_usd_per_hr'] * calculate_costs_input_dict['operational_hrs_per_day'] + calculate_costs_output_dict['Equipment Cost USD without weather delays'] = (calculate_costs_output_dict['Days taken for trenching (equipment)'] * calculate_costs_output_dict['Equipment cost of trenching per day {usd/day)']) + calculate_costs_output_dict['Equipment Cost USD with weather delays'] = calculate_costs_output_dict['Equipment Cost USD without weather delays'] * calculate_costs_output_dict['wind_multiplier'] + + if calculate_costs_input_dict['turbine_rating_MW'] >= 0.1: + trenching_equipment_rental_cost_df = pd.DataFrame([['Equipment rental', calculate_costs_output_dict[ + 'Equipment Cost USD with weather delays'], 'Collection']], + columns=['Type of cost', 'Cost USD', + 'Phase of construction']) # switch for small DW else: - if calculate_costs_output_dict["Equipment Cost USD with weather delays"] < 137: - calculate_costs_output_dict["Equipment Cost USD with weather delays"] = 137 # cost of renting for a day - trenching_equipment_rental_cost_df = pd.DataFrame( - [ - [ - "Equipment rental", - calculate_costs_output_dict["Equipment Cost USD with weather delays"], - "Collection", - ] - ], - columns=["Type of cost", "Cost USD", "Phase of construction"], - ) + if calculate_costs_output_dict['Equipment Cost USD with weather delays'] < 137: + calculate_costs_output_dict['Equipment Cost USD with weather delays'] = 137 #cost of renting for a day + trenching_equipment_rental_cost_df = pd.DataFrame([['Equipment rental', calculate_costs_output_dict[ + 'Equipment Cost USD with weather delays'], 'Collection']], + columns=['Type of cost', 'Cost USD', + 'Phase of construction']) else: - trenching_equipment_rental_cost_df = pd.DataFrame( - [ - [ - "Equipment rental", - calculate_costs_output_dict["Equipment Cost USD with weather delays"], - "Small DW Collection", - ] - ], - columns=["Type of cost", "Cost USD", "Phase of construction"], - ) - - # Calculating labor cost: - calculate_costs_output_dict["Days taken for trenching (labor)"] = ( - calculate_costs_output_dict["trench_length_km"] / self._km_to_LF - ) / calculate_costs_output_dict["trenching_labor_daily_output"] - calculate_costs_output_dict["Labor cost of trenching per day (usd/day)"] = ( - calculate_costs_output_dict["trenching_labor_usd_per_hr"] - * calculate_costs_input_dict["operational_hrs_per_day"] - * calculate_costs_input_dict["overtime_multiplier"] - ) - calculate_costs_output_dict["Total per diem costs (USD)"] = per_diem.sum() - calculate_costs_output_dict["Labor Cost USD without weather delays"] = ( - calculate_costs_output_dict["Days taken for trenching (labor)"] - * calculate_costs_output_dict["Labor cost of trenching per day (usd/day)"] - ) + ( - calculate_costs_output_dict["Total per diem costs (USD)"] - + calculate_costs_output_dict["managament_crew_cost_before_wind_delay"] - ) - calculate_costs_output_dict["Labor Cost USD with weather delays"] = ( - calculate_costs_output_dict["Labor Cost USD without weather delays"] - * calculate_costs_output_dict["wind_multiplier"] - ) - - if calculate_costs_input_dict["turbine_rating_MW"] >= 0.1: + trenching_equipment_rental_cost_df = pd.DataFrame([['Equipment rental', calculate_costs_output_dict[ + 'Equipment Cost USD with weather delays'], 'Small DW Collection']], + columns=['Type of cost', 'Cost USD', + 'Phase of construction']) + + #Calculating labor cost: + calculate_costs_output_dict['Days taken for trenching (labor)'] = ((calculate_costs_output_dict['trench_length_km'] / self._km_to_LF) / calculate_costs_output_dict['trenching_labor_daily_output']) + calculate_costs_output_dict['Labor cost of trenching per day (usd/day)'] = (calculate_costs_output_dict['trenching_labor_usd_per_hr'] * calculate_costs_input_dict['operational_hrs_per_day'] * calculate_costs_input_dict['overtime_multiplier']) + calculate_costs_output_dict['Total per diem costs (USD)'] = per_diem.sum() + calculate_costs_output_dict['Labor Cost USD without weather delays'] =((calculate_costs_output_dict['Days taken for trenching (labor)'] * calculate_costs_output_dict['Labor cost of trenching per day (usd/day)']) + (calculate_costs_output_dict['Total per diem costs (USD)'] + calculate_costs_output_dict['managament_crew_cost_before_wind_delay'])) + calculate_costs_output_dict['Labor Cost USD with weather delays'] = calculate_costs_output_dict['Labor Cost USD without weather delays'] * calculate_costs_output_dict['wind_multiplier'] + + if calculate_costs_input_dict['turbine_rating_MW'] >= 0.1: trenching_labor_cost_df = pd.DataFrame( - [["Labor", calculate_costs_output_dict["Labor Cost USD with weather delays"], "Collection"]], - columns=["Type of cost", "Cost USD", "Phase of construction"], - ) + [['Labor', calculate_costs_output_dict['Labor Cost USD with weather delays'], 'Collection']], + columns=['Type of cost', 'Cost USD', 'Phase of construction']) # switch for small DW else: trenching_labor_cost_df = pd.DataFrame( - [["Labor", calculate_costs_output_dict["Labor Cost USD with weather delays"], "Small DW Collection"]], - columns=["Type of cost", "Cost USD", "Phase of construction"], - ) + [['Labor', calculate_costs_output_dict['Labor Cost USD with weather delays'], 'Small DW Collection']], + columns=['Type of cost', 'Cost USD', 'Phase of construction']) - # Calculate cable cost: - cable_cost_usd_per_LF_df = pd.DataFrame( - [["Materials", self._total_cable_cost, "Collection"]], - columns=["Type of cost", "Cost USD", "Phase of construction"], - ) + #Calculate cable cost: + cable_cost_usd_per_LF_df = pd.DataFrame([['Materials',self._total_cable_cost, 'Collection']], + columns = ['Type of cost', 'Cost USD', 'Phase of construction']) # Combine all calculated cost items into the 'collection_cost' dataframe: - collection_cost = pd.DataFrame([], columns=["Type of cost", "Cost USD", "Phase of construction"]) - collection_cost = pd.concat( - (collection_cost, trenching_equipment_rental_cost_df, trenching_labor_cost_df, cable_cost_usd_per_LF_df) - ) + collection_cost = pd.DataFrame([],columns = ['Type of cost', 'Cost USD', 'Phase of construction']) + collection_cost = pd.concat( (collection_cost, + trenching_equipment_rental_cost_df, + trenching_labor_cost_df, + cable_cost_usd_per_LF_df) ) # Calculate Mobilization Cost and add to collection_cost dataframe. # For utility scale plants, mobilization is assumed to be 5% of the sum of labor, equipment, and material costs. # For distributed mode, mobilization is a calculated % that is a function of turbine size. - if calculate_costs_input_dict["num_turbines"] > 10: - calculate_costs_output_dict["mob_cost"] = collection_cost["Cost USD"].sum() * 0.05 + if calculate_costs_input_dict['num_turbines'] > 10: + calculate_costs_output_dict['mob_cost'] = collection_cost['Cost USD'].sum() * 0.05 else: - if calculate_costs_input_dict["turbine_rating_MW"] >= 0.1: - calculate_costs_output_dict["mob_cost"] = collection_cost[ - "Cost USD" - ].sum() * self.mobilization_cost_multiplier(calculate_costs_input_dict["turbine_rating_MW"]) + if calculate_costs_input_dict['turbine_rating_MW'] >= 0.1: + calculate_costs_output_dict['mob_cost'] = collection_cost[ + 'Cost USD'].sum() * self.mobilization_cost_multiplier(calculate_costs_input_dict['turbine_rating_MW']) # switch for small DW else: # mobilization cost included in equipment rental cost - calculate_costs_output_dict["mob_cost"] = 0.0 + calculate_costs_output_dict['mob_cost'] = 0.0 - mobilization_cost = pd.DataFrame( - [["Mobilization", calculate_costs_output_dict["mob_cost"], "Collection"]], - columns=["Type of cost", "Cost USD", "Phase of construction"], - ) + mobilization_cost = pd.DataFrame([['Mobilization', calculate_costs_output_dict['mob_cost'], 'Collection']], + columns=['Type of cost', 'Cost USD', 'Phase of construction']) collection_cost = pd.concat((collection_cost, mobilization_cost)) - calculate_costs_output_dict["total_collection_cost"] = collection_cost + calculate_costs_output_dict['total_collection_cost'] = collection_cost return collection_cost @@ -995,177 +882,148 @@ def outputs_for_detailed_tab(self, input_dict, output_dict): A list of dicts, with each dict representing a row of the data. """ result = [] - module = "Collection Cost" - result.append( - { - "unit": "", - "type": "variable", - "variable_df_key_col_name": "Total Number of Turbines", - "value": float(self.output_dict["total_turb"]), - } - ) - - result.append( - { - "unit": "km", - "type": "variable", - "variable_df_key_col_name": "Total trench length", - "value": float(self.output_dict["trench_length_km"]), - } - ) - - result.append( - { - "unit": "km", - "type": "variable", - "variable_df_key_col_name": "Total cable length", - "value": float(self.output_dict["total_cable_len_km"]), - } - ) - - result.append( - { - "unit": "", - "type": "variable", - "variable_df_key_col_name": "Number of Turbines Per String in Full String", - "value": float(self.output_dict["total_turb_per_string"]), - } - ) - result.append( - { - "unit": "", - "type": "variable", - "variable_df_key_col_name": "Number of Full Strings", - "value": float(self.output_dict["num_full_strings"]), - } - ) - result.append( - { - "unit": "", - "type": "variable", - "variable_df_key_col_name": "Number of Turbines in Partial String", - "value": float(self.output_dict["num_leftover_turb"]), - } - ) - result.append( - { - "unit": "", - "type": "variable", - "variable_df_key_col_name": "Number of Partial Strings", - "value": float(self.output_dict["num_partial_strings"]), - } - ) - result.append( - { - "unit": "", - "type": "variable", - "variable_df_key_col_name": "Total number of strings full + partial", - "value": float(self.output_dict["num_full_strings"] + self.output_dict["num_partial_strings"]), - } - ) - result.append( - { - "unit": "", - "type": "variable", - "variable_df_key_col_name": "Trench Length to Substation (km)", - "value": float(self.output_dict["distance_to_grid_connection_km"]), - } - ) - result.append( - { - "unit": "", - "type": "variable", - "variable_df_key_col_name": "Cable Length to Substation (km)", - "value": float(self.output_dict["cable_len_to_grid_connection_km"]), - } - ) - - cables = "" + module = 'Collection Cost' + result.append({ + 'unit': '', + 'type': 'variable', + 'variable_df_key_col_name': 'Total Number of Turbines', + 'value': float(self.output_dict['total_turb']) + }) + + result.append({ + 'unit': 'km', + 'type': 'variable', + 'variable_df_key_col_name': 'Total trench length', + 'value': float(self.output_dict['trench_length_km']) + }) + + result.append({ + 'unit': 'km', + 'type': 'variable', + 'variable_df_key_col_name': 'Total cable length', + 'value': float(self.output_dict['total_cable_len_km']) + }) + + result.append({ + 'unit': '', + 'type': 'variable', + 'variable_df_key_col_name': 'Number of Turbines Per String in Full String', + 'value': float(self.output_dict['total_turb_per_string']) + }) + result.append({ + 'unit': '', + 'type': 'variable', + 'variable_df_key_col_name': 'Number of Full Strings', + 'value': float(self.output_dict['num_full_strings']) + }) + result.append({ + 'unit': '', + 'type': 'variable', + 'variable_df_key_col_name': 'Number of Turbines in Partial String', + 'value': float(self.output_dict['num_leftover_turb']) + }) + result.append({ + 'unit': '', + 'type': 'variable', + 'variable_df_key_col_name': 'Number of Partial Strings', + 'value': float(self.output_dict['num_partial_strings']) + }) + result.append({ + 'unit': '', + 'type': 'variable', + 'variable_df_key_col_name': 'Total number of strings full + partial', + 'value': float(self.output_dict['num_full_strings'] + self.output_dict['num_partial_strings']) + }) + result.append({ + 'unit': '', + 'type': 'variable', + 'variable_df_key_col_name': 'Trench Length to Substation (km)', + 'value': float(self.output_dict['distance_to_grid_connection_km']) + }) + result.append({ + 'unit': '', + 'type': 'variable', + 'variable_df_key_col_name': 'Cable Length to Substation (km)', + 'value': float(self.output_dict['cable_len_to_grid_connection_km']) + }) + + cables = '' n = 1 # to keep tab of number of cables input by user. - for cable, specs in self.output_dict["cables"].items(): - if n == len(self.output_dict["cables"]): + for cable, specs in self.output_dict['cables'].items(): + if n == len(self.output_dict['cables']): cables += str(cable) else: - cables += str(cable) + " , " + cables += str(cable) + ' , ' for variable, value in specs.__dict__.items(): - if variable == "array_cable_len": - result.append( - { - "unit": "km", - "type": "variable", - "variable_df_key_col_name": "Array cable length for cable " + cable, - "value": float(value), - } - ) - elif variable == "total_length": - result.append( - { - "unit": "km", - "type": "variable", - "variable_df_key_col_name": "Total cable length for cable " + cable, - "value": float(value), - } - ) - - elif variable == "total_cost": - result.append( - { - "unit": "usd", - "type": "variable", - "variable_df_key_col_name": "Total cable cost for cable " + cable, - "value": float(value), - } - ) + if variable == 'array_cable_len': + result.append({ + 'unit': 'km', + 'type': 'variable', + 'variable_df_key_col_name': 'Array cable length for cable ' + cable, + 'value': float(value) + }) + elif variable == 'total_length': + result.append({ + 'unit': 'km', + 'type': 'variable', + 'variable_df_key_col_name': 'Total cable length for cable ' + cable, + 'value': float(value) + }) + + elif variable == 'total_cost': + result.append({ + 'unit': 'usd', + 'type': 'variable', + 'variable_df_key_col_name': 'Total cable cost for cable ' + cable, + 'value': float(value) + }) n += 1 - result.append( - { - "unit": "", - "type": "list", - "variable_df_key_col_name": "Number of turbines per cable type in full strings [" + cables + "]", - "value": str(self.output_dict["num_turb_per_cable"]), - } - ) - - if self.input_dict["turbine_rating_MW"] > 0.1: - for row in self.output_dict["management_crew"].itertuples(): - dashed_row = " <--> ".join(str(x) for x in list(row)) - result.append( - { - "unit": "", - "type": "dataframe", - "variable_df_key_col_name": "Labor type ID <--> Hourly rate USD per hour <--> Per diem USD per day <--> Operation <--> Crew type <--> Crew name <--> Number of workers <--> Per Diem Total <--> Hourly costs total <--> Crew total cost ", - "value": dashed_row, - } - ) - - result.append( - { - "unit": "", - "type": "list", - "variable_df_key_col_name": "Percent length of cable in partial string [" + cables + "]", - "value": str(self.output_dict["perc_partial_string"]), - } - ) - - for row in self.output_dict["total_collection_cost"].itertuples(): - dashed_row = "{} <--> {} <--> {}".format(row[1], row[3], math.ceil(row[2])) - result.append( - { - "unit": "", - "type": "dataframe", - "variable_df_key_col_name": "Type of Cost <--> Phase of Construction <--> Cost in USD ", - "value": dashed_row, - "last_number": row[2], - } - ) + result.append({ + 'unit': '', + 'type': 'list', + 'variable_df_key_col_name': 'Number of turbines per cable type in full strings [' + cables + ']', + + 'value': str(self.output_dict['num_turb_per_cable']) + }) + + if self.input_dict['turbine_rating_MW'] > 0.1: + for row in self.output_dict['management_crew'].itertuples(): + dashed_row = ' <--> '.join(str(x) for x in list(row)) + result.append({ + 'unit': '', + 'type': 'dataframe', + 'variable_df_key_col_name': 'Labor type ID <--> Hourly rate USD per hour <--> Per diem USD per day <--> Operation <--> Crew type <--> Crew name <--> Number of workers <--> Per Diem Total <--> Hourly costs total <--> Crew total cost ', + 'value': dashed_row + }) + + result.append({ + 'unit': '', + 'type': 'list', + 'variable_df_key_col_name': 'Percent length of cable in partial string [' + cables + ']', + + 'value': str(self.output_dict['perc_partial_string']) + }) + + + + for row in self.output_dict['total_collection_cost'].itertuples(): + dashed_row = '{} <--> {} <--> {}'.format(row[1], row[3], math.ceil(row[2])) + result.append({ + 'unit': '', + 'type': 'dataframe', + 'variable_df_key_col_name': 'Type of Cost <--> Phase of Construction <--> Cost in USD ', + 'value': dashed_row, + 'last_number': row[2] + }) + for _dict in result: - _dict["project_id_with_serial"] = self.project_name - _dict["module"] = module + _dict['project_id_with_serial'] = self.project_name + _dict['module'] = module - self.output_dict["collection_cost_csv"] = result + self.output_dict['collection_cost_csv'] = result return result def run_module(self): @@ -1180,38 +1038,37 @@ def run_module(self): operation_data = self.estimate_construction_time(self.input_dict, self.output_dict) # pull only global inputs for weather delay from input_dict - weather_data_keys = ("wind_shear_exponent", "weather_window") + weather_data_keys = ('wind_shear_exponent', + 'weather_window') # specify collection-specific weather delay inputs self.weather_input_dict = dict( - [(i, self.input_dict[i]) for i in self.input_dict if i in set(weather_data_keys)] - ) + [(i, self.input_dict[i]) for i in self.input_dict if i in set(weather_data_keys)]) + self.weather_input_dict[ + 'start_delay_hours'] = 0 # assume zero start for when collection construction begins (start at beginning of construction time) + self.weather_input_dict[ + 'critical_wind_speed_m_per_s'] = self.input_dict['critical_speed_non_erection_wind_delays_m_per_s'] self.weather_input_dict[ - "start_delay_hours" - ] = 0 # assume zero start for when collection construction begins (start at beginning of construction time) - self.weather_input_dict["critical_wind_speed_m_per_s"] = self.input_dict[ - "critical_speed_non_erection_wind_delays_m_per_s" - ] - self.weather_input_dict["wind_height_of_interest_m"] = self.input_dict[ - "critical_height_non_erection_wind_delays_m" - ] + 'wind_height_of_interest_m'] = self.input_dict['critical_height_non_erection_wind_delays_m'] # Compute the duration of the construction for electrical collection - duration_construction = operation_data["Time construct days"].max(skipna=True) + duration_construction = operation_data['Time construct days'].max(skipna=True) days_per_month = 30 duration_construction_months = duration_construction / days_per_month - self.output_dict["collection_construction_months"] = duration_construction_months + self.output_dict['collection_construction_months'] = duration_construction_months # compute and specify weather delay mission time for roads - operational_hrs_per_day = self.input_dict["hour_day"][self.input_dict["time_construct"]] + operational_hrs_per_day = self.input_dict['hour_day'][self.input_dict['time_construct']] mission_time_hrs = duration_construction * operational_hrs_per_day - self.weather_input_dict["mission_time_hours"] = int(mission_time_hrs) + self.weather_input_dict['mission_time_hours'] = int(mission_time_hrs) self.calculate_weather_delay(self.weather_input_dict, self.output_dict) self.calculate_costs(self.input_dict, self.output_dict) self.outputs_for_detailed_tab(self.input_dict, self.output_dict) - self.output_dict["collection_cost_module_type_operation"] = self.outputs_for_costs_by_module_type_operation( - input_df=self.output_dict["total_collection_cost"], project_id=self.project_name, total_or_turbine=True + self.output_dict['collection_cost_module_type_operation'] = self.outputs_for_costs_by_module_type_operation( + input_df=self.output_dict['total_collection_cost'], + project_id=self.project_name, + total_or_turbine=True ) return 0, 0 # module ran successfully except Exception as error: diff --git a/WISDEM/wisdem/landbosse/model/CostModule.py b/WISDEM/wisdem/landbosse/model/CostModule.py index 68f0c7cb1..c38671240 100644 --- a/WISDEM/wisdem/landbosse/model/CostModule.py +++ b/WISDEM/wisdem/landbosse/model/CostModule.py @@ -1,6 +1,5 @@ import math - class CostModule: """ This is a super class for all other cost modules to import @@ -27,7 +26,11 @@ def mobilization_cost_multiplier(self, turbine_rating): mobilization_cost_multiplier = (36.892 * math.exp(-5e-04 * (turbine_rating * 1000))) / 100 return mobilization_cost_multiplier - def outputs_for_costs_by_module_type_operation(self, *, input_df, project_id, total_or_turbine): + def outputs_for_costs_by_module_type_operation(self, + *, + input_df, + project_id, + total_or_turbine): """ This takes a dataframe and turns it into a list of dictionaries suitable for output to a cost tab in a spreadsheet. @@ -63,36 +66,36 @@ def outputs_for_costs_by_module_type_operation(self, *, input_df, project_id, to """ result = [] # module = type(self).__name__ - module = "CollectionCost" if (type(self).__name__ == "ArraySystem") else type(self).__name__ - turbine_rating_MW = self.input_dict["turbine_rating_MW"] - num_turbines = self.input_dict["num_turbines"] - rotor_diameter_m = self.input_dict["rotor_diameter_m"] + module = 'CollectionCost' if (type(self).__name__ == 'ArraySystem') else type(self).__name__ + turbine_rating_MW = self.input_dict['turbine_rating_MW'] + num_turbines = self.input_dict['num_turbines'] + rotor_diameter_m = self.input_dict['rotor_diameter_m'] project_size_kw = num_turbines * turbine_rating_MW * 1000 for _, row in input_df.iterrows(): _dict = dict() row = row.to_dict() - _dict["operation_id"] = row["Phase of construction"] - _dict["type_of_cost"] = row["Type of cost"] - _dict["raw_cost"] = row["Cost USD"] + _dict['operation_id'] = row['Phase of construction'] + _dict['type_of_cost'] = row['Type of cost'] + _dict['raw_cost'] = row['Cost USD'] result.append(_dict) for _dict in result: - _dict["turbine_rating_MW"] = turbine_rating_MW - _dict["num_turbines"] = num_turbines - _dict["rotor_diameter_m"] = rotor_diameter_m - _dict["project_id_with_serial"] = self.project_name - _dict["module"] = module + _dict['turbine_rating_MW'] = turbine_rating_MW + _dict['num_turbines'] = num_turbines + _dict['rotor_diameter_m'] = rotor_diameter_m + _dict['project_id_with_serial'] = self.project_name + _dict['module'] = module if total_or_turbine: # If raw_cost is the total cost - _dict["raw_cost_total_or_per_turbine"] = "total" - _dict["cost_per_turbine"] = _dict["raw_cost"] / num_turbines - _dict["cost_per_project"] = _dict["raw_cost"] - _dict["usd_per_kw_per_project"] = _dict["raw_cost"] / project_size_kw - else: # If raw_cost is per turbine - _dict["raw_cost_total_or_per_turbine"] = "turbine" - _dict["cost_per_turbine"] = _dict["raw_cost"] - _dict["cost_per_project"] = _dict["raw_cost"] * num_turbines - _dict["usd_per_kw_per_project"] = _dict["cost_per_project"] / project_size_kw + _dict['raw_cost_total_or_per_turbine'] = 'total' + _dict['cost_per_turbine'] = _dict['raw_cost'] / num_turbines + _dict['cost_per_project'] = _dict['raw_cost'] + _dict['usd_per_kw_per_project'] = _dict['raw_cost'] / project_size_kw + else: # If raw_cost is per turbine + _dict['raw_cost_total_or_per_turbine'] = 'turbine' + _dict['cost_per_turbine'] = _dict['raw_cost'] + _dict['cost_per_project'] = _dict['raw_cost'] * num_turbines + _dict['usd_per_kw_per_project'] = _dict['cost_per_project'] / project_size_kw return result diff --git a/WISDEM/wisdem/landbosse/model/DefaultMasterInputDict.py b/WISDEM/wisdem/landbosse/model/DefaultMasterInputDict.py index 4e15490aa..61c783b55 100644 --- a/WISDEM/wisdem/landbosse/model/DefaultMasterInputDict.py +++ b/WISDEM/wisdem/landbosse/model/DefaultMasterInputDict.py @@ -12,12 +12,11 @@ def __init__(self): self.default_input_dict = dict() # Set the list and dictionary values on the master dictionary - self.default_input_dict["season_construct"] = ["spring", "summer", "fall"] - self.default_input_dict["time_construct"] = "normal" - self.default_input_dict["hour_day"] = {"long": 24, "normal": 10} - self.default_input_dict["operational_construction_time"] = self.default_input_dict["hour_day"][ - self.default_input_dict["time_construct"] - ] + self.default_input_dict['season_construct'] = ['spring', 'summer', 'fall'] + self.default_input_dict['time_construct'] = 'normal' + self.default_input_dict['hour_day'] = {'long': 24, 'normal': 10} + self.default_input_dict['operational_construction_time'] = self.default_input_dict['hour_day'][ + self.default_input_dict['time_construct']] def populate_input_dict(self, incomplete_input_dict): """ diff --git a/WISDEM/wisdem/landbosse/model/DevelopmentCost.py b/WISDEM/wisdem/landbosse/model/DevelopmentCost.py index 76869ca9b..5ee4fd794 100644 --- a/WISDEM/wisdem/landbosse/model/DevelopmentCost.py +++ b/WISDEM/wisdem/landbosse/model/DevelopmentCost.py @@ -1,10 +1,7 @@ -import math import traceback - -import pandas as pd - from wisdem.landbosse.model.CostModule import CostModule - +import pandas as pd +import math class DevelopmentCost(CostModule): """ @@ -38,24 +35,19 @@ def calculate_costs(self): total_development_cost : pd.DataFrame data frame with total development cost by type of cost (e.g., Labor) """ - if "development_labor_cost_usd" in self.input_dict: - total_development_cost = pd.DataFrame( - [ - {"Type of cost": "Equipment rental", "Cost USD": 0, "Phase of construction": "Development"}, - { - "Type of cost": "Labor", - "Cost USD": self.input_dict["development_labor_cost_usd"], - "Phase of construction": "Development", - }, - {"Type of cost": "Materials", "Cost USD": 0, "Phase of construction": "Development"}, - {"Type of cost": "Mobilization", "Cost USD": 0, "Phase of construction": "Development"}, - {"Type of cost": "Other", "Cost USD": 0, "Phase of construction": "Development"}, - ] - ) + if 'development_labor_cost_usd' in self.input_dict: + total_development_cost = pd.DataFrame([ + {'Type of cost': 'Equipment rental', 'Cost USD': 0, 'Phase of construction': 'Development'}, + {'Type of cost': 'Labor', 'Cost USD': self.input_dict['development_labor_cost_usd'], + 'Phase of construction': 'Development'}, + {'Type of cost': 'Materials', 'Cost USD': 0, 'Phase of construction': 'Development'}, + {'Type of cost': 'Mobilization', 'Cost USD': 0, 'Phase of construction': 'Development'}, + {'Type of cost': 'Other', 'Cost USD': 0, 'Phase of construction': 'Development'} + ]) else: - total_development_cost = self.input_dict["development_df"] + total_development_cost = self.input_dict['development_df'] - self.output_dict["total_development_cost"] = total_development_cost + self.output_dict['total_development_cost'] = total_development_cost return total_development_cost @@ -74,25 +66,21 @@ def outputs_for_detailed_tab(self): result = [] module = type(self).__name__ - for _, row in self.output_dict["total_development_cost"].iterrows(): - dashed_row = "{} - {} - {}".format( - row["Type of cost"], row["Phase of construction"], math.ceil(row["Cost USD"]) - ) - result.append( - { - "unit": "", - "type": "dataframe", - "variable_df_key_col_name": "Type of Cost - Phase of Construction - Cost in USD", - "value": dashed_row, - "last_number": row[2], - } - ) + for _, row in self.output_dict['total_development_cost'].iterrows(): + dashed_row = '{} - {} - {}'.format(row["Type of cost"], row["Phase of construction"], math.ceil(row["Cost USD"])) + result.append({ + 'unit': '', + 'type': 'dataframe', + 'variable_df_key_col_name': 'Type of Cost - Phase of Construction - Cost in USD', + 'value': dashed_row, + 'last_number': row[2] + }) for _dict in result: - _dict["project_id_with_serial"] = self.project_name - _dict["module"] = module + _dict['project_id_with_serial'] = self.project_name + _dict['module'] = module - self.output_dict["development_cost_csv"] = result + self.output_dict['development_cost_csv'] = result return result def run_module(self): @@ -104,8 +92,10 @@ def run_module(self): try: self.calculate_costs() self.outputs_for_detailed_tab() - self.output_dict["development_module_type_operation"] = self.outputs_for_costs_by_module_type_operation( - input_df=self.output_dict["total_development_cost"], project_id=self.project_name, total_or_turbine=True + self.output_dict['development_module_type_operation'] = self.outputs_for_costs_by_module_type_operation( + input_df=self.output_dict['total_development_cost'], + project_id=self.project_name, + total_or_turbine=True ) return 0, 0 # module ran successfully @@ -113,3 +103,5 @@ def run_module(self): traceback.print_exc() print(f"Fail {self.project_name} DevelopmentCost") return 1, error # module did not run successfully + + diff --git a/WISDEM/wisdem/landbosse/model/ErectionCost.py b/WISDEM/wisdem/landbosse/model/ErectionCost.py index 2c1c147fa..671048e75 100644 --- a/WISDEM/wisdem/landbosse/model/ErectionCost.py +++ b/WISDEM/wisdem/landbosse/model/ErectionCost.py @@ -1,15 +1,15 @@ -import traceback -from math import ceil - -import numpy as np import pandas as pd +import numpy as np +from math import ceil from wisdem.landbosse.model.CostModule import CostModule from wisdem.landbosse.model.WeatherDelay import WeatherDelay +import traceback + # constants km_per_m = 0.001 -hr_per_min = 1 / 60 +hr_per_min = 1/60 m_per_ft = 0.3048 @@ -30,137 +30,132 @@ def __init__(self, x, y): else: raise ValueError(type(x)) - -def ccw(A, B, C): - return (C.y - A.y) * (B.x - A.x) > (B.y - A.y) * (C.x - A.x) - +def ccw(A,B,C): + return (C.y-A.y) * (B.x-A.x) > (B.y-A.y) * (C.x-A.x) # Return true if line segments AB and CD intersect -def intersect(A, B, C, D): - return ccw(A, C, D) != ccw(B, C, D) and ccw(A, B, C) != ccw(A, B, D) - +def intersect(A,B,C,D): + return ccw(A,C,D) != ccw(B,C,D) and ccw(A,B,C) != ccw(A,B,D) def point_in_polygon(pt, poly): result = False maxx = float(np.r_[pt.x, np.array([m.x for m in poly])].max()) - for i in range(len(poly) - 1): - if intersect(poly[i], poly[i + 1], pt, Point(1.1 * maxx, pt.y)): + for i in range(len(poly)-1): + if intersect(poly[i], poly[i+1], pt, Point(1.1*maxx, pt.y)): result = not result - if intersect(poly[-1], poly[0], pt, Point(1.1 * maxx, pt.y)): + if intersect(poly[-1], poly[0], pt, Point(1.1*maxx, pt.y)): result = not result return result - class ErectionCost(CostModule): """ - ErectionCost.py - Created by Annika Eberle and Owen Roberts on Mar. 16, 2018 - Created by Alicia Key and Parangat Bhaskar on 01 June 2019 + ErectionCost.py + Created by Annika Eberle and Owen Roberts on Mar. 16, 2018 + Created by Alicia Key and Parangat Bhaskar on 01 June 2019 - Calculates the costs for erecting the tower and rotor nacelle assembly for land-based wind projects - (items in brackets are not yet implemented) + Calculates the costs for erecting the tower and rotor nacelle assembly for land-based wind projects + (items in brackets are not yet implemented) - [Get terrain complexity] - [Get site complexity] - Get number of turbines - Get duration of construction - Get rate of deliveries - Get daily hours of operation - Get turbine rating - Get component specifications - [Get crane availability] + [Get terrain complexity] + [Get site complexity] + Get number of turbines + Get duration of construction + Get rate of deliveries + Get daily hours of operation + Get turbine rating + Get component specifications + [Get crane availability] - Get price data - Get labor mobilization_prices by crew type - Get labor prices by crew type - Get equipment mobilization prices by equipment type - Get fuel prices - Get equipment prices by equipment type + Get price data + Get labor mobilization_prices by crew type + Get labor prices by crew type + Get equipment mobilization prices by equipment type + Get fuel prices + Get equipment prices by equipment type - Calculate operational time for lifting components + Calculate operational time for lifting components - Estimate potential time delays due to weather + Estimate potential time delays due to weather - Calculate required labor and equip for erection (see equip_labor_by_type method below) - Calculate number of workers by crew type - Calculate man hours by crew type - Calculate number of equipment by equip type - Calculate equipment hours by equip type + Calculate required labor and equip for erection (see equip_labor_by_type method below) + Calculate number of workers by crew type + Calculate man hours by crew type + Calculate number of equipment by equip type + Calculate equipment hours by equip type - Calculate erection costs by type (see methods below) - Calculate mobilization costs as function of number of workers by crew type, number of equipment by equipment type, labor_mobilization_prices, and equip_mobilization_prices - Calculate labor costs as function of man_hours and labor prices by crew type - Calculate fuel costs as function of equipment hours by equipment type and fuel prices by equipment type - Calculate equipment costs as function of equipment hours by equipment type and equipment prices by equipment type + Calculate erection costs by type (see methods below) + Calculate mobilization costs as function of number of workers by crew type, number of equipment by equipment type, labor_mobilization_prices, and equip_mobilization_prices + Calculate labor costs as function of man_hours and labor prices by crew type + Calculate fuel costs as function of equipment hours by equipment type and fuel prices by equipment type + Calculate equipment costs as function of equipment hours by equipment type and equipment prices by equipment type - Sum erection costs over all types to get total costs + Sum erection costs over all types to get total costs - Find the least cost option + Find the least cost option - Return total erection costs + Return total erection costs - Keys in the input dictionary are the following: + Keys in the input dictionary are the following: - construct_duration - (int) duration of construction (in months) + construct_duration + (int) duration of construction (in months) - rate_of_deliveries - (int) rate of deliveries (number of turbines per week) + rate_of_deliveries + (int) rate of deliveries (number of turbines per week) - weather_window - (pd.DataFrame) window of weather data for project of interest. + weather_window + (pd.DataFrame) window of weather data for project of interest. - wind_shear_exponent - - (float) The exponent of the power law wind shear calculation + wind_shear_exponent +- (float) The exponent of the power law wind shear calculation - overtime_multiplier: - (float) multiplier for overtime work (working 60 hr/wk vs 40 hr/wk) + overtime_multiplier: + (float) multiplier for overtime work (working 60 hr/wk vs 40 hr/wk) - allow_same_flag - (bool) boolean flag to indicate whether choosing same base and - topping crane is allowed. + allow_same_flag + (bool) boolean flag to indicate whether choosing same base and + topping crane is allowed. - operational_construction_time - (int) Number of hours per day when construction can happen. + operational_construction_time + (int) Number of hours per day when construction can happen. - time_construct - (int) 'normal' (10 hours per day) or 'long' (24 hours per day) + time_construct + (int) 'normal' (10 hours per day) or 'long' (24 hours per day) - project_data - (dict) dictionary of pd.DataFrame for each of the csv files loaded - for the project. + project_data + (dict) dictionary of pd.DataFrame for each of the csv files loaded + for the project. - In turn, the project_data dictionary contains key value pairs of the - following: + In turn, the project_data dictionary contains key value pairs of the + following: - crane_specs: - (pd.DateFrame) Specs about the cranes for the cost calculations. + crane_specs: + (pd.DateFrame) Specs about the cranes for the cost calculations. - equip - (pd.DataFrame) Equipment needed for various tasks + equip + (pd.DataFrame) Equipment needed for various tasks - crew - (pd.DataFrame) Crew configurations needed for various tasks + crew + (pd.DataFrame) Crew configurations needed for various tasks - components - (pd.DataFrame) components to build a wind turbine + components + (pd.DataFrame) components to build a wind turbine - project - (pd.DataFrame) The project of the project to calculate. + project + (pd.DataFrame) The project of the project to calculate. - equip_price - (pd.DatFrame) Prices to operate various pieces of equipment. + equip_price + (pd.DatFrame) Prices to operate various pieces of equipment. - crew_price - (pd.DataFrame) THe prices for various crews + crew_price + (pd.DataFrame) THe prices for various crews - material_price - (pd.DatFrame) Prices for various materials used during erection. + material_price + (pd.DatFrame) Prices for various materials used during erection. - rsmeans - (p.DataFrame) RSMeans data + rsmeans + (p.DataFrame) RSMeans data """ - def __init__(self, input_dict, output_dict, project_name): """ Parameters @@ -196,14 +191,16 @@ def run_module(self): try: self.calculate_costs() self.outputs_for_detailed_tab() - self.output_dict["erection_module_type_operation"] = self.outputs_for_costs_by_module_type_operation( - input_df=self.output_dict["total_erection_cost"], project_id=self.project_name, total_or_turbine=True + self.output_dict['erection_module_type_operation'] = self.outputs_for_costs_by_module_type_operation( + input_df=self.output_dict['total_erection_cost'], + project_id=self.project_name, + total_or_turbine=True ) - return 0, 0 # Module ran successfully + return 0, 0 # Module ran successfully except Exception as error: traceback.print_exc() print(f"Fail {self.project_name} ErectionCost") - return 1, error # Module did not run successfully + return 1, error # Module did not run successfully def outputs_for_detailed_tab(self): """ @@ -217,205 +214,170 @@ def outputs_for_detailed_tab(self): list(dict) A list of dicts, with each dict representing a row of the data. """ - result = [] + result =[] for _, row in self._number_of_equip.iterrows(): - result.append( - { - "unit": "", - "type": "dataframe", - "variable_df_key_col_name": "_number_of_equip: Operation-Crane name-Boom system-Number of equipment", - "value": f'{row["Operation"]}-{row["Crane name"]}-{row["Boom system"]}-{row["Number of equipment"]}', - "last_number": row["Number of equipment"], - } - ) - - for _, row in self.output_dict["erection_selected_detailed_data"].iterrows(): - result.append( - { - "unit": "", - "type": "dataframe", - "variable_df_key_col_name": f"erection_selected_detailed_data: Operation-Crane name-Boom system-Operational construct days over time construct days", - "value": f'{row["Operation"]}-{row["Crane name"]}-{row["Boom system"]}-{row["Operational construct days over time construct days"]}', - "last_number": row["Operational construct days over time construct days"], - } - ) - - for row in self.output_dict["component_name_topvbase"].itertuples(): - dashed_row = "{} - {}".format(row[1], row[2]) - result.append( - { - "unit": "", - "type": "dataframe", - "variable_df_key_col_name": "component_name_topvbase: Operation - Top or Base", - "value": dashed_row, - } - ) - - for row in self.output_dict["crane_choice"].itertuples(): - dashed_row = "{} - {} - {}".format(row[1], row[2], row[3]) - result.append( - { - "unit": "", - "type": "dataframe", - "variable_df_key_col_name": "crane_choice: Crew name - Boom system - Operation", - "value": dashed_row, - } - ) - - for _, row in self.output_dict["crane_data_output"].iterrows(): - dashed_row = "{} - {} - {}".format(row[0], row[1], row[2]) - result.append( - { - "unit": "", - "type": "dataframe", - "variable_df_key_col_name": "crane_data_output: crane_boom_operation_concat - variable - value", - "value": dashed_row, - "last_number": row[2], - } - ) - - for _, row in self.output_dict["crane_cost_details"].iterrows(): - dashed_row = "{} - {} - {}".format(row[0], row[1], row[2]) - result.append( - { - "unit": "", - "type": "dataframe", - "variable_df_key_col_name": "crane_cost_details: Operation ID - Type of cost - Cost", - "value": dashed_row, - "last_number": row[2], - } - ) - - for _, row in self.output_dict["total_erection_cost"].iterrows(): - dashed_row = "{} - {} - {}".format(row[0], row[1], row[2]) - result.append( - { - "unit": "", - "type": "dataframe", - "variable_df_key_col_name": "total_erection_cost: Phase of construction - Type of cost - Cost USD", - "value": dashed_row, - "last_number": row[2], - } - ) - - for _, row in self.output_dict["erection_selected_detailed_data"].iterrows(): - value = row["Labor cost USD without management"] - operation = row["Operation"] - result.append( - { - "unit": "usd", - "type": "dataframe", - "variable_df_key_col_name": f"erection_selected_detailed_data: crew cost without management", - "value": value, - "non_numeric_value": operation, - } - ) - - for _, row in self.output_dict["erection_selected_detailed_data"].iterrows(): - value = row["Mobilization cost USD"] - crane_boom_operation_concat = row["crane_boom_operation_concat"] - result.append( - { - "unit": "usd", - "type": "dataframe", - "variable_df_key_col_name": "erection_selected_detailed_data: mobilization", - "value": value, - "non_numeric_value": crane_boom_operation_concat, - } - ) - - for _, row in self.output_dict["erection_selected_detailed_data"].iterrows(): - value = row["Wind multiplier"] - operation = row["Operation"] - result.append( - { - "unit": "", - "type": "dataframe", - "variable_df_key_col_name": f"erection_selected_detailed_data: wind multiplier", - "value": value, - "non_numeric_value": operation, - } - ) - - result.append( - { - "unit": "usd", - "type": "variable", - "variable_df_key_col_name": "total_cost_summed_erection", - "value": float(self.output_dict["total_cost_summed_erection"]), - } - ) - - for _, row in self.output_dict["management_crews_cost"].iterrows(): - result.append( - { - "unit": "", - "type": "dataframe", - "variable_df_key_col_name": "management_crews_cost: {}".format(" - ".join(row.index)), - "value": " - ".join(list(str(x) for x in row)[1:]), - } - ) + result.append({ + 'unit': '', + 'type': 'dataframe', + 'variable_df_key_col_name': '_number_of_equip: Operation-Crane name-Boom system-Number of equipment', + 'value': f'{row["Operation"]}-{row["Crane name"]}-{row["Boom system"]}-{row["Number of equipment"]}', + 'last_number': row["Number of equipment"] + }) + + for _, row in self.output_dict['erection_selected_detailed_data'].iterrows(): + result.append({ + 'unit': '', + 'type': 'dataframe', + 'variable_df_key_col_name': f'erection_selected_detailed_data: Operation-Crane name-Boom system-Operational construct days over time construct days', + 'value': f'{row["Operation"]}-{row["Crane name"]}-{row["Boom system"]}-{row["Operational construct days over time construct days"]}', + 'last_number': row["Operational construct days over time construct days"] + }) + + for row in self.output_dict['component_name_topvbase'].itertuples(): + dashed_row = '{} - {}'.format(row[1], row[2]) + result.append({ + 'unit': '', + 'type': 'dataframe', + 'variable_df_key_col_name': 'component_name_topvbase: Operation - Top or Base', + 'value': dashed_row + }) + + for row in self.output_dict['crane_choice'].itertuples(): + dashed_row = '{} - {} - {}'.format(row[1], row[2], row[3]) + result.append({ + 'unit': '', + 'type': 'dataframe', + 'variable_df_key_col_name': 'crane_choice: Crew name - Boom system - Operation', + 'value': dashed_row + }) + + for _, row in self.output_dict['crane_data_output'].iterrows(): + dashed_row = '{} - {} - {}'.format(row[0], row[1], row[2]) + result.append({ + 'unit': '', + 'type': 'dataframe', + 'variable_df_key_col_name': 'crane_data_output: crane_boom_operation_concat - variable - value', + 'value': dashed_row, + 'last_number': row[2] + }) + + for _, row in self.output_dict['crane_cost_details'].iterrows(): + dashed_row = '{} - {} - {}'.format(row[0], row[1], row[2]) + result.append({ + 'unit': '', + 'type': 'dataframe', + 'variable_df_key_col_name': 'crane_cost_details: Operation ID - Type of cost - Cost', + 'value': dashed_row, + 'last_number': row[2] + }) + + for _, row in self.output_dict['total_erection_cost'].iterrows(): + dashed_row = '{} - {} - {}'.format(row[0], row[1], row[2]) + result.append({ + 'unit': '', + 'type': 'dataframe', + 'variable_df_key_col_name': 'total_erection_cost: Phase of construction - Type of cost - Cost USD', + 'value': dashed_row, + 'last_number': row[2] + }) + + for _, row in self.output_dict['erection_selected_detailed_data'].iterrows(): + value = row['Labor cost USD without management'] + operation = row['Operation'] + result.append({ + 'unit': 'usd', + 'type': 'dataframe', + 'variable_df_key_col_name': f'erection_selected_detailed_data: crew cost without management', + 'value': value, + 'non_numeric_value': operation + }) + + for _, row in self.output_dict['erection_selected_detailed_data'].iterrows(): + value = row['Mobilization cost USD'] + crane_boom_operation_concat = row['crane_boom_operation_concat'] + result.append({ + 'unit': 'usd', + 'type': 'dataframe', + 'variable_df_key_col_name': 'erection_selected_detailed_data: mobilization', + 'value': value, + 'non_numeric_value': crane_boom_operation_concat + }) + + for _, row in self.output_dict['erection_selected_detailed_data'].iterrows(): + value = row['Wind multiplier'] + operation = row['Operation'] + result.append({ + 'unit': '', + 'type': 'dataframe', + 'variable_df_key_col_name': f'erection_selected_detailed_data: wind multiplier', + 'value': value, + 'non_numeric_value': operation + }) + + result.append({ + 'unit': 'usd', + 'type': 'variable', + 'variable_df_key_col_name': 'total_cost_summed_erection', + 'value': float(self.output_dict['total_cost_summed_erection']) + }) + + for _, row in self.output_dict['management_crews_cost'].iterrows(): + result.append({ + 'unit': '', + 'type': 'dataframe', + 'variable_df_key_col_name': 'management_crews_cost: {}'.format(' - '.join(row.index)), + 'value': ' - '.join(list(str(x) for x in row)[1:]) + }) + + result.append({ + 'unit': 'hours', + 'type': 'variable', + 'variable_df_key_col_name': 'number of hours in weather window', + 'value': len(self.input_dict['weather_window']) + }) + + result.append({ + 'unit': 'none', + 'type': 'variable', + 'variable_df_key_col_name': 'time_weighted_weather_multiplier', + 'value': self.output_dict['time_weighted_weather_multiplier'] + }) + + result.append({ + 'unit': 'months', + 'type': 'variable', + 'variable_df_key_col_name': 'erection_construction_months', + 'value': self.output_dict['erection_construction_months'] + }) + + result.append({ + 'unit': 'usd', + 'type': 'variable', + 'variable_df_key_col_name': 'labor_cost_management', + 'value': self.output_dict['labor_cost_management'] + }) + + result.append({ + 'unit': 'usd', + 'type': 'variable', + 'variable_df_key_col_name': 'labor_cost_non_management', + 'value': self.output_dict['labor_cost_non_management'] + }) + + result.append({ + 'unit': 'usd', + 'type': 'variable', + 'variable_df_key_col_name': 'labor_cost_total', + 'value': self.output_dict['labor_cost_total'] + }) - result.append( - { - "unit": "hours", - "type": "variable", - "variable_df_key_col_name": "number of hours in weather window", - "value": len(self.input_dict["weather_window"]), - } - ) - - result.append( - { - "unit": "none", - "type": "variable", - "variable_df_key_col_name": "time_weighted_weather_multiplier", - "value": self.output_dict["time_weighted_weather_multiplier"], - } - ) - - result.append( - { - "unit": "months", - "type": "variable", - "variable_df_key_col_name": "erection_construction_months", - "value": self.output_dict["erection_construction_months"], - } - ) - - result.append( - { - "unit": "usd", - "type": "variable", - "variable_df_key_col_name": "labor_cost_management", - "value": self.output_dict["labor_cost_management"], - } - ) - - result.append( - { - "unit": "usd", - "type": "variable", - "variable_df_key_col_name": "labor_cost_non_management", - "value": self.output_dict["labor_cost_non_management"], - } - ) - - result.append( - { - "unit": "usd", - "type": "variable", - "variable_df_key_col_name": "labor_cost_total", - "value": self.output_dict["labor_cost_total"], - } - ) module = type(self).__name__ for _dict in result: - _dict["project_id_with_serial"] = self.project_name - _dict["module"] = module - self.output_dict["erection_cost_csv"] = result + _dict['project_id_with_serial'] = self.project_name + _dict['module'] = module + self.output_dict['erection_cost_csv'] = result return result @@ -444,35 +406,33 @@ def calculate_erection_operation_time(self): pd.DataFrame, pd.DataFrame Dataframe of possible_cranes (with geometry) and operational time for cranes """ - project_data = self.input_dict["project_data"] - construct_duration = self.input_dict["construct_duration"] # Total project construction time (months) - operational_construction_time = self.input_dict["operational_construction_time"] # Hours, 10 or 24 + project_data = self.input_dict['project_data'] + construct_duration = self.input_dict['construct_duration'] # Total project construction time (months) + operational_construction_time = self.input_dict['operational_construction_time'] # Hours, 10 or 24 # Why multiply by hardcoded 1/3? erection_construction_time = 1 / 3 * construct_duration - breakpoint_between_base_and_topping_percent = self.input_dict["breakpoint_between_base_and_topping_percent"] - hub_height_m = self.input_dict["hub_height_meters"] - rotor_diameter_m = self.input_dict["rotor_diameter_m"] - num_turbines = float(self.input_dict["num_turbines"]) - turbine_spacing_rotor_diameters = self.input_dict["turbine_spacing_rotor_diameters"] + breakpoint_between_base_and_topping_percent = self.input_dict['breakpoint_between_base_and_topping_percent'] + hub_height_m = self.input_dict['hub_height_meters'] + rotor_diameter_m = self.input_dict['rotor_diameter_m'] + num_turbines = float(self.input_dict['num_turbines']) + turbine_spacing_rotor_diameters = self.input_dict['turbine_spacing_rotor_diameters'] # for components in component list determine if base or topping - project_data["components"]["Operation"] = project_data["components"]["Lift height m"] > ( - float(hub_height_m * breakpoint_between_base_and_topping_percent) - ) - boolean_dictionary = {True: "Top", False: "Base"} - project_data["components"]["Operation"] = project_data["components"]["Operation"].map(boolean_dictionary) + project_data['components']['Operation'] = project_data['components']['Lift height m'] > ( + float(hub_height_m * breakpoint_between_base_and_topping_percent)) + boolean_dictionary = {True: 'Top', False: 'Base'} + project_data['components']['Operation'] = project_data['components']['Operation'].map(boolean_dictionary) # For output to a csv file - self.output_dict["component_name_topvbase"] = project_data["components"][["Component", "Operation"]] + self.output_dict['component_name_topvbase'] = project_data['components'][['Component', 'Operation']] # create groups for operations - top_v_base = project_data["components"].groupby("Operation") + top_v_base = project_data['components'].groupby('Operation') # group crane data by boom system and crane name to get distinct cranes - crane_grouped = project_data["crane_specs"].groupby( - ["Equipment name", "Equipment ID", "Crane name", "Boom system", "Crane capacity tonne"] - ) + crane_grouped = project_data['crane_specs'].groupby( + ['Equipment name', 'Equipment ID', 'Crane name', 'Boom system', 'Crane capacity tonne']) # Calculate the crane lift polygons crane_poly = self.calculate_crane_lift_polygons(crane_grouped=crane_grouped) @@ -480,109 +440,94 @@ def calculate_erection_operation_time(self): # loop through operation type (topping vs. base) component_max_speed = pd.DataFrame() for name_operation, component_group in top_v_base: - lift_max_wind_speed = self.calculate_component_lift_max_wind_speed( - component_group=component_group, - crane_poly=crane_poly, - component_max_speed=component_max_speed, - operation=name_operation, - ) - crane_poly = lift_max_wind_speed["crane_poly"] - component_max_speed = lift_max_wind_speed["component_max_speed"] + lift_max_wind_speed = self.calculate_component_lift_max_wind_speed(component_group=component_group, + crane_poly=crane_poly, + component_max_speed=component_max_speed, + operation=name_operation) + crane_poly = lift_max_wind_speed['crane_poly'] + component_max_speed = lift_max_wind_speed['component_max_speed'] # Sorting can help for some operations, but isn't strictly necessary, so it can be turned # off when not debugging # component_max_speed = component_max_speed.sort_values(by=['Crane name', 'Boom system', 'Component']) # join crane polygon to crane specs - crane_component = pd.merge(crane_poly, component_max_speed, on=["Crane name", "Boom system"]) + crane_component = pd.merge(crane_poly, component_max_speed, on=['Crane name', 'Boom system']) # select only cranes that could lift the component - possible_cranes = ( - crane_component.where(crane_component["crane_bool"] == True).dropna(thresh=1).reset_index(drop=True) - ) + possible_cranes = crane_component.where(crane_component['crane_bool'] == True).dropna(thresh=1).reset_index( + drop=True) # calculate travel time per cycle - turbine_spacing = float(turbine_spacing_rotor_diameters * rotor_diameter_m * km_per_m) - possible_cranes["Travel time hr"] = ( - turbine_spacing / possible_cranes["Speed of travel km per hr"] * num_turbines - ) + turbine_spacing = float( + turbine_spacing_rotor_diameters * rotor_diameter_m * km_per_m) + possible_cranes['Travel time hr'] = turbine_spacing / possible_cranes['Speed of travel km per hr'] * num_turbines # calculate erection time - possible_cranes["Operation time hr"] = ( - (possible_cranes["Lift height m"] / possible_cranes["Hoist speed m per min"] * hr_per_min) - + (possible_cranes["Cycle time installation hrs"]) - ) * num_turbines + possible_cranes['Operation time hr'] = ((possible_cranes['Lift height m'] / possible_cranes[ + 'Hoist speed m per min'] * hr_per_min) + + (possible_cranes['Cycle time installation hrs']) + ) * num_turbines # Modify the breakdown time column to reflect all the crane breakdowns # the entire project - crane_breakdown_fraction = self.input_dict["crane_breakdown_fraction"] + crane_breakdown_fraction = self.input_dict['crane_breakdown_fraction'] num_turbines_needing_breakdowns = ceil(num_turbines * crane_breakdown_fraction) - breakdown_time_all_turbines_hrs = possible_cranes["Breakdown time hr"] * num_turbines_needing_breakdowns + breakdown_time_all_turbines_hrs = possible_cranes['Breakdown time hr'] * num_turbines_needing_breakdowns # Combine the breakdown time with the setup time to get total setup + breakdown # time and store it as setup time. - setup_time_all_turbines_hrs = possible_cranes["Setup time hr"] * num_turbines - possible_cranes["Setup time hr"] = setup_time_all_turbines_hrs + breakdown_time_all_turbines_hrs + setup_time_all_turbines_hrs = possible_cranes['Setup time hr'] * num_turbines + possible_cranes['Setup time hr'] = setup_time_all_turbines_hrs + breakdown_time_all_turbines_hrs # check that crane can lift all components within a group (base vs top) - crane_lift_entire_group_for_operation = crane_component.groupby(by=["Crane name", "Boom system", "Operation"])[ - "crane_bool" - ].all() + crane_lift_entire_group_for_operation = crane_component.groupby(by=['Crane name', 'Boom system', 'Operation'])[ + 'crane_bool'].all() # if it can't then we need to remove it. # otherwise we end up with an option for a crane to perform an operation without lifting all of the corresponding components - testcranenew = possible_cranes.merge( - crane_lift_entire_group_for_operation, on=["Crane name", "Boom system", "Operation"] - ) - possible_cranes = testcranenew.loc[testcranenew["crane_bool_y"]] - - erection_time = possible_cranes.groupby( - ["Crane name", "Equipment name", "Crane capacity tonne", "Crew type ID", "Boom system", "Operation"] - )["Operation time hr"].sum() - travel_time = possible_cranes.groupby( - ["Crane name", "Equipment name", "Crane capacity tonne", "Crew type ID", "Boom system", "Operation"] - )["Travel time hr"].max() - setup_time = possible_cranes.groupby( - ["Crane name", "Equipment name", "Crane capacity tonne", "Crew type ID", "Boom system", "Operation"] - )["Setup time hr"].max() + testcranenew = possible_cranes.merge(crane_lift_entire_group_for_operation, + on=['Crane name', 'Boom system', 'Operation']) + possible_cranes = testcranenew.loc[testcranenew['crane_bool_y']] + + erection_time = possible_cranes.groupby(['Crane name', 'Equipment name', 'Crane capacity tonne', 'Crew type ID', + 'Boom system', 'Operation'])['Operation time hr'].sum() + travel_time = possible_cranes.groupby(['Crane name', 'Equipment name', 'Crane capacity tonne', 'Crew type ID', + 'Boom system', 'Operation'])['Travel time hr'].max() + setup_time = possible_cranes.groupby(['Crane name', 'Equipment name', 'Crane capacity tonne', 'Crew type ID', + 'Boom system', 'Operation'])['Setup time hr'].max() rental_time_without_weather = erection_time + travel_time + setup_time operation_time = rental_time_without_weather.reset_index() - operation_time = operation_time.rename(columns={0: "Operation time all turbines hrs"}) - operation_time["Operational construct days"] = ( - operation_time["Operation time all turbines hrs"] / operational_construction_time - ) + operation_time = operation_time.rename(columns={0: 'Operation time all turbines hrs'}) + operation_time['Operational construct days'] = (operation_time['Operation time all turbines hrs'] / + operational_construction_time) # if more than one crew needed to complete within construction duration then assume that all construction happens # within that window and use that time frame for weather delays; if not, use the number of days calculated - operation_time["time_construct_bool"] = ( - operation_time["Operational construct days"] > erection_construction_time * 30 - ) + operation_time['time_construct_bool'] = (operation_time['Operational construct days'] > + erection_construction_time * 30) boolean_dictionary = {True: erection_construction_time * 30, False: np.NAN} - operation_time["time_construct_bool"] = operation_time["time_construct_bool"].map(boolean_dictionary) - operation_time["Time construct days"] = operation_time[ - ["time_construct_bool", "Operational construct days"] - ].min(axis=1) + operation_time['time_construct_bool'] = operation_time['time_construct_bool'].map(boolean_dictionary) + operation_time['Time construct days'] = operation_time[ + ['time_construct_bool', 'Operational construct days']].min(axis=1) # print(possible_cranes[['Crane name', 'Component', 'Operation time hr', 'Operation']]) for operation, component_group in top_v_base: - unique_component_crane = possible_cranes.loc[possible_cranes["Operation"] == operation][ - "Component" - ].unique() - for component in component_group["Component"]: + unique_component_crane = possible_cranes.loc[possible_cranes['Operation'] == operation][ + 'Component'].unique() + for component in component_group['Component']: if component not in unique_component_crane: raise Exception( - "Error: Unable to find installation crane for {} operation and {} component".format( - operation, component - ) - ) + 'Error: Unable to find installation crane for {} operation and {} component'.format(operation, + component)) erection_operation_time_dict = dict() - erection_operation_time_dict["possible_cranes"] = possible_cranes - erection_operation_time_dict["operation_time"] = operation_time + erection_operation_time_dict['possible_cranes'] = possible_cranes + erection_operation_time_dict['operation_time'] = operation_time - self.output_dict["possible_cranes"] = possible_cranes - self.output_dict["erection_operation_time"] = erection_operation_time_dict + self.output_dict['possible_cranes'] = possible_cranes + self.output_dict['erection_operation_time'] = erection_operation_time_dict return possible_cranes, operation_time @@ -609,100 +554,92 @@ def calculate_offload_operation_time(self): operation_time : int Integer of number of hours per day construction can proceed. """ - project_data = self.input_dict["project_data"] - operational_construction_time = self.input_dict["operational_construction_time"] - rate_of_deliveries = self.input_dict["rate_of_deliveries"] - rotor_diameter_m = self.input_dict["rotor_diameter_m"] - num_turbines = float(self.input_dict["num_turbines"]) - turbine_spacing_rotor_diameters = self.input_dict["turbine_spacing_rotor_diameters"] + project_data = self.input_dict['project_data'] + operational_construction_time = self.input_dict['operational_construction_time'] + rate_of_deliveries = self.input_dict['rate_of_deliveries'] + rotor_diameter_m = self.input_dict['rotor_diameter_m'] + num_turbines = float(self.input_dict['num_turbines']) + turbine_spacing_rotor_diameters = self.input_dict['turbine_spacing_rotor_diameters'] - offload_cranes = project_data["crane_specs"].where( - project_data["crane_specs"]["Equipment name"] == "Offload crane" - ) + offload_cranes = project_data['crane_specs'].where( + project_data['crane_specs']['Equipment name'] == 'Offload crane') # group crane data by boom system and crane name to get distinct cranes crane_grouped = offload_cranes.groupby( - ["Equipment name", "Equipment ID", "Crane name", "Boom system", "Crane capacity tonne"] - ) + ['Equipment name', 'Equipment ID', 'Crane name', 'Boom system', 'Crane capacity tonne']) crane_poly = self.calculate_crane_lift_polygons(crane_grouped=crane_grouped) - component_group = project_data["components"] + component_group = project_data['components'] component_max_speed = pd.DataFrame() - lift_max_wind_speed = self.calculate_component_lift_max_wind_speed( - component_group=component_group, - crane_poly=crane_poly, - component_max_speed=component_max_speed, - operation="offload", - ) - component_max_speed = lift_max_wind_speed["component_max_speed"] - crane_poly = lift_max_wind_speed["crane_poly"] + lift_max_wind_speed = self.calculate_component_lift_max_wind_speed(component_group=component_group, + crane_poly=crane_poly, + component_max_speed=component_max_speed, + operation='offload') + component_max_speed = lift_max_wind_speed['component_max_speed'] + crane_poly = lift_max_wind_speed['crane_poly'] if len(crane_poly) != 0: # join crane polygon to crane specs - crane_component = pd.merge(crane_poly, component_max_speed, on=["Crane name", "Boom system"]) + crane_component = pd.merge(crane_poly, component_max_speed, on=['Crane name', 'Boom system']) # select only cranes that could lift the component - possible_cranes = ( - crane_component.where(crane_component["crane_bool"] == True).dropna(thresh=1).reset_index(drop=True) - ) + possible_cranes = crane_component.where(crane_component['crane_bool'] == True).dropna(thresh=1).reset_index( + drop=True) # calculate travel time per cycle - turbine_spacing = float(turbine_spacing_rotor_diameters * rotor_diameter_m * km_per_m) - turbine_num = float(self.input_dict["num_turbines"]) - possible_cranes["Travel time hr"] = ( - turbine_spacing / possible_cranes["Speed of travel km per hr"] * num_turbines - ) + turbine_spacing = float( + turbine_spacing_rotor_diameters * rotor_diameter_m * km_per_m) + turbine_num = float(self.input_dict['num_turbines']) + possible_cranes['Travel time hr'] = turbine_spacing / possible_cranes['Speed of travel km per hr'] * num_turbines # calculate erection time - possible_cranes["Operation time hr"] = ( - (possible_cranes["Lift height m"] / possible_cranes["Hoist speed m per min"] * hr_per_min) - + (possible_cranes["Offload cycle time hrs"]) - ) * turbine_num + possible_cranes['Operation time hr'] = ((possible_cranes['Lift height m'] / possible_cranes[ + 'Hoist speed m per min'] * hr_per_min) + + (possible_cranes['Offload cycle time hrs']) + ) * turbine_num # store setup time - possible_cranes["Setup time hr"] = possible_cranes["Setup time hr"] * turbine_num - - erection_time = possible_cranes.groupby( - ["Crane name", "Equipment name", "Crane capacity tonne", "Crew type ID", "Boom system"] - )["Operation time hr"].sum() - travel_time = possible_cranes.groupby( - ["Crane name", "Equipment name", "Crane capacity tonne", "Crew type ID", "Boom system"] - )["Travel time hr"].max() - setup_time = possible_cranes.groupby( - ["Crane name", "Equipment name", "Crane capacity tonne", "Crew type ID", "Boom system"] - )["Setup time hr"].max() + possible_cranes['Setup time hr'] = possible_cranes['Setup time hr'] * turbine_num + + erection_time = \ + possible_cranes.groupby(['Crane name', 'Equipment name', 'Crane capacity tonne', 'Crew type ID', + 'Boom system'])['Operation time hr'].sum() + travel_time = \ + possible_cranes.groupby(['Crane name', 'Equipment name', 'Crane capacity tonne', 'Crew type ID', + 'Boom system'])['Travel time hr'].max() + setup_time = \ + possible_cranes.groupby(['Crane name', 'Equipment name', 'Crane capacity tonne', 'Crew type ID', + 'Boom system'])['Setup time hr'].max() rental_time_without_weather = erection_time + travel_time + setup_time operation_time = rental_time_without_weather.reset_index() - operation_time = operation_time.rename(columns={0: "Operation time all turbines hrs"}) - operation_time["Operational construct days"] = ( - operation_time["Operation time all turbines hrs"] / operational_construction_time - ) + operation_time = operation_time.rename(columns={0: 'Operation time all turbines hrs'}) + operation_time['Operational construct days'] = (operation_time['Operation time all turbines hrs'] / + operational_construction_time) # if more than one crew needed to complete within construction duration # then assume that all construction happens within that window and use # that timeframe for weather delays; if not, use the number of days calculated - operation_time["time_construct_bool"] = turbine_num / operation_time[ - "Operational construct days" - ] * 6 > float(rate_of_deliveries) + operation_time['time_construct_bool'] = (turbine_num / operation_time['Operational construct days'] * 6 + > float(rate_of_deliveries)) boolean_dictionary = {True: (float(turbine_num) / (float(rate_of_deliveries) / 6)), False: np.NAN} - operation_time["time_construct_bool"] = operation_time["time_construct_bool"].map(boolean_dictionary) - operation_time["Time construct days"] = operation_time[ - ["time_construct_bool", "Operational construct days"] - ].max(axis=1) + operation_time['time_construct_bool'] = operation_time['time_construct_bool'].map(boolean_dictionary) + operation_time['Time construct days'] = operation_time[ + ['time_construct_bool', 'Operational construct days']].max( + axis=1) - possible_cranes["Operation"] = "Offload" - operation_time["Operation"] = "Offload" + possible_cranes['Operation'] = 'Offload' + operation_time['Operation'] = 'Offload' else: possible_cranes = [] operation_time = [] # print(possible_cranes[['Crane name', 'Component', 'Operation time hr']]) - unique_components = project_data["components"]["Component"].unique() - unique_component_crane = possible_cranes["Component"].unique() + unique_components = project_data['components']['Component'].unique() + unique_component_crane = possible_cranes['Component'].unique() for component in unique_components: if component not in unique_component_crane: - raise Exception("Error: Unable to find offload crane for {}".format(component)) + raise Exception('Error: Unable to find offload crane for {}'.format(component)) return possible_cranes, operation_time @@ -727,60 +664,34 @@ def calculate_crane_lift_polygons(self, crane_grouped): A dataframe of the cranes and their lifting polygons. """ crane_poly = pd.DataFrame( - columns=[ - "Equipment name", - "Equipment ID", - "Crane name", - "Boom system", - "Crane capacity tonne", - "Crane poly", - ] - ) + columns=['Equipment name', 'Equipment ID', 'Crane name', 'Boom system', 'Crane capacity tonne', 'Crane poly']) for (equipment_name, equipment_id, crane_name, boom_system, crane_capacity_tonne), crane in crane_grouped: crane = crane.reset_index(drop=True) - x = crane["Max capacity tonne"] - y = crane["Hub height m"] - wind_speed = min(crane["Max wind speed m per s"]) - hoist_speed = min(crane["Hoist speed m per min"]) - travel_speed = min(crane["Speed of travel km per hr"]) - setup_time = max(crane["Setup time hr"]) - breakdown_time = max(crane["Breakdown time hr"]) - crew_type = crane.loc[ - 0, "Crew type ID" - ] # For every crane/boom combo the crew is the same, so we can just take first crew. + x = crane['Max capacity tonne'] + y = crane['Hub height m'] + wind_speed = min(crane['Max wind speed m per s']) + hoist_speed = min(crane['Hoist speed m per min']) + travel_speed = min(crane['Speed of travel km per hr']) + setup_time = max(crane['Setup time hr']) + breakdown_time = max(crane['Breakdown time hr']) + crew_type = crane.loc[0, 'Crew type ID'] # For every crane/boom combo the crew is the same, so we can just take first crew. polygon = [Point(0, 0), Point(0, max(y)), Point(min(x), max(y)), Point(max(x), min(y)), Point(max(x), 0)] - df = pd.DataFrame( - [ - [ - equipment_name, - equipment_id, - crane_name, - boom_system, - crane_capacity_tonne, - wind_speed, - setup_time, - breakdown_time, - hoist_speed, - travel_speed, - crew_type, - polygon, - ] - ], - columns=[ - "Equipment name", - "Equipment ID", - "Crane name", - "Boom system", - "Crane capacity tonne", - "Max wind speed m per s", - "Setup time hr", - "Breakdown time hr", - "Hoist speed m per min", - "Speed of travel km per hr", - "Crew type ID", - "Crane poly", - ], - ) + df = pd.DataFrame([[equipment_name, + equipment_id, + crane_name, + boom_system, + crane_capacity_tonne, + wind_speed, + setup_time, + breakdown_time, + hoist_speed, + travel_speed, + crew_type, + polygon]], + columns=['Equipment name', 'Equipment ID', 'Crane name', 'Boom system', 'Crane capacity tonne', + 'Max wind speed m per s', 'Setup time hr', 'Breakdown time hr', + 'Hoist speed m per min', 'Speed of travel km per hr', + 'Crew type ID', 'Crane poly']) crane_poly = pd.concat((crane_poly, df), sort=True) return crane_poly @@ -835,58 +746,56 @@ def calculate_component_lift_max_wind_speed(self, *, component_group, crane_poly of "Crane bool {operation}" attached. """ for idx, crane in crane_poly.iterrows(): - polygon = crane["Crane poly"] + polygon = crane['Crane poly'] # calculate polygon for crane capacity and check if component can be lifted by each crane without wind loading - for component in component_group["Component"]: + for component in component_group['Component']: # get weight and height of component in each component group - component_only = component_group.where(component_group["Component"] == component).dropna(thresh=1) + component_only = component_group.where(component_group['Component'] == component).dropna(thresh=1) # See docstring for "operation" parameter above about mass calculations for offloading - if operation == "offload": - point = Point( - component_only["Mass tonne"] / 2, - (component_only["Section height m"] + component_only["Offload hook height m"]), - ) + if operation == 'offload': + point = Point(component_only['Mass tonne'] / 2, (component_only['Section height m'] + component_only['Offload hook height m'])) else: - point = Point( - component_only["Mass tonne"], - (component_only["Lift height m"] + component_only["Offload hook height m"]), - ) - crane["Lift boolean {component}".format(component=component)] = point_in_polygon(point, polygon) + point = Point(component_only['Mass tonne'], (component_only['Lift height m'] + component_only['Offload hook height m'])) + crane['Lift boolean {component}'.format(component=component)] = point_in_polygon(point, polygon) # Transform the "Lift boolean" indexes in the series to a list of booleans # that signify if the crane can lift a component. bool_list = [] - for component in component_group["Component"]: - if crane["Lift boolean {component}".format(component=component)] is False: + for component in component_group['Component']: + if crane['Lift boolean {component}'.format(component=component)] is False: crane_bool = False else: crane_bool = True bool_list.append(crane_bool) # mh is an effective mass (it should be the mass of the entire component for both offload and other cranes, not just 1/2 that's used above for determining whether the part can be lifted) - mh = component_group["Mass tonne"] - aw = component_group["Surface area sq m"] * component_group["Coeff drag"] - vmax_tab = crane["Max wind speed m per s"] + mh = component_group['Mass tonne'] + aw = component_group['Surface area sq m'] * component_group['Coeff drag'] + vmax_tab = crane['Max wind speed m per s'] vmax_calc = vmax_tab * np.sqrt(1.2 * mh / aw) # if vmax_calc is less than vmax_tab then vmax_calc, otherwise vmax_tab (based on pg. 33 of Liebherr) - component_group_new = pd.DataFrame( - component_group, - columns=list(component_group.columns.values) + ["vmax", "Crane name", "Boom system", "crane_bool"], - ) - component_group_new["vmax"] = np.minimum(vmax_tab, vmax_calc) - component_group_new["Crane name"] = crane["Crane name"] - component_group_new["Boom system"] = crane["Boom system"] - component_group_new["crane_bool"] = bool_list + component_group_new = pd.DataFrame(component_group, + columns=list(component_group.columns.values) + ['vmax', + 'Crane name', + 'Boom system', + 'crane_bool']) + component_group_new['vmax'] = np.minimum(vmax_tab, vmax_calc) + component_group_new['Crane name'] = crane['Crane name'] + component_group_new['Boom system'] = crane['Boom system'] + component_group_new['crane_bool'] = bool_list component_max_speed = pd.concat((component_max_speed, component_group_new), sort=True) crane_poly_new = crane_poly.copy() - crane_poly_new["Crane bool {}".format(operation)] = min(bool_list) + crane_poly_new['Crane bool {}'.format(operation)] = min(bool_list) - result = {"component_max_speed": component_max_speed, "crane_poly": crane_poly_new} + result = { + 'component_max_speed': component_max_speed, + 'crane_poly': crane_poly_new + } return result @@ -901,15 +810,15 @@ def calculate_wind_delay_by_component(self): """ # Get necessary values from input_dict - crane_specs = self.output_dict["crane_specs_withoffload"] - weather_window = self.input_dict["weather_window"] + crane_specs = self.output_dict['crane_specs_withoffload'] + weather_window = self.input_dict['weather_window'] # calculate wind delay for each component and crane combination crane_specs = crane_specs.reset_index() - crane_specs["Wind delay percent"] = np.nan + crane_specs['Wind delay percent'] = np.nan # pull global inputs for weather delay from input_dict - weather_data_keys = {"wind_shear_exponent", "weather_window"} + weather_data_keys = {'wind_shear_exponent', 'weather_window'} # specify collection-specific weather delay inputs weather_delay_global_inputs = {i: self.input_dict[i] for i in self.input_dict if i in weather_data_keys} @@ -921,33 +830,33 @@ def calculate_wind_delay_by_component(self): operation_start = 0 # start time is at beginning of construction weather window # extract critical wind speed - critical_wind_operation = row["vmax"] + critical_wind_operation = row['vmax'] # extract height of interest (differs for offload cranes) - if (row["Crane bool offload"] == 1) is True: - height_interest = row["Section height m"] + row["Offload hook height m"] + if (row['Crane bool offload'] == 1) is True: + height_interest = row['Section height m'] + row['Offload hook height m'] else: - height_interest = row["Lift height m"] + row["Offload hook height m"] + height_interest = row['Lift height m'] + row['Offload hook height m'] # compute weather delay weather_delay_input_dict = weather_delay_global_inputs weather_delay_output_dict = dict() - weather_delay_input_dict["start_delay_hours"] = operation_start - weather_delay_input_dict["critical_wind_speed_m_per_s"] = critical_wind_operation - weather_delay_input_dict["wind_height_of_interest_m"] = height_interest - weather_delay_input_dict["mission_time_hours"] = operation_window + weather_delay_input_dict['start_delay_hours'] = operation_start + weather_delay_input_dict['critical_wind_speed_m_per_s'] = critical_wind_operation + weather_delay_input_dict['wind_height_of_interest_m'] = height_interest + weather_delay_input_dict['mission_time_hours'] = operation_window WeatherDelay(weather_delay_input_dict, weather_delay_output_dict) - wind_delay = np.array(weather_delay_output_dict["wind_delays"]) + wind_delay = np.array(weather_delay_output_dict['wind_delays']) # if greater than 4 hour delay, then shut down for full day (10 hours) wind_delay[(wind_delay > 4)] = 10 wind_delay_time = float(wind_delay.sum()) # store weather delay for operation, component, crane, and boom combination - crane_specs.loc[i, "Wind delay percent"] = wind_delay_time / len(weather_window) + crane_specs.loc[i, 'Wind delay percent'] = wind_delay_time / len(weather_window) - self.output_dict["enhanced_crane_specs"] = crane_specs + self.output_dict['enhanced_crane_specs'] = crane_specs return crane_specs def aggregate_erection_costs(self): @@ -961,63 +870,41 @@ def aggregate_erection_costs(self): Second, utilizing same crane for base and topping, Third is crew cost. """ - join_wind_operation = self.output_dict["join_wind_operation"] - overtime_multiplier = self.input_dict["overtime_multiplier"] - time_construct = self.input_dict["time_construct"] - project_data = self.input_dict["project_data"] - hour_day = self.input_dict["hour_day"] + join_wind_operation = self.output_dict['join_wind_operation'] + overtime_multiplier = self.input_dict['overtime_multiplier'] + time_construct = self.input_dict['time_construct'] + project_data = self.input_dict['project_data'] + hour_day = self.input_dict['hour_day'] # TODO: consider removing equipment name and crane capacity from crane_specs tab (I believe these data are unused here and they get overwritten later with equip information from equip tab) - join_wind_operation = join_wind_operation.drop(columns=["Equipment name", "Crane capacity tonne"]) + join_wind_operation = join_wind_operation.drop(columns=['Equipment name', 'Crane capacity tonne']) - possible_crane_cost_with_equip = pd.merge( - join_wind_operation, project_data["equip"], on=["Equipment ID", "Operation"] - ) + possible_crane_cost_with_equip = pd.merge(join_wind_operation, project_data['equip'], + on=['Equipment ID', 'Operation']) - equip_crane_cost = pd.merge( - possible_crane_cost_with_equip, project_data["equip_price"], on=["Equipment name", "Crane capacity tonne"] - ) + equip_crane_cost = pd.merge(possible_crane_cost_with_equip, project_data['equip_price'], + on=['Equipment name', 'Crane capacity tonne']) - equip_crane_cost["Equipment rental cost USD"] = ( - equip_crane_cost["Total time per op with weather"] - * equip_crane_cost["Equipment price USD per hour"] - * equip_crane_cost["Number of equipment"] - ) + equip_crane_cost['Equipment rental cost USD'] = equip_crane_cost['Total time per op with weather'] * \ + equip_crane_cost['Equipment price USD per hour'] * \ + equip_crane_cost['Number of equipment'] # Drop duplicates from equip crane cost, if any # equip_crane_cost.drop_duplicates(subset=['Equipment ID', 'Operation', 'Crane name', 'Boom system'], inplace=True) - equipment_cost_to_merge = equip_crane_cost[ - [ - "Crane name", - "Boom system", - "Equipment ID", - "Operation", - "Equipment price USD per hour", - "Number of equipment", - "Equipment rental cost USD", - "Fuel consumption gal per day", - ] - ] - equipment_cost_to_merge = ( - equipment_cost_to_merge.groupby(["Crane name", "Boom system", "Equipment ID", "Operation"]) - .sum() - .reset_index() - ) - - possible_crane_cost = pd.merge( - join_wind_operation, equipment_cost_to_merge, on=["Crane name", "Boom system", "Equipment ID", "Operation"] - ) + equipment_cost_to_merge = equip_crane_cost[['Crane name', 'Boom system', 'Equipment ID', 'Operation', 'Equipment price USD per hour', 'Number of equipment', 'Equipment rental cost USD', 'Fuel consumption gal per day']] + equipment_cost_to_merge = equipment_cost_to_merge.groupby(['Crane name', 'Boom system', 'Equipment ID', 'Operation']).sum().reset_index() + + possible_crane_cost = pd.merge(join_wind_operation, equipment_cost_to_merge, on=['Crane name', 'Boom system', 'Equipment ID', 'Operation']) # Remove any duplicates from crew data. - crew_deduped = project_data["crew"].drop_duplicates( - subset=["Crew type ID", "Operation", "Crew name", "Labor type ID"], keep="first" - ) + crew_deduped = project_data['crew'].drop_duplicates( + subset=['Crew type ID', 'Operation', 'Crew name', 'Labor type ID'], keep="first") # Merge crew and price data for non-management crews only (base, topping, and offload only) - crew_cost = pd.merge(crew_deduped, project_data["crew_price"], on=["Labor type ID"]) - self.output_dict["crew_cost"] = crew_cost - non_management_crew_cost = crew_cost.loc[crew_cost["Operation"].isin(["Base", "Top", "Offload"])] + crew_cost = pd.merge(crew_deduped, project_data['crew_price'], on=['Labor type ID']) + self.output_dict['crew_cost'] = crew_cost + non_management_crew_cost = crew_cost.loc[crew_cost['Operation'].isin(['Base', 'Top', 'Offload'])] # calculate crew costs non_overtime_hours_per_week = 40 @@ -1025,12 +912,9 @@ def aggregate_erection_costs(self): hours_per_week = working_days_per_week * hour_day[time_construct] overtime_percentage = (hours_per_week - non_overtime_hours_per_week) / hours_per_week normal_labor_rate = non_overtime_hours_per_week / hours_per_week - crew_cost["Hourly rate for all workers"] = ( - non_management_crew_cost["Hourly rate USD per hour"] * non_management_crew_cost["Number of workers"] - ) * (normal_labor_rate + overtime_percentage * overtime_multiplier) - crew_cost["Per diem all workers"] = ( - non_management_crew_cost["Per diem USD per day"] * non_management_crew_cost["Number of workers"] - ) + crew_cost['Hourly rate for all workers'] = (non_management_crew_cost['Hourly rate USD per hour'] * non_management_crew_cost[ + 'Number of workers']) * (normal_labor_rate + overtime_percentage * overtime_multiplier) + crew_cost['Per diem all workers'] = non_management_crew_cost['Per diem USD per day'] * non_management_crew_cost['Number of workers'] # Crew cost group is getting two more people in it. # Note to future self, enforce constraints on dataframes. @@ -1039,112 +923,85 @@ def aggregate_erection_costs(self): # Intent is to keep the most expensive labor row. # group crew costs by crew type and operation - crew_cost_grouped = crew_cost.groupby(["Crew type ID", "Operation"]).sum(numeric_only=True).reset_index() + crew_cost_grouped = crew_cost.groupby(['Crew type ID', 'Operation']).sum(numeric_only=True).reset_index() # merge crane data with grouped crew costs - possible_crane_cost = pd.merge(possible_crane_cost, crew_cost_grouped, on=["Crew type ID", "Operation"]) + + possible_crane_cost = pd.merge(possible_crane_cost, crew_cost_grouped, on=['Crew type ID', 'Operation']) # calculate labor costs - labor_day_operation = round(possible_crane_cost["Total time per op with weather"] / hour_day[time_construct]) - possible_crane_cost["Subtotal for hourly labor (non-management) USD"] = ( - possible_crane_cost["Total time per op with weather"] * possible_crane_cost["Hourly rate for all workers"] - ) - possible_crane_cost["Subtotal for per diem labor (non-management) USD"] = ( - labor_day_operation * possible_crane_cost["Per diem all workers"] - ) - possible_crane_cost["Labor cost USD without management"] = ( - possible_crane_cost["Subtotal for hourly labor (non-management) USD"] - + possible_crane_cost["Subtotal for per diem labor (non-management) USD"] - ) + labor_day_operation = round(possible_crane_cost['Total time per op with weather'] / hour_day[time_construct]) + possible_crane_cost['Subtotal for hourly labor (non-management) USD'] = possible_crane_cost['Total time per op with weather'] * possible_crane_cost['Hourly rate for all workers'] + possible_crane_cost['Subtotal for per diem labor (non-management) USD'] = labor_day_operation * possible_crane_cost['Per diem all workers'] + possible_crane_cost['Labor cost USD without management'] = possible_crane_cost['Subtotal for hourly labor (non-management) USD'] + \ + possible_crane_cost['Subtotal for per diem labor (non-management) USD'] + # calculate fuel costs - possible_crane_cost["Fuel cost USD"] = ( - possible_crane_cost["Fuel consumption gal per day"] - * float(self.input_dict["fuel_cost_usd_per_gal"]) - * labor_day_operation - ) + possible_crane_cost['Fuel cost USD'] = possible_crane_cost['Fuel consumption gal per day'] * float( + self.input_dict['fuel_cost_usd_per_gal']) * labor_day_operation # calculate costs if top and base cranes are the same - base_cranes = possible_crane_cost[possible_crane_cost["Operation"] == "Base"] - top_cranes = possible_crane_cost[possible_crane_cost["Operation"] == "Top"] - crane_topbase_bool = top_cranes["Crane name"].isin(base_cranes["Crane name"]) - boom_topbase_bool = top_cranes["Boom system"].isin(base_cranes["Boom system"]) + base_cranes = possible_crane_cost[possible_crane_cost['Operation'] == 'Base'] + top_cranes = possible_crane_cost[possible_crane_cost['Operation'] == 'Top'] + crane_topbase_bool = top_cranes['Crane name'].isin(base_cranes['Crane name']) + boom_topbase_bool = top_cranes['Boom system'].isin(base_cranes['Boom system']) possible_crane_topbase = top_cranes[boom_topbase_bool & crane_topbase_bool] - same_topbase_crane_list = possible_crane_topbase[["Crane name", "Boom system"]] - possible_crane_topbase = same_topbase_crane_list.merge(possible_crane_cost, on=["Crane name", "Boom system"]) - possible_crane_topbase_sum = ( - possible_crane_topbase.groupby(["Crane name", "Boom system"])[ - [ - "Labor cost USD without management", - "Subtotal for hourly labor (non-management) USD", - "Subtotal for per diem labor (non-management) USD", - "Equipment rental cost USD", - "Fuel cost USD", - ] - ] - .sum() - .reset_index() - ) + same_topbase_crane_list = possible_crane_topbase[['Crane name', 'Boom system']] + possible_crane_topbase = same_topbase_crane_list.merge(possible_crane_cost, on=['Crane name', 'Boom system']) + possible_crane_topbase_sum = possible_crane_topbase.groupby(['Crane name', + 'Boom system'])[['Labor cost USD without management', + 'Subtotal for hourly labor (non-management) USD', + 'Subtotal for per diem labor (non-management) USD', + 'Equipment rental cost USD', + 'Fuel cost USD'] + ].sum().reset_index() # Store the possible cranes for the top and base for future diagnostics. self._possible_crane_cost = possible_crane_cost.copy() # group crane spec data for mobilization - mobilization_costs = ( - project_data["crane_specs"] - .groupby(["Crane name", "Boom system"])["Mobilization cost USD"] - .max() - .reset_index() - ) + mobilization_costs = project_data['crane_specs'].groupby(['Crane name', 'Boom system'])[ + 'Mobilization cost USD'].max().reset_index() - mobilization_costs["Mobilization cost USD"] = ( - mobilization_costs["Mobilization cost USD"] * 2 - ) # for mobilization and demobilizaton + mobilization_costs['Mobilization cost USD'] = mobilization_costs['Mobilization cost USD'] * 2 # for mobilization and demobilizaton # join top and base crane data with mobilization data - topbase_same_crane_cost = pd.merge( - possible_crane_topbase_sum, mobilization_costs, on=["Crane name", "Boom system"] - ) + topbase_same_crane_cost = pd.merge(possible_crane_topbase_sum, mobilization_costs, + on=['Crane name', 'Boom system']) # compute total project cost for erection - topbase_same_crane_cost["Total cost USD"] = ( - topbase_same_crane_cost["Labor cost USD without management"] - + topbase_same_crane_cost["Equipment rental cost USD"] - + topbase_same_crane_cost["Fuel cost USD"] - + topbase_same_crane_cost["Mobilization cost USD"] - ) + topbase_same_crane_cost['Total cost USD'] = topbase_same_crane_cost['Labor cost USD without management'] + \ + topbase_same_crane_cost['Equipment rental cost USD'] + \ + topbase_same_crane_cost['Fuel cost USD'] + \ + topbase_same_crane_cost[ + 'Mobilization cost USD'] # adds operation label for same crane used for base and topping (this way columns are consistent for same and separate basetop) - topbase_same_crane_cost["Operation"] = "Base + Top" + topbase_same_crane_cost['Operation'] = 'Base + Top' # calculate costs if top and base use separate cranes - separate_topbase = ( - possible_crane_cost.groupby(["Operation", "Crane name", "Boom system"])[ - [ - "Labor cost USD without management", - "Subtotal for hourly labor (non-management) USD", - "Subtotal for per diem labor (non-management) USD", - "Equipment rental cost USD", - "Fuel cost USD", - ] - ] - .sum() - .reset_index() - ) + separate_topbase = \ + possible_crane_cost.groupby(['Operation', 'Crane name', 'Boom system'])[['Labor cost USD without management', + 'Subtotal for hourly labor (non-management) USD', + 'Subtotal for per diem labor (non-management) USD', + 'Equipment rental cost USD', + 'Fuel cost USD'] + ].sum().reset_index() # join mobilization data to separate top base crane costs - separate_topbase_crane_cost = pd.merge(separate_topbase, mobilization_costs, on=["Crane name", "Boom system"]) + separate_topbase_crane_cost = pd.merge(separate_topbase, mobilization_costs, on=['Crane name', 'Boom system']) # compute total project cost for erection - separate_topbase_crane_cost["Total cost USD"] = ( - separate_topbase_crane_cost["Labor cost USD without management"] - + separate_topbase_crane_cost["Equipment rental cost USD"] - + separate_topbase_crane_cost["Fuel cost USD"] - + separate_topbase_crane_cost["Mobilization cost USD"] - ) + separate_topbase_crane_cost['Total cost USD'] = separate_topbase_crane_cost['Labor cost USD without management'] + \ + separate_topbase_crane_cost['Equipment rental cost USD'] + \ + separate_topbase_crane_cost['Fuel cost USD'] + \ + separate_topbase_crane_cost[ + 'Mobilization cost USD'] return separate_topbase_crane_cost, topbase_same_crane_cost, crew_cost + def find_minimum_cost_cranes(self): """ Finds the minimum cost crane(s) based on the aggregated labor, equipment, @@ -1162,48 +1019,44 @@ def find_minimum_cost_cranes(self): allow_same_flag : boolean flag to indicate whether choosing same base and topping crane is allowed """ - allow_same_flag = self.input_dict["allow_same_flag"] - separate_basetop = self.output_dict["separate_basetop"] - same_basetop = self.output_dict["same_basetop"] + allow_same_flag = self.input_dict['allow_same_flag'] + separate_basetop = self.output_dict['separate_basetop'] + same_basetop = self.output_dict['same_basetop'] - self.output_dict["separate_basetop"] = separate_basetop + self.output_dict['separate_basetop'] = separate_basetop total_separate_cost = pd.DataFrame() - for operation in separate_basetop["Operation"].unique(): + for operation in separate_basetop['Operation'].unique(): # find minimum cost option for separate base and topping cranes - min_val = min(separate_basetop["Total cost USD"].where(separate_basetop["Operation"] == operation).dropna()) + min_val = min(separate_basetop['Total cost USD'].where(separate_basetop['Operation'] == operation).dropna()) # find the crane that corresponds to the minimum cost for each operation - crane = separate_basetop[separate_basetop["Total cost USD"] == min_val] - cost = crane.groupby("Operation").min() + crane = separate_basetop[separate_basetop['Total cost USD'] == min_val] + cost = crane.groupby('Operation').min() total_separate_cost = pd.concat((total_separate_cost, cost), sort=True) # reset index for separate crane costs total_separate_cost = total_separate_cost.reset_index() # duplicate offload records because assuming two offload cranes are on site - total_separate_cost = pd.concat( - (total_separate_cost, total_separate_cost.loc[total_separate_cost["Operation"] == "Offload"]), sort=True - ) + total_separate_cost = pd.concat((total_separate_cost, + total_separate_cost.loc[total_separate_cost['Operation'] == 'Offload']), + sort=True) # sum costs for separate cranes to get total for all cranes - cost_chosen_separate = total_separate_cost["Total cost USD"].sum() + cost_chosen_separate = total_separate_cost['Total cost USD'].sum() if allow_same_flag is True: # get the minimum cost for using the same crane for all operations - cost_chosen_same = min(same_basetop["Total cost USD"]) + cost_chosen_same = min(same_basetop['Total cost USD']) # check if separate or same crane option is cheaper and choose crane cost if cost_chosen_separate < cost_chosen_same: - cost_chosen = total_separate_cost.groupby( - by=["Boom system", "Crane name", "Operation"] - ).sum() # added crane name and operation to groupby + cost_chosen = total_separate_cost.groupby(by=["Boom system", "Crane name", "Operation"]).sum() # added crane name and operation to groupby else: - cost_chosen = same_basetop.where(same_basetop["Total cost USD"] == cost_chosen_same).dropna() + cost_chosen = same_basetop.where(same_basetop['Total cost USD'] == cost_chosen_same).dropna() else: - cost_chosen = total_separate_cost.groupby( - by=["Boom system", "Crane name", "Operation"] - ).sum() # added crane name and operation to groupby + cost_chosen = total_separate_cost.groupby(by=["Boom system", "Crane name", "Operation"]).sum() # added crane name and operation to groupby return cost_chosen @@ -1225,68 +1078,57 @@ def calculate_management_crews_cost(self, erection_cost): teams. The float is the sum of all the management costs for erection. """ - num_turbines = self.input_dict["num_turbines"] - overtime_multiplier = self.input_dict["overtime_multiplier"] - hour_day = self.input_dict["hour_day"] - time_construct = self.input_dict["time_construct"] - deliveries_per_week = float(self.input_dict["rate_of_deliveries"]) - duration_days = erection_cost["Time construct days"].sum() + num_turbines = self.input_dict['num_turbines'] + overtime_multiplier = self.input_dict['overtime_multiplier'] + hour_day = self.input_dict['hour_day'] + time_construct = self.input_dict['time_construct'] + deliveries_per_week = float(self.input_dict['rate_of_deliveries']) + duration_days = erection_cost['Time construct days'].sum() duration_hours = round(duration_days * hour_day[time_construct]) # Merge crew and price data for management crews only. - crew_cost = self.output_dict["crew_cost"] - management_crews = crew_cost.loc[crew_cost["Operation"].isin(["Management", "Mechanical completion"])].copy() + crew_cost = self.output_dict['crew_cost'] + management_crews = crew_cost.loc[crew_cost['Operation'].isin(['Management', 'Mechanical completion'])].copy() # increase management crews by project size - management_crews.loc[management_crews["Crew name"] == "Management - project size", "Number of workers"] = round( - management_crews.loc[management_crews["Crew name"] == "Management - project size", "Number of workers"] - * np.ceil(num_turbines / 100) - ) + management_crews.loc[management_crews['Crew name'] == 'Management - project size', 'Number of workers'] = \ + round(management_crews.loc[management_crews['Crew name'] == 'Management - project size', 'Number of workers'] * + np.ceil(num_turbines / 100)) # increase management crews by rate of construction (scale if greater than 10/wk) - management_crews.loc[ - management_crews["Crew name"] == "Management - rate construction", "Number of workers" - ] = round( - management_crews.loc[management_crews["Crew name"] == "Management - rate construction", "Number of workers"] - * np.ceil(deliveries_per_week / 10) - ) - management_crews.loc[management_crews["Crew name"] == "Mechanical completion", "Number of workers"] = round( - management_crews.loc[management_crews["Crew name"] == "Mechanical completion", "Number of workers"] - * np.ceil(deliveries_per_week / 10) - ) - - management_crews["Hourly rate for all workers"] = ( - management_crews["Hourly rate USD per hour"] * management_crews["Number of workers"] - ) - - management_crews["Per diem all workers"] = ( - management_crews["Per diem USD per day"] * management_crews["Number of workers"] - ) + management_crews.loc[management_crews['Crew name'] == 'Management - rate construction', 'Number of workers'] = \ + round(management_crews.loc[management_crews['Crew name'] == 'Management - rate construction', 'Number of workers'] * + np.ceil(deliveries_per_week / 10)) + management_crews.loc[management_crews['Crew name'] == 'Mechanical completion', 'Number of workers'] = \ + round(management_crews.loc[management_crews['Crew name'] == 'Mechanical completion', 'Number of workers'] * + np.ceil(deliveries_per_week / 10)) + + management_crews['Hourly rate for all workers'] = (management_crews['Hourly rate USD per hour'] * \ + management_crews['Number of workers']) + + management_crews['Per diem all workers'] = management_crews['Per diem USD per day'] * \ + management_crews['Number of workers'] # Now calculate management costs - management_crews["per_diem_costs"] = management_crews["Per diem all workers"] * duration_days + management_crews['per_diem_costs'] = management_crews['Per diem all workers'] * duration_days hours_per_week = 6 * hour_day[time_construct] overtime_percentage = (hours_per_week - 40) / hours_per_week normal_labor_rate = 40 / hours_per_week - management_crews["hourly_costs"] = management_crews["Hourly rate for all workers"] * ( - duration_hours * (normal_labor_rate + overtime_percentage * overtime_multiplier) - ) - management_crews["crew_level_total_costs"] = ( - management_crews["per_diem_costs"] + management_crews["hourly_costs"] - ) + management_crews['hourly_costs'] = management_crews['Hourly rate for all workers'] * (duration_hours * (normal_labor_rate + overtime_percentage * overtime_multiplier)) + management_crews['crew_level_total_costs'] = management_crews['per_diem_costs'] + \ + management_crews['hourly_costs'] # Aggregate and sum - management_crew_cost_grouped = ( - management_crews.groupby(["Crew type ID", "Operation", "Crew name"]).sum(numeric_only=True).reset_index() - ) + management_crew_cost_grouped = \ + management_crews.groupby(['Crew type ID', 'Operation', 'Crew name']).sum(numeric_only=True).reset_index() # Total management cost - total_management_cost = management_crews["crew_level_total_costs"].sum() + total_management_cost = management_crews['crew_level_total_costs'].sum() # erection_construction_months is the duration of erection time in # units of months. days_per_month = 30 - self.output_dict["erection_construction_months"] = duration_days / days_per_month + self.output_dict['erection_construction_months'] = duration_days / days_per_month return management_crews, management_crew_cost_grouped, total_management_cost @@ -1297,132 +1139,99 @@ def calculate_costs(self): for erection. """ [crane_specs, operation_time] = self.calculate_erection_operation_time() - crane_specs = crane_specs.infer_objects() # cast cols of Booleans to bool dtype + crane_specs = crane_specs.infer_objects() # cast cols of Booleans to bool dtype - self.output_dict["crane_specs"] = crane_specs - self.output_dict["operation_time"] = operation_time + self.output_dict['crane_specs'] = crane_specs + self.output_dict['operation_time'] = operation_time [offload_specs, offload_time] = self.calculate_offload_operation_time() - offload_specs = offload_specs.infer_objects() # cast cols of Booleans to bool dtype + offload_specs = offload_specs.infer_objects() # cast cols of Booleans to bool dtype - self.output_dict["offload_specs"] = offload_specs - self.output_dict["offload_time"] = offload_time + self.output_dict['offload_specs'] = offload_specs + self.output_dict['offload_time'] = offload_time # append data for offloading if len(offload_specs) != 0: crane_specs_withoffload = pd.concat((crane_specs, offload_specs), sort=True) operation_time_withoffload = pd.concat((operation_time, offload_time), sort=True) else: - raise Exception("ErectionCost calculate_costs(): offload_specs empty") + raise Exception('ErectionCost calculate_costs(): offload_specs empty') - self.output_dict["crane_specs_withoffload"] = crane_specs_withoffload - self.output_dict["operation_time_withoffload"] = operation_time_withoffload + self.output_dict['crane_specs_withoffload'] = crane_specs_withoffload + self.output_dict['operation_time_withoffload'] = operation_time_withoffload crane_specs_with_weather = self.calculate_wind_delay_by_component() - self.output_dict["cranes_wind_delay_withoffload"] = crane_specs_with_weather + self.output_dict['cranes_wind_delay_withoffload'] = crane_specs_with_weather - average_wind_delay = ( - crane_specs_with_weather.groupby(["Crane name", "Boom system", "Operation", "Equipment ID"])[ - "Wind delay percent" - ] - .mean() - .reset_index() - ) + average_wind_delay = crane_specs_with_weather.groupby(['Crane name', + 'Boom system', + 'Operation', + 'Equipment ID'])['Wind delay percent'].mean().reset_index() - join_wind_operation = pd.merge( - operation_time_withoffload, average_wind_delay, on=["Crane name", "Boom system", "Operation"] - ) + join_wind_operation = pd.merge(operation_time_withoffload, average_wind_delay, + on=['Crane name', 'Boom system', 'Operation']) - join_wind_operation["Wind multiplier"] = 1 / (1 - join_wind_operation["Wind delay percent"]) + join_wind_operation['Wind multiplier'] = 1 / (1 - join_wind_operation['Wind delay percent']) # 'Total time per op with weather' units are hours - join_wind_operation["Total time per op with weather"] = ( - join_wind_operation["Operation time all turbines hrs"] * join_wind_operation["Wind multiplier"] - ) + join_wind_operation['Total time per op with weather'] = (join_wind_operation['Operation time all turbines hrs'] * + join_wind_operation['Wind multiplier']) - self.output_dict["join_wind_operation"] = join_wind_operation + self.output_dict['join_wind_operation'] = join_wind_operation [separate_basetop, same_basetop, crew_cost] = self.aggregate_erection_costs() - self.output_dict["separate_basetop"] = separate_basetop - self.output_dict["same_basetop"] = same_basetop - self.output_dict["crew_cost"] = crew_cost + self.output_dict['separate_basetop'] = separate_basetop + self.output_dict['same_basetop'] = same_basetop + self.output_dict['crew_cost'] = crew_cost erection_cost = self.find_minimum_cost_cranes() - selected_time = join_wind_operation[ - [ - "Crane name", - "Boom system", - "Operation", - "Operation time all turbines hrs", - "Total time per op with weather", - "Wind multiplier", - "Operational construct days", - "Time construct days", - ] - ] + selected_time = join_wind_operation[['Crane name', 'Boom system', 'Operation', 'Operation time all turbines hrs', 'Total time per op with weather', 'Wind multiplier', + 'Operational construct days', 'Time construct days']] erection_cost = erection_cost.reset_index() - selected_detailed_data = erection_cost.merge(selected_time, on=["Crane name", "Boom system", "Operation"]) - selected_detailed_data["Total time per turbine"] = ( - selected_detailed_data["Total time per op with weather"] / self.input_dict["num_turbines"] - ) - - ( - management_crews_cost, - management_crews_cost_grouped, - total_management_cost, - ) = self.calculate_management_crews_cost(selected_detailed_data) - - crane_choice = selected_detailed_data[["Crane name", "Boom system", "Operation"]].drop_duplicates() - - selected_detailed_data["crane_boom_operation_concat"] = selected_detailed_data[ - ["Crane name", "Boom system", "Operation"] - ].apply(lambda x: "-".join(x), axis=1) - crane_data_output = selected_detailed_data.drop(["Crane name", "Boom system", "Operation"], axis=1) - crane_data_output = crane_data_output.melt(id_vars=["crane_boom_operation_concat"]) - - crane_cost_details = crane_data_output.where(crane_data_output["variable"].str.contains("cost")).dropna() - crane_cost_details = crane_cost_details.rename( - index=str, - columns={"crane_boom_operation_concat": "Operation ID", "variable": "Type of cost", "value": "Cost"}, - ) - - subtotal_per_diem_labor_management_USD = management_crews_cost["per_diem_costs"].sum() - subtotal_hourly_labor_management_USD = management_crews_cost["hourly_costs"].sum() - - self.output_dict["labor_cost_management"] = ( - subtotal_per_diem_labor_management_USD + subtotal_hourly_labor_management_USD - ) - self.output_dict["labor_cost_non_management"] = selected_detailed_data[ - "Labor cost USD without management" - ].sum() - self.output_dict["labor_cost_total"] = ( - self.output_dict["labor_cost_management"] + self.output_dict["labor_cost_non_management"] - ) + selected_detailed_data = erection_cost.merge(selected_time, on=['Crane name', 'Boom system', 'Operation']) + selected_detailed_data['Total time per turbine'] = selected_detailed_data['Total time per op with weather'] / self.input_dict['num_turbines'] + + management_crews_cost, management_crews_cost_grouped, total_management_cost = self.calculate_management_crews_cost(selected_detailed_data) + + crane_choice = selected_detailed_data[['Crane name', 'Boom system', 'Operation']].drop_duplicates() + + selected_detailed_data['crane_boom_operation_concat'] = selected_detailed_data[['Crane name', 'Boom system', 'Operation']].apply(lambda x: '-'.join(x), axis=1) + crane_data_output = selected_detailed_data.drop(['Crane name', 'Boom system', 'Operation'], axis=1) + crane_data_output = crane_data_output.melt(id_vars=['crane_boom_operation_concat']) + + crane_cost_details = crane_data_output.where(crane_data_output['variable'].str.contains("cost")).dropna() + crane_cost_details = crane_cost_details.rename(index=str, + columns={"crane_boom_operation_concat": "Operation ID", "variable": "Type of cost", + "value": "Cost"}) + + subtotal_per_diem_labor_management_USD = management_crews_cost['per_diem_costs'].sum() + subtotal_hourly_labor_management_USD = management_crews_cost['hourly_costs'].sum() + + self.output_dict['labor_cost_management'] = subtotal_per_diem_labor_management_USD + subtotal_hourly_labor_management_USD + self.output_dict['labor_cost_non_management'] = selected_detailed_data['Labor cost USD without management'].sum() + self.output_dict['labor_cost_total'] = self.output_dict['labor_cost_management'] + self.output_dict['labor_cost_non_management'] total_erection_cost = pd.DataFrame( - [ - ["Erection", "Equipment rental", selected_detailed_data["Equipment rental cost USD"].sum()], - ["Erection", "Fuel", selected_detailed_data["Fuel cost USD"].sum()], - ["Erection", "Labor", self.output_dict["labor_cost_total"]], - ["Erection", "Mobilization", selected_detailed_data["Mobilization cost USD"].sum()], - ["Erection", "Other", 0], - ["Erection", "Materials", 0], - ], - columns=["Phase of construction", "Type of cost", "Cost USD"], - ) + [['Erection', 'Equipment rental', selected_detailed_data['Equipment rental cost USD'].sum()], + ['Erection', 'Fuel', selected_detailed_data['Fuel cost USD'].sum()], + ['Erection', 'Labor', self.output_dict['labor_cost_total']], + ['Erection', 'Mobilization', selected_detailed_data['Mobilization cost USD'].sum()], + ['Erection', 'Other', 0], + ['Erection', 'Materials', 0]], + columns=['Phase of construction', 'Type of cost', 'Cost USD']) total_cost_summed_erection = total_erection_cost.sum(numeric_only=True)[0] - erection_wind_mult = selected_detailed_data["Wind multiplier"] + erection_wind_mult = selected_detailed_data['Wind multiplier'] erection_wind_mult = erection_wind_mult.reset_index(drop=True).mean() - self.output_dict["total_erection_cost"] = total_erection_cost - self.output_dict["erection_wind_mult"] = erection_wind_mult - self.output_dict["crane_choice"] = crane_choice - self.output_dict["crane_data_output"] = crane_data_output - self.output_dict["crane_cost_details"] = crane_cost_details - self.output_dict["total_cost_summed_erection"] = total_cost_summed_erection + self.output_dict['total_erection_cost'] = total_erection_cost + self.output_dict['erection_wind_mult'] = erection_wind_mult + self.output_dict['crane_choice'] = crane_choice + self.output_dict['crane_data_output'] = crane_data_output + self.output_dict['crane_cost_details'] = crane_cost_details + self.output_dict['total_cost_summed_erection'] = total_cost_summed_erection # Put some diagnostic data on selected_detailed_data. This is the number of crews needed # To complete the construction withing the construction duration. @@ -1430,25 +1239,18 @@ def calculate_costs(self): # Operational days over time construct days isn't necessarily a proxy for a particular value. # But in case it is useful for something, here it is. - selected_detailed_data["Operational construct days over time construct days"] = np.ceil( - selected_detailed_data["Operational construct days"] / selected_detailed_data["Time construct days"] - ) + selected_detailed_data['Operational construct days over time construct days'] = \ + np.ceil(selected_detailed_data['Operational construct days'] / selected_detailed_data['Time construct days']) - total_time_construct_days = (selected_detailed_data["Time construct days"]).sum() - self.output_dict["time_weighted_weather_multiplier"] = ( - selected_detailed_data["Wind multiplier"] - * (selected_detailed_data["Time construct days"]) - / total_time_construct_days - ).sum() + total_time_construct_days = (selected_detailed_data['Time construct days']).sum() + self.output_dict['time_weighted_weather_multiplier'] = (selected_detailed_data['Wind multiplier'] * (selected_detailed_data['Time construct days']) / total_time_construct_days).sum() # Now get the number of equipment diagnostic data ready. This is held on an instance # attribute because it isn't meant to be used outside of the class. - self._number_of_equip = selected_detailed_data.merge( - self._possible_crane_cost, on=["Crane name", "Boom system", "Operation"], how="inner" - ) - self._number_of_equip = self._number_of_equip[["Operation", "Crane name", "Boom system", "Number of equipment"]] + self._number_of_equip = selected_detailed_data.merge(self._possible_crane_cost, on=['Crane name', 'Boom system', 'Operation'], how='inner') + self._number_of_equip = self._number_of_equip[['Operation', 'Crane name', 'Boom system', 'Number of equipment']] # Management crews data - self.output_dict["management_crews_cost"] = management_crews_cost - self.output_dict["management_crews_cost_grouped"] = management_crews_cost_grouped - self.output_dict["erection_selected_detailed_data"] = selected_detailed_data + self.output_dict['management_crews_cost'] = management_crews_cost + self.output_dict['management_crews_cost_grouped'] = management_crews_cost_grouped + self.output_dict['erection_selected_detailed_data'] = selected_detailed_data diff --git a/WISDEM/wisdem/landbosse/model/FoundationCost.py b/WISDEM/wisdem/landbosse/model/FoundationCost.py index 3fa466d42..2212cba28 100644 --- a/WISDEM/wisdem/landbosse/model/FoundationCost.py +++ b/WISDEM/wisdem/landbosse/model/FoundationCost.py @@ -1,12 +1,13 @@ -import math import traceback +import math -import numpy as np import pandas as pd +import numpy as np +import math from scipy.optimize import root_scalar -from wisdem.landbosse.model.CostModule import CostModule from wisdem.landbosse.model.WeatherDelay import WeatherDelay as WD +from wisdem.landbosse.model.CostModule import CostModule class FoundationCost(CostModule): @@ -193,13 +194,15 @@ class documentation self.output_dict = output_dict self.project_name = project_name - # Constants used in FoundationCost class. Making this data private (hidden from outside of this class): #TODO: Change private variables to protected. + + #Constants used in FoundationCost class. Making this data private (hidden from outside of this class): #TODO: Change private variables to protected. self._kg_per_tonne = 1000 self._cubicm_per_cubicft = 0.0283168 self._steel_density = 9490 # kg / m^3 self._cubicyd_per_cubicm = 1.30795 self._ton_per_tonne = 0.907185 + def calculate_foundation_load(self, foundation_load_input_data, foundation_load_output_data): """ @@ -251,27 +254,28 @@ def calculate_foundation_load(self, foundation_load_input_data, foundation_load_ z_g = 274.32 # get section height - z = foundation_load_input_data["Section height m"] + z = foundation_load_input_data['Section height m'] # get cross-sectional area - a_f = foundation_load_input_data["Surface area sq m"] + a_f = foundation_load_input_data['Surface area sq m'] # get coefficient of drag - c_d = foundation_load_input_data["Coeff drag (installed)"] + c_d = foundation_load_input_data['Coeff drag (installed)'] # get lever arm - l = foundation_load_input_data["Lever arm m"] + l = foundation_load_input_data['Lever arm m'] # get multipliers for tower and rotor - multiplier_rotor = foundation_load_input_data["Multplier drag rotor"] - multiplier_tower = foundation_load_input_data["Multiplier tower drag"] + multiplier_rotor = foundation_load_input_data['Multplier drag rotor'] + multiplier_tower = foundation_load_input_data['Multiplier tower drag'] + # calculate wind pressure k_z = 2.01 * (z / z_g) ** (2 / a) # exposure factor k_d = 0.95 # wind directionality factor k_zt = 1 # topographic factor - v = foundation_load_input_data["gust_velocity_m_per_s"] - wind_pressure = 0.613 * k_z * k_zt * k_d * v**2 + v = foundation_load_input_data['gust_velocity_m_per_s'] + wind_pressure = 0.613 * k_z * k_zt * k_d * v ** 2 # calculate wind loads on each tower component g = 0.85 # gust factor @@ -280,15 +284,13 @@ def calculate_foundation_load(self, foundation_load_input_data, foundation_load_ # calculate drag rotor rho = 1.225 # air density in kg/m^3 - f_r = (0.5 * rho * c_d * a_f * v**2) * multiplier_rotor + f_r = (0.5 * rho * c_d * a_f * v ** 2) * multiplier_rotor - f = f_t + f_r + f = (f_t + f_r) # calculate dead load in N g = 9.8 # m / s ^ 2 - f_dead = ( - sum(foundation_load_input_data["Mass tonne"]) * g * self._kg_per_tonne / 1.15 - ) # scaling factor to adjust dead load for uplift + f_dead = sum(foundation_load_input_data['Mass tonne']) * g * self._kg_per_tonne / 1.15 # scaling factor to adjust dead load for uplift # calculate moment from each component at base of tower m_overturn = f * l @@ -298,7 +300,7 @@ def calculate_foundation_load(self, foundation_load_input_data, foundation_load_ m_overturn = m_overturn.sum() # compare to moment from rated thrust - rated_thrust = foundation_load_input_data["rated_thrust_N"] + rated_thrust = foundation_load_input_data['rated_thrust_N'] m_thrust = rated_thrust * max(l) m_tot = max(m_thrust, m_overturn) @@ -311,17 +313,8 @@ def calculate_foundation_load(self, foundation_load_input_data, foundation_load_ safety_overturn = 1.5 unit_weight_fill = 17.3e3 # in N / m^3 unit_weight_concrete = 23.6e3 # in N / m^3 - bearing_pressure = foundation_load_input_data["bearing_pressure_n_m2"] - p = [ - ( - np.pi - * foundation_load_input_data["depth"] - * (vol_fraction_fill * unit_weight_fill + vol_fraction_concrete * unit_weight_concrete) - ), - 0, - f_dead, - -(safety_overturn * (m_tot + f_horiz * foundation_load_input_data["depth"])), - ] + bearing_pressure = foundation_load_input_data['bearing_pressure_n_m2'] + p = [(np.pi * foundation_load_input_data['depth'] * (vol_fraction_fill * unit_weight_fill + vol_fraction_concrete * unit_weight_concrete)), 0, f_dead, - (safety_overturn * (m_tot + f_horiz * foundation_load_input_data['depth']))] r_overturn = np.roots(p) r_overturn = np.real(r_overturn[np.isreal(r_overturn)])[0] @@ -329,87 +322,66 @@ def calculate_foundation_load(self, foundation_load_input_data, foundation_load_ safety_slipping = 1.5 friction_angle_soil = 25 tangent_slip_angle = math.tan((friction_angle_soil * math.pi) / 180) - slipping_force_with_sf = safety_slipping * f_lat + slipping_force_with_sf = (safety_slipping * f_lat) # first check if slipping is already satisfied by dead weight if slipping_force_with_sf < (f_dead * tangent_slip_angle): r_slipping = 0 else: # Calculate foundation radius based on slipping: - r_slipping = ( - ((slipping_force_with_sf / tangent_slip_angle) - f_dead) - / ( - (vol_fraction_fill * unit_weight_fill + vol_fraction_concrete * unit_weight_concrete) - * math.pi - * foundation_load_input_data["depth"] - ) - ) ** 0.5 + r_slipping = (((slipping_force_with_sf / tangent_slip_angle) - f_dead) / + ((vol_fraction_fill * unit_weight_fill + vol_fraction_concrete * unit_weight_concrete) * math.pi * foundation_load_input_data['depth'])) ** 0.5 r_test_gapping = max(r_overturn, r_slipping) # calculate foundation radius based on gapping # check if gapping constrain is already satisfied - r / 3 < e - foundation_vol = np.pi * r_test_gapping**2 * foundation_load_input_data["depth"] - v_1 = ( - foundation_vol * (vol_fraction_fill * unit_weight_fill + vol_fraction_concrete * unit_weight_concrete) - + f_dead - ) + foundation_vol = np.pi * r_test_gapping ** 2 * foundation_load_input_data['depth'] + v_1 = (foundation_vol * ( + vol_fraction_fill * unit_weight_fill + vol_fraction_concrete * unit_weight_concrete) + f_dead) e = m_tot / v_1 if (r_test_gapping / 3) < e: r_gapping = 0 else: - def r_g(x): - foundation_vol = np.pi * x**2 * foundation_load_input_data["depth"] - v_1 = ( - foundation_vol - * (vol_fraction_fill * unit_weight_fill + vol_fraction_concrete * unit_weight_concrete) - + f_dead - ) + foundation_vol = np.pi * x** 2 * foundation_load_input_data['depth'] + v_1 = (foundation_vol * (vol_fraction_fill * unit_weight_fill + vol_fraction_concrete * unit_weight_concrete) + f_dead) e = m_tot / v_1 - return e * 3 - x - - result = root_scalar(r_g, method="brentq", bracket=[0.9 * r_overturn, 50], xtol=1e-4, maxiter=50) + return (e * 3 - x) + result = root_scalar(r_g, method='brentq', bracket=[0.9*r_overturn, 50], xtol=1e-4, maxiter=50) r_gapping = result.root if not result.converged: - raise ValueError( - f"Warning {self.project_name} calculate_foundation_load r_gapping solve failed, {result.flag}" - ) + raise ValueError(f'Warning {self.project_name} calculate_foundation_load r_gapping solve failed, {result.flag}') r_test_bearing = max(r_test_gapping, r_gapping) # calculate foundation radius based on bearing pressure def r_b(x): - foundation_vol = np.pi * r_test_bearing**2 * foundation_load_input_data["depth"] - v_1 = ( - foundation_vol * (vol_fraction_fill * unit_weight_fill + vol_fraction_concrete * unit_weight_concrete) - + f_dead - ) + foundation_vol = np.pi * r_test_bearing ** 2 * foundation_load_input_data['depth'] + v_1 = (foundation_vol * (vol_fraction_fill * unit_weight_fill + vol_fraction_concrete * unit_weight_concrete) + f_dead) e = m_tot / v_1 a_eff = v_1 / bearing_pressure - return 2 * (x**2 - e * (x**2 - e**2) ** 0.5) - a_eff - - result = root_scalar(r_b, method="brentq", bracket=[0.9 * r_overturn, 50], xtol=1e-10, maxiter=50) + return (2 * (x ** 2 - e * (x ** 2 - e ** 2) ** 0.5) - a_eff) + result = root_scalar(r_b, method='brentq', bracket=[0.9*r_overturn, 50], xtol=1e-10, maxiter=50) r_bearing = result.root if not result.converged: - raise ValueError( - f"Warning {self.project_name} calculate_foundation_load r_bearing solve failed, {result.flag}" - ) + raise ValueError(f'Warning {self.project_name} calculate_foundation_load r_bearing solve failed, {result.flag}') # pick the largest foundation radius based on all 4 foundation design criteria: moment, gapping, bearing, slipping r_choosen = max(r_bearing, r_overturn, r_slipping, r_gapping) - foundation_load_output_data["F_dead_kN_per_turbine"] = f_dead / 1e3 - foundation_load_output_data["F_horiz_kN_per_turbine"] = f_lat / 1e3 - foundation_load_output_data["M_tot_kN_m_per_turbine"] = m_tot / 1e3 - foundation_load_output_data["Radius_o_m"] = r_overturn - foundation_load_output_data["Radius_s_m"] = r_slipping - foundation_load_output_data["Radius_g_m"] = r_gapping - foundation_load_output_data["Radius_b_m"] = r_bearing - foundation_load_output_data["Radius_m"] = r_choosen + foundation_load_output_data['F_dead_kN_per_turbine'] = f_dead / 1e3 + foundation_load_output_data['F_horiz_kN_per_turbine'] = f_lat / 1e3 + foundation_load_output_data['M_tot_kN_m_per_turbine'] = m_tot / 1e3 + foundation_load_output_data['Radius_o_m'] = r_overturn + foundation_load_output_data['Radius_s_m'] = r_slipping + foundation_load_output_data['Radius_g_m'] = r_gapping + foundation_load_output_data['Radius_b_m'] = r_bearing + foundation_load_output_data['Radius_m'] = r_choosen return foundation_load_output_data + def determine_foundation_size(self, foundation_size_input_data, foundation_size_output_data): """ Function to calculate the volume of a round, raft foundation. Assumes foundation made of concrete with 1 m thickness. @@ -426,30 +398,24 @@ def determine_foundation_size(self, foundation_size_input_data, foundation_size_ Foundation volume [in m^3] -> foundation_volume_concrete_m3_per_turbine """ - # TODO: still updating/fine-tuning foundation size equations for small DW (Parangat - Feb 27, 2020) - r = float(foundation_size_output_data["Radius_m"]) - if foundation_size_input_data["turbine_rating_MW"] < 0.1: - foundation_size_output_data["excavated_volume_m3"] = r * r * foundation_size_input_data["depth"] - foundation_size_output_data["foundation_volume_concrete_m3_per_turbine"] = ( - foundation_size_output_data["excavated_volume_m3"] * 0.45 - ) + #TODO: still updating/fine-tuning foundation size equations for small DW (Parangat - Feb 27, 2020) + r = float(foundation_size_output_data['Radius_m']) + if foundation_size_input_data['turbine_rating_MW'] < 0.1: + foundation_size_output_data['excavated_volume_m3'] = r * r * foundation_size_input_data['depth'] + foundation_size_output_data['foundation_volume_concrete_m3_per_turbine'] = foundation_size_output_data['excavated_volume_m3'] * 0.45 else: - foundation_size_output_data["excavated_volume_m3"] = ( - np.pi * (r + 0.5) ** 2 * foundation_size_input_data["depth"] - ) + foundation_size_output_data['excavated_volume_m3'] = np.pi * (r + 0.5) ** 2 * foundation_size_input_data['depth'] # only compute the portion of the foundation that is composed of concrete (45% concrete; other portion is # backfill); TODO: Add to sphinx -> (volume excavated = pi*(r_pick + .5m)^2 this assumes vertical sides which # does not reflect reality as OSHA requires benched sides over 3’) - foundation_size_output_data["foundation_volume_concrete_m3_per_turbine"] = ( - np.pi * r**2 * foundation_size_input_data["depth"] * 0.45 - ) + foundation_size_output_data['foundation_volume_concrete_m3_per_turbine'] = np.pi * r ** 2 * \ + foundation_size_input_data['depth'] * 0.45 return foundation_size_output_data - def estimate_material_needs_per_turbine( - self, material_needs_per_turbine_input_data, material_needs_per_turbine_output_data - ): + + def estimate_material_needs_per_turbine(self, material_needs_per_turbine_input_data, material_needs_per_turbine_output_data): """ Function to estimate amount of material based on foundation size and number of turbines. @@ -467,39 +433,19 @@ def estimate_material_needs_per_turbine( """ - steel_mass_short_ton_per_turbine = ( - material_needs_per_turbine_output_data["foundation_volume_concrete_m3_per_turbine"] - * 0.012 - * self._steel_density - / self._kg_per_tonne - ) - concrete_volume_cubic_yards_per_turbine = ( - material_needs_per_turbine_output_data["foundation_volume_concrete_m3_per_turbine"] - * 0.985 - * self._cubicyd_per_cubicm - ) - - # Assign values to output dictionary: - material_needs_per_turbine_output_data["material_needs_per_turbine"] = pd.DataFrame( - [ - ["Steel - rebar", steel_mass_short_ton_per_turbine, "ton (short)"], - ["Concrete 5000 psi", concrete_volume_cubic_yards_per_turbine, "cubic yards"], - [ - "Excavated dirt", - material_needs_per_turbine_output_data["excavated_volume_m3"] * self._cubicyd_per_cubicm, - "cubic_yards", - ], - [ - "Backfill", - material_needs_per_turbine_output_data["excavated_volume_m3"] * self._cubicyd_per_cubicm, - "cubic_yards", - ], - ], - columns=["Material type ID", "Quantity of material", "Units"], - ) - - material_needs_per_turbine_output_data["steel_mass_short_ton_per_turbine"] = steel_mass_short_ton_per_turbine - return material_needs_per_turbine_output_data["material_needs_per_turbine"] + steel_mass_short_ton_per_turbine = (material_needs_per_turbine_output_data['foundation_volume_concrete_m3_per_turbine'] * 0.012 * self._steel_density / self._kg_per_tonne) + concrete_volume_cubic_yards_per_turbine = material_needs_per_turbine_output_data['foundation_volume_concrete_m3_per_turbine'] * 0.985 * self._cubicyd_per_cubicm + + #Assign values to output dictionary: + material_needs_per_turbine_output_data['material_needs_per_turbine'] = pd.DataFrame([['Steel - rebar', steel_mass_short_ton_per_turbine, 'ton (short)'], + ['Concrete 5000 psi', concrete_volume_cubic_yards_per_turbine, 'cubic yards'], + ['Excavated dirt', material_needs_per_turbine_output_data['excavated_volume_m3'] * self._cubicyd_per_cubicm, 'cubic_yards'], + ['Backfill', material_needs_per_turbine_output_data['excavated_volume_m3'] * self._cubicyd_per_cubicm, 'cubic_yards']], + columns=['Material type ID', 'Quantity of material', 'Units']) + + material_needs_per_turbine_output_data['steel_mass_short_ton_per_turbine'] = steel_mass_short_ton_per_turbine + return material_needs_per_turbine_output_data['material_needs_per_turbine'] + def estimate_construction_time(self, construction_time_input_data, construction_time_output_data): """ @@ -524,75 +470,59 @@ def estimate_construction_time(self, construction_time_input_data, construction_ """ - foundation_construction_time = construction_time_input_data["construct_duration"] * 1 / 3 - # throughput_operations = construction_time_input_data['throughput_operations'] - throughput_operations = construction_time_input_data["rsmeans"] - material_needs_per_turbine = construction_time_output_data["material_needs_per_turbine"] - quantity_materials_entire_farm = ( - material_needs_per_turbine["Quantity of material"] * construction_time_input_data["num_turbines"] - ) - - # Calculations for estimate construction time will be on entire wind farm basis: - construction_time_output_data["material_needs_entire_farm"] = material_needs_per_turbine.copy() - material_needs_entire_farm = construction_time_output_data["material_needs_entire_farm"] - material_needs_entire_farm["Quantity of material"] = quantity_materials_entire_farm - if construction_time_input_data["turbine_rating_MW"] <= 0.1: + foundation_construction_time = construction_time_input_data['construct_duration'] * 1 / 3 + #throughput_operations = construction_time_input_data['throughput_operations'] + throughput_operations = construction_time_input_data['rsmeans'] + material_needs_per_turbine = construction_time_output_data['material_needs_per_turbine'] + quantity_materials_entire_farm = material_needs_per_turbine['Quantity of material'] * construction_time_input_data['num_turbines'] + + + #Calculations for estimate construction time will be on entire wind farm basis: + construction_time_output_data['material_needs_entire_farm'] = material_needs_per_turbine.copy() + material_needs_entire_farm = construction_time_output_data['material_needs_entire_farm'] + material_needs_entire_farm['Quantity of material'] = quantity_materials_entire_farm + if construction_time_input_data['turbine_rating_MW'] <= 0.1: operation_data = throughput_operations.where( - throughput_operations["Module"] == "Small DW Foundations" - ).dropna(thresh=4) + throughput_operations['Module'] == 'Small DW Foundations').dropna( + thresh=4) else: - operation_data = throughput_operations.where(throughput_operations["Module"] == "Foundations").dropna( - thresh=4 - ) + operation_data = throughput_operations.where(throughput_operations['Module'] == 'Foundations').dropna( + thresh=4) - # operation data for entire wind farm: - operation_data = pd.merge(material_needs_entire_farm, operation_data, on=["Material type ID"], how="outer") - operation_data["Number of days"] = operation_data["Quantity of material"] / operation_data["Daily output"] - operation_data["Number of crews"] = np.ceil( - (operation_data["Number of days"] / 30) / foundation_construction_time - ) + #operation data for entire wind farm: + operation_data = pd.merge(material_needs_entire_farm, operation_data, on=['Material type ID'], how='outer') + operation_data['Number of days'] = operation_data['Quantity of material'] / operation_data['Daily output'] + operation_data['Number of crews'] = np.ceil((operation_data['Number of days'] / 30) / foundation_construction_time) - alpha = operation_data[operation_data["Type of cost"] == "Labor"] - operation_data_id_days_crews_workers = alpha[ - ["Operation ID", "Number of days", "Number of crews", "Number of workers"] - ] + alpha = operation_data[operation_data['Type of cost'] == 'Labor'] + operation_data_id_days_crews_workers = alpha[['Operation ID', 'Number of days', 'Number of crews', 'Number of workers']] # if more than one crew needed to complete within construction duration then assume that all construction happens # within that window and use that timeframe for weather delays; if not, use the number of days calculated - operation_data["time_construct_bool"] = operation_data["Number of days"] > foundation_construction_time * 30 + operation_data['time_construct_bool'] = operation_data['Number of days'] > foundation_construction_time * 30 boolean_dictionary = {True: foundation_construction_time * 30, False: np.NAN} - operation_data["time_construct_bool"] = operation_data["time_construct_bool"].map(boolean_dictionary) - operation_data["Time construct days"] = operation_data[["time_construct_bool", "Number of days"]].min(axis=1) - num_days = operation_data["Time construct days"].max() + operation_data['time_construct_bool'] = operation_data['time_construct_bool'].map(boolean_dictionary) + operation_data['Time construct days'] = operation_data[['time_construct_bool', 'Number of days']].min(axis=1) + num_days = operation_data['Time construct days'].max() - construction_time_output_data["operation_data_id_days_crews_workers"] = operation_data_id_days_crews_workers - construction_time_output_data["operation_data_entire_farm"] = operation_data + construction_time_output_data['operation_data_id_days_crews_workers'] = operation_data_id_days_crews_workers + construction_time_output_data['operation_data_entire_farm'] = operation_data # pull out management data #TODO: Add this cost to Labor cost next - if construction_time_input_data["turbine_rating_MW"] > 0.1: - crew_cost = self.input_dict["crew_cost"] - crew = self.input_dict["crew"][self.input_dict["crew"]["Crew type ID"].str.contains("M0")] - management_crew = pd.merge(crew_cost, crew, on=["Labor type ID"]) - management_crew = management_crew.assign( - per_diem_total=management_crew["Per diem USD per day"] * management_crew["Number of workers"] * num_days - ) - management_crew = management_crew.assign( - hourly_costs_total=management_crew["Hourly rate USD per hour"] - * self.input_dict["hour_day"][self.input_dict["time_construct"]] - * num_days - ) - management_crew = management_crew.assign( - total_crew_cost_before_wind_delay=management_crew["per_diem_total"] - + management_crew["hourly_costs_total"] - ) - self.output_dict["management_crew"] = management_crew - self.output_dict["managament_crew_cost_before_wind_delay"] = management_crew[ - "total_crew_cost_before_wind_delay" - ].sum() + if construction_time_input_data['turbine_rating_MW'] > 0.1: + crew_cost = self.input_dict['crew_cost'] + crew = self.input_dict['crew'][self.input_dict['crew']['Crew type ID'].str.contains('M0')] + management_crew = pd.merge(crew_cost, crew, on=['Labor type ID']) + management_crew = management_crew.assign(per_diem_total=management_crew['Per diem USD per day'] * management_crew['Number of workers'] * num_days) + management_crew = management_crew.assign(hourly_costs_total=management_crew['Hourly rate USD per hour'] * self.input_dict['hour_day'][self.input_dict['time_construct']] * num_days) + management_crew = management_crew.assign(total_crew_cost_before_wind_delay=management_crew['per_diem_total'] + management_crew['hourly_costs_total']) + self.output_dict['management_crew'] = management_crew + self.output_dict['managament_crew_cost_before_wind_delay'] = management_crew['total_crew_cost_before_wind_delay'].sum() else: - self.output_dict["managament_crew_cost_before_wind_delay"] = 0 + self.output_dict['managament_crew_cost_before_wind_delay'] = 0 + + return construction_time_output_data['operation_data_entire_farm'] - return construction_time_output_data["operation_data_entire_farm"] def calculate_weather_delay(self, weather_delay_input_data, weather_delay_output_data): """ @@ -619,14 +549,15 @@ def calculate_weather_delay(self, weather_delay_input_data, weather_delay_output WD(weather_delay_input_data, weather_delay_output_data) # compute weather delay - wind_delay = pd.DataFrame(weather_delay_output_data["wind_delays"]) + wind_delay = pd.DataFrame(weather_delay_output_data['wind_delays']) # if greater than 4 hour delay, then shut down for full day (10 hours) wind_delay[(wind_delay > 4)] = 10 - weather_delay_output_data["wind_delay_time"] = float(wind_delay.sum()) + weather_delay_output_data['wind_delay_time'] = float(wind_delay.sum().iloc[0]) return weather_delay_output_data + def calculate_costs(self, calculate_costs_input_dict, calculate_costs_output_dict): """ Function to calculate the total foundation cost. @@ -660,125 +591,94 @@ def calculate_costs(self, calculate_costs_input_dict, calculate_costs_output_dic """ - material_vol_entire_farm = calculate_costs_output_dict["material_needs_entire_farm"] - material_price = calculate_costs_input_dict["material_price"] - material_data_entire_farm = pd.merge(material_vol_entire_farm, material_price, on=["Material type ID"]) - material_data_entire_farm["Cost USD"] = material_data_entire_farm["Quantity of material"] * pd.to_numeric( - material_data_entire_farm["Material price USD per unit"] - ) # material data on a total wind farm basis + material_vol_entire_farm = calculate_costs_output_dict['material_needs_entire_farm'] + material_price = calculate_costs_input_dict['material_price'] + - operation_data = calculate_costs_output_dict["operation_data_entire_farm"] + material_data_entire_farm = pd.merge(material_vol_entire_farm, material_price, on=['Material type ID']) + material_data_entire_farm['Cost USD'] = material_data_entire_farm['Quantity of material'] * pd.to_numeric(material_data_entire_farm['Material price USD per unit']) # material data on a total wind farm basis - wind_delay = calculate_costs_output_dict["wind_delay_time"] - wind_delay_fraction = (wind_delay / calculate_costs_input_dict["operational_hrs_per_day"]) / operation_data[ - "Time construct days" - ].max(skipna=True) + operation_data = calculate_costs_output_dict['operation_data_entire_farm'] + + wind_delay = calculate_costs_output_dict['wind_delay_time'] + + wind_delay_fraction = (wind_delay / calculate_costs_input_dict['operational_hrs_per_day']) / operation_data['Time construct days'].max(skipna=True) # check if wind_delay_fraction is greater than 1, which would mean weather delays are longer than they can possibily be for the input data if wind_delay_fraction > 1: - raise ValueError("{}: Error: Wind delay greater than 100%".format(type(self).__name__)) + raise ValueError('{}: Error: Wind delay greater than 100%'.format(type(self).__name__)) wind_multiplier = 1 / (1 - wind_delay_fraction) - calculate_costs_output_dict["wind_multiplier"] = wind_multiplier + calculate_costs_output_dict['wind_multiplier'] = wind_multiplier - rsmeans = calculate_costs_input_dict["rsmeans"] - if calculate_costs_input_dict["turbine_rating_MW"] > 0.1: - rsmeans = rsmeans.where(rsmeans["Module"] == "Foundations").dropna(thresh=4) + rsmeans = calculate_costs_input_dict['rsmeans'] + if calculate_costs_input_dict['turbine_rating_MW'] > 0.1: + rsmeans = rsmeans.where(rsmeans['Module'] == 'Foundations').dropna(thresh=4) else: - rsmeans = rsmeans.where(rsmeans["Module"] == "Small DW Foundations").dropna(thresh=4) + rsmeans = rsmeans.where(rsmeans['Module'] == 'Small DW Foundations').dropna(thresh=4) - labor_equip_data = pd.merge(material_vol_entire_farm, rsmeans, on=["Material type ID"]) + labor_equip_data = pd.merge(material_vol_entire_farm, rsmeans, on=['Material type ID']) # Create foundation cost dataframe - foundation_cost = pd.DataFrame(columns=["Type of cost", "Cost USD", "Phase of construction"]) + foundation_cost = pd.DataFrame(columns=['Type of cost', 'Cost USD', 'Phase of construction']) # Calculate per diem - per_diem = ( - operation_data["Number of workers"] - * operation_data["Number of crews"] - * (operation_data["Time construct days"] + np.ceil(operation_data["Time construct days"] / 7)) - * calculate_costs_input_dict["rsmeans_per_diem"] - ) + per_diem = operation_data['Number of workers'] * operation_data['Number of crews'] * (operation_data['Time construct days'] + + np.ceil(operation_data['Time construct days'] / 7)) * calculate_costs_input_dict['rsmeans_per_diem'] where_are_na_ns = np.isnan(per_diem) per_diem[where_are_na_ns] = 0 - labor_equip_data["Cost USD"] = ( - labor_equip_data["Quantity of material"] - * labor_equip_data["Rate USD per unit"] - * calculate_costs_input_dict["overtime_multiplier"] - + per_diem - + calculate_costs_output_dict["managament_crew_cost_before_wind_delay"] - ) * wind_multiplier - self.output_dict["labor_equip_data"] = labor_equip_data + labor_equip_data['Cost USD'] = (labor_equip_data['Quantity of material'] * labor_equip_data['Rate USD per unit'] * calculate_costs_input_dict['overtime_multiplier'] + per_diem + calculate_costs_output_dict['managament_crew_cost_before_wind_delay']) * wind_multiplier + self.output_dict['labor_equip_data'] = labor_equip_data # EQUIPMENT COST # Create equipment costs row to be appended to foundation_cost - equipment_dataframe = labor_equip_data[labor_equip_data["Type of cost"].str.match("Equipment rental")] + equipment_dataframe = labor_equip_data[labor_equip_data['Type of cost'].str.match('Equipment rental')] equipment_cost_usd_without_delay = ( - equipment_dataframe["Quantity of material"] - * equipment_dataframe["Rate USD per unit"] - * calculate_costs_input_dict["overtime_multiplier"] - + per_diem - ) + equipment_dataframe['Quantity of material'] * equipment_dataframe['Rate USD per unit'] * + calculate_costs_input_dict['overtime_multiplier'] + per_diem) equipment_cost_usd_with_weather_delays = equipment_cost_usd_without_delay.sum() * wind_multiplier - equipment_costs = pd.DataFrame( - [["Equipment rental", equipment_cost_usd_with_weather_delays, "Foundation"]], - columns=["Type of cost", "Cost USD", "Phase of construction"], - ) + equipment_costs = pd.DataFrame([['Equipment rental', equipment_cost_usd_with_weather_delays, 'Foundation']], + columns=['Type of cost', 'Cost USD', 'Phase of construction']) # LABOR COST # Create labor costs row to be appended to foundation_cost - labor_dataframe = labor_equip_data[labor_equip_data["Type of cost"].str.match("Labor")] - labor_cost_usd_without_management = ( - labor_dataframe["Quantity of material"] - * labor_dataframe["Rate USD per unit"] - * calculate_costs_input_dict["overtime_multiplier"] - + per_diem - ) - labor_cost_usd_with_management = ( - labor_cost_usd_without_management.sum() - + calculate_costs_output_dict["managament_crew_cost_before_wind_delay"] - ) + labor_dataframe = labor_equip_data[labor_equip_data['Type of cost'].str.match('Labor')] + labor_cost_usd_without_management= (labor_dataframe['Quantity of material'] * labor_dataframe['Rate USD per unit'] * calculate_costs_input_dict['overtime_multiplier'] + per_diem ) + labor_cost_usd_with_management = labor_cost_usd_without_management.sum() + calculate_costs_output_dict['managament_crew_cost_before_wind_delay'] labor_cost_usd_with_management_plus_weather_delays = labor_cost_usd_with_management * wind_multiplier - labor_costs = pd.DataFrame( - [["Labor", labor_cost_usd_with_management_plus_weather_delays, "Foundation"]], - columns=["Type of cost", "Cost USD", "Phase of construction"], - ) + labor_costs = pd.DataFrame([['Labor', labor_cost_usd_with_management_plus_weather_delays, 'Foundation']], + columns=['Type of cost', 'Cost USD', 'Phase of construction']) # MATERIAL COST - material_cost_dataframe = pd.DataFrame(columns=["Operation ID", "Type of cost", "Cost USD"]) - material_cost_dataframe["Operation ID"] = material_data_entire_farm["Material type ID"] - material_cost_dataframe["Type of cost"] = "Materials" - material_cost_dataframe["Cost USD"] = material_data_entire_farm["Cost USD"] - material_costs_sum = material_cost_dataframe["Cost USD"].sum() - material_costs = pd.DataFrame( - [["Materials", material_costs_sum, "Foundation"]], - columns=["Type of cost", "Cost USD", "Phase of construction"], - ) + material_cost_dataframe = pd.DataFrame(columns=['Operation ID', 'Type of cost', 'Cost USD']) + material_cost_dataframe['Operation ID'] = material_data_entire_farm['Material type ID'] + material_cost_dataframe['Type of cost'] = 'Materials' + material_cost_dataframe['Cost USD'] = material_data_entire_farm['Cost USD'] + material_costs_sum = material_cost_dataframe['Cost USD'].sum() + material_costs = pd.DataFrame([['Materials', material_costs_sum, 'Foundation']], + columns=['Type of cost', 'Cost USD', 'Phase of construction']) # Append all cost items to foundation_cost - foundation_cost = pd.concat((foundation_cost, equipment_costs, labor_costs, material_costs)) + foundation_cost = pd.concat( (foundation_cost,equipment_costs,labor_costs,material_costs) ) # Calculate mobilization cost as percentage of total foundation cost and add to foundation_cost # Assumed 5% of total foundation cost and add to foundation_cost for utility scale plant # A function of turbine size for distributed wind (< 10 turbines) - if calculate_costs_input_dict["num_turbines"] > 10: - mobilization_cost = foundation_cost["Cost USD"].sum() * 0.05 + if calculate_costs_input_dict['num_turbines'] > 10: + mobilization_cost = foundation_cost['Cost USD'].sum() * 0.05 else: - if calculate_costs_input_dict["turbine_rating_MW"] < 0.1: + if calculate_costs_input_dict['turbine_rating_MW'] < 0.1: # Zero since mobilization cost of equipment is included in the equipment rental cost mobilization_cost = 0 else: # There is mobilization cost for 0-10 turbines 100+ kW in rating. - num_turbines = calculate_costs_input_dict["num_turbines"] - rating = calculate_costs_input_dict["turbine_rating_MW"] + num_turbines = calculate_costs_input_dict['num_turbines'] + rating = calculate_costs_input_dict['turbine_rating_MW'] mobilization_multipler = self.mobilization_cost_multiplier(rating) - mobilization_cost = foundation_cost["Cost USD"].sum() / num_turbines * mobilization_multipler + mobilization_cost = foundation_cost['Cost USD'].sum() / num_turbines * mobilization_multipler - mob_cost = pd.DataFrame( - [["Mobilization", mobilization_cost, "Foundation"]], - columns=["Type of cost", "Cost USD", "Phase of construction"], - ) + mob_cost = pd.DataFrame([['Mobilization', mobilization_cost, 'Foundation']], columns=['Type of cost', 'Cost USD', 'Phase of construction']) foundation_cost = pd.concat((foundation_cost, mob_cost)) @@ -790,9 +690,9 @@ def calculate_costs(self, calculate_costs_input_dict, calculate_costs_output_dic # total_cost_summed_foundation = total_foundation_cost.sum(numeric_only=True)[0] # todo: add total_cost_summed_foundation to output dict total_foundation_cost = foundation_cost - calculate_costs_output_dict["total_foundation_cost"] = total_foundation_cost + calculate_costs_output_dict['total_foundation_cost'] = total_foundation_cost - self.output_dict["labor_equip_data"] = labor_equip_data + self.output_dict['labor_equip_data'] = labor_equip_data return total_foundation_cost @@ -816,151 +716,123 @@ def outputs_for_detailed_tab(self, input_dict, output_dict): result = [] module = type(self).__name__ - result.append( - { - "unit": "", - "type": "variable", - "variable_df_key_col_name": "wind_multiplier", - "value": float(self.output_dict["wind_multiplier"]), - } - ) - result.append( - { - "unit": "kN", - "type": "variable", - "variable_df_key_col_name": "F_dead", - "value": float(self.output_dict["F_dead_kN_per_turbine"]), - } - ) - result.append( - { - "unit": "kN", - "type": "variable", - "variable_df_key_col_name": "F_horiz", - "value": float(self.output_dict["F_horiz_kN_per_turbine"]), - } - ) - result.append( - { - "unit": "kN_m", - "type": "variable", - "variable_df_key_col_name": "M_tot_kN", - "value": float(self.output_dict["M_tot_kN_m_per_turbine"]), - } - ) - result.append( - { - "unit": "m", - "type": "variable", - "variable_df_key_col_name": "Radius_o", - "value": float(self.output_dict["Radius_o_m"]), - } - ) - result.append( - { - "unit": "m", - "type": "variable", - "variable_df_key_col_name": "Radius_g", - "value": float(self.output_dict["Radius_g_m"]), - } - ) - result.append( - { - "unit": "m", - "type": "variable", - "variable_df_key_col_name": "Radius_b", - "value": float(self.output_dict["Radius_b_m"]), - } - ) - result.append( - { - "unit": "m", - "type": "variable", - "variable_df_key_col_name": "Radius", - "value": float(self.output_dict["Radius_m"]), - } - ) - result.append( - { - "unit": "short_ton", - "type": "variable", - "variable_df_key_col_name": "steel_mass_short_ton_per_turbine", - "value": self.output_dict["steel_mass_short_ton_per_turbine"], - } - ) + result.append({ + 'unit': '', + 'type': 'variable', + 'variable_df_key_col_name': 'wind_multiplier', + 'value': float(self.output_dict['wind_multiplier']) + }) + result.append({ + 'unit': 'kN', + 'type': 'variable', + 'variable_df_key_col_name': 'F_dead', + 'value': float(self.output_dict['F_dead_kN_per_turbine']) + }) + result.append({ + 'unit': 'kN', + 'type': 'variable', + 'variable_df_key_col_name': 'F_horiz', + 'value': float(self.output_dict['F_horiz_kN_per_turbine']) + }) + result.append({ + 'unit': 'kN_m', + 'type': 'variable', + 'variable_df_key_col_name': 'M_tot_kN', + 'value': float(self.output_dict['M_tot_kN_m_per_turbine']) + }) + result.append({ + 'unit': 'm', + 'type': 'variable', + 'variable_df_key_col_name': 'Radius_o', + 'value': float(self.output_dict['Radius_o_m']) + }) + result.append({ + 'unit': 'm', + 'type': 'variable', + 'variable_df_key_col_name': 'Radius_g', + 'value': float(self.output_dict['Radius_g_m']) + }) + result.append({ + 'unit': 'm', + 'type': 'variable', + 'variable_df_key_col_name': 'Radius_b', + 'value': float(self.output_dict['Radius_b_m']) + }) + result.append({ + 'unit': 'm', + 'type': 'variable', + 'variable_df_key_col_name': 'Radius', + 'value': float(self.output_dict['Radius_m']) + }) + result.append({ + 'unit': 'short_ton', + 'type': 'variable', + 'variable_df_key_col_name': 'steel_mass_short_ton_per_turbine', + 'value': self.output_dict['steel_mass_short_ton_per_turbine'] + }) # foundation_volume_concrete_m3_per_turbine - result.append( - { - "unit": "m^3", - "type": "variable", - "variable_df_key_col_name": "foundation_volume_concrete_m3_per_turbine", - "value": self.output_dict["foundation_volume_concrete_m3_per_turbine"], - } - ) - - for row in self.output_dict["operation_data_id_days_crews_workers"].itertuples(): - dashed_row = "{}-{}-{}-{}".format(row[1], math.ceil(row[2]), row[3], row[4]) - result.append( - { - "unit": "", - "type": "dataframe", - "variable_df_key_col_name": "operation_data: Operation ID-Number of days-Number of crews-Number of workers", - "value": dashed_row, - } - ) - - for row in self.output_dict["material_needs_per_turbine"].itertuples(): + result.append({ + 'unit': 'm^3', + 'type': 'variable', + 'variable_df_key_col_name': 'foundation_volume_concrete_m3_per_turbine', + 'value': self.output_dict['foundation_volume_concrete_m3_per_turbine'] + }) + + for row in self.output_dict['operation_data_id_days_crews_workers'].itertuples(): + dashed_row = '{}-{}-{}-{}'.format(row[1], math.ceil(row[2]), row[3], row[4]) + result.append({ + 'unit': '', + 'type': 'dataframe', + 'variable_df_key_col_name': 'operation_data: Operation ID-Number of days-Number of crews-Number of workers', + 'value': dashed_row + }) + + for row in self.output_dict['material_needs_per_turbine'].itertuples(): # This must be formatted in Python - dashed_row = "{}-{}-{:.2e}".format(row[0], row[1], row[2]) - result.append( - { - "unit": row[3], - "type": "dataframe", - "variable_df_key_col_name": "material_needs_per_turbine: {}".format( - "-".join(self.output_dict["material_needs_per_turbine"].columns[:-1]) - ), - "value": dashed_row, - } - ) - - for row in self.output_dict["total_foundation_cost"].itertuples(): - dashed_row = "{} <--> {} <--> {}".format(row[1], row[3], math.ceil(row[2])) - result.append( - { - "unit": "", - "type": "dataframe", - "variable_df_key_col_name": "Type of Cost <--> Phase of Construction <--> Cost in USD ", - "value": dashed_row, - "last_number": row[2], - } - ) + dashed_row = '{}-{}-{:.2e}'.format(row[0], row[1], row[2]) + result.append({ + 'unit': row[3], + 'type': 'dataframe', + 'variable_df_key_col_name': 'material_needs_per_turbine: {}'.format('-'.join(self.output_dict['material_needs_per_turbine'].columns[:-1])), + 'value': dashed_row + }) + + for row in self.output_dict['total_foundation_cost'].itertuples(): + dashed_row = '{} <--> {} <--> {}'.format(row[1], row[3], math.ceil(row[2])) + result.append({ + 'unit': '', + 'type': 'dataframe', + 'variable_df_key_col_name': 'Type of Cost <--> Phase of Construction <--> Cost in USD ', + 'value': dashed_row, + 'last_number': row[2] + }) for _dict in result: - _dict["project_id_with_serial"] = self.project_name - _dict["module"] = module + _dict['project_id_with_serial'] = self.project_name + _dict['module'] = module - self.output_dict["foundation_cost_csv"] = result + self.output_dict['foundation_cost_csv'] = result return result def outputs_for_module_type_operation(self, input_dict, output_dict): result = [] module = type(self).__name__ - costs_by_module_type_operation = self.output_dict["labor_equip_data"] + costs_by_module_type_operation = self.output_dict['labor_equip_data'] for _, row in costs_by_module_type_operation.iterrows(): _dict = dict() row = row.to_dict() - _dict["operation_id"] = row["Operation ID"] - _dict["type_of_cost"] = row["Type of cost"] - _dict["cost"] = row["Cost USD"] + _dict['operation_id'] = row['Operation ID'] + _dict['type_of_cost'] = row['Type of cost'] + _dict['cost'] = row['Cost USD'] result.append(_dict) for _dict in result: - _dict["project_id_with_serial"] = self.project_name - _dict["module"] = module - _dict["total_or_turbine"] = "total" + _dict['project_id_with_serial'] = self.project_name + _dict['module'] = module + _dict['total_or_turbine'] = 'total' - self.output_dict["foundation_module_type_operation"] = result + self.output_dict['foundation_module_type_operation'] = result return result def run_module(self): @@ -984,50 +856,47 @@ def run_module(self): self.calculate_foundation_load(self.input_dict, self.output_dict) # Returns foundation load self.determine_foundation_size(self.input_dict, self.output_dict) # Returns foundation volume self.estimate_material_needs_per_turbine(self.input_dict, self.output_dict) # Returns material volume - operation_data = self.estimate_construction_time( - self.input_dict, self.output_dict - ) # Estimates construction time + operation_data = self.estimate_construction_time(self.input_dict, self.output_dict) # Estimates construction time # pull only global inputs for weather delay from input_dict - weather_data_keys = ("wind_shear_exponent", "weather_window") + weather_data_keys = ('wind_shear_exponent', + 'weather_window') # specify foundation-specific weather delay inputs self.weather_input_dict = dict( - [(i, self.input_dict[i]) for i in self.input_dict if i in set(weather_data_keys)] - ) + [(i, self.input_dict[i]) for i in self.input_dict if i in set(weather_data_keys)]) + self.weather_input_dict[ + 'start_delay_hours'] = 0 # assume zero start for when foundation construction begins (start at beginning of construction time) + self.weather_input_dict[ + 'critical_wind_speed_m_per_s'] = self.input_dict['critical_speed_non_erection_wind_delays_m_per_s'] self.weather_input_dict[ - "start_delay_hours" - ] = 0 # assume zero start for when foundation construction begins (start at beginning of construction time) - self.weather_input_dict["critical_wind_speed_m_per_s"] = self.input_dict[ - "critical_speed_non_erection_wind_delays_m_per_s" - ] - self.weather_input_dict["wind_height_of_interest_m"] = self.input_dict[ - "critical_height_non_erection_wind_delays_m" - ] + 'wind_height_of_interest_m'] = self.input_dict['critical_height_non_erection_wind_delays_m'] # duration_construction is in units of days # duration_construction_months is in units of months days_per_month = 30 - duration_construction = operation_data["Time construct days"].max(skipna=True) + duration_construction = operation_data['Time construct days'].max(skipna=True) duration_construction_months = duration_construction / days_per_month - self.output_dict["foundation_construction_months"] = duration_construction_months + self.output_dict['foundation_construction_months'] = duration_construction_months # compute and specify weather delay mission time for roads - operational_hrs_per_day = self.input_dict["hour_day"][self.input_dict["time_construct"]] + operational_hrs_per_day = self.input_dict['hour_day'][self.input_dict['time_construct']] mission_time_hrs = duration_construction * operational_hrs_per_day - self.weather_input_dict["mission_time_hours"] = mission_time_hrs - self.input_dict["operational_hrs_per_day"] = operational_hrs_per_day + self.weather_input_dict['mission_time_hours'] = mission_time_hrs + self.input_dict['operational_hrs_per_day'] = operational_hrs_per_day self.calculate_weather_delay(self.weather_input_dict, self.output_dict) self.calculate_costs(self.input_dict, self.output_dict) self.outputs_for_detailed_tab(self.input_dict, self.output_dict) # self.output_dict['labor_equip_data'] # self.output_dict['foundation_module_type_operation'] = self.outputs_for_module_type_operation(self.input_dict, self.output_dict) - self.output_dict["foundation_module_type_operation"] = self.outputs_for_costs_by_module_type_operation( - input_df=self.output_dict["total_foundation_cost"], project_id=self.project_name, total_or_turbine=True + self.output_dict['foundation_module_type_operation'] = self.outputs_for_costs_by_module_type_operation( + input_df=self.output_dict['total_foundation_cost'], + project_id=self.project_name, + total_or_turbine=True ) - return 0, 0 # module ran successfully + return 0, 0 # module ran successfully except Exception as error: traceback.print_exc() print(f"Fail {self.project_name} FoundationCost") - return 1, error # module did not run successfully + return 1, error # module did not run successfully diff --git a/WISDEM/wisdem/landbosse/model/GridConnectionCost.py b/WISDEM/wisdem/landbosse/model/GridConnectionCost.py index 9505844de..7c69ed6d7 100644 --- a/WISDEM/wisdem/landbosse/model/GridConnectionCost.py +++ b/WISDEM/wisdem/landbosse/model/GridConnectionCost.py @@ -1,7 +1,7 @@ -import math import traceback - import pandas as pd +import math + from wisdem.landbosse.model.CostModule import CostModule @@ -31,7 +31,7 @@ class GridConnectionCost(CostModule): """ - def __init__(self, input_dict, output_dict, project_name): + def __init__(self, input_dict, output_dict , project_name): """ Parameters ---------- @@ -65,44 +65,42 @@ def calculate_costs(self, calculate_costs_input_dict, calculate_costs_output_dic """ # Switch between utility scale model and distributed model # Run utility version of GridConnectionCost for project size > 15 MW: - if (calculate_costs_input_dict["turbine_rating_MW"] * calculate_costs_input_dict["num_turbines"]) > 15: - if calculate_costs_input_dict["distance_to_interconnect_mi"] == 0: - calculate_costs_output_dict["trans_dist_usd"] = 0 + if (calculate_costs_input_dict['turbine_rating_MW'] * calculate_costs_input_dict['num_turbines']) > 15: + if calculate_costs_input_dict['distance_to_interconnect_mi'] == 0: + calculate_costs_output_dict['trans_dist_usd'] = 0 else: - if calculate_costs_input_dict["new_switchyard"] is True: - calculate_costs_output_dict["interconnect_adder_USD"] = ( - 18115 * self.input_dict["interconnect_voltage_kV"] + 165944 - ) + if calculate_costs_input_dict['new_switchyard'] is True: + calculate_costs_output_dict['interconnect_adder_USD'] = 18115 * self.input_dict['interconnect_voltage_kV'] + 165944 else: - calculate_costs_output_dict["interconnect_adder_USD"] = 0 - calculate_costs_output_dict["trans_dist_usd"] = ( - (1176 * self.input_dict["interconnect_voltage_kV"] + 218257) - * (calculate_costs_input_dict["distance_to_interconnect_mi"] ** (-0.1063)) - * calculate_costs_input_dict["distance_to_interconnect_mi"] - ) + calculate_costs_output_dict["interconnect_adder_USD"] + calculate_costs_output_dict['interconnect_adder_USD'] = 0 + calculate_costs_output_dict['trans_dist_usd'] = ((1176 * self.input_dict[ + 'interconnect_voltage_kV'] + 218257) * (calculate_costs_input_dict['distance_to_interconnect_mi'] ** ( + -0.1063)) * calculate_costs_input_dict['distance_to_interconnect_mi']) + calculate_costs_output_dict[ + 'interconnect_adder_USD'] # Run distributed wind version of GridConnectionCost for project size < 15 MW: else: # Code below is for newer version of LandBOSSE which incorporates distributed wind into the model: - calculate_costs_output_dict["tower_to_point_of_interconnection_usd_per_kw"] = 1736.7 * ( - (calculate_costs_input_dict["num_turbines"] * calculate_costs_input_dict["turbine_rating_MW"] * 1000) - ** (-0.272) - ) - calculate_costs_output_dict["trans_dist_usd"] = ( - calculate_costs_input_dict["num_turbines"] - * calculate_costs_input_dict["turbine_rating_MW"] - * 1000 - * calculate_costs_output_dict["tower_to_point_of_interconnection_usd_per_kw"] - ) - - calculate_costs_output_dict["trans_dist_usd_df"] = pd.DataFrame( - [["Other", calculate_costs_output_dict["trans_dist_usd"], "Transmission and Distribution"]], - columns=["Type of cost", "Cost USD", "Phase of construction"], - ) - - calculate_costs_output_dict["total_transdist_cost"] = calculate_costs_output_dict["trans_dist_usd_df"] - - return calculate_costs_output_dict["trans_dist_usd_df"] + calculate_costs_output_dict['tower_to_point_of_interconnection_usd_per_kw'] = 1736.7 * (( + calculate_costs_input_dict[ + 'num_turbines'] * + calculate_costs_input_dict[ + 'turbine_rating_MW'] * 1000) ** ( + -0.272)) + calculate_costs_output_dict['trans_dist_usd'] = calculate_costs_input_dict['num_turbines'] * \ + calculate_costs_input_dict[ + 'turbine_rating_MW'] * 1000 * \ + calculate_costs_output_dict[ + 'tower_to_point_of_interconnection_usd_per_kw'] + + + calculate_costs_output_dict['trans_dist_usd_df'] = pd.DataFrame([['Other', calculate_costs_output_dict['trans_dist_usd'], 'Transmission and Distribution']], + columns=['Type of cost', 'Cost USD', 'Phase of construction']) + + calculate_costs_output_dict['total_transdist_cost'] = calculate_costs_output_dict['trans_dist_usd_df'] + + return calculate_costs_output_dict['trans_dist_usd_df'] + def outputs_for_detailed_tab(self, input_dict, output_dict): """ @@ -119,23 +117,21 @@ def outputs_for_detailed_tab(self, input_dict, output_dict): result = [] module = type(self).__name__ - for row in self.output_dict["trans_dist_usd_df"].itertuples(): - dashed_row = "{} <--> {} <--> {}".format(row[1], row[3], math.ceil(row[2])) - result.append( - { - "unit": "", - "type": "dataframe", - "variable_df_key_col_name": "Type of Cost <--> Phase of Construction <--> Cost in USD ", - "value": dashed_row, - "last_number": row[2], - } - ) + for row in self.output_dict['trans_dist_usd_df'].itertuples(): + dashed_row = '{} <--> {} <--> {}'.format(row[1], row[3], math.ceil(row[2])) + result.append({ + 'unit': '', + 'type': 'dataframe', + 'variable_df_key_col_name': 'Type of Cost <--> Phase of Construction <--> Cost in USD ', + 'value': dashed_row, + 'last_number': row[2] + }) for _dict in result: - _dict["project_id_with_serial"] = self.project_name - _dict["module"] = module + _dict['project_id_with_serial'] = self.project_name + _dict['module'] = module - self.output_dict["trans_dist_cost_csv"] = result + self.output_dict['trans_dist_cost_csv'] = result return result def outputs_for_module_type_operation(self, input_dict, output_dict): @@ -152,21 +148,21 @@ def outputs_for_module_type_operation(self, input_dict, output_dict): result = [] module = type(self).__name__ - costs_by_module_type_operation = output_dict["trans_dist_usd_df"] + costs_by_module_type_operation = output_dict['trans_dist_usd_df'] for _, row in costs_by_module_type_operation.iterrows(): _dict = dict() row = row.to_dict() - _dict["operation_id"] = row["Phase of construction"] - _dict["type_of_cost"] = row["Type of cost"] - _dict["cost"] = row["Cost USD"] + _dict['operation_id'] = row['Phase of construction'] + _dict['type_of_cost'] = row['Type of cost'] + _dict['cost'] = row['Cost USD'] result.append(_dict) for _dict in result: - _dict["project_id_with_serial"] = self.project_name - _dict["module"] = module - _dict["total_or_turbine"] = "total" + _dict['project_id_with_serial'] = self.project_name + _dict['module'] = module + _dict['total_or_turbine'] = 'total' - output_dict["trans_dist_cost_module_type_operation"] = result + output_dict['trans_dist_cost_module_type_operation'] = result return result def run_module(self): @@ -189,11 +185,13 @@ def run_module(self): try: self.calculate_costs(self.input_dict, self.output_dict) self.outputs_for_detailed_tab(self.input_dict, self.output_dict) - self.output_dict["trans_dist_cost_module_type_operation"] = self.outputs_for_costs_by_module_type_operation( - input_df=self.output_dict["trans_dist_usd_df"], project_id=self.project_name, total_or_turbine=True - ) - return 0, 0 # module ran successfully + self.output_dict['trans_dist_cost_module_type_operation'] = \ + self.outputs_for_costs_by_module_type_operation(input_df=self.output_dict['trans_dist_usd_df'], + project_id=self.project_name, + total_or_turbine=True) + return 0, 0 # module ran successfully except Exception as error: traceback.print_exc() print(f"Fail {self.project_name} GridConnectionCost") - return 1, error # module did not run successfully + return 1, error # module did not run successfully + diff --git a/WISDEM/wisdem/landbosse/model/ManagementCost.py b/WISDEM/wisdem/landbosse/model/ManagementCost.py index 6a6ae364d..9237956db 100644 --- a/WISDEM/wisdem/landbosse/model/ManagementCost.py +++ b/WISDEM/wisdem/landbosse/model/ManagementCost.py @@ -1,9 +1,6 @@ import math import traceback -import pytest - - class ManagementCost: """ This class models management costs of a wind plant. Its inputs are @@ -95,7 +92,7 @@ def __init__(self, input_dict, output_dict, project_name): output_dict : dict Dictionary with output key / value pairs. """ - self.in_distributed_mode = "override_total_management_cost" in input_dict + self.in_distributed_mode = 'override_total_management_cost' in input_dict self.validate_inputs(input_dict) self.input_dict = input_dict self.output_dict = output_dict @@ -120,24 +117,24 @@ def validate_inputs(self, input_dict): """ if not self.in_distributed_mode: required_keys = { - "project_value_usd", - "foundation_cost_usd", - "construct_duration", - "num_hwy_permits", - "num_turbines", - "project_size_megawatts", - "hub_height_meters", - "num_access_roads", - "markup_contingency", - "markup_warranty_management", - "markup_sales_and_use_tax", - "markup_overhead", - "markup_profit_margin", - "site_facility_building_area_df", + 'project_value_usd', + 'foundation_cost_usd', + 'construct_duration', + 'num_hwy_permits', + 'num_turbines', + 'project_size_megawatts', + 'hub_height_meters', + 'num_access_roads', + 'markup_contingency', + 'markup_warranty_management', + 'markup_sales_and_use_tax', + 'markup_overhead', + 'markup_profit_margin', + 'site_facility_building_area_df' } found_keys = set(input_dict.keys()) if len(required_keys - found_keys) > 0: - err_msg = "{}: did not find all required keys in inputs dictionary. Missing keys are {}" + err_msg = '{}: did not find all required keys in inputs dictionary. Missing keys are {}' raise ValueError(err_msg.format(type(self).__name__, required_keys - found_keys)) def insurance(self): @@ -166,7 +163,7 @@ def insurance(self): float Insurance costs in USD """ - insurance_cost = 0.0056 * self.input_dict["project_value_usd"] + insurance_cost = 0.0056 * self.input_dict['project_value_usd'] return insurance_cost def construction_permitting(self): @@ -179,8 +176,8 @@ def construction_permitting(self): float Construction permitting cost in USD """ - building_permits = 0.02 * self.input_dict["foundation_cost_usd"] - highway_permits = 20000 * self.input_dict["num_hwy_permits"] + building_permits = 0.02 * self.input_dict['foundation_cost_usd'] + highway_permits = 20000 * self.input_dict['num_hwy_permits'] construction_permitting_cost = building_permits + highway_permits return construction_permitting_cost @@ -194,7 +191,7 @@ def bonding(self): Bonding cost in USD """ # Calculate bonding costs based on project size - performance_bond_cost = 0.01 * self.input_dict["project_value_usd"] + performance_bond_cost = 0.01 * self.input_dict['project_value_usd'] return performance_bond_cost def project_management(self): @@ -230,14 +227,12 @@ def project_management(self): Project management cost """ # todo: add relationship to site-specific interface with public infrastructure - if self.output_dict["actual_construction_months"] < 28: - project_management_cost = ( - 53.333 * self.output_dict["actual_construction_months"] ** 2 - - 3442 * self.output_dict["actual_construction_months"] - + 209542 - ) * (self.output_dict["actual_construction_months"] + 2) + if self.output_dict['actual_construction_months'] < 28: + project_management_cost = (53.333 * self.output_dict['actual_construction_months'] ** 2 - + 3442 * self.output_dict['actual_construction_months'] + + 209542) * (self.output_dict['actual_construction_months'] + 2) else: - project_management_cost = (self.output_dict["actual_construction_months"] + 2) * 155000 + project_management_cost = (self.output_dict['actual_construction_months'] + 2) * 155000 return project_management_cost def markup_contingency(self): @@ -260,13 +255,11 @@ def markup_contingency(self): Mark up and contingency costs. """ # Calculate mark-up and contingency costs based on project value - markup_contingency_cost = ( - self.input_dict["markup_contingency"] - + self.input_dict["markup_warranty_management"] - + self.input_dict["markup_sales_and_use_tax"] - + self.input_dict["markup_overhead"] - + self.input_dict["markup_profit_margin"] - ) * self.input_dict["project_value_usd"] + markup_contingency_cost = (self.input_dict['markup_contingency'] + + self.input_dict['markup_warranty_management'] + + self.input_dict['markup_sales_and_use_tax'] + + self.input_dict['markup_overhead'] + + self.input_dict['markup_profit_margin']) * self.input_dict['project_value_usd'] return markup_contingency_cost def engineering_foundations_collection_sys(self): @@ -280,35 +273,27 @@ def engineering_foundations_collection_sys(self): site-specific engineering costs """ # development engineering costs for foundations and collection system - if self.input_dict["project_size_megawatts"] < 200: - development_engineering_cost = ( - 7188.5 * self.input_dict["num_turbines"] - + round(3.4893 * math.log(self.input_dict["num_turbines"]) - 7.3049, 0) * 16800 - + 165675 - ) + if self.input_dict['project_size_megawatts'] < 200: + development_engineering_cost = 7188.5 * self.input_dict['num_turbines'] + round(3.4893 * math.log(self.input_dict['num_turbines']) - 7.3049, 0) * 16800 + 165675 else: - development_engineering_cost = ( - 7188.5 * self.input_dict["num_turbines"] - + round(3.4893 * math.log(self.input_dict["num_turbines"]) - 7.3049, 0) * 16800 - + 327250 - ) + development_engineering_cost = 7188.5 * self.input_dict['num_turbines'] + round(3.4893 * math.log(self.input_dict['num_turbines']) - 7.3049, 0) * 16800 + 327250 # engineering costs for met masts # TODO: Projects less than 30 MW for met masts - if 30 <= self.input_dict["project_size_megawatts"] <= 100: + if 30 <= self.input_dict['project_size_megawatts'] <= 100: num_perm_met_mast = 2 num_temp_met_mast = 2 - elif 100 < self.input_dict["project_size_megawatts"] <= 300: + elif 100 < self.input_dict['project_size_megawatts'] <= 300: num_perm_met_mast = 2 num_temp_met_mast = 4 - elif self.input_dict["project_size_megawatts"] > 300: - num_perm_met_mast = round(self.input_dict["project_size_megawatts"] / 100) - num_temp_met_mast = round(self.input_dict["project_size_megawatts"] / 100) * 2 + elif self.input_dict['project_size_megawatts'] > 300: + num_perm_met_mast = round(self.input_dict['project_size_megawatts'] / 100) + num_temp_met_mast = round(self.input_dict['project_size_megawatts'] / 100) * 2 else: num_perm_met_mast = 1 num_temp_met_mast = 1 - if self.input_dict["hub_height_meters"] < 90: + if self.input_dict['hub_height_meters'] < 90: multiplier_perm = 232600 multiplier_temp = 92600 else: @@ -379,16 +364,16 @@ def site_facility(self): float Building area in square feet """ - df = self.input_dict["site_facility_building_area_df"] - project_size_megawatts = self.input_dict["project_size_megawatts"] - row = df[(df["Size Max (MW)"] > project_size_megawatts) & (df["Size Min (MW)"] <= project_size_megawatts)] - building_area_sq_ft = float(row["Building area (sq. ft.)"]) + df = self.input_dict['site_facility_building_area_df'] + project_size_megawatts = self.input_dict['project_size_megawatts'] + row = df[(df['Size Max (MW)'] > project_size_megawatts) & (df['Size Min (MW)'] <= project_size_megawatts)] + building_area_sq_ft = float(row['Building area (sq. ft.)']) construction_building_cost = building_area_sq_ft * 125 + 176125 - ps = self.input_dict["project_size_megawatts"] - ct = self.output_dict["actual_construction_months"] - nt = self.input_dict["num_turbines"] + ps = self.input_dict['project_size_megawatts'] + ct = self.output_dict['actual_construction_months'] + nt = self.input_dict['num_turbines'] if nt < 30: nr = 1 acs = 30000 @@ -403,6 +388,7 @@ def site_facility(self): site_facility_cost = construction_building_cost + compound_security_cost return site_facility_cost + def total_management_cost(self): """ Calculates the total cost of returned by the rest of the methods. @@ -418,13 +404,13 @@ def total_management_cost(self): other methods. """ total = 0 - total += self.output_dict["insurance_usd"] - total += self.output_dict["construction_permitting_usd"] - total += self.output_dict["bonding_usd"] - total += self.output_dict["project_management_usd"] - total += self.output_dict["markup_contingency_usd"] - total += self.output_dict["engineering_usd"] - total += self.output_dict["site_facility_usd"] + total += self.output_dict['insurance_usd'] + total += self.output_dict['construction_permitting_usd'] + total += self.output_dict['bonding_usd'] + total += self.output_dict['project_management_usd'] + total += self.output_dict['markup_contingency_usd'] + total += self.output_dict['engineering_usd'] + total += self.output_dict['site_facility_usd'] return total def outputs_for_detailed_tab(self): @@ -442,34 +428,34 @@ def outputs_for_detailed_tab(self): result = [] if self.in_distributed_mode: row = { - "project_id_with_serial": self.project_name, - "module": type(self).__name__, - "type": "variable", - "variable_df_key_col_name": "total_management_cost", - "unit": "usd", - "value": self.output_dict["total_management_cost"], + 'project_id_with_serial': self.project_name, + 'module': type(self).__name__, + 'type': 'variable', + 'variable_df_key_col_name': 'total_management_cost', + 'unit': 'usd', + 'value': self.output_dict['total_management_cost'] } result.append(row) else: management_cost_keys = [ - "insurance_usd", - "construction_permitting_usd", - "bonding_usd", - "project_management_usd", - "markup_contingency_usd", - "engineering_usd", - "site_facility_usd", + 'insurance_usd', + 'construction_permitting_usd', + 'bonding_usd', + 'project_management_usd', + 'markup_contingency_usd', + 'engineering_usd', + 'site_facility_usd' ] for key in management_cost_keys: value = self.output_dict[key] row = { - "project_id_with_serial": self.project_name, - "module": type(self).__name__, - "type": "variable", - "variable_df_key_col_name": key, - "unit": "usd", - "value": value, + 'project_id_with_serial': self.project_name, + 'module': type(self).__name__, + 'type': 'variable', + 'variable_df_key_col_name': key, + 'unit': 'usd', + 'value': value } result.append(row) @@ -488,46 +474,57 @@ def outputs_for_module_type_operation(self): """ result = [] module = type(self).__name__ - turbine_rating_MW = self.input_dict["turbine_rating_MW"] - num_turbines = self.input_dict["num_turbines"] + turbine_rating_MW = self.input_dict['turbine_rating_MW'] + num_turbines = self.input_dict['num_turbines'] project_size_kw = num_turbines * turbine_rating_MW * 1000 if self.in_distributed_mode: - result.append( - {"type_of_cost": "total_management_cost", "raw_cost": self.output_dict["total_management_cost"]} - ) + result.append({ + 'type_of_cost': 'total_management_cost', + 'raw_cost': self.output_dict['total_management_cost'] + }) else: - result.append({"type_of_cost": "insurance", "raw_cost": self.output_dict["insurance_usd"]}) - result.append( - {"type_of_cost": "Construction Permitting", "raw_cost": self.output_dict["construction_permitting_usd"]} - ) - result.append( - {"type_of_cost": "Project Management", "raw_cost": self.output_dict["project_management_usd"]} - ) - result.append({"type_of_cost": "Bonding", "raw_cost": self.output_dict["bonding_usd"]}) - result.append( - {"type_of_cost": "Markup Contingency", "raw_cost": self.output_dict["markup_contingency_usd"]} - ) - result.append( - { - "type_of_cost": "Engineering Foundation and Collections System (includes met mast)", - "raw_cost": self.output_dict["engineering_usd"], - } - ) - result.append({"type_of_cost": "Site Facility", "raw_cost": self.output_dict["site_facility_usd"]}) + result.append({ + 'type_of_cost': 'insurance', + 'raw_cost': self.output_dict['insurance_usd'] + }) + result.append({ + 'type_of_cost': 'Construction Permitting', + 'raw_cost': self.output_dict['construction_permitting_usd'] + }) + result.append({ + 'type_of_cost': 'Project Management', + 'raw_cost': self.output_dict['project_management_usd'] + }) + result.append({ + 'type_of_cost': 'Bonding', + 'raw_cost': self.output_dict['bonding_usd'] + }) + result.append({ + 'type_of_cost': 'Markup Contingency', + 'raw_cost': self.output_dict['markup_contingency_usd'] + }) + result.append({ + 'type_of_cost': 'Engineering Foundation and Collections System (includes met mast)', + 'raw_cost': self.output_dict['engineering_usd'] + }) + result.append({ + 'type_of_cost': 'Site Facility', + 'raw_cost': self.output_dict['site_facility_usd'] + }) for _dict in result: - _dict["turbine_rating_MW"] = self.input_dict["turbine_rating_MW"] - _dict["num_turbines"] = self.input_dict["num_turbines"] - _dict["rotor_diameter_m"] = self.input_dict["rotor_diameter_m"] - _dict["project_id_with_serial"] = self.project_name - _dict["operation_id"] = "Management" - _dict["module"] = module - _dict["raw_cost_total_or_per_turbine"] = "total" - _dict["cost_per_turbine"] = _dict["raw_cost"] / num_turbines - _dict["cost_per_project"] = _dict["raw_cost"] - _dict["usd_per_kw_per_project"] = _dict["raw_cost"] / project_size_kw + _dict['turbine_rating_MW'] = self.input_dict['turbine_rating_MW'] + _dict['num_turbines'] = self.input_dict['num_turbines'] + _dict['rotor_diameter_m'] = self.input_dict['rotor_diameter_m'] + _dict['project_id_with_serial'] = self.project_name + _dict['operation_id'] = 'Management' + _dict['module'] = module + _dict['raw_cost_total_or_per_turbine'] = 'total' + _dict['cost_per_turbine'] = _dict['raw_cost'] / num_turbines + _dict['cost_per_project'] = _dict['raw_cost'] + _dict['usd_per_kw_per_project'] = _dict['raw_cost'] / project_size_kw return result @@ -551,27 +548,27 @@ def run_module(self): """ try: if self.in_distributed_mode: - self.output_dict["insurance_usd"] = 0 - self.output_dict["construction_permitting_usd"] = 0 - self.output_dict["project_management_usd"] = 0 - self.output_dict["bonding_usd"] = 0 - self.output_dict["markup_contingency_usd"] = 0 - self.output_dict["engineering_usd"] = 0 - self.output_dict["site_facility_usd"] = 0 - self.output_dict["total_management_cost"] = self.input_dict["override_total_management_cost"] + self.output_dict['insurance_usd'] = 0 + self.output_dict['construction_permitting_usd'] = 0 + self.output_dict['project_management_usd'] = 0 + self.output_dict['bonding_usd'] = 0 + self.output_dict['markup_contingency_usd'] = 0 + self.output_dict['engineering_usd'] = 0 + self.output_dict['site_facility_usd'] = 0 + self.output_dict['total_management_cost'] = self.input_dict['override_total_management_cost'] else: - self.output_dict["insurance_usd"] = self.insurance() - self.output_dict["construction_permitting_usd"] = self.construction_permitting() - self.output_dict["project_management_usd"] = self.project_management() - self.output_dict["bonding_usd"] = self.bonding() - self.output_dict["markup_contingency_usd"] = self.markup_contingency() - self.output_dict["engineering_usd"] = self.engineering_foundations_collection_sys() - self.output_dict["site_facility_usd"] = self.site_facility() - self.output_dict["total_management_cost"] = self.total_management_cost() - self.output_dict["management_cost_csv"] = self.outputs_for_detailed_tab() - self.output_dict["mangement_module_type_operation"] = self.outputs_for_module_type_operation() - return 0, 0 # module ran successfully + self.output_dict['insurance_usd'] = self.insurance() + self.output_dict['construction_permitting_usd'] = self.construction_permitting() + self.output_dict['project_management_usd'] = self.project_management() + self.output_dict['bonding_usd'] = self.bonding() + self.output_dict['markup_contingency_usd'] = self.markup_contingency() + self.output_dict['engineering_usd'] = self.engineering_foundations_collection_sys() + self.output_dict['site_facility_usd'] = self.site_facility() + self.output_dict['total_management_cost'] = self.total_management_cost() + self.output_dict['management_cost_csv'] = self.outputs_for_detailed_tab() + self.output_dict['mangement_module_type_operation'] = self.outputs_for_module_type_operation() + return 0, 0 # module ran successfully except Exception as error: traceback.print_exc() print(f"Fail {self.project_name} ManagementCost") diff --git a/WISDEM/wisdem/landbosse/model/Manager.py b/WISDEM/wisdem/landbosse/model/Manager.py index 040d99d89..b549a8ea0 100644 --- a/WISDEM/wisdem/landbosse/model/Manager.py +++ b/WISDEM/wisdem/landbosse/model/Manager.py @@ -1,17 +1,17 @@ -import math import traceback +import math -import pandas as pd - -from wisdem.landbosse.model.ErectionCost import ErectionCost -from wisdem.landbosse.model.CollectionCost import Array, Cable, ArraySystem -from wisdem.landbosse.model.FoundationCost import FoundationCost from wisdem.landbosse.model.ManagementCost import ManagementCost +from wisdem.landbosse.model.FoundationCost import FoundationCost from wisdem.landbosse.model.SubstationCost import SubstationCost -from wisdem.landbosse.model.DevelopmentCost import DevelopmentCost +from wisdem.landbosse.model.TransportCost import TransportCost from wisdem.landbosse.model.GridConnectionCost import GridConnectionCost from wisdem.landbosse.model.SitePreparationCost import SitePreparationCost +from wisdem.landbosse.model.CollectionCost import ArraySystem +from wisdem.landbosse.model.ErectionCost import ErectionCost +from wisdem.landbosse.model.DevelopmentCost import DevelopmentCost +import pandas as pd class Manager: """ @@ -37,100 +37,78 @@ def __init__(self, input_dict, output_dict): def execute_landbosse(self, project_name): try: # Create weather window that will be used for all tasks (window for entire project; selected to restrict to seasons and hours specified) - weather_data_user_input = self.input_dict["weather_window"] - season_construct = self.input_dict["season_construct"] - time_construct = self.input_dict["time_construct"] - daily_operational_hours = self.input_dict["hour_day"][time_construct] + weather_data_user_input = self.input_dict['weather_window'] + season_construct = self.input_dict['season_construct'] + time_construct = self.input_dict['time_construct'] + daily_operational_hours = self.input_dict['hour_day'][time_construct] # Filtered window. Restrict to the seasons and hours specified. - filtered_weather_window = weather_data_user_input.loc[ - (weather_data_user_input["Season"].isin(season_construct)) - & (weather_data_user_input["Time window"] == time_construct) - ] - filtered_weather_window = filtered_weather_window[ - 0 : (math.ceil(self.input_dict["construct_duration"] * 30 * daily_operational_hours)) - ] + filtered_weather_window = weather_data_user_input.loc[(weather_data_user_input['Season'].isin(season_construct)) & (weather_data_user_input['Time window'] == time_construct)] + filtered_weather_window = filtered_weather_window[0:(math.ceil(self.input_dict['construct_duration'] * 30 * daily_operational_hours))] # Rename weather data to specify types - self.input_dict["weather_window"] = filtered_weather_window - self.input_dict["weather_data_user_input"] = weather_data_user_input + self.input_dict['weather_window'] = filtered_weather_window + self.input_dict['weather_data_user_input'] = weather_data_user_input - foundation_cost = FoundationCost( - input_dict=self.input_dict, output_dict=self.output_dict, project_name=project_name - ) + foundation_cost = FoundationCost(input_dict=self.input_dict, output_dict=self.output_dict, project_name=project_name) foundation_cost.run_module() - roads_cost = SitePreparationCost( - input_dict=self.input_dict, output_dict=self.output_dict, project_name=project_name - ) + roads_cost = SitePreparationCost(input_dict=self.input_dict, output_dict=self.output_dict, project_name=project_name) roads_cost.run_module() - substation_cost = SubstationCost( - input_dict=self.input_dict, output_dict=self.output_dict, project_name=project_name - ) + substation_cost = SubstationCost(input_dict=self.input_dict, output_dict=self.output_dict, project_name=project_name) substation_cost.run_module() - transdist_cost = GridConnectionCost( - input_dict=self.input_dict, output_dict=self.output_dict, project_name=project_name - ) + transport_cost = TransportCost(input_dict=self.input_dict, output_dict=self.output_dict, project_name=project_name) + transport_cost.run_module() + + transdist_cost = GridConnectionCost(input_dict=self.input_dict, output_dict=self.output_dict, project_name=project_name) transdist_cost.run_module() - collection_cost = ArraySystem( - input_dict=self.input_dict, output_dict=self.output_dict, project_name=project_name - ) + collection_cost = ArraySystem(input_dict=self.input_dict, output_dict=self.output_dict, project_name=project_name) collection_cost.run_module() - development_cost = DevelopmentCost( - input_dict=self.input_dict, output_dict=self.output_dict, project_name=project_name - ) + development_cost = DevelopmentCost(input_dict=self.input_dict, output_dict=self.output_dict, + project_name=project_name) development_cost.run_module() erection_cost_output_dict = dict() erection_cost = ErectionCost( - input_dict=self.input_dict, output_dict=self.output_dict, project_name=project_name + input_dict=self.input_dict, + output_dict=self.output_dict, + project_name=project_name ) erection_cost.run_module() - self.output_dict["erection_cost"] = erection_cost_output_dict - - self.output_dict["actual_construction_months"] = ( - self.output_dict["siteprep_construction_months"] - + max( - self.output_dict["erection_construction_months"], - self.output_dict["foundation_construction_months"], - self.output_dict["collection_construction_months"], - ) - + 1 - ) + self.output_dict['erection_cost'] = erection_cost_output_dict - if self.output_dict["actual_construction_months"] < self.input_dict["construct_duration"]: - road_cost = self.output_dict["total_road_cost"] - index = road_cost["Type of cost"] == "Other" - other = road_cost[index] - amount_shorter_than_input_construction_time = ( - self.input_dict["construct_duration"] - self.output_dict["siteprep_construction_months"] - ) - road_cost.loc[index, "Cost USD"] = ( - other["Cost USD"] - amount_shorter_than_input_construction_time * 55500 - ) - self.output_dict["total_road_cost"] = road_cost - - total_costs = pd.concat( - ( - self.output_dict["total_collection_cost"], - self.output_dict["total_road_cost"], - self.output_dict["total_transdist_cost"], - self.output_dict["total_substation_cost"], - self.output_dict["total_foundation_cost"], - self.output_dict["total_erection_cost"], - self.output_dict["total_development_cost"], - ) - ) - self.input_dict["project_value_usd"] = float(total_costs["Cost USD"].sum()) - self.input_dict["foundation_cost_usd"] = self.output_dict["total_foundation_cost"]["Cost USD"].sum() - management_cost = ManagementCost( - input_dict=self.input_dict, output_dict=self.output_dict, project_name=project_name - ) + + self.output_dict['actual_construction_months'] = self.output_dict['siteprep_construction_months'] + \ + max(self.output_dict['erection_construction_months'], + self.output_dict['foundation_construction_months'], + self.output_dict['collection_construction_months']) + 1 + + if self.output_dict['actual_construction_months'] < self.input_dict['construct_duration']: + road_cost = self.output_dict['total_road_cost'] + index = road_cost['Type of cost'] == 'Other' + other = road_cost[index] + amount_shorter_than_input_construction_time = (self.input_dict['construct_duration'] - self.output_dict['siteprep_construction_months']) + road_cost.loc[index, 'Cost USD'] = other['Cost USD'] - amount_shorter_than_input_construction_time * 55500 + self.output_dict['total_road_cost'] = road_cost + + total_costs = pd.concat((self.output_dict['total_collection_cost'], + self.output_dict['total_road_cost'], + self.output_dict['total_transdist_cost'], + self.output_dict['total_substation_cost'], + self.output_dict['total_transport_cost'], + self.output_dict['total_foundation_cost'], + self.output_dict['total_erection_cost'], + self.output_dict['total_development_cost'], + ), sort=True) + self.input_dict['project_value_usd'] = float(total_costs['Cost USD'].sum()) + self.input_dict['foundation_cost_usd'] = self.output_dict['total_foundation_cost']['Cost USD'].sum() + + management_cost = ManagementCost(input_dict=self.input_dict, output_dict=self.output_dict, project_name=project_name) management_cost.run_module() return 0 diff --git a/WISDEM/wisdem/landbosse/model/SitePreparationCost.py b/WISDEM/wisdem/landbosse/model/SitePreparationCost.py index 022a98132..44f276d05 100644 --- a/WISDEM/wisdem/landbosse/model/SitePreparationCost.py +++ b/WISDEM/wisdem/landbosse/model/SitePreparationCost.py @@ -1,12 +1,9 @@ +import numpy as np import math +from wisdem.landbosse.model.WeatherDelay import WeatherDelay as WD import traceback - -import numpy as np -import pandas as pd - from wisdem.landbosse.model.CostModule import CostModule -from wisdem.landbosse.model.WeatherDelay import WeatherDelay as WD - +import pandas as pd class SitePreparationCost(CostModule): """ @@ -132,6 +129,7 @@ class SitePreparationCost(CostModule): """ + def __init__(self, input_dict, output_dict, project_name): """ Parameters @@ -149,9 +147,9 @@ class documentation self.output_dict = output_dict self.project_name = project_name - # Road quality and fraction of roads that are - self.fraction_new_roads = self.input_dict["fraction_new_roads"] - self.road_quality = self.input_dict["road_quality"] + #Road quality and fraction of roads that are + self.fraction_new_roads = self.input_dict['fraction_new_roads'] + self.road_quality = self.input_dict['road_quality'] # Conversion factors. Making this data private (hidden from outside of this class): self._meters_per_foot = 0.3 @@ -212,41 +210,34 @@ def calculate_road_properties(self, road_properties_input, road_properties_outpu """ - if road_properties_input["road_distributed_wind"] == True or road_properties_input["turbine_rating_MW"] < 0.1: - road_properties_output["road_volume"] = ( - road_properties_input["road_length_adder_m"] - * (road_properties_input["road_width_ft"] * self._meters_per_foot) - * (road_properties_input["road_thickness"] * self._meters_per_inch) - ) # units of cubic meters + if road_properties_input['road_distributed_wind'] == True or road_properties_input['turbine_rating_MW'] < 0.1: + road_properties_output['road_volume'] = road_properties_input['road_length_adder_m'] * \ + (road_properties_input['road_width_ft'] * self._meters_per_foot) * \ + (road_properties_input[ + 'road_thickness'] * self._meters_per_inch) # units of cubic meters else: - road_properties_output["road_length_m"] = ( - (road_properties_input["num_turbines"] - 1) - * road_properties_input["turbine_spacing_rotor_diameters"] - * road_properties_input["rotor_diameter_m"] - ) + road_properties_input["road_length_adder_m"] - road_properties_output["road_width_m"] = road_properties_input["road_width_ft"] * self._meters_per_foot - road_properties_output["road_volume"] = ( - road_properties_output["road_length_m"] - * (road_properties_input["road_width_ft"] * self._meters_per_foot) - * (road_properties_input["road_thickness"] * self._meters_per_inch) - ) # units of cubic meters - - road_properties_output["road_volume_m3"] = ( - road_properties_output["road_volume"] + self._crane_pad_volume * road_properties_input["num_turbines"] - ) # in cubic meters - - road_properties_output["depth_to_subgrade_m"] = 0.1 - - road_properties_output["crane_path_width_m"] = road_properties_input["crane_width"] + 1.5 + road_properties_output['road_length_m'] = ((road_properties_input['num_turbines'] - 1) * + road_properties_input['turbine_spacing_rotor_diameters'] * + road_properties_input['rotor_diameter_m']) + \ + road_properties_input['road_length_adder_m'] + road_properties_output['road_width_m'] = road_properties_input['road_width_ft'] * self._meters_per_foot + road_properties_output['road_volume'] = road_properties_output['road_length_m'] * \ + (road_properties_input['road_width_ft'] * self._meters_per_foot) * \ + (road_properties_input[ + 'road_thickness'] * self._meters_per_inch) # units of cubic meters + + + road_properties_output['road_volume_m3'] = road_properties_output['road_volume'] + self._crane_pad_volume * \ + road_properties_input['num_turbines'] # in cubic meters + + road_properties_output['depth_to_subgrade_m'] = 0.1 + + road_properties_output['crane_path_width_m'] = road_properties_input['crane_width'] + 1.5 # todo: replace with actual crane path width from erection module - road_properties_output["road_thickness_m"] = road_properties_input["road_thickness"] * self._meters_per_inch - road_properties_output["road_width_m"] = road_properties_input["road_width_ft"] * self._meters_per_foot - road_properties_output["material_volume_cubic_yards"] = ( - road_properties_output["road_volume_m3"] - * self._cubic_yards_per_cubic_meter - * self._yards_loose_per_yards_packed - ) # todo: output_dict material volume + road_properties_output['road_thickness_m'] = (road_properties_input['road_thickness'] * self._meters_per_inch) + road_properties_output['road_width_m'] = road_properties_input['road_width_ft'] * self._meters_per_foot + road_properties_output['material_volume_cubic_yards'] = (road_properties_output['road_volume_m3'] * self._cubic_yards_per_cubic_meter * self._yards_loose_per_yards_packed) # todo: output_dict material volume return road_properties_output @@ -286,154 +277,131 @@ def estimate_construction_time(self, estimate_construction_time_input, estimate_ - Cost of labor and equipment rental prior to weather delays """ - throughput_operations = estimate_construction_time_input["rsmeans"] + throughput_operations = estimate_construction_time_input['rsmeans'] - # TODO: Figure out where 'construct_duration' gets read in. - estimate_construction_time_output["road_construction_time"] = ( - estimate_construction_time_input["construct_duration"] * 1 / 5 - ) # assumes road construction occurs for 1/5 of project time + #TODO: Figure out where 'construct_duration' gets read in. + estimate_construction_time_output['road_construction_time'] = estimate_construction_time_input[ + 'construct_duration'] * 1 / 5 # assumes road construction occurs for 1/5 of project time # Main switch between small DW wind and (utility scale + distributed wind) # select operations for roads module that have data - if estimate_construction_time_input["turbine_rating_MW"] >= 0.1: - operation_data = throughput_operations.where(throughput_operations["Module"] == "Roads").dropna(thresh=4) + if estimate_construction_time_input['turbine_rating_MW'] >= 0.1: + operation_data = throughput_operations.where(throughput_operations['Module'] == 'Roads').dropna(thresh=4) else: - operation_data = throughput_operations.where(throughput_operations["Module"] == "Small DW Roads").dropna( - thresh=4 - ) - operation_data = operation_data.dropna(subset=["Units"]) + operation_data = throughput_operations.where(throughput_operations['Module'] == 'Small DW Roads').dropna( + thresh=4) + operation_data = operation_data.dropna(subset=['Units']) # create list of unique material units for operations - list_units = operation_data["Units"].unique() - - if ( - estimate_construction_time_input["road_distributed_wind"] == True - and estimate_construction_time_input["turbine_rating_MW"] >= 0.1 - ): - estimate_construction_time_output["topsoil_volume"] = ( - estimate_construction_time_input["site_prep_area_m2"] - * (estimate_construction_time_output["depth_to_subgrade_m"]) - * self._cubic_yards_per_cubic_meter - ) # units: cubic yards - estimate_construction_time_output["embankment_volume_crane"] = estimate_construction_time_output[ - "topsoil_volume" - ] # units: cubic yards - estimate_construction_time_output["embankment_volume_road"] = estimate_construction_time_output[ - "topsoil_volume" - ] # units: cubic yards - estimate_construction_time_output["rough_grading_area"] = ( - estimate_construction_time_input["site_prep_area_m2"] * 10.76391 - ) / 100000 # where 10.76391 sq ft = 1 sq m - - elif ( - estimate_construction_time_input["road_distributed_wind"] == True - and estimate_construction_time_input["turbine_rating_MW"] < 0.1 - ): - estimate_construction_time_output["topsoil_volume"] = ( - estimate_construction_time_input["road_length_adder_m"] - * (estimate_construction_time_input["road_width_ft"] * 0.3048) - * (estimate_construction_time_input["road_thickness"] * 0.0254) - * 1.308 - ) # Units: CY (where 1 m3 = 1.308 CY) + list_units = operation_data['Units'].unique() + + if estimate_construction_time_input['road_distributed_wind'] == True and estimate_construction_time_input[ + 'turbine_rating_MW'] >= 0.1: + estimate_construction_time_output['topsoil_volume'] = estimate_construction_time_input[ + 'site_prep_area_m2'] * ( + estimate_construction_time_output[ + 'depth_to_subgrade_m']) * self._cubic_yards_per_cubic_meter # units: cubic yards + estimate_construction_time_output['embankment_volume_crane'] = estimate_construction_time_output[ + 'topsoil_volume'] # units: cubic yards + estimate_construction_time_output['embankment_volume_road'] = estimate_construction_time_output[ + 'topsoil_volume'] # units: cubic yards + estimate_construction_time_output['rough_grading_area'] = (estimate_construction_time_input[ + 'site_prep_area_m2'] * 10.76391) / 100000 # where 10.76391 sq ft = 1 sq m + + elif estimate_construction_time_input['road_distributed_wind'] == True and estimate_construction_time_input[ + 'turbine_rating_MW'] < 0.1: + estimate_construction_time_output['topsoil_volume'] = estimate_construction_time_input[ + 'road_length_adder_m'] * ( + estimate_construction_time_input[ + 'road_width_ft'] * 0.3048) * ( + estimate_construction_time_input[ + 'road_thickness'] * 0.0254) * 1.308 # Units: CY (where 1 m3 = 1.308 CY) else: - estimate_construction_time_output["topsoil_volume"] = ( - (estimate_construction_time_output["crane_path_width_m"]) - * estimate_construction_time_output["road_length_m"] - * (estimate_construction_time_output["depth_to_subgrade_m"]) - * self._cubic_yards_per_cubic_meter - ) # units: cubic yards - estimate_construction_time_output["embankment_volume_crane"] = ( - (estimate_construction_time_output["crane_path_width_m"]) - * estimate_construction_time_output["road_length_m"] - * (estimate_construction_time_output["depth_to_subgrade_m"]) - * self._cubic_yards_per_cubic_meter - ) # units: cubic yards - estimate_construction_time_output["embankment_volume_road"] = ( - estimate_construction_time_output["road_volume"] - * self._cubic_yards_per_cubic_meter - * math.ceil(estimate_construction_time_output["road_thickness_m"] / self._lift_depth_m) - ) # units: cubic yards road - estimate_construction_time_output["rough_grading_area"] = ( - estimate_construction_time_output["road_length_m"] - * estimate_construction_time_output["road_width_m"] - * self._square_feet_per_square_meter - * math.ceil(estimate_construction_time_output["road_thickness_m"] / self._lift_depth_m) - / 100000 - ) # Units: Each (100,000 square feet) - - if estimate_construction_time_input["turbine_rating_MW"] >= 0.1: - material_quantity_dict = { - "cubic yard": estimate_construction_time_output["topsoil_volume"], - "embankment cubic yards crane": estimate_construction_time_output["embankment_volume_crane"], - "embankment cubic yards road": estimate_construction_time_output["embankment_volume_road"], - "loose cubic yard": estimate_construction_time_output["material_volume_cubic_yards"], - "Each (100000 square feet)": estimate_construction_time_output["rough_grading_area"], - } + estimate_construction_time_output['topsoil_volume'] = (estimate_construction_time_output[ + 'crane_path_width_m']) * estimate_construction_time_output['road_length_m'] * ( + estimate_construction_time_output[ + 'depth_to_subgrade_m']) * self._cubic_yards_per_cubic_meter # units: cubic yards + estimate_construction_time_output['embankment_volume_crane'] = (estimate_construction_time_output[ + 'crane_path_width_m']) * estimate_construction_time_output['road_length_m'] * ( + estimate_construction_time_output[ + 'depth_to_subgrade_m']) * self._cubic_yards_per_cubic_meter # units: cubic yards + estimate_construction_time_output['embankment_volume_road'] = estimate_construction_time_output[ + 'road_volume'] * self._cubic_yards_per_cubic_meter * math.ceil( + estimate_construction_time_output['road_thickness_m'] / self._lift_depth_m) # units: cubic yards road + estimate_construction_time_output['rough_grading_area'] = estimate_construction_time_output[ + 'road_length_m'] * \ + estimate_construction_time_output[ + 'road_width_m'] * \ + self._square_feet_per_square_meter * \ + math.ceil(estimate_construction_time_output[ + 'road_thickness_m'] / self._lift_depth_m) / 100000 # Units: Each (100,000 square feet) + + if estimate_construction_time_input['turbine_rating_MW'] >= 0.1: + material_quantity_dict = {'cubic yard': estimate_construction_time_output['topsoil_volume'], + 'embankment cubic yards crane': estimate_construction_time_output[ + 'embankment_volume_crane'], + 'embankment cubic yards road': estimate_construction_time_output[ + 'embankment_volume_road'], + 'loose cubic yard': estimate_construction_time_output[ + 'material_volume_cubic_yards'], + 'Each (100000 square feet)': estimate_construction_time_output[ + 'rough_grading_area']} else: # small DW - material_quantity_dict = { - "cubic yard": estimate_construction_time_output["topsoil_volume"], - "embankment cubic yards crane": estimate_construction_time_output["topsoil_volume"], - "loose cubic yard": estimate_construction_time_output["topsoil_volume"], - "embankment cubic yards road": estimate_construction_time_output["topsoil_volume"], - } - - material_needs = pd.DataFrame(columns=["Units", "Quantity of material"]) + material_quantity_dict = {'cubic yard': estimate_construction_time_output['topsoil_volume'], + 'embankment cubic yards crane': estimate_construction_time_output[ + 'topsoil_volume'], + 'loose cubic yard': estimate_construction_time_output['topsoil_volume'], + 'embankment cubic yards road': estimate_construction_time_output['topsoil_volume'] + } + + material_needs = pd.DataFrame(columns=['Units', 'Quantity of material']) for unit in list_units: - unit_quantity = pd.DataFrame( - [[unit, material_quantity_dict[unit]]], columns=["Units", "Quantity of material"] - ) + unit_quantity = pd.DataFrame([[unit, material_quantity_dict[unit]]], + columns=['Units', 'Quantity of material']) material_needs = pd.concat((material_needs, unit_quantity)) - estimate_construction_time_output["material_needs"] = material_needs + estimate_construction_time_output['material_needs'] = material_needs # join material needs with operational data to compute costs - operation_data = pd.merge(operation_data, material_needs, on=["Units"]).dropna(thresh=3) - operation_data = operation_data.where((operation_data["Daily output"]).isnull() == False).dropna(thresh=4) + operation_data = pd.merge(operation_data, material_needs, on=['Units']).dropna(thresh=3) + operation_data = operation_data.where((operation_data['Daily output']).isnull() == False).dropna(thresh=4) # calculate operational parameters and estimate costs without weather delays - operation_data["Number of days"] = operation_data["Quantity of material"] / operation_data["Daily output"] - operation_data["Number of crews"] = np.ceil( - (operation_data["Number of days"] / 30) / estimate_construction_time_output["road_construction_time"] - ) - operation_data["Cost USD without weather delays"] = ( - operation_data["Quantity of material"] * operation_data["Rate USD per unit"] - ) + operation_data['Number of days'] = operation_data['Quantity of material'] / operation_data['Daily output'] + operation_data['Number of crews'] = np.ceil((operation_data['Number of days'] / 30) / estimate_construction_time_output['road_construction_time']) + operation_data['Cost USD without weather delays'] = operation_data['Quantity of material'] * operation_data['Rate USD per unit'] # if more than one crew needed to complete within construction duration then assume that all construction happens # within that window and use that time frame for weather delays; if not, use the number of days calculated - operation_data["time_construct_bool"] = ( - operation_data["Number of days"] > estimate_construction_time_output["road_construction_time"] * 30 - ) - boolean_dictionary = {True: estimate_construction_time_output["road_construction_time"] * 30, False: np.NAN} - operation_data["time_construct_bool"] = operation_data["time_construct_bool"].map(boolean_dictionary) - operation_data["Time construct days"] = operation_data[["time_construct_bool", "Number of days"]].min(axis=1) - num_days = operation_data["Time construct days"].max() + operation_data['time_construct_bool'] = operation_data['Number of days'] > estimate_construction_time_output['road_construction_time'] * 30 + boolean_dictionary = {True: estimate_construction_time_output['road_construction_time'] * 30, False: np.NAN} + operation_data['time_construct_bool'] = operation_data['time_construct_bool'].map(boolean_dictionary) + operation_data['Time construct days'] = operation_data[['time_construct_bool', 'Number of days']].min(axis=1) + num_days = operation_data['Time construct days'].max() # pull out management data - if estimate_construction_time_input["turbine_rating_MW"] >= 0.1: - crew_cost = self.input_dict["crew_cost"] - crew = self.input_dict["crew"][self.input_dict["crew"]["Crew type ID"].str.contains("M0")] - management_crew = pd.merge(crew_cost, crew, on=["Labor type ID"]) - management_crew = management_crew.assign( - per_diem_total=management_crew["Per diem USD per day"] * management_crew["Number of workers"] * num_days - ) - management_crew = management_crew.assign( - hourly_costs_total=management_crew["Hourly rate USD per hour"] - * self.input_dict["hour_day"][self.input_dict["time_construct"]] - * num_days - ) - management_crew = management_crew.assign( - total_crew_cost_before_wind_delay=management_crew["per_diem_total"] - + management_crew["hourly_costs_total"] - ) - self.output_dict["management_crew"] = management_crew - - self.output_dict["managament_crew_cost_before_wind_delay"] = management_crew[ - "total_crew_cost_before_wind_delay" - ].sum() - - estimate_construction_time_output["operation_data"] = operation_data + if estimate_construction_time_input['turbine_rating_MW'] >= 0.1: + crew_cost = self.input_dict['crew_cost'] + crew = self.input_dict['crew'][self.input_dict['crew']['Crew type ID'].str.contains('M0')] + management_crew = pd.merge(crew_cost, crew, on=['Labor type ID']) + management_crew = management_crew.assign(per_diem_total= + management_crew['Per diem USD per day'] * + management_crew['Number of workers'] * + num_days) + management_crew = management_crew.assign(hourly_costs_total= + management_crew['Hourly rate USD per hour'] * + self.input_dict['hour_day'][self.input_dict['time_construct']] * + num_days) + management_crew = management_crew.assign(total_crew_cost_before_wind_delay= + management_crew['per_diem_total'] + + management_crew['hourly_costs_total']) + self.output_dict['management_crew'] = management_crew + + self.output_dict['managament_crew_cost_before_wind_delay'] = management_crew[ + 'total_crew_cost_before_wind_delay'].sum() + + estimate_construction_time_output['operation_data'] = operation_data return operation_data @@ -447,14 +415,15 @@ def calculate_weather_delay(self, weather_delay_input_data, weather_delay_output WD(weather_delay_input_data, weather_delay_output_data) # compute weather delay - wind_delay = pd.DataFrame(weather_delay_output_data["wind_delays"]) + wind_delay = pd.DataFrame(weather_delay_output_data['wind_delays']) # if greater than 4 hour delay, then shut down for full day (10 hours) wind_delay[(wind_delay > 4)] = 10 - weather_delay_output_data["wind_delay_time"] = float(wind_delay.sum()) + weather_delay_output_data['wind_delay_time'] = float(wind_delay.sum().iloc[0]) return weather_delay_output_data + def new_and_existing_total_road_cost(self, new_road_cost_by_type): """ Calculates total road cost, with contribution from new and existing roads. Refer to eq. 3.3.10 in Technical Report. @@ -465,18 +434,13 @@ def new_and_existing_total_road_cost(self, new_road_cost_by_type): Sum total cost in USD of new and existing roads. """ - f_new = ( - self.fraction_new_roads - ) # fraction of new roads that will be built (default assumes 33% new). TODO: Change to user input. - r_q = ( - self.road_quality - ) # is a non-dimensional representation of road quality. Default assumes 0.6, which is representative of average road conditions. TODO: Change to user input. - cost_existing_roads = ( - 0.5 * new_road_cost_by_type - ) # cost of installing existing roads for the entire project. We currently assume default case to equal 50 % of cost of building new roads. - new_and_existing_total_road_cost = (f_new * new_road_cost_by_type) + ((1 - f_new) * r_q * cost_existing_roads) + f_new = self.fraction_new_roads #fraction of new roads that will be built (default assumes 33% new). TODO: Change to user input. + r_q = self.road_quality #is a non-dimensional representation of road quality. Default assumes 0.6, which is representative of average road conditions. TODO: Change to user input. + cost_existing_roads = 0.5 * new_road_cost_by_type #cost of installing existing roads for the entire project. We currently assume default case to equal 50 % of cost of building new roads. + new_and_existing_total_road_cost = (f_new * new_road_cost_by_type) + ((1-f_new) * r_q * cost_existing_roads) return new_and_existing_total_road_cost + def calculate_costs(self, calculate_cost_input_dict, calculate_cost_output_dict): """ Function to calculate total labor, equipment, material, mobilization, and anyother associated costs after @@ -510,190 +474,160 @@ def calculate_costs(self, calculate_cost_input_dict, calculate_cost_output_dict) """ - rsmeans = calculate_cost_input_dict["rsmeans"] + rsmeans = calculate_cost_input_dict['rsmeans'] - material_name = rsmeans["Material type ID"].where(rsmeans["Module"] == "Roads").dropna().unique() + material_name = rsmeans['Material type ID'].where(rsmeans['Module'] == 'Roads').dropna().unique() material_vol = pd.DataFrame( - [[material_name[0], calculate_cost_output_dict["material_volume_cubic_yards"], "Loose cubic yard"]], - columns=["Material type ID", "Quantity of material", "Units"], - ) + [[material_name[0], calculate_cost_output_dict['material_volume_cubic_yards'], 'Loose cubic yard']], + columns=['Material type ID', 'Quantity of material', 'Units']) - material_data = pd.merge(material_vol, calculate_cost_input_dict["material_price"], on=["Material type ID"]) - material_data["Cost USD"] = material_data["Quantity of material"] * pd.to_numeric( - material_data["Material price USD per unit"] - ) + material_data = pd.merge(material_vol, calculate_cost_input_dict['material_price'], on=['Material type ID']) + material_data['Cost USD'] = material_data['Quantity of material'] * pd.to_numeric( + material_data['Material price USD per unit']) - # New roads material cost: - material_cost_of_new_roads = material_data["Quantity of material"].iloc[0] * pd.to_numeric( - material_data["Material price USD per unit"].iloc[0] - ) + #New roads material cost: + material_cost_of_new_roads = material_data['Quantity of material'].iloc[0] * pd.to_numeric(material_data['Material price USD per unit'].iloc[0]) # New + old roads material cost: - if calculate_cost_input_dict["turbine_rating_MW"] >= 0.1: + if calculate_cost_input_dict['turbine_rating_MW'] >= 0.1: material_cost_of_old_and_new_roads = self.new_and_existing_total_road_cost(material_cost_of_new_roads) material_costs = pd.DataFrame( - [["Materials", float(material_cost_of_old_and_new_roads), "Roads"]], - columns=["Type of cost", "Cost USD", "Phase of construction"], - ) + [['Materials', float(material_cost_of_old_and_new_roads), 'Roads']], + columns=['Type of cost', 'Cost USD', 'Phase of construction']) else: material_cost_of_old_and_new_roads = material_cost_of_new_roads material_costs = pd.DataFrame( - [["Materials", float(material_cost_of_old_and_new_roads), "Small DW Roads"]], - columns=["Type of cost", "Cost USD", "Phase of construction"], - ) + [['Materials', float(material_cost_of_old_and_new_roads), 'Small DW Roads']], + columns=['Type of cost', 'Cost USD', 'Phase of construction']) + + operation_data = self.estimate_construction_time(calculate_cost_input_dict, calculate_cost_output_dict) - wind_delay_fraction = ( - calculate_cost_output_dict["wind_delay_time"] / calculate_cost_input_dict["operational_hrs_per_day"] - ) / operation_data["Time construct days"].max(skipna=True) + wind_delay_fraction = (calculate_cost_output_dict['wind_delay_time'] / calculate_cost_input_dict[ + 'operational_hrs_per_day']) / operation_data['Time construct days'].max(skipna=True) # check if wind_delay_fraction is greater than 1, which would mean weather delays are longer than they can possibily be for the input data if wind_delay_fraction > 1: - raise ValueError("{}: Error: Wind delay greater than 100%".format(type(self).__name__)) - calculate_cost_output_dict["wind_multiplier"] = 1 / (1 - wind_delay_fraction) - - per_diem = ( - operation_data["Number of workers"] - * operation_data["Number of crews"] - * (operation_data["Time construct days"] + np.ceil(operation_data["Time construct days"] / 7)) - * calculate_cost_input_dict["rsmeans_per_diem"] - ) + raise ValueError('{}: Error: Wind delay greater than 100%'.format(type(self).__name__)) + calculate_cost_output_dict['wind_multiplier'] = 1 / ( + 1 - wind_delay_fraction) + + per_diem = operation_data['Number of workers'] * operation_data['Number of crews'] * (operation_data['Time construct days'] + np.ceil(operation_data['Time construct days'] / 7)) * calculate_cost_input_dict['rsmeans_per_diem'] labor_per_diem = per_diem.dropna() # calculate_cost_output_dict['Total per diem (USD)'] = per_diem.sum() - labor_equip_data = pd.merge( - operation_data[["Operation ID", "Units", "Quantity of material"]], rsmeans, on=["Units", "Operation ID"] - ) + labor_equip_data = pd.merge(operation_data[['Operation ID', 'Units', 'Quantity of material']], rsmeans, on=['Units', 'Operation ID']) # Calculating labor costs: - if calculate_cost_input_dict["turbine_rating_MW"] >= 0.1: - labor_equip_data["Calculated per diem"] = per_diem - labor_data = labor_equip_data[labor_equip_data["Type of cost"] == "Labor"].copy() + if calculate_cost_input_dict['turbine_rating_MW'] >= 0.1: + labor_equip_data['Calculated per diem'] = per_diem + labor_data = labor_equip_data[labor_equip_data['Type of cost'] == 'Labor'].copy() else: - labor_equip_data["Calculated per diem"] = 0 + labor_equip_data['Calculated per diem'] = 0 # labor_data = labor_equip_data[labor_equip_data['Type of cost'] == 'Labor'].copy() - labor_data = labor_equip_data[labor_equip_data["Module"] == "Small DW Roads"].copy() - - quantity_material = material_data["Quantity of material"] - labor_usd_per_unit = labor_data["Rate USD per unit"] - overtime_multiplier = calculate_cost_input_dict["overtime_multiplier"] - wind_multiplier = calculate_cost_output_dict["wind_multiplier"] - - labor_data["Cost USD"] = ( - ( - labor_data["Quantity of material"] - * labor_data["Rate USD per unit"] - * calculate_cost_input_dict["overtime_multiplier"] - ) - + labor_per_diem - ) * calculate_cost_output_dict["wind_multiplier"] + labor_data = labor_equip_data[labor_equip_data['Module'] == 'Small DW Roads'].copy() + + quantity_material = material_data['Quantity of material'] + labor_usd_per_unit = labor_data['Rate USD per unit'] + overtime_multiplier = calculate_cost_input_dict['overtime_multiplier'] + wind_multiplier = calculate_cost_output_dict['wind_multiplier'] + + labor_data['Cost USD'] = ((labor_data['Quantity of material'] * + labor_data['Rate USD per unit'] * + calculate_cost_input_dict['overtime_multiplier']) + + labor_per_diem + ) * calculate_cost_output_dict['wind_multiplier'] - if calculate_cost_input_dict["road_distributed_wind"] and calculate_cost_input_dict["turbine_rating_MW"] >= 0.1: - labor_for_new_roads_cost_usd = (labor_data["Cost USD"].sum()) + calculate_cost_output_dict[ - "managament_crew_cost_before_wind_delay" - ] + if calculate_cost_input_dict['road_distributed_wind'] and \ + calculate_cost_input_dict['turbine_rating_MW'] >= 0.1: + + labor_for_new_roads_cost_usd = labor_data['Cost USD'].sum() + \ + calculate_cost_output_dict['managament_crew_cost_before_wind_delay'] labor_for_new_and_old_roads_cost_usd = self.new_and_existing_total_road_cost(labor_for_new_roads_cost_usd) - labor_costs = pd.DataFrame( - [["Labor", float(labor_for_new_and_old_roads_cost_usd), "Roads"]], - columns=["Type of cost", "Cost USD", "Phase of construction"], - ) + labor_costs = pd.DataFrame([['Labor', float(labor_for_new_and_old_roads_cost_usd), 'Roads']], + columns=['Type of cost', 'Cost USD', 'Phase of construction']) - elif ( - calculate_cost_input_dict["road_distributed_wind"] and calculate_cost_input_dict["turbine_rating_MW"] < 0.1 - ): # small DW - labor_for_new_roads_cost_usd = labor_data["Cost USD"].sum() + elif calculate_cost_input_dict['road_distributed_wind'] and \ + calculate_cost_input_dict['turbine_rating_MW'] < 0.1: # small DW + + labor_for_new_roads_cost_usd = labor_data['Cost USD'].sum() labor_for_new_and_old_roads_cost_usd = self.new_and_existing_total_road_cost(labor_for_new_roads_cost_usd) - labor_costs = pd.DataFrame( - [["Labor", float(labor_for_new_and_old_roads_cost_usd), "Small DW Roads"]], - columns=["Type of cost", "Cost USD", "Phase of construction"], - ) + labor_costs = pd.DataFrame([['Labor', float(labor_for_new_and_old_roads_cost_usd), 'Small DW Roads']], + columns=['Type of cost', 'Cost USD', 'Phase of construction']) else: - labor_for_new_roads_cost_usd = ( - labor_data["Cost USD"].sum() + calculate_cost_output_dict["managament_crew_cost_before_wind_delay"] - ) + labor_for_new_roads_cost_usd = labor_data['Cost USD'].sum() + \ + calculate_cost_output_dict['managament_crew_cost_before_wind_delay'] labor_for_new_and_old_roads_cost_usd = self.new_and_existing_total_road_cost(labor_for_new_roads_cost_usd) - labor_costs = pd.DataFrame( - [["Labor", float(labor_for_new_and_old_roads_cost_usd), "Roads"]], - columns=["Type of cost", "Cost USD", "Phase of construction"], - ) + labor_costs = pd.DataFrame([['Labor', + float(labor_for_new_and_old_roads_cost_usd), + 'Roads']], + + columns=['Type of cost', + 'Cost USD', + 'Phase of construction']) # Filter out equipment costs from rsmeans tab: - if calculate_cost_input_dict["turbine_rating_MW"] >= 0.1: - equipment_data = labor_equip_data[labor_equip_data["Type of cost"] == "Equipment rental"].copy() + if calculate_cost_input_dict['turbine_rating_MW'] >= 0.1: + equipment_data = labor_equip_data[labor_equip_data['Type of cost'] == 'Equipment rental'].copy() else: - equipment_data = labor_equip_data[labor_equip_data["Module"] == "Small DW Roads"].copy() - equipment_data = equipment_data[equipment_data["Type of cost"] == "Equipment rental"].copy() + equipment_data = labor_equip_data[labor_equip_data['Module'] == 'Small DW Roads'].copy() + equipment_data = equipment_data[equipment_data['Type of cost'] == 'Equipment rental'].copy() - equipment_data["Cost USD"] = ( - equipment_data["Quantity of material"] * equipment_data["Rate USD per unit"] - ) * calculate_cost_output_dict["wind_multiplier"] + equipment_data['Cost USD'] = (equipment_data['Quantity of material'] * equipment_data['Rate USD per unit']) * \ + calculate_cost_output_dict['wind_multiplier'] # if rental cost is < half day minimum: - if equipment_data["Cost USD"].sum() < 460: + if equipment_data['Cost USD'].sum() < 460: equip_for_new_roads_cost_usd = 460 else: - equip_for_new_roads_cost_usd = equipment_data["Cost USD"].sum() + equip_for_new_roads_cost_usd = equipment_data['Cost USD'].sum() - if calculate_cost_input_dict["turbine_rating_MW"] >= 0.1: + if calculate_cost_input_dict['turbine_rating_MW'] >= 0.1: equip_for_new_and_old_roads_cost_usd = self.new_and_existing_total_road_cost(equip_for_new_roads_cost_usd) - equipment_costs = pd.DataFrame( - [["Equipment rental", float(equip_for_new_and_old_roads_cost_usd), "Roads"]], - columns=["Type of cost", "Cost USD", "Phase of construction"], - ) + equipment_costs = pd.DataFrame([['Equipment rental', float(equip_for_new_and_old_roads_cost_usd), 'Roads']], + columns=['Type of cost', 'Cost USD', 'Phase of construction']) else: equip_for_new_and_old_roads_cost_usd = self.new_and_existing_total_road_cost(equip_for_new_roads_cost_usd) - equipment_costs = pd.DataFrame( - [["Equipment rental", float(equip_for_new_and_old_roads_cost_usd), "Small DW Roads"]], - columns=["Type of cost", "Cost USD", "Phase of construction"], - ) + equipment_costs = pd.DataFrame([['Equipment rental', float(equip_for_new_and_old_roads_cost_usd), 'Small DW Roads']], + columns=['Type of cost', 'Cost USD', 'Phase of construction']) # add costs for other operations not included in process data for utility mode (e.g., fencing, access roads) - if calculate_cost_input_dict["turbine_rating_MW"] > 0.1: - num_turbines = calculate_cost_input_dict["num_turbines"] - rotor_diameter_m = calculate_cost_input_dict["rotor_diameter_m"] - construct_duration = calculate_cost_input_dict["construct_duration"] - num_access_roads = calculate_cost_input_dict["num_access_roads"] + if calculate_cost_input_dict['turbine_rating_MW'] > 0.1: + num_turbines = calculate_cost_input_dict['num_turbines'] + rotor_diameter_m = calculate_cost_input_dict['rotor_diameter_m'] + construct_duration = calculate_cost_input_dict['construct_duration'] + num_access_roads = calculate_cost_input_dict['num_access_roads'] cost_new_roads_adder = ( - (float(num_turbines) * 17639) - + (float(num_turbines) * float(rotor_diameter_m) * 24.8) - + (float(construct_duration) * 55500) - + float(num_access_roads) * 3800 - ) + (float(num_turbines) * 17639) + (float(num_turbines) * float(rotor_diameter_m) * 24.8) + ( + float(construct_duration) * 55500) + float(num_access_roads) * 3800) cost_adder = self.new_and_existing_total_road_cost(cost_new_roads_adder) - additional_costs = pd.DataFrame( - [["Other", float(cost_adder), "Roads"]], columns=["Type of cost", "Cost USD", "Phase of construction"] - ) + additional_costs = pd.DataFrame([['Other', float(cost_adder), 'Roads']], + columns=['Type of cost', 'Cost USD', 'Phase of construction']) else: # No 'Other' cost in distributed wind mode: cost_new_roads_adder = 0 cost_adder = self.new_and_existing_total_road_cost(cost_new_roads_adder) - additional_costs = pd.DataFrame( - [["Other", float(cost_adder), "Small DW Roads"]], - columns=["Type of cost", "Cost USD", "Phase of construction"], - ) + additional_costs = pd.DataFrame([['Other', float(cost_adder), 'Small DW Roads']], + columns=['Type of cost', 'Cost USD', 'Phase of construction']) + + # Create empty road cost (showing cost breakdown by type) dataframe: - road_cost = pd.DataFrame(columns=["Type of cost", "Cost USD", "Phase of construction"]) + road_cost = pd.DataFrame(columns=['Type of cost', 'Cost USD', 'Phase of construction']) - # Filter out equipment costs from rsmeans tab: - equipment_data = labor_equip_data[labor_equip_data["Type of cost"] == "Equipment rental"].copy() - equipment_data["Cost USD"] = ( - equipment_data["Quantity of material"] * equipment_data["Rate USD per unit"] - ) * calculate_cost_output_dict[ - "wind_multiplier" - ] # TODO: Annika can you confirm if this is correct. - - equip_for_new_roads_cost_usd = equipment_data["Cost USD"].sum() + #Filter out equipment costs from rsmeans tab: + equipment_data = labor_equip_data[labor_equip_data['Type of cost'] == 'Equipment rental'].copy() + equipment_data['Cost USD'] = (equipment_data['Quantity of material'] * equipment_data['Rate USD per unit']) * calculate_cost_output_dict['wind_multiplier'] #TODO: Annika can you confirm if this is correct. + + equip_for_new_roads_cost_usd = equipment_data['Cost USD'].sum() equip_for_new_and_old_roads_cost_usd = self.new_and_existing_total_road_cost(equip_for_new_roads_cost_usd) - equipment_costs = pd.DataFrame( - [["Equipment rental", float(equip_for_new_and_old_roads_cost_usd), "Roads"]], - columns=["Type of cost", "Cost USD", "Phase of construction"], - ) + equipment_costs = pd.DataFrame([['Equipment rental', float(equip_for_new_and_old_roads_cost_usd), 'Roads']], + columns=['Type of cost', 'Cost USD', 'Phase of construction']) # add costs for other operations not included in process data (e.g., fencing, access roads) # @@ -706,59 +640,49 @@ def calculate_costs(self, calculate_cost_input_dict, calculate_cost_output_dict) # All crews work concurrently, so the total site preparation time is the # the max of "Time construct days" - max_time_construct_days = operation_data["Time construct days"].max() - num_turbines = float(calculate_cost_input_dict["num_turbines"]) - rotor_diameter_m = float(calculate_cost_input_dict["rotor_diameter_m"]) - num_access_roads = float(calculate_cost_input_dict["num_access_roads"]) - calendar_construct_days = max_time_construct_days + np.ceil( - max_time_construct_days / 6 - ) # assumes working only 6 days per week + max_time_construct_days = operation_data['Time construct days'].max() + num_turbines = float(calculate_cost_input_dict['num_turbines']) + rotor_diameter_m = float(calculate_cost_input_dict['rotor_diameter_m']) + num_access_roads = float(calculate_cost_input_dict['num_access_roads']) + calendar_construct_days = (max_time_construct_days + np.ceil( + max_time_construct_days / 6)) # assumes working only 6 days per week siteprep_construction_months = calendar_construct_days / 30.0 - cost_new_roads_adder = ( - num_turbines * 17639 - + num_turbines * rotor_diameter_m * 24.8 - + calculate_cost_input_dict["construct_duration"] * 55500 + cost_new_roads_adder = \ + num_turbines * 17639 + num_turbines * rotor_diameter_m * 24.8 + calculate_cost_input_dict['construct_duration'] * 55500 \ + num_access_roads * 3800 - ) cost_adder = self.new_and_existing_total_road_cost(cost_new_roads_adder) - additional_costs = pd.DataFrame( - [["Other", cost_adder, "Roads"]], columns=["Type of cost", "Cost USD", "Phase of construction"] - ) + additional_costs = pd.DataFrame([['Other', cost_adder, 'Roads']], + columns=['Type of cost', 'Cost USD', 'Phase of construction']) - road_cost = pd.concat((road_cost, material_costs, equipment_costs, labor_costs, additional_costs)) + road_cost = pd.concat((road_cost,material_costs,equipment_costs,labor_costs,additional_costs)) # set mobilization cost equal to 5% of total road cost for utility scale model and function of # of turbine size for distributed wind: - if calculate_cost_input_dict["num_turbines"] > 10: + if calculate_cost_input_dict['num_turbines'] > 10: mobilization_costs_new_roads = road_cost["Cost USD"].sum() * 0.05 mobilization_costs_new_plus_old_roads = self.new_and_existing_total_road_cost(mobilization_costs_new_roads) - mobilization_costs = pd.DataFrame( - [["Mobilization", mobilization_costs_new_plus_old_roads, "Roads"]], - columns=["Type of cost", "Cost USD", "Phase of construction"], - ) + mobilization_costs = pd.DataFrame([['Mobilization', mobilization_costs_new_plus_old_roads, 'Roads']], + columns=['Type of cost', 'Cost USD', 'Phase of construction']) else: - mobilization_costs_new_roads = road_cost["Cost USD"].sum() * self.mobilization_cost_multiplier( - calculate_cost_input_dict["turbine_rating_MW"] - ) + mobilization_costs_new_roads = road_cost["Cost USD"].sum() * \ + self.mobilization_cost_multiplier(calculate_cost_input_dict['turbine_rating_MW']) mobilization_costs_new_plus_old_roads = self.new_and_existing_total_road_cost(mobilization_costs_new_roads) - if calculate_cost_input_dict["turbine_rating_MW"] >= 0.1: - mobilization_costs = pd.DataFrame( - [["Mobilization", mobilization_costs_new_plus_old_roads, "Roads"]], - columns=["Type of cost", "Cost USD", "Phase of construction"], - ) + if calculate_cost_input_dict['turbine_rating_MW'] >= 0.1: + mobilization_costs = pd.DataFrame([['Mobilization', mobilization_costs_new_plus_old_roads, 'Roads']], + columns=['Type of cost', 'Cost USD', 'Phase of construction']) else: - mobilization_costs = pd.DataFrame( - [["Mobilization", mobilization_costs_new_plus_old_roads, "Small DW Roads"]], - columns=["Type of cost", "Cost USD", "Phase of construction"], - ) + mobilization_costs = pd.DataFrame([['Mobilization', mobilization_costs_new_plus_old_roads, 'Small DW Roads']], + columns=['Type of cost', 'Cost USD', 'Phase of construction']) + road_cost = pd.concat((road_cost, mobilization_costs)) total_road_cost = road_cost - calculate_cost_output_dict["total_road_cost"] = total_road_cost - calculate_cost_output_dict["siteprep_construction_months"] = siteprep_construction_months + calculate_cost_output_dict['total_road_cost'] = total_road_cost + calculate_cost_output_dict['siteprep_construction_months'] = siteprep_construction_months return total_road_cost + def outputs_for_detailed_tab(self, input_dict, output_dict): """ Creates a list of dictionaries which can be used on their own or @@ -778,126 +702,107 @@ def outputs_for_detailed_tab(self, input_dict, output_dict): # numbers. XlsxWriter, interestingly, cannot handle np.float32() # types. - result.append( - { - "unit": "m^3", - "type": "variable", - "variable_df_key_col_name": "Total road volume", - "value": float(self.output_dict["road_volume_m3"]), - } - ) - - result.append( - { - "unit": "m", - "type": "variable", - "variable_df_key_col_name": "Depth to subgrade", - "value": self.output_dict["depth_to_subgrade_m"], - } - ) - - result.append( - { - "unit": "ft", - "type": "variable", - "variable_df_key_col_name": "Crane path width", - "value": self.output_dict["crane_path_width_m"], # TODO: Rename variable to: crane_path_width_ft - } - ) - - if not input_dict["road_distributed_wind"]: - result.append( - { - "unit": "m", - "type": "variable", - "variable_df_key_col_name": "Road length", - "value": float(self.output_dict["road_length_m"]), - } - ) + result.append({ + 'unit': 'm^3', + 'type': 'variable', + 'variable_df_key_col_name': 'Total road volume', + 'value': float(self.output_dict['road_volume_m3']) + }) + + result.append({ + 'unit': 'm', + 'type': 'variable', + 'variable_df_key_col_name': 'Depth to subgrade', + 'value': self.output_dict['depth_to_subgrade_m'] + }) + + result.append({ + 'unit': 'ft', + 'type': 'variable', + 'variable_df_key_col_name': 'Crane path width', + 'value': self.output_dict['crane_path_width_m'] #TODO: Rename variable to: crane_path_width_ft + }) + + if not input_dict['road_distributed_wind']: + result.append({ + 'unit': 'm', + 'type': 'variable', + 'variable_df_key_col_name': 'Road length', + 'value': float(self.output_dict['road_length_m']) + }) + + result.append({ + 'unit': 'm', + 'type': 'variable', + 'variable_df_key_col_name': 'Road width', + 'value': self.output_dict['road_width_m'] + }) + + result.append({ + 'unit': 'm', + 'type': 'variable', + 'variable_df_key_col_name': 'Road thickness', + 'value': self.output_dict['road_thickness_m'] + }) + + + + result.append({ + 'unit': 'cubic yards', + 'type': 'variable', + 'variable_df_key_col_name': 'Material volume', + 'value': float(self.output_dict['material_volume_cubic_yards']) + }) + + result.append({ + 'unit': 'cubic yards', + 'type': 'variable', + 'variable_df_key_col_name': 'Topsoil volume', + 'value': float(self.output_dict['topsoil_volume']) + }) + + if input_dict['turbine_rating_MW'] >= 0.1: + result.append({ + 'unit': 'cubic yards', + 'type': 'variable', + 'variable_df_key_col_name': 'Embankment volume crane', + 'value': float(self.output_dict['embankment_volume_crane']) + }) + + result.append({ + 'unit': 'cubic yards', + 'type': 'variable', + 'variable_df_key_col_name': 'Embankment volume road', + 'value': float(self.output_dict['embankment_volume_road']) + }) + + result.append({ + 'unit': 'ft^2', + 'type': 'variable', + 'variable_df_key_col_name': 'Rough grading area', + 'value': float(self.output_dict['rough_grading_area']) + }) + + for row in self.output_dict['total_road_cost'].itertuples(): + dashed_row = '{} <--> {} <--> {}'.format(row[1], row[3], math.ceil(row[2])) + result.append({ + 'unit': '', + 'type': 'dataframe', + 'variable_df_key_col_name': 'Type of Cost <--> Phase of Construction <--> Cost in USD ', + 'value': dashed_row, + 'last_number': row[2] + }) - result.append( - { - "unit": "m", - "type": "variable", - "variable_df_key_col_name": "Road width", - "value": self.output_dict["road_width_m"], - } - ) - - result.append( - { - "unit": "m", - "type": "variable", - "variable_df_key_col_name": "Road thickness", - "value": self.output_dict["road_thickness_m"], - } - ) - - result.append( - { - "unit": "cubic yards", - "type": "variable", - "variable_df_key_col_name": "Material volume", - "value": float(self.output_dict["material_volume_cubic_yards"]), - } - ) - - result.append( - { - "unit": "cubic yards", - "type": "variable", - "variable_df_key_col_name": "Topsoil volume", - "value": float(self.output_dict["topsoil_volume"]), - } - ) - - if input_dict["turbine_rating_MW"] >= 0.1: - result.append( - { - "unit": "cubic yards", - "type": "variable", - "variable_df_key_col_name": "Embankment volume crane", - "value": float(self.output_dict["embankment_volume_crane"]), - } - ) - result.append( - { - "unit": "cubic yards", - "type": "variable", - "variable_df_key_col_name": "Embankment volume road", - "value": float(self.output_dict["embankment_volume_road"]), - } - ) - - result.append( - { - "unit": "ft^2", - "type": "variable", - "variable_df_key_col_name": "Rough grading area", - "value": float(self.output_dict["rough_grading_area"]), - } - ) - - for row in self.output_dict["total_road_cost"].itertuples(): - dashed_row = "{} <--> {} <--> {}".format(row[1], row[3], math.ceil(row[2])) - result.append( - { - "unit": "", - "type": "dataframe", - "variable_df_key_col_name": "Type of Cost <--> Phase of Construction <--> Cost in USD ", - "value": dashed_row, - "last_number": row[2], - } - ) for _dict in result: - _dict["project_id_with_serial"] = self.project_name - _dict["module"] = module + _dict['project_id_with_serial'] = self.project_name + _dict['module'] = module - self.output_dict["roads_cost_csv"] = result + self.output_dict['roads_cost_csv'] = result return result + def outputs_for_module_type_operation(self, input_dict, output_dict): """ Outputs dictionaries that are rows for the @@ -911,24 +816,24 @@ def outputs_for_module_type_operation(self, input_dict, output_dict): """ result = [] module = type(self).__name__ - num_turbines = self.input_dict["num_turbines"] + num_turbines = self.input_dict['num_turbines'] - costs_by_module_type_operation = output_dict["total_road_cost"] + costs_by_module_type_operation = output_dict['total_road_cost'] for _, row in costs_by_module_type_operation.iterrows(): _dict = dict() row = row.to_dict() - _dict["operation_id"] = row["Phase of construction"] - _dict["type_of_cost"] = row["Type of cost"] - _dict["cost"] = row["Cost USD"] + _dict['operation_id'] = row['Phase of construction'] + _dict['type_of_cost'] = row['Type of cost'] + _dict['cost'] = row['Cost USD'] result.append(_dict) for _dict in result: - _dict["project_id_with_serial"] = self.project_name - _dict["module"] = module - _dict["total_or_turbine"] = "total" - _dict["num_turbines"] = num_turbines + _dict['project_id_with_serial'] = self.project_name + _dict['module'] = module + _dict['total_or_turbine'] = 'total' + _dict['num_turbines'] = num_turbines - output_dict["roads_cost_module_type_operation"] = result + output_dict['roads_cost_module_type_operation'] = result return result def run_module(self): @@ -941,34 +846,31 @@ def run_module(self): operation_data = self.estimate_construction_time(self.input_dict, self.output_dict) # pull only global inputs for weather delay from input_dict - weather_data_keys = ("wind_shear_exponent", "weather_window") + weather_data_keys = ('wind_shear_exponent', + 'weather_window') # specify roads-specific weather delay inputs - self.weather_input_dict = dict( - [(i, self.input_dict[i]) for i in self.input_dict if i in set(weather_data_keys)] - ) + self.weather_input_dict = dict([(i, self.input_dict[i]) for i in self.input_dict if i in set(weather_data_keys)]) + self.weather_input_dict['start_delay_hours'] = 0 # assume zero start for when road construction begins (start at beginning of construction time) + self.weather_input_dict[ + 'critical_wind_speed_m_per_s'] = self.input_dict['critical_speed_non_erection_wind_delays_m_per_s'] self.weather_input_dict[ - "start_delay_hours" - ] = 0 # assume zero start for when road construction begins (start at beginning of construction time) - self.weather_input_dict["critical_wind_speed_m_per_s"] = self.input_dict[ - "critical_speed_non_erection_wind_delays_m_per_s" - ] - self.weather_input_dict["wind_height_of_interest_m"] = self.input_dict[ - "critical_height_non_erection_wind_delays_m" - ] + 'wind_height_of_interest_m'] = self.input_dict['critical_height_non_erection_wind_delays_m'] # compute and specify weather delay mission time for roads - duration_construction = operation_data["Time construct days"].max(skipna=True) - operational_hrs_per_day = self.input_dict["hour_day"][self.input_dict["time_construct"]] + duration_construction = operation_data['Time construct days'].max(skipna=True) + operational_hrs_per_day = self.input_dict['hour_day'][self.input_dict['time_construct']] mission_time_hrs = duration_construction * operational_hrs_per_day - self.weather_input_dict["mission_time_hours"] = mission_time_hrs + self.weather_input_dict['mission_time_hours'] = mission_time_hrs self.calculate_weather_delay(self.weather_input_dict, self.output_dict) self.calculate_costs(self.input_dict, self.output_dict) self.outputs_for_detailed_tab(self.input_dict, self.output_dict) # self.outputs_for_module_type_operation(self.input_dict, self.output_dict) - self.output_dict["siteprep_module_type_operation"] = self.outputs_for_costs_by_module_type_operation( - input_df=self.output_dict["total_road_cost"], project_id=self.project_name, total_or_turbine=True + self.output_dict['siteprep_module_type_operation'] = self.outputs_for_costs_by_module_type_operation( + input_df=self.output_dict['total_road_cost'], + project_id=self.project_name, + total_or_turbine=True ) return 0, 0 # module ran successfully except Exception as error: diff --git a/WISDEM/wisdem/landbosse/model/SubstationCost.py b/WISDEM/wisdem/landbosse/model/SubstationCost.py index fef2b2392..f1e362f6c 100644 --- a/WISDEM/wisdem/landbosse/model/SubstationCost.py +++ b/WISDEM/wisdem/landbosse/model/SubstationCost.py @@ -1,7 +1,6 @@ -import math import traceback - import pandas as pd +import math from wisdem.landbosse.model.CostModule import CostModule @@ -37,7 +36,6 @@ class SubstationCost(CostModule): """ - def __init__(self, input_dict, output_dict, project_name): """ Parameters @@ -54,7 +52,8 @@ class documentation self.output_dict = output_dict self.project_name = project_name - def calculate_costs(self, calculate_costs_input_dict, calculate_costs_output_dict): + + def calculate_costs(self, calculate_costs_input_dict , calculate_costs_output_dict): """ Function to calculate Substation Cost in USD @@ -75,28 +74,21 @@ def calculate_costs(self, calculate_costs_input_dict, calculate_costs_output_dic """ # Run in utility mode if number of turbines is > 10: - if calculate_costs_input_dict["num_turbines"] > 10: - calculate_costs_output_dict["substation_cost_usd"] = ( - 11652 - * ( - calculate_costs_input_dict["interconnect_voltage_kV"] - + calculate_costs_input_dict["project_size_megawatts"] - ) - + 11795 * (calculate_costs_input_dict["project_size_megawatts"] ** 0.3549) - + 1526800 - ) + if calculate_costs_input_dict['num_turbines'] > 10: + calculate_costs_output_dict['substation_cost_usd'] = 11652 * ( + calculate_costs_input_dict['interconnect_voltage_kV'] + calculate_costs_input_dict[ + 'project_size_megawatts']) + 11795 * (calculate_costs_input_dict[ + 'project_size_megawatts'] ** 0.3549) + 1526800 # Run in distributed mode if number of turbines is <= 10: else: - calculate_costs_output_dict["substation_cost_usd"] = 0 + calculate_costs_output_dict['substation_cost_usd'] = 0 - calculate_costs_output_dict["substation_cost_output_df"] = pd.DataFrame( - [["Other", calculate_costs_output_dict["substation_cost_usd"], "Substation"]], - columns=["Type of cost", "Cost USD", "Phase of construction"], - ) + calculate_costs_output_dict['substation_cost_output_df'] = pd.DataFrame([['Other', calculate_costs_output_dict['substation_cost_usd'], 'Substation']], + columns=['Type of cost', 'Cost USD', 'Phase of construction']) - calculate_costs_output_dict["total_substation_cost"] = calculate_costs_output_dict["substation_cost_output_df"] + calculate_costs_output_dict['total_substation_cost'] = calculate_costs_output_dict['substation_cost_output_df'] - return calculate_costs_output_dict["substation_cost_output_df"] + return calculate_costs_output_dict['substation_cost_output_df'] def outputs_for_detailed_tab(self, input_dict, output_dict): """ @@ -113,25 +105,24 @@ def outputs_for_detailed_tab(self, input_dict, output_dict): result = [] module = type(self).__name__ - for row in self.output_dict["substation_cost_output_df"].itertuples(): - dashed_row = "{} <--> {} <--> {}".format(row[1], row[3], math.ceil(row[2])) - result.append( - { - "unit": "", - "type": "dataframe", - "variable_df_key_col_name": "Type of Cost <--> Phase of Construction <--> Cost in USD ", - "value": dashed_row, - "last_number": row[2], - } - ) + for row in self.output_dict['substation_cost_output_df'].itertuples(): + dashed_row = '{} <--> {} <--> {}'.format(row[1], row[3], math.ceil(row[2])) + result.append({ + 'unit': '', + 'type': 'dataframe', + 'variable_df_key_col_name': 'Type of Cost <--> Phase of Construction <--> Cost in USD ', + 'value': dashed_row, + 'last_number': row[2] + }) for _dict in result: - _dict["project_id_with_serial"] = self.project_name - _dict["module"] = module + _dict['project_id_with_serial'] = self.project_name + _dict['module'] = module - self.output_dict["substation_cost_csv"] = result + self.output_dict['substation_cost_csv'] = result return result + def run_module(self): """ Runs the SubstationCost module and populates the IO dictionaries with calculated values. @@ -153,10 +144,10 @@ def run_module(self): self.calculate_costs(self.input_dict, self.output_dict) self.outputs_for_detailed_tab(self.input_dict, self.output_dict) # self.outputs_for_module_type_operation(self.input_dict, self.output_dict) - self.output_dict["substation_module_type_operation"] = self.outputs_for_costs_by_module_type_operation( - input_df=self.output_dict["substation_cost_output_df"], + self.output_dict['substation_module_type_operation'] = self.outputs_for_costs_by_module_type_operation( + input_df=self.output_dict['substation_cost_output_df'], project_id=self.project_name, - total_or_turbine=True, + total_or_turbine=True ) return 0, 0 except Exception as error: diff --git a/WISDEM/wisdem/landbosse/model/TransportCost.py b/WISDEM/wisdem/landbosse/model/TransportCost.py new file mode 100644 index 000000000..c0e0d4752 --- /dev/null +++ b/WISDEM/wisdem/landbosse/model/TransportCost.py @@ -0,0 +1,160 @@ +import traceback + +import pandas as pd +import scipy.interpolate +from wisdem.landbosse.model.CostModule import CostModule +import numpy as np + +class TransportCost(CostModule): + """ + **TransportCost.py** + + Calculates the costs associated with transportation for land-based wind projects *(module is currently based on curve fit of empirical data)* + + Get number of blades, nacelles + + Return total trasnport costs + + \n\n**Keys in the input dictionary are the following:** + + rotor_diameter_m + (float) Determines the approximate blade length [in m] + + number_turbines + (int) Number of turbines + + \n\n**Keys in the output dictionary are the following:** + + transport_cost + (float) cost of transportation [in USD] + + + """ + + def __init__(self, input_dict, output_dict, project_name): + """ + Parameters + ---------- + input_dict : dict + The input dictionary with key value pairs described in the + class documentation + + output_dict : dict + The output dictionary with key value pairs as found on the + output documentation. + """ + self.input_dict = input_dict + self.output_dict = output_dict + self.project_name = project_name + + def calculate_costs(self, calculate_costs_input_dict, calculate_costs_output_dict): + """ + Function to calculate Transport Cost in USD + + Parameters + ------- + interconnect_voltage_kV + (in kV) + + project_size_megawatts + (in MW) + + + Returns: + ------- + substation_cost + (in USD) + + """ + + blade_length = 0.5 * calculate_costs_input_dict["rotor_diameter_m"] + n_turb = calculate_costs_input_dict["num_turbines"] + # Transport cost is $/blade * nblades + infrastructure costs + cost for tower & nacelle + # Blade transport from emp.lbl.gov/publications/supersized-wind-turbine-blade-study + xlen = np.array([-500., 0., 65., 75., 95., 115.]) + ycost = 1e3 * np.array([0.0, 0.0, 52., 70., 120., 171.]) + yinfra = 1e6 * np.array([0.0, 0.0, 0.0, 0.2, 1.0, 5.0]) + + f_blade = scipy.interpolate.interp1d(xlen, ycost, fill_value='extrapolate', assume_sorted=True) + cost_per_blade = f_blade(blade_length) + + f_infra = scipy.interpolate.interp1d(xlen, yinfra, fill_value='extrapolate', assume_sorted=True) + cost_infra = f_infra(blade_length) + + # Multiply by 4x for 3 blades + 1 tower + calculate_costs_output_dict["transport_cost_usd"] = 4 * cost_per_blade * n_turb + cost_infra + + calculate_costs_output_dict["transport_cost_output_df"] = pd.DataFrame( + [["Other", calculate_costs_output_dict["transport_cost_usd"], "Transport"]], + columns=["Type of cost", "Cost USD", "Phase of construction"], + ) + + calculate_costs_output_dict["total_transport_cost"] = calculate_costs_output_dict["transport_cost_output_df"] + + return calculate_costs_output_dict["transport_cost_output_df"] + + def outputs_for_detailed_tab(self, input_dict, output_dict): + """ + Creates a list of dictionaries which can be used on their own or + used to make a dataframe. + + Must be called after self.run_module() + + Returns + ------- + list(dict) + A list of dicts, with each dict representing a row of the data. + """ + result = [] + module = type(self).__name__ + + for row in self.output_dict["transport_cost_output_df"].itertuples(): + dashed_row = "{} <--> {} <--> {}".format(row[1], row[3], np.ceil(row[2])) + result.append( + { + "unit": "", + "type": "dataframe", + "variable_df_key_col_name": "Type of Cost <--> Phase of Construction <--> Cost in USD ", + "value": dashed_row, + "last_number": row[2], + } + ) + + for _dict in result: + _dict["project_id_with_serial"] = self.project_name + _dict["module"] = module + + self.output_dict["transport_cost_csv"] = result + return result + + def run_module(self): + """ + Runs the TransportCost module and populates the IO dictionaries with calculated values. + + Parameters + ---------- + + + Returns + ------- + tuple + First element of tuple contains a 0 or 1. 0 means no errors happened and + 1 means an error happened and the module failed to run. The second element + either returns a 0 if the module ran successfully, or it returns the error + raised that caused the failure. + + """ + try: + self.calculate_costs(self.input_dict, self.output_dict) + self.outputs_for_detailed_tab(self.input_dict, self.output_dict) + # self.outputs_for_module_type_operation(self.input_dict, self.output_dict) + self.output_dict["transport_module_type_operation"] = self.outputs_for_costs_by_module_type_operation( + input_df=self.output_dict["transport_cost_output_df"], + project_id=self.project_name, + total_or_turbine=True, + ) + return 0, 0 + except Exception as error: + traceback.print_exc() + print(f"Fail {self.project_name} TransportCost") + return 1, error diff --git a/WISDEM/wisdem/landbosse/model/WeatherDelay.py b/WISDEM/wisdem/landbosse/model/WeatherDelay.py index 029e09bf1..971162989 100644 --- a/WISDEM/wisdem/landbosse/model/WeatherDelay.py +++ b/WISDEM/wisdem/landbosse/model/WeatherDelay.py @@ -60,7 +60,7 @@ def __init__(self, input_dict, output_dict): self.input_dict = input_dict self.output_dict = output_dict self.validate_inputs(self.input_dict) - self.output_dict["wind_delays"] = self.calculate_wind_delay() + self.output_dict['wind_delays'] = self.calculate_wind_delay() def validate_inputs(self, input_dict): """ @@ -80,16 +80,16 @@ def validate_inputs(self, input_dict): If one of the keys is missing, this method raises a ValueError """ required_keys = { - "start_delay_hours", - "mission_time_hours", - "critical_wind_speed_m_per_s", - "wind_height_of_interest_m", - "wind_shear_exponent", - "weather_window", + 'start_delay_hours', + 'mission_time_hours', + 'critical_wind_speed_m_per_s', + 'wind_height_of_interest_m', + 'wind_shear_exponent', + 'weather_window' } found_keys = set(input_dict.keys()) if len(required_keys - found_keys) > 0: - err_msg = "{}: did not find all required keys in inputs dictionary. Missing keys are {}" + err_msg = '{}: did not find all required keys in inputs dictionary. Missing keys are {}' raise ValueError(err_msg.format(type(self).__name__, required_keys - found_keys)) def calculate_wind_delay(self): @@ -115,20 +115,20 @@ def calculate_wind_delay(self): # following lines shorter. Also, the keys on the input # dictionary have units but the lines below do not have units in # the variable names. - start_delay = self.input_dict["start_delay_hours"] - mission_time = self.input_dict["mission_time_hours"] - critical_wind_speed = self.input_dict["critical_wind_speed_m_per_s"] - wind_height_of_interest_m = self.input_dict["wind_height_of_interest_m"] - wind_shear_exponent = self.input_dict["wind_shear_exponent"] - weather_window = self.input_dict["weather_window"] + start_delay = self.input_dict['start_delay_hours'] + mission_time = self.input_dict['mission_time_hours'] + critical_wind_speed = self.input_dict['critical_wind_speed_m_per_s'] + wind_height_of_interest_m = self.input_dict['wind_height_of_interest_m'] + wind_shear_exponent = self.input_dict['wind_shear_exponent'] + weather_window = self.input_dict['weather_window'] # Extract only the 'Speed m per s' as a dataframe, and only retain # elements where index is > start_delay and < mission_time - wind_speeds_m_s = weather_window["Speed m per s"].values + wind_speeds_m_s = weather_window['Speed m per s'].values # check if mission time exceeds size of weather window if mission_time > len(wind_speeds_m_s): - raise ValueError("{}: Error: Mission time longer than weather window".format(type(self).__name__)) - wind_speeds_m_s_filtered = wind_speeds_m_s[(start_delay + 1) : (int(mission_time) + 1)] + raise ValueError('{}: Error: Mission time longer than weather window'.format(type(self).__name__)) + wind_speeds_m_s_filtered = wind_speeds_m_s[(start_delay + 1):(int(mission_time) + 1)] # Calculate the wind speed at the particular, given the wind shear exponent wind_speed_at_height_m_s = wind_speeds_m_s_filtered * (wind_height_of_interest_m / 100) ** wind_shear_exponent @@ -151,6 +151,7 @@ def calculate_wind_delay(self): # to a small set. if np.any(wind_delays): + # Holds the list of delay durations delay_durations = [] @@ -207,7 +208,8 @@ def run_module(self): 0 if the module ran without errors. 1 if there was an error. """ try: - self.output_dict["wind_delay"] = self.calculate_wind_delay() - return 0 # module ran successfully + self.output_dict['wind_delay'] = self.calculate_wind_delay() + return 0 # module ran successfully except: - return 1 # module did not run successfully + return 1 # module did not run successfully + diff --git a/WISDEM/wisdem/landbosse/model/__init__.py b/WISDEM/wisdem/landbosse/model/__init__.py index 5627459d7..8bb639f96 100644 --- a/WISDEM/wisdem/landbosse/model/__init__.py +++ b/WISDEM/wisdem/landbosse/model/__init__.py @@ -1,11 +1,11 @@ +from wisdem.landbosse.model.ManagementCost import ManagementCost from wisdem.landbosse.model.Manager import Manager -from wisdem.landbosse.model.ErectionCost import ErectionCost from wisdem.landbosse.model.WeatherDelay import WeatherDelay -from wisdem.landbosse.model.CollectionCost import Array, Cable, ArraySystem from wisdem.landbosse.model.FoundationCost import FoundationCost -from wisdem.landbosse.model.ManagementCost import ManagementCost +from wisdem.landbosse.model.ErectionCost import ErectionCost +from wisdem.landbosse.model.SitePreparationCost import SitePreparationCost from wisdem.landbosse.model.SubstationCost import SubstationCost -from wisdem.landbosse.model.DevelopmentCost import DevelopmentCost from wisdem.landbosse.model.GridConnectionCost import GridConnectionCost -from wisdem.landbosse.model.SitePreparationCost import SitePreparationCost +from wisdem.landbosse.model.CollectionCost import Cable, Array, ArraySystem +from wisdem.landbosse.model.DevelopmentCost import DevelopmentCost from wisdem.landbosse.model.DefaultMasterInputDict import DefaultMasterInputDict diff --git a/WISDEM/wisdem/library/landbosse/ge15_expected_validation.xlsx b/WISDEM/wisdem/library/landbosse/ge15_expected_validation.xlsx index b804fac0f..dcf1ec6f4 100644 Binary files a/WISDEM/wisdem/library/landbosse/ge15_expected_validation.xlsx and b/WISDEM/wisdem/library/landbosse/ge15_expected_validation.xlsx differ diff --git a/WISDEM/wisdem/library/landbosse/ge15_public.xlsx b/WISDEM/wisdem/library/landbosse/ge15_public.xlsx index 60f082941..2ea83dc19 100644 Binary files a/WISDEM/wisdem/library/landbosse/ge15_public.xlsx and b/WISDEM/wisdem/library/landbosse/ge15_public.xlsx differ diff --git a/WISDEM/wisdem/moorpy/Catenary.py b/WISDEM/wisdem/moorpy/Catenary.py deleted file mode 100644 index 0801005cf..000000000 --- a/WISDEM/wisdem/moorpy/Catenary.py +++ /dev/null @@ -1,1268 +0,0 @@ -import numpy as np -import matplotlib.pyplot as plt -from matplotlib import cm - -# import wisdem.moorpy.MoorSolve as msolve -from wisdem.moorpy.helpers import CatenaryError, dsolve2 - - -def catenary(XF, ZF, L, EA, W, CB=0, HF0=0, VF0=0, Tol=0.000001, nNodes=20, MaxIter=100, plots=0): - """ - The quasi-static mooring line solver. Adapted from catenary subroutine in FAST v7 by J. Jonkman. - Note: this version is updated Oct 7 2020 to use the dsolve solver. - - Parameters - ---------- - XF : float - Horizontal distance from end 1 to end 2 [m] - ZF : float - Vertical distance from end 1 to end 2 [m] (positive up) - L : float - Unstretched length of line [m] - EA : float - Extensional stiffness of line [N] - W : float - Weight of line in fluid per unit length [N/m] - CB : float, optional - If positive, coefficient of seabed static friction drag. If negative, no seabed contact and the value is the distance down from end A to the seabed in m\ - NOTE: friction (CV > 0) should only be applied when end A of the line is at an anchor, otherwise assumptions are violated. - HF0 : float, optional - Horizontal fairlead tension. If zero or not provided, a guess will be calculated. - VF0 : float, optional - Vertical fairlead tension. If zero or not provided, a guess will be calculated. - - Tol : float, optional - Convergence tolerance within Newton-Raphson iteration specified as an absolute displacement error - nNodes : int, optional - Number of nodes to describe the line - MaxIter: int, optional - Maximum number of iterations to try before resetting to default ICs and then trying again - plots : int, optional - 1: plot output, 0: don't - - - Returns - ------- - : tuple - (end 1 horizontal tension, end 1 vertical tension, end 2 horizontal tension, end 2 vertical tension, info dictionary) [N] (positive up) - - """ - - # make info dict to contain any additional outputs - info = dict(error=False) - - info[ - "call" - ] = f"catenary({XF}, {ZF}, {L}, {EA}, {W}, CB={CB}, HF0={HF0}, VF0={VF0}, Tol={Tol}, MaxIter={MaxIter}, plots=1)" - - # make some arrays if needed for plotting each node - if plots > 0: - s = np.linspace( - 0, L, nNodes - ) # Unstretched arc distance along line from anchor to each node where the line position and tension can be output (meters) - Xs = np.zeros(nNodes) # Horizontal locations of each line node relative to the anchor (meters) - Zs = np.zeros(nNodes) # Vertical locations of each line node relative to the anchor (meters) - Te = np.zeros(nNodes) # Effective line tensions at each node (N) - - # flip line in the solver if it is buoyant - if W < 0: - W = -W - ZF = -ZF - CB = -10000.0 # <<< TODO: set this to the distance to sea surface <<< - flipFlag = True - else: - flipFlag = False - - # reverse line in the solver if end A is above end B - if ZF < 0: - ZF = -ZF - reverseFlag = True - else: - reverseFlag = False - - # ensure the input variables are realistic - if XF < 0.0: - raise CatenaryError("XF is negative!") - if L <= 0.0: - breakpoint() - raise CatenaryError("L is zero or negative!") - if EA <= 0.0: - raise CatenaryError("EA is zero or negative!") - - # Solve for the horizontal and vertical forces at the fairlead (HF, VF) and at the anchor (HA, VA) - - # There are many "ProfileTypes" of a mooring line and each must be analyzed separately (1-3 are consistent with FAST v7) - # ProfileType=0: Entire line is on seabed - # ProfileType=1: No portion of the line rests on the seabed - # ProfileType=2: A portion of the line rests on the seabed and the anchor tension is nonzero - # ProfileType=3: A portion of the line must rest on the seabed and the anchor tension is zero - # ProfileType=4: The line is negatively buoyant, seabed interaction is enabled, and the line - # is longer than a full L between end points (including stretching) i.e. it is horizontal - # along the seabed from the anchor, then vertical to the fairlead. Computes the maximum - # stretched length of the line with seabed interaction beyond which the line would have to - # double-back on itself; the line forms an "L" between the anchor and fairlead. Then it - # models it as bunched up on the seabed (instead of throwing an error) - # ProfileType=5: Similar to above but both ends are off seabed, so it's U shaped and fully slack - # ProfileType=6: Completely vertical line that is off the seabed (on the seabed is handled by 4 and 5) - - EA_W = EA / W - - # calculate the unstretched length that would be hanging if the line was fully slack (vertical down to flat on the seabed) - if CB < 0: # free floating (potentially U shaped case) - LHanging1 = np.sqrt(2.0 * (-CB) * EA_W + EA_W * EA_W) - EA_W # unstretched hanging length at end A - LHanging2 = np.sqrt(2.0 * (ZF - CB) * EA_W + EA_W * EA_W) - EA_W # unstretched hanging length at end B - LHanging = LHanging1 + LHanging2 - else: # at least one end on seabed - LHanging = ( - np.sqrt(2.0 * ZF * EA_W + EA_W * EA_W) - EA_W - ) # unstretched length of line hanging vertically to seabed - - # calculate a vertical stiffness estimate for an end lifting off the seabed - def dV_dZ_s(z0, H): # height off seabed to evaluate at (infinite if 0), horizontal tension - # return W*(z0*W/H + 1)/np.sqrt( (z0*W/H + 1)**2 - 1) # inelastic apprxoimation - return W # returning a fully slack line approximation, - # because a large value here risks adding a bad cross coupling term in the system stiffness matrix - - # ProfileType 0 case - entirely along seabed - if ZF == 0.0 and CB >= 0.0 and W > 0: - ProfileType = 0 - - if CB == 0 or XF <= L: # case 1: no friction, or zero tension - HF = np.max([0, (XF / L - 1.0) * EA]) - HA = 1.0 * HF - elif ( - 0.5 * L + EA / CB / W * (1 - XF / L) <= 0 - ): # case 2: seabed friction but tension at anchor (xB estimate < 0) - HF = (XF / L - 1.0) * EA + 0.5 * CB * W * L - HA = np.max([0.0, HF - CB * W * L]) - else: # case 3: seabed friction and zero anchor tension - HF = np.sqrt(2 * EA * CB * W * (XF - L)) - HA = 0.0 - - VF = 0.0 - VA = 0.0 - - if HF > 0: # if taut - dHF_dXF = EA / L # approximation <<< what about friction? <<<<<<<< - # dVF_dZF = W + HF/L # vertical stiffness <<< approximation a - dVF_dZF = dV_dZ_s(Tol, HF) # vertical stiffness <<< approximation b - else: # if slack - dHF_dXF = 0.0 - dVF_dZF = W # vertical stiffness - - info[ - "HF" - ] = HF # solution to be used to start next call (these are the solved variables, may be for anchor if line is reversed) - info["VF"] = 0.0 - info["stiffnessB"] = np.array([[dHF_dXF, 0.0], [0.0, dVF_dZF]]) - info["stiffnessA"] = np.array([[dHF_dXF, 0.0], [0.0, dVF_dZF]]) - info["stiffnessAB"] = np.array([[-dHF_dXF, 0.0], [0.0, 0.0]]) - info["LBot"] = L - info["ProfileType"] = 0 - info["Zextreme"] = 0 - - if plots > 0: - if CB > 0 and XF > L: - xB = L - HF / W / CB # location of point at which line tension reaches zero - else: - xB = 0.0 - - # z values remain zero in this case - - if CB == 0 or XF <= L: # case 1: no friction, or zero tension - Xs = XF / L * s # X values uniformly distributed - Te = Te + np.max([0, (XF / L - 1.0) * EA]) # uniform tension - elif xB <= 0: # case 2: seabed friction but tension at anchor - Xs = s * (1 + CB * W / EA * (0.5 * s - xB)) - Te = HF + CB * W * (s - L) - else: # case 3: seabed friction and zero anchor tension - for I in range(nNodes): - if s[I] <= xB: # if this node is in the zero tension range - Xs[I] = s[I] - # x is unstretched, z and Te remain zero - - else: # the tension is nonzero - Xs[I] = s[I] + CB * W / EA * (s[I] - xB) ** 2 - Te[I] = HF - CB * W * (L - s[I]) - - # ProfileType 4 case - fully slack - elif (W > 0.0) and (L >= XF + LHanging): - if CB >= 0.0: # one end on seabed - ProfileType = 4 - # this is a special case that requires no iteration - - HF = 0.0 - VF = W * LHanging - HA = 0.0 - VA = 0.0 - - dVF_dZF = W / np.sqrt(2.0 * ZF / EA_W + 1.0) # vertical stiffness - - info[ - "HF" - ] = HF # solution to be used to start next call (these are the solved variables, may be for anchor if line is reversed) - info["VF"] = VF - info["stiffnessB"] = np.array([[0.0, 0.0], [0.0, dVF_dZF]]) - info["stiffnessA"] = np.array([[0.0, 0.0], [0.0, W]]) - info["stiffnessAB"] = np.array([[0.0, 0.0], [0.0, 0.0]]) - info["LBot"] = L - LHanging - info["ProfileType"] = 4 - info["Zextreme"] = 0 - - if plots > 0: - for I in range(nNodes): - if s[I] > L - LHanging: # this node is on the suspended/hanging portion of the line - Xs[I] = XF - Zs[I] = ZF - (L - s[I] + 0.5 * W / EA * (L - s[I]) ** 2) - Te[I] = W * (s[I] - (L - LHanging)) - - else: # this node is on the seabed - Xs[I] = np.min([s[I], XF]) - Zs[I] = 0.0 - Te[I] = 0.0 - - else: # U shaped - ProfileType = 5 - - HF = 0.0 - VF = W * LHanging2 - HA = 0.0 - VA = -W * LHanging1 - - dVF_dZF = W / np.sqrt(2.0 * ZF / EA_W + 1.0) # vertical stiffness - - info[ - "HF" - ] = HF # solution to be used to start next call (these are the solved variables, may be for anchor if line is reversed) - info["VF"] = VF - info["stiffnessB"] = np.array([[0.0, 0.0], [0.0, W / np.sqrt(2.0 * (ZF - CB) / EA_W + 1.0)]]) - info["stiffnessA"] = np.array([[0.0, 0.0], [0.0, W / np.sqrt(2.0 * (-CB) / EA_W + 1.0)]]) - info["stiffnessAB"] = np.array([[0.0, 0.0], [0.0, 0.0]]) - info["LBot"] = L - LHanging - info["ProfileType"] = 5 - info["Zextreme"] = CB - - if plots > 0: - for I in range(nNodes): - if s[I] < LHanging1: # the 1st suspended/hanging portion of the line - Xs[I] = 0.0 - Zs[I] = -s[I] - W / EA * (LHanging1 * s[I] - 0.5 * s[I] ** 2) - Te[I] = W * s[I] - - elif s[I] <= L - LHanging2: # the middle portion of the line, slack along the seabed - Xs[I] = (s[I] - LHanging1) * XF / (L - LHanging1 - LHanging2) - Zs[I] = CB - Te[I] = 0.0 - - else: # the 2nd suspended/hanging portion of the line - Lms = L - s[I] # distance from end B - Xs[I] = XF - Zs[I] = ZF - Lms - W / EA * (LHanging2 * Lms - 0.5 * Lms**2) - Te[I] = W * Lms - - # ProfileType 6 case - vertical line without seabed contact - elif XF == 0: - ProfileType = 6 - - dz_hanging = L + 0.5 * W / EA * L**2 # stretched length if it was hanging from one end - - # slack case - if dz_hanging >= ZF: - # figure out how line will hang - LB = (ZF + L + W * L**2 / 2 / EA) / ( - 2 + W * L / EA - ) # unstretched length of line from lowest point up to end B - hB = LB + W / 2 / EA * LB**2 # stretched of the above - LA = L - LB - hA = hB - ZF - - HF = 0.0 - VF = W * LB - HA = 0.0 - VA = W * LA - - info[ - "HF" - ] = HF # solution to be used to start next call (these are the solved variables, may be for anchor if line is reversed) - info["VF"] = VF - info["stiffnessB"] = np.array([[0.0, 0.0], [0.0, 0.5 * W]]) - info["stiffnessA"] = np.array([[0.0, 0.0], [0.0, 0.5 * W]]) - info["stiffnessAB"] = np.array([[-0.0, 0.0], [0.0, -0.5 * W]]) - info["LBot"] = 0.0 - info["ProfileType"] = 6 - info["Zextreme"] = -hA - - if plots > 0: - for I in range(nNodes): - if s[I] < LA: # the 1st suspended/hanging portion of the line - Xs[I] = 0.0 - Zs[I] = -s[I] - W / EA * (LA * s[I] - 0.5 * s[I] ** 2) - Te[I] = W * (LA - s[I]) - else: # the 2nd suspended/hanging portion of the line - Lms = L - s[I] # distance from end B - Xs[I] = XF - Zs[I] = ZF - Lms - W / EA * (LB * Lms - 0.5 * Lms**2) - Te[I] = W * (s[I] - LA) - - # taut case - else: - # figure out how line will hang - LB = (ZF + L + W * L**2 / 2 / EA) / ( - 2 + W * L / EA - ) # unstretched length of line from lowest point up to end B - hB = LB + W / 2 / EA * LB**2 # stretched of the above - LA = L - LB - hA = hB - ZF - - uniform_strain = ( - ZF - dz_hanging - ) / L # the constrant strain due only to stretch - to be added to weight-based strain - Tstretch = uniform_strain * EA # the constant tension component to be added to weight-based tension - - HF = 0.0 - VF = Tstretch + W * L - HA = 0.0 - VA = Tstretch - - info[ - "HF" - ] = HF # solution to be used to start next call (these are the solved variables, may be for anchor if line is reversed) - info["VF"] = VF - info["stiffnessB"] = np.array([[Tstretch / ZF, 0.0], [0.0, EA / L]]) - info["stiffnessA"] = np.array([[Tstretch / ZF, 0.0], [0.0, EA / L]]) - info["stiffnessAB"] = np.array([[-Tstretch / ZF, 0.0], [0.0, -EA / L]]) - info["LBot"] = 0.0 - info["ProfileType"] = 6 - info["Zextreme"] = 0 - - if plots > 0: - for I in range(nNodes): - Lms = L - s[I] # distance from end B - Xs[I] = 0.0 - Zs[I] = ZF - Lms * L * uniform_strain - W / EA * (L * Lms - 0.5 * Lms**2) - Te[I] = Tstretch + W * s[I] - - # Use an iterable solver function to solve for the forces on the line - else: - # Initialize some commonly used terms that don't depend on the iteration: - - WL = W * L - WEA = W * EA - L_EA = L / EA - CB_EA = CB / EA - # MaxIter = 50 #int(1.0/Tol) # Smaller tolerances may take more iterations, so choose a maximum inversely proportional to the tolerance - - # more initialization - I = 1 # Initialize iteration counter - FirstIter = 1 # 1 means first attempt (can be retried), 0 means it's alread been retried, -1 triggers a retry - - # make HF and VF initial guesses if either was provided as zero <<<<<<<<<<<< why does it matter if VF0 is zero?? - if HF0 <= 0 or VF0 <= 0: - XF2 = XF * XF - ZF2 = ZF * ZF - - if L <= np.sqrt(XF2 + ZF2): # if the current mooring line is taut - Lamda0 = 0.2 - else: # The current mooring line must be slack and not vertical - Lamda0 = np.sqrt(3.0 * ((L * L - ZF2) / XF2 - 1.0)) - - HF = np.max([abs(0.5 * W * XF / Lamda0), Tol]) - # ! As above, set the lower limit of the guess value of HF to the tolerance - VF = 0.5 * W * (ZF / np.tanh(Lamda0) + L) - else: - HF = 1.0 * HF0 - VF = 1.0 * VF0 - - # >>> note, the above Tol uses should be adjusted now that I've changed it to be absolute and distance <<< - - # make sure required values are non-zero - HF = np.max([HF, Tol]) - XF = np.max([XF, Tol]) - ZF = np.max([ZF, Tol]) - - # some initial values just for printing before they're filled in - EXF = 0 - EZF = 0 - - # Solve the analytical, static equilibrium equations for a catenary (or taut) mooring line with seabed interaction: - X0 = [HF, VF] - Ytarget = [0, 0] - args = dict(cat=[XF, ZF, L, EA, W, CB, WL, WEA, L_EA, CB_EA], step=[0.15, 1.0, 1.5]) - # call the master solver function - # X, Y, info2 = msolve.dsolve(eval_func_cat, X0, Ytarget=Ytarget, step_func=step_func_cat, args=args, tol=Tol, maxIter=MaxIter, a_max=1.2) - X, Y, info2 = dsolve2( - eval_func_cat, - X0, - Ytarget=Ytarget, - step_func=step_func_cat, - args=args, - ytol=Tol, - stepfac=1, - maxIter=MaxIter, - a_max=1.2, - ) - - # retry if it failed - if info2["iter"] >= MaxIter - 1 or info2["oths"]["error"] == True or np.linalg.norm(info2["err"]) > 10 * Tol: - # ! Perhaps we failed to converge because our initial guess was too far off. - # (This could happen, for example, while linearizing a model via large - # pertubations in the DOFs.) Instead, use starting values documented in: - # Peyrot, Alain H. and Goulois, A. M., "Analysis Of Cable Structures," - # Computers & Structures, Vol. 10, 1979, pp. 805-813: - # NOTE: We don't need to check if the current mooring line is exactly - # vertical (i.e., we don't need to check if XF == 0.0), because XF is - # limited by the tolerance above. */ - - if ( - info2["iter"] >= MaxIter - 1 and XF / ZF < 0.001 - ): # if it's nearly vertical, keep iterating from the last point - HF = X[0] - VF = X[1] - else: # otherwise try starting from some good initial guesses - if L <= np.sqrt(XF**2 + ZF**2): # if the current mooring line is taut - Lamda0 = 0.2 - else: # The current mooring line must be slack and not vertical - Lamda0 = np.sqrt(3.0 * ((L * L - ZF**2) / XF**2 - 1.0)) - - HF = np.max( - [abs(0.5 * W * XF / Lamda0), Tol] - ) # As above, set the lower limit of the guess value of HF to the tolerance - VF = 0.5 * W * (ZF / np.tanh(Lamda0) + L) - - X0 = [HF, VF] - Ytarget = [0, 0] - args = dict( - cat=[XF, ZF, L, EA, W, CB, WL, WEA, L_EA, CB_EA], step=[0.1, 0.8, 1.5] - ) # step: alpha_min, alpha0, alphaR - # call the master solver function - # X, Y, info3 = msolve.dsolve(eval_func_cat, X0, Ytarget=Ytarget, step_func=step_func_cat, args=args, tol=Tol, maxIter=MaxIter, a_max=1.1) #, dX_last=info2['dX']) - X, Y, info3 = dsolve2( - eval_func_cat, - X0, - Ytarget=Ytarget, - step_func=step_func_cat, - args=args, - ytol=Tol, - stepfac=1, - maxIter=MaxIter, - a_max=1.2, - ) - - # retry if it failed - if info3["iter"] >= MaxIter - 1 or info3["oths"]["error"] == True: - X0 = X - Ytarget = [0, 0] - args = dict(cat=[XF, ZF, L, EA, W, CB, WL, WEA, L_EA, CB_EA], step=[0.1, 1.0, 2.0]) - # call the master solver function - # X, Y, info4 = msolve.dsolve(eval_func_cat, X0, Ytarget=Ytarget, step_func=step_func_cat, args=args, tol=Tol, maxIter=10*MaxIter, a_max=1.15) #, dX_last=info3['dX']) - X, Y, info4 = dsolve2( - eval_func_cat, - X0, - Ytarget=Ytarget, - step_func=step_func_cat, - args=args, - ytol=Tol, - stepfac=1, - maxIter=MaxIter, - a_max=1.2, - ) - - # check if it failed - if info4["iter"] >= 10 * MaxIter - 1 or info4["oths"]["error"] == True: - print("catenary solve failed on all 3 attempts.") - print( - f"catenary({XF}, {ZF}, {L}, {EA}, {W}, CB={CB}, HF0={HF0}, VF0={VF0}, Tol={Tol}, MaxIter={MaxIter}, plots=1)" - ) - - print("First attempt's iterations are as follows:") - for i in range(info2["iter"] + 1): - print( - f" Iteration {i}: HF={info2['Xs'][i,0]: 8.4e}, VF={info2['Xs'][i,1]: 8.4e}, EX={info2['Es'][i,0]: 6.2e}, EZ={info2['Es'][i,1]: 6.2e}" - ) - - print("Second attempt's iterations are as follows:") - for i in range(info3["iter"] + 1): - print( - f" Iteration {i}: HF={info3['Xs'][i,0]: 8.4e}, VF={info3['Xs'][i,1]: 8.4e}, EX={info3['Es'][i,0]: 6.2e}, EZ={info3['Es'][i,1]: 6.2e}" - ) - - print("Last attempt's iterations are as follows:") - for i in range(info4["iter"] + 1): - print( - f" Iteration {i}: HF={info4['Xs'][i,0]: 8.4e}, VF={info4['Xs'][i,1]: 8.4e}, EX={info4['Es'][i,0]: 6.2e}, EZ={info4['Es'][i,1]: 6.2e}" - ) - - """ - # plot solve performance - fig, ax = plt.subplots(4,1, sharex=True) - ax[0].plot(np.hstack([info2['Xs'][:,0], info3['Xs'][:,0], info4['Xs'][:,0]])) - ax[1].plot(np.hstack([info2['Xs'][:,1], info3['Xs'][:,1], info4['Xs'][:,1]])) - ax[2].plot(np.hstack([info2['Es'][:,0], info3['Es'][:,0], info4['Es'][:,0]])) - ax[3].plot(np.hstack([info2['Es'][:,1], info3['Es'][:,1], info4['Es'][:,1]])) - ax[0].set_ylabel("HF") - ax[1].set_ylabel("VF") - ax[2].set_ylabel("X err") - ax[3].set_ylabel("Z err") - - # plot solve path - plt.figure() - - #c = np.hypot(info2['Es'][:,0], info2['Es'][:,1]) - - - c = np.arange(info2['iter']+1) - c = cm.jet((c-np.min(c))/(np.max(c)-np.min(c))) - - for i in np.arange(info2['iter']): - plt.plot(info2['Xs'][i:i+2,0], info2['Xs'][i:i+2,1],":", c=c[i]) - plt.plot(info2['Xs'][0,0], info2['Xs'][0,1],"o") - - c = np.arange(info3['iter']+1) - c = cm.jet((c-np.min(c))/(np.max(c)-np.min(c))) - - for i in np.arange(info3['iter']): - plt.plot(info3['Xs'][i:i+2,0], info3['Xs'][i:i+2,1], c=c[i]) - plt.plot(info3['Xs'][0,0], info3['Xs'][0,1],"*") - - c = np.arange(info4['iter']+1) - c = cm.jet((c-np.min(c))/(np.max(c)-np.min(c))) - - for i in np.arange(info4['iter']): - plt.plot(info4['Xs'][i:i+2,0], info4['Xs'][i:i+2,1], c=c[i]) - plt.plot(info4['Xs'][0,0], info4['Xs'][0,1],"*") - - plt.title("catenary solve path for troubleshooting") - plt.show() - - #breakpoint() - """ - raise CatenaryError("catenary solver failed.") - - else: # if the solve was successful, - info.update(info4["oths"]) # copy info from last solve into existing info dictionary - info["catenary"] = info4 - - else: # if the solve was successful, - info.update(info3["oths"]) # copy info from last solve into existing info dictionary - info["catenary"] = info3 - else: # if the solve was successful, - info.update(info2["oths"]) # copy info from last solve into existing info dictionary - info["catenary"] = info2 - - # check for errors ( WOULD SOME NOT ALREADY HAVE BEEN CAUGHT AND RAISED ALREADY?) - if info["error"] == True: - # breakpoint() - # >>>> what about errors for which we can first plot the line profile?? <<<< - raise CatenaryError("Error in catenary computations: " + info["message"]) - - # if info['Zextreme'] < CB: - # info["warning"] = "Line is suspended from both ends but hits the seabed (this isn't allowed in MoorPy)" - - ProfileType = info["ProfileType"] - HF = X[0] - VF = X[1] - HA = info["HA"] - VA = info["VA"] - - # --- now that the iterative solve is over, check some things on the results, handle plotting, etc. --- - - # compute the Zextreme value - for a freely suspended line, if necessary, check to ensure the line doesn't droop and hit the seabed - if ( - info["ProfileType"] == 1 and CB < 0 and VF - WL < 0.0 - ): # only need to do this if the line is slack (has zero slope somewhere) - VFMinWL = VF - WL - LBot = L - VF / W - # unstretched length of line resting on seabed (Jonkman's PhD eqn 2-38), LMinVFOVrW - HF_W = HF / W - HF_WEA = HF / WEA - VF_WEA = VF / WEA - VF_HF = VF / HF - VFMinWL_HF = VFMinWL / HF - VF_HF2 = VF_HF * VF_HF - VFMinWL_HF2 = VFMinWL_HF * VFMinWL_HF - SQRT1VF_HF2 = np.sqrt(1.0 + VF_HF2) - SQRT1VFMinWL_HF2 = np.sqrt(1.0 + VFMinWL_HF2) - - # this is indicated by the anchor force having a positive value, meaning it's helping hold up the line - info["Sextreme"] = L - VF / W # arc length where slope is zero - info["Zextreme"] = ( - 1 - SQRT1VFMinWL_HF2 - ) * HF_W - 0.5 * VFMinWL**2 / WEA # max or min line elevation (where slope=0) - info["Xextreme"] = (-np.log(VFMinWL_HF + SQRT1VFMinWL_HF2)) * HF_W + HF * info["Sextreme"] / EA - else: - info["Sextreme"] = 0.0 - info["Zextreme"] = 0.0 - info["Xextreme"] = 0.0 - - # handle special case of a U-shaped line that has seabed contact (using 2 new catenary solves) - if info["ProfileType"] == 1 and info["Zextreme"] < min(CB, 0): - # we will solve this as two separate lines to form the U shape - info["ProfileType"] = "U" - ProfileType = "U" - - X1_0 = info["Xextreme"] # define fake anchor point as lowest point of line (if the seabed wasn't there) - X2_0 = XF - X1_0 - L1 = info["Sextreme"] - L2 = L - L1 - Z1 = CB # negative of height from seabed to original 'anchor' end [m] - Z2 = -Z1 + ZF # height from seabed to fairlead end - - # set up a 1D solve for the correct choice of the anchor point so that horizontal tensions balance - - def eval_func_U(X, args): - info = dict(error=False) - - X1 = X[0] - X2 = XF - X1 - - # note: reducing tolerances for these sub-calls <<< how much is good? <<< - (fAH1, fAV1, fBH1, fBV1, info1) = catenary(X1, Z1, L1, EA, W, CB=0, Tol=0.5 * Tol, MaxIter=MaxIter) - (fAH2, fAV2, fBH2, fBV2, info2) = catenary(X2, Z2, L2, EA, W, CB=0, Tol=0.5 * Tol, MaxIter=MaxIter) - - Himbalance = fBH2 - fBH1 - - K1 = info1[ - "stiffnessA" - ] # note: this refers to the upper end of this half of the line (since it is called with Z<0) - K2 = info2["stiffnessB"] - - info["dH_dX"] = ( - K1[0, 0] + K2[0, 0] - ) # horizontal stiffness on connection point on seabed between two line portions - - # print(f" X1 = {X1}, H1 = {fBH1}, H2 = {fBH2}, err={Himbalance}, dH/dX = {info['dH_dX']}")\ - # breakpoint() - - return np.array([Himbalance]), info, False # returns Y value, misc dict, and stop flag - - def step_func_U(X, args, Y, info, Ytarget, err, tols, iter, maxIter): - dX = -err[0] / info["dH_dX"] - - # print(f" Step is {dX}") - - return np.array([dX]) # returns dX (step to make) - - # call this to solve for line shapes that balance the horizontal tension in the line - X, Y, infoU = dsolve2( - eval_func_U, [X1_0], step_func=step_func_U, ytol=0.25 * Tol, stepfac=1, maxIter=20, a_max=1.2, display=0 - ) - X1 = X[0] - X2 = XF - X1 - nNodes1 = int( - L1 / L * nNodes + 0.5 - ) # set number of nodes in the first line proportionally to its length, rounded. - - # call one more time to get final values - (fAH1, fAV1, fBH1, fBV1, info1) = catenary( - X1, Z1, L1, EA, W, CB=0, Tol=0.5 * Tol, MaxIter=MaxIter, plots=plots, nNodes=nNodes1 - ) - (fAH2, fAV2, fBH2, fBV2, info2) = catenary( - X2, Z2, L2, EA, W, CB=0, Tol=0.5 * Tol, MaxIter=MaxIter, plots=plots, nNodes=nNodes - nNodes1 - ) - - if plots > 0 or (info1["error"] and info2["error"]): - s = np.hstack([info1["s"], info2["s"] + L1]) - Xs = np.hstack([info1["X"], info2["X"] + X1]) - Zs = np.hstack([info1["Z"], info2["Z"] + Z1]) - Te = np.hstack([info1["Te"], info2["Te"]]) - - # re-reverse line distributed data back to normal if applicable - """ - if reverseFlag: - info['s'] = L - info['s' ][::-1] - info['X'] = XF - info['X' ][::-1] - info['Z'] = info['Z' ][::-1] - ZF # remember ZF still has a flipped sign right now - info['Te'] = info['Te'][::-1] - """ - - if flipFlag: - raise Exception( - "flipFlag connot be True for the case of a U shaped line with seabed contact. Something must be wrong." - ) - - # get stiffnesses (check sign of A!) - K1 = info1[ - "stiffnessA" - ] # note: this refers to the upper end of this half of the line (since it is called with Z<0) - K2 = info2["stiffnessB"] - dH_dX = 1.0 / (1.0 / K1[0, 0] + 1.0 / K2[0, 0]) # = K1[0,0]*K2[0,0]/(K1[0,0] + K2[0,0]) - Kmid = K1[0, 0] + K2[0, 0] # horizontal stiffness on connection point on seabed between two line portions - - dxdH = 1.0 / Kmid # = 1/(K1[0,0] + K2[0,0]) - - info["stiffnessA"] = np.array( - [ - [dH_dX, K1[0, 1] * K2[0, 0] * dxdH], - [K1[1, 0] * K2[0, 0] * dxdH, K1[1, 1] - K1[1, 0] * dxdH * K1[0, 1]], - ] - ) - - info["stiffnessB"] = np.array( - [ - [dH_dX, K2[0, 1] * K1[0, 0] * dxdH], - [K2[1, 0] * K1[0, 0] * dxdH, K2[1, 1] - K2[1, 0] * dxdH * K2[0, 1]], - ] - ) - - info["stiffnessAB"] = np.array( - [ - [ - -K1[0, 0] * K2[0, 0] * dxdH, - K1[0, 1] * K2[0, 0] * dxdH, - ], # this is the lower-left submatrix, A motions, B reaction forces (corrected/flipped sign of entry 0,1) - [-K1[0, 0] * dxdH * K2[1, 0], -K1[0, 1] * dxdH * K2[1, 0]], - ] - ) - - # xA zA xB zB - - info["K"] = np.array( - [ - [ - K1[0, 0] * K2[0, 0] * dxdH, - K1[0, 1] * K2[0, 0] * dxdH, - -K2[0, 0] * K1[0, 0] * dxdH, - -K2[0, 1] * K1[0, 0] * dxdH, - ], # HA - [ - K1[1, 0] * K2[0, 0] * dxdH, - K1[1, 1] - K1[1, 0] * dxdH * K1[0, 1], - -K2[0, 0] * dxdH * K1[1, 0], - -K2[0, 1] * dxdH * K1[1, 0], - ], # VA - [ - -K1[0, 0] * K2[0, 0] * dxdH, - -K1[0, 1] * K2[0, 0] * dxdH, - K2[0, 0] * K1[0, 0] * dxdH, - K2[0, 1] * K1[0, 0] * dxdH, - ], # HB - [ - -K1[0, 0] * dxdH * K2[1, 0], - -K1[0, 1] * dxdH * K2[1, 0], - K2[1, 0] * K1[0, 0] * dxdH, - K2[1, 1] - K2[1, 0] * dxdH * K2[0, 1], - ], - ] - ) # VB - - """ - - \frac{ \pderiv{H_A}{x_A}\pderiv{H_B}{x_B}}{\pderiv{H_A}{x_A}+\pderiv{H_B}{x_B}} - &\frac{ \pderiv{H_A}{z_A}\pderiv{H_B}{x_B}}{\pderiv{H_A}{x_A}+\pderiv{H_B}{x_B}} - &-\frac{\pderiv{H_A}{x_A}\pderiv{H_B}{x_B}}{\pderiv{H_A}{x_A}+\pderiv{H_B}{x_B}} - &-\frac{\pderiv{H_A}{x_A}\pderiv{H_B}{z_B}}{\pderiv{H_A}{x_A}+\pderiv{H_B}{x_B}} \\ - - \frac{ \pderiv{V_A}{x_A}\pderiv{H_B}{x_B}}{\pderiv{H_A}{x_A}+\pderiv{H_B}{x_B}} - &\pderiv{V_A}{z_A} - \frac{ \pderiv{H_A}{z_A}\pderiv{V_A}{x_A}}{\pderiv{H_A}{x_A}+\pderiv{H_B}{x_B}} - &-\frac{\pderiv{V_A}{x_A}\pderiv{H_B}{x_B}}{\pderiv{H_A}{x_A}+\pderiv{H_B}{x_B}} - &-\frac{\pderiv{V_A}{x_A}\pderiv{H_B}{z_B}}{\pderiv{H_A}{x_A}+\pderiv{H_B}{x_B}} \\ - - -\frac{ \pderiv{H_A}{x_A}\pderiv{H_B}{x_B}}{\pderiv{H_A}{x_A}+\pderiv{H_B}{x_B}} - &-\frac{\pderiv{H_A}{z_A}\pderiv{H_B}{x_B}}{\pderiv{H_A}{x_A}+\pderiv{H_B}{x_B}} - &\frac{ \pderiv{H_A}{x_A}\pderiv{H_B}{x_B}}{\pderiv{H_A}{x_A}+\pderiv{H_B}{x_B}} - &\frac{ \pderiv{H_A}{x_A}\pderiv{H_B}{z_B}}{\pderiv{H_A}{x_A}+\pderiv{H_B}{x_B}} \\ - - -\frac{ \pderiv{H_A}{x_A}\pderiv{V_B}{x_B}}{\pderiv{H_A}{x_A}+\pderiv{H_B}{x_B}} - &-\frac{\pderiv{H_A}{z_A}\pderiv{V_B}{x_B}}{\pderiv{H_A}{x_A}+\pderiv{H_B}{x_B}} - &\frac{ \pderiv{H_A}{x_A}\pderiv{V_B}{x_B}}{\pderiv{H_A}{x_A}+\pderiv{H_B}{x_B}} - &\pderiv{V_B}{z_B} - \frac{ \pderiv{H_B}{z_B}\pderiv{V_B}{x_B}}{\pderiv{H_A}{x_A}+\pderiv{H_B}{x_B}} - - - - for a normal line - - \pderiv{H_B}{x_B} &? & -\pderiv{H_B}{x_B} & \pderiv{H_B}{z_B}\\ # HA - ? & ? & 0 & 0 \\ # VA - -\pderiv{H_B}{x_B}+ & 0ish & \pderiv{H_B}{x_B} & \pderiv{H_B}{z_B}\\ # HB - -\pderiv{V_B}{x_B}+ & 0ish & \pderiv{V_B}{x_B} & \pderiv{V_B}{z_B} # VB - - - # sorted - K = np.array([[ dH_dX, K1[0,1] *K2[0,0]*dxdH , -dH_dX, -K2[0,1] *K1[0,0]*dxdH ], # HA - [ K1[1,0] *K2[0,0]*dxdH, K1[1,1] -K1[1,0]*dxdH*K1[0,1], -K2[0,0] *dxdH*K1[1,0], -K2[0,1] *dxdH*K1[1,0] ], # VA - [ -dH_dX, -K1[0,1] *K2[0,0]*dxdH , dH_dX, K2[0,1] *K1[0,0]*dxdH ], # HB - [ -K1[0,0] *dxdH*K2[1,0], -K1[0,1] *dxdH*K2[1,0] , K2[1,0] *K1[0,0]*dxdH, K2[1,1] -K2[1,0]*dxdH*K2[0,1] ]]) # VB - """ - - info["LBot"] = info1["LBot"] + info2["LBot"] - # not very useful outputs for this case: - info["Sextreme"] = L1 - info1["LBot"] - info["Zextreme"] = CB - info["Xextreme"] = X1 - info1["LBot"] - - # FxA = fAH1 - # FzA = fAV1 - # FxB = fBH2 - # FzB = fBV2 - HA = fAH1 - VA = fAV1 - HF = -fBH2 - VF = -fBV2 - - if plots > 3: - plt.plot(Xs, Zs) - plt.show() - - # the normal case - else: - # do plotting-related calculations if needed (plots=1: show plots; plots=2: just return values) - if plots > 0 or info["error"] == True: - # calculate some commonly used terms that depend on HF and VF: AGAIN - VFMinWL = VF - WL - LBot = L - VF / W - # unstretched length of line resting on seabed (Jonkman's PhD eqn 2-38), LMinVFOVrW - HF_W = HF / W - # HF_WEA = HF/WEA - # VF_WEA = VF/WEA - VF_HF = VF / HF - VFMinWL_HF = VFMinWL / HF - VF_HF2 = VF_HF * VF_HF - # VFMinWL_HF2 = VFMinWL_HF*VFMinWL_HF - # SQRT1VF_HF2 = np.sqrt( 1.0 + VF_HF2 ) - SQRT1VFMinWL_HF2 = np.sqrt(1.0 + VFMinWL_HF**2) - - for I in range(nNodes): - # calculate some values for the current node - Ws = W * s[I] - VFMinWLs = VFMinWL + Ws # = VF - W*(L-s[I]) - VFMinWLs_HF = VFMinWLs / HF - s_EA = s[I] / EA - SQRT1VFMinWLs_HF2 = np.sqrt(1.0 + VFMinWLs_HF * VFMinWLs_HF) - - # No portion of the line rests on the seabed - if ProfileType == 1: - Xs[I] = ( - np.log(VFMinWLs_HF + SQRT1VFMinWLs_HF2) - np.log(VFMinWL_HF + SQRT1VFMinWL_HF2) - ) * HF_W + s_EA * HF - Zs[I] = (SQRT1VFMinWLs_HF2 - SQRT1VFMinWL_HF2) * HF_W + s_EA * (VFMinWL + 0.5 * Ws) - Te[I] = np.sqrt(HF * HF + VFMinWLs * VFMinWLs) - - # A portion of the line must rest on the seabed - elif ProfileType in [2, 3]: - if CB > 0: - xB = LBot - HF_W / CB # location of point at which line tension reaches zero - else: - xB = 0.0 - xBlim = max(xB, 0.0) - - if ( - s[I] <= xB and CB > 0 - ): # (aka Lbot - s > HF/(CB*W) ) if this node rests on the seabed and the tension is zero - Xs[I] = s[I] - Zs[I] = 0.0 - Te[I] = 0.0 - - elif s[I] <= LBot: # // .TRUE. if this node rests on the seabed and the tension is nonzero - Xs[I] = s[I] + 0.5 * CB * W / EA * (s[I] * s[I] - 2.0 * xB * s[I] + xB * xBlim) - Zs[I] = 0.0 - Te[I] = HF + CB * VFMinWLs - - else: # // LBot < s <= L ! This node must be above the seabed - Xs[I] = ( - LBot - + HF_W * np.log(VFMinWLs_HF + SQRT1VFMinWLs_HF2) - + HF * s_EA - + 0.5 * CB * W / EA * (-LBot * LBot + xB * xBlim) - ) - Zs[I] = ( - (-1.0 + SQRT1VFMinWLs_HF2) * HF_W - + s_EA * (VFMinWL + 0.5 * Ws) - + 0.5 * VFMinWL * VFMinWL / WEA - ) - Te[I] = np.sqrt(HF * HF + VFMinWLs * VFMinWLs) - - if plots > 0: - # re-reverse line distributed data back to normal if applicable - if reverseFlag: - s = L - s[::-1] - Xs = XF - Xs[::-1] - Zs = Zs[::-1] - ZF # remember ZF still has a flipped sign right now - Te = Te[::-1] - if flipFlag: - Zs = -Zs # flip calculated line Z coordinates (hopefully this is right) - - # save data to info dict - info["X"] = Xs - info["Z"] = Zs - info["s"] = s - info["Te"] = Te - - if plots == 2 or info["error"] == True: # also show the profile plot - plt.figure() - plt.plot(Xs, Zs) - - # get A and AB stiffness matrices for catenary profiles here based on fairlead (B) stiffness matrix - if ProfileType == 1: - info["stiffnessA"] = np.array(info["stiffnessB"]) - info["stiffnessAB"] = -info["stiffnessB"] - - elif ProfileType in [2, 3]: - if CB == 0.0: - info["stiffnessA"] = np.array( - [[info["stiffnessB"][0, 0], 0], [0, dV_dZ_s(Tol, HF)]] - ) # vertical term is very approximate - info["stiffnessAB"] = np.array( - [[-info["stiffnessB"][0, 0], 0], [0, 0]] - ) # note: A and AB stiffnesses for this case only valid if zero friction - else: - info["stiffnessA"] = np.ones([2, 2]) * np.nan # if friction, flag to ensure users don't use this - info["stiffnessAB"] = np.ones([2, 2]) * np.nan # if friction, flag to ensure users don't use this - - # un-swap line ends if they've been previously swapped, and apply global sign convention - # (vertical force positive-up, horizontal force positive from A to B) - if reverseFlag: - ZF = -ZF # put height rise from end A to B back to negative - - FxA = HF - FzA = -VF # VF is positive-down convention so flip sign - FxB = -HA - FzB = VA - - info["stiffnessA"], info["stiffnessB"] = info["stiffnessB"], info["stiffnessA"] # swap A and B - # note: diagonals of AB matrix do not change - - info["stiffnessA"][0, 1] = -info["stiffnessA"][0, 1] # reverse off-diagonal signs - info["stiffnessA"][1, 0] = -info["stiffnessA"][1, 0] - info["stiffnessB"][0, 1] = -info["stiffnessB"][0, 1] - info["stiffnessB"][1, 0] = -info["stiffnessB"][1, 0] - info["stiffnessAB"][0, 1] = -info["stiffnessAB"][ - 0, 1 - ] # for cross coupling matrix could also maybe transpose? but should be symmetrical so no need - info["stiffnessAB"][1, 0] = -info["stiffnessAB"][1, 0] - - else: - FxA = HA - FzA = VA - FxB = -HF - FzB = -VF - - if flipFlag: - W = -W # restore original - ZF = -ZF # restore original - - FzA = -FzA - FzB = -FzB - - info["stiffnessA"], info["stiffnessB"] = info["stiffnessB"], info["stiffnessA"] # swap A and BB - # note: diagonals of AB matrix do not change - - info["stiffnessA"][0, 1] = -info["stiffnessA"][0, 1] # reverse off-diagonal signs - info["stiffnessA"][1, 0] = -info["stiffnessA"][1, 0] - info["stiffnessB"][0, 1] = -info["stiffnessB"][0, 1] - info["stiffnessB"][1, 0] = -info["stiffnessB"][1, 0] - info["stiffnessAB"][0, 1] = -info["stiffnessAB"][0, 1] - info["stiffnessAB"][1, 0] = -info["stiffnessAB"][1, 0] - - # TODO <<< should add more info <<< - - # return horizontal and vertical (positive-up) tension components at each end, and length along seabed - return (FxA, FzA, FxB, FzB, info) - - -def eval_func_cat(X, args): - """returns target outputs and also secondary outputs for constraint checks etc.""" - - info = dict(error=False) # a dict of extra outputs to be returned - - ## Step 1. break out design variables and arguments into nice names - HF = X[0] - VF = X[1] - - [XF, ZF, L, EA, W, CB, WL, WEA, L_EA, CB_EA] = args["cat"] - - ## Step 2. do the evaluation (this may change mutable things in args) - - # print("catenary iteration HF={:8.4e}, VF={:8.4e}".format(HF,VF)) - - # calculate some commonly used terms that depend on HF and VF: - - VFMinWL = VF - WL - # = VA, the vertical anchor load (positive-up, but VF is positive-down) - LBot = L - VF / W - # unstretched length of line resting on seabed (Jonkman's PhD eqn 2-38), LMinVFOVrW - HF_W = HF / W - HF_WEA = HF / WEA - VF_WEA = VF / WEA - VF_HF = VF / HF - # VF_HF = np.abs(VF/HF) # I added the abs <<<<<< <<<<<<<<<<<<<<<<<<<<<<<<<<< - VFMinWL_HF = VFMinWL / HF - VF_HF2 = VF_HF * VF_HF - VFMinWL_HF2 = VFMinWL_HF * VFMinWL_HF - SQRT1VF_HF2 = np.sqrt(1.0 + VF_HF2) - SQRT1VFMinWL_HF2 = np.sqrt(1.0 + VFMinWL_HF2) - - # determine line profile type - if (CB < 0.0) or (W < 0.0) or (VFMinWL > 0.0): # no portion of the line rests on the seabed - ProfileType = 1 - elif -CB * VFMinWL < HF: # a portion of the line rests on the seabed and the anchor tension is nonzero - ProfileType = 2 - else: # must be 0.0 < HF <= -CB*VFMinWL, meaning a portion of the line must rest on the seabed and the anchor tension is zero - ProfileType = 3 - - # Compute the error functions (to be zeroed) and the Jacobian matrix - # (these depend on the anticipated configuration of the mooring line): - - # <<< could eliminate frequent division by W below, (make 1/W variable) >>>>> - - # No portion of the line rests on the seabed - if ProfileType == 1: - if VF_HF + SQRT1VF_HF2 <= 0: - info["error"] = True - info["message"] = "ProfileType 1: VF_HF + SQRT1VF_HF2 <= 0" - elif VFMinWL_HF + SQRT1VFMinWL_HF2 <= 0: - info["error"] = True - info["message"] = "ProfileType 1: VFMinWL_HF + SQRT1VFMinWL_HF2 <= 0" - # note: these errors seemed to occur when a buoyant line got to an HF=0 iteration (hopefully avoided now) - - else: - LBot = 0 # note that there is no seabed contact (for clarity in outputs) - - EXF = ( - (np.log(VF_HF + SQRT1VF_HF2) - np.log(VFMinWL_HF + SQRT1VFMinWL_HF2)) * HF_W + L_EA * HF - XF - ) # error in horizontal distance - - EZF = (SQRT1VF_HF2 - SQRT1VFMinWL_HF2) * HF_W + L_EA * (VF - 0.5 * WL) - ZF # error in vertical distance - - dXFdHF = ( - (np.log(VF_HF + SQRT1VF_HF2) - np.log(VFMinWL_HF + SQRT1VFMinWL_HF2)) / W - - ( - (VF_HF + VF_HF2 / SQRT1VF_HF2) / (VF_HF + SQRT1VF_HF2) - - (VFMinWL_HF + VFMinWL_HF2 / SQRT1VFMinWL_HF2) / (VFMinWL_HF + SQRT1VFMinWL_HF2) - ) - / W - + L_EA - ) - - dXFdVF = ( - (1.0 + VF_HF / SQRT1VF_HF2) / (VF_HF + SQRT1VF_HF2) - - (1.0 + VFMinWL_HF / SQRT1VFMinWL_HF2) / (VFMinWL_HF + SQRT1VFMinWL_HF2) - ) / W - - dZFdHF = (SQRT1VF_HF2 - SQRT1VFMinWL_HF2) / W - (VF_HF2 / SQRT1VF_HF2 - VFMinWL_HF2 / SQRT1VFMinWL_HF2) / W - - dZFdVF = (VF_HF / SQRT1VF_HF2 - VFMinWL_HF / SQRT1VFMinWL_HF2) / W + L_EA - # dZFdVF = ( np.sign(VF)*VF_HF /SQRT1VF_HF2 - VFMinWL_HF /SQRT1VFMinWL_HF2 )/ W + L_EA - - elif ProfileType == 27: - if VF_HF + SQRT1VF_HF2 <= 0: - info["error"] = True - info["message"] = "ProfileType 2: VF_HF + SQRT1VF_HF2 <= 0" - - else: - EXF = np.log(VF_HF + SQRT1VF_HF2) * HF_W - 0.5 * CB_EA * W * LBot * LBot + L_EA * HF + LBot - XF - - EZF = (SQRT1VF_HF2 - 1.0) * HF_W + 0.5 * VF * VF_WEA - ZF - - dXFdHF = ( - np.log(VF_HF + SQRT1VF_HF2) / W - ((VF_HF + VF_HF2 / SQRT1VF_HF2) / (VF_HF + SQRT1VF_HF2)) / W + L_EA - ) - - dXFdVF = ((1.0 + VF_HF / SQRT1VF_HF2) / (VF_HF + SQRT1VF_HF2)) / W + CB_EA * LBot - 1.0 / W - - dZFdHF = (SQRT1VF_HF2 - 1.0 - VF_HF2 / SQRT1VF_HF2) / W - - dZFdVF = (VF_HF / SQRT1VF_HF2) / W + VF_WEA - breakpoint() - - # A portion of the line must rest on the seabed and the anchor tension is zero - elif ProfileType in [2, 3]: - if VF_HF + SQRT1VF_HF2 <= 0: - info["error"] = True - info["message"] = "ProfileType 2 or 3: VF_HF + SQRT1VF_HF2 <= 0" - - else: - if CB > 0: - xB = LBot - HF_W / CB # location of point at which line tension reaches zero - else: - xB = 0.0 - xBlim = max(xB, 0.0) - - EXF = ( - np.log(VF_HF + SQRT1VF_HF2) * HF_W - - 0.5 * CB_EA * W * (LBot * LBot - xBlim * xBlim) - + L_EA * HF - + LBot - - XF - ) - - EZF = (SQRT1VF_HF2 - 1.0) * HF_W + 0.5 * VF * VF_WEA - ZF - - dXFdHF = ( - np.log(VF_HF + SQRT1VF_HF2) / W - - ((VF_HF + VF_HF2 / SQRT1VF_HF2) / (VF_HF + SQRT1VF_HF2)) / W - + L_EA - - xBlim / EA - ) - - # dXFdVF = ( ( 1.0 + VF_HF /SQRT1VF_HF2 )/( VF_HF + SQRT1VF_HF2 ) )/ W + HF_WEA +xBlim*CB/EA- 1.0/W <<<< incorrect, at least when CB=0 - if xB <= 0: - dXFdVF = ( - ((1.0 + VF_HF / SQRT1VF_HF2) / (VF_HF + SQRT1VF_HF2)) / W + CB_EA * LBot - 1.0 / W - ) # from ProfileType 2 - else: - dXFdVF = ( - ((1.0 + VF_HF / SQRT1VF_HF2) / (VF_HF + SQRT1VF_HF2)) / W + HF_WEA - 1.0 / W - ) # from ProfileType 3 - - dZFdHF = (SQRT1VF_HF2 - 1.0 - VF_HF2 / SQRT1VF_HF2) / W - - dZFdVF = (VF_HF / SQRT1VF_HF2) / W + VF_WEA - - # Now compute the tensions at the anchor - if ProfileType == 1: # No portion of the line rests on the seabed - HA = HF - VA = VFMinWL # note: VF is defined positive when tension pulls downward, while VA is defined positive when tension pulls up - - elif ProfileType == 2: # A portion of the line rests on the seabed and the anchor tension is nonzero - HA = ( - HF + CB * VFMinWL - ) # note: -VFMinWL = -(VF-W*L) is the negative of line weight NOT supported by the fairlead; i.e. the weight on the seabed - VA = 0.0 - - elif ProfileType == 3: # A portion of the line must rest on the seabed and the anchor tension is zero - HA = 0.0 - VA = 0.0 - - # if there was an error, send the stop signal - if info["error"] == True: - # breakpoint() - return np.zeros(2), info, True - - ## Step 3. group the outputs into objective function value and others - Y = np.array([EXF, EZF]) # objective function - - # info is a dict of other outputs to be returned - info[ - "HF" - ] = HF # solution to be used to start next call (these are the solved variables, may be for anchor if line is reversed) - info["VF"] = VF - # info["jacobian"] = np.array([[dXFdHF, dXFdVF], [dZFdHF, dZFdVF]]) - info["stiffnessB"] = np.linalg.inv( - np.array([[dXFdHF, dXFdVF], [dZFdHF, dZFdVF]]) - ) # stiffness matrix at fairlead end - info["LBot"] = LBot - info["HA"] = HA - info["VA"] = VA - info["ProfileType"] = ProfileType - - # print("EX={:5.2e}, EZ={:5.2e}".format(EXF, EZF)) - - return Y, info, False - - -def step_func_cat(X, args, Y, info, Ytarget, err, tols, iter, maxIter): - """General stepping functions, which can also contain special condition checks or other adjustments to the process - - info - the info dict created by the main catenary function - - """ - [XF, ZF, L, EA, W, CB, WL, WEA, L_EA, CB_EA] = args["cat"] - - # if abs( err[1] + ZF ) < 0.0001: - # breakpoint() - - [alpha_min, alpha0, alphaR] = args[ - "step" - ] # get minimum alpha, initial alpha, and alpha reduction rate from passed arguments - - # J = info['jacobian'] - # dX = -np.matmul(np.linalg.inv(J), err) - dX = -np.matmul(info["stiffnessB"], err) - - # ! Reduce dHF by factor (between 1 at I = 1 and 0 at I = MaxIter) that reduces linearly with iteration count - # to ensure that we converge on a solution even in the case were we obtain a nonconvergent cycle about the - # correct solution (this happens, for example, if we jump to quickly between a taut and slack catenary) - - alpha = 1.0 # M<<<<<<<< np.max([alpha_min, alpha0*(1.0 - alphaR*iter/maxIter)]) - - # exponential approach alpha = alpha0 * np.exp( iter/maxIter * np.log(alpha_min/alpha0 ) ) - - dX[0] = dX[0] * alpha # dHF*( 1.0 - Tol*I ) - dX[1] = dX[1] * alpha # dVF*( 1.0 - Tol*I ) - - # To avoid an ill-conditioned situation, make sure HF does not go less than or equal to zero by having a lower limit of Tol*HF - # [NOTE: the value of dHF = ( Tol - 1.0 )*HF comes from: HF = HF + dHF = Tol*HF when dHF = ( Tol - 1.0 )*HF] - # dX[0] = max( dX[0], ( tol - 1.0 )*info['HF']); - - # To avoid an ill-conditioned situation, make sure HF does not get too close to zero, by forcing HF >= tols[0] - # if info['HF'] + dX[0] <= tol*abs(info['VF']+dX[1]): - # if info['HF'] + dX[0] <= tols[0] - if X[0] + dX[0] <= tols[0]: - # dX[0] = tol*abs(info['VF']+dX[1]) - info['HF'] - # dX[0] = tols[0] - info['HF'] - dX[0] = tols[0] - X[0] - - # To avoid an ill-conditioned situation where the line is nearly all on the seabed but the solver gets stuck, - # if np.abs(err[1] + ZF)/ZF < tol: - # breakpoint() - # deltaHFVF = info['HF'] - info['VF'] - # dX[0] = dX[0] - 0.5*deltaHFVF - # dX[1] = dX[1] + 0.5*deltaHFVF - - # prevent silly situation where a line with weight and positive ZF considers a negative VF - if info["ProfileType"] == 2: - if X[1] + dX[1] <= tols[1]: # if vertical force is within tolerance of being zero/negative - VFtarget = (L - info["LBot"]) * W # set next VF value to be the weight of portion of line that's suspended - dX[1] = VFtarget - X[1] - - return dX # returns dX (step to make) - - -if __name__ == "__main__": - import matplotlib.pyplot as plt - - """ - (fAH, fAV, fBH, fBV, info) = catenary(37.96888656874307, 20.49078283711694, 100.0, 751000000.0, - -881.0549577007893, CB=-1245.2679469540894, - HF0=63442.20077641379, VF0=-27995.71383270186, Tol=1e-06, MaxIter=50, plots=2) - - - #(fAH, fAV, fBH, fBV, info) = catenary(89.9, 59.2, 130.0, 751000000.0, - # 881.05, CB=-372.7, Tol=1e-06, MaxIter=50, plots=2) - - #(fAH, fAV, fBH, fBV, info) = catenary(400, 200, 500.0, 7510000000000.0, 200.0, CB=-372.7, Tol=1e-06, MaxIter=50, plots=3) - # - """ - - """ - #(fAH, fAV, fBH, fBV, info) = catenary(400, 200, 500.0, 7510000000000.0, 200.0, CB=5.0, Tol=1e-06, MaxIter=50, plots=3) - (fAH, fAV, fBH, fBV, info) = catenary(400, 200, 500.0, 7510000000000.0, 200.0, CB=-20, Tol=1e-06, MaxIter=50, plots=3) - - - print(f"Error is {info['catenary']['err'][0]:8.3f}, {info['catenary']['err'][1]:8.3f} m") - - print(" Fax={:8.2e}, Faz={:8.2e}, Fbx={:8.2e}, Fbz={:8.2e}".format(fAH, fAV, fBH, fBV)) - print(info['jacobian']) - print(np.linalg.inv(info['jacobian'])) - """ - - # (fAH, fAV, fBH, fBV, info) = catenary(100, 20, 130, 1e12, 100.0, CB=-20, Tol=0.001, MaxIter=50, plots=3) - # (fAH, fAV, fBH, fBV, info) = catenary(205, -3.9, 250, 1229760000.0, 2442, CB=-55, Tol=1e-06, MaxIter=50, plots=3) - - (fAH1, fAV1, fBH1, fBV1, info1) = catenary(400, 100, 470, 1e12, 100.0, CB=-10, Tol=0.001, MaxIter=50, plots=4) - # (fAH1, fAV1, fBH1, fBV1, info1) = catenary(2306.4589923684835, 1.225862496312402e-05, 1870.0799339749528, 203916714.02425563, 405.04331583394304, CB=0.0, HF0=58487689.78903873, VF0=0.0, Tol=4.000000000000001e-06, MaxIter=50, plots=1) - # (fAH1, fAV1, fBH1, fBV1, info1) = catenary(459.16880261639346, 0.0004792939078015479, 447.67890341877506, 2533432597.6567926, 5032.201233267459, CB=0.0, HF0=65021800.32966018, VF0=17487.252675845888, Tol=4.000000000000001e-06, MaxIter=50, plots=1) - # (fAH1, fAV1, fBH1, fBV1, info1) = catenary(0.00040612281105723014, 391.558570722038, 400.0, 3300142385.3140063, 6555.130220040344, CB=-287.441429277962, HF0=2127009.4122708915, VF0=10925834.69512347, Tol=4.000000000000001e-06, MaxIter=100, plots=1) - # (fAH1, fAV1, fBH1, fBV1, info1) = catenary(0.0004959907076624859, 69.87150531147275, 110.89397565668423, 80297543.26800226, 146.26820268238743, CB=-509.12849468852727, HF0=1322712.3676957292, VF0=1045583.1849462093, Tol=4.000000000000001e-06, MaxIter=50, plots=1) - - plt.plot(info1["X"], info1["Z"]) - # plt.plot(infoU['X'], infoU['Z'] ) - plt.axis("equal") - """ - plt.figure() - plt.plot(info1['s'], info1['Te'] ) - plt.plot(infoU['s'], infoU['Te'] ) - """ - - print(fAH1, fAV1, fBH1, fBV1) - print("") - - from wisdem.moorpy.helpers import printMat - - printMat(info1["K"]) - print("") - printMat(info1["stiffnessA"]) - print("") - printMat(info1["stiffnessB"]) - - plt.show() diff --git a/WISDEM/wisdem/moorpy/MoorProps.py b/WISDEM/wisdem/moorpy/MoorProps.py deleted file mode 100644 index eb6beaae9..000000000 --- a/WISDEM/wisdem/moorpy/MoorProps.py +++ /dev/null @@ -1,280 +0,0 @@ -# MoorProps -# start of a script to hold the functions that hold the mooring line and anchor property info -# just simple functions for now, can import functions to other scripts if necessary -# very much in progress -# MoorProps started 4-26-21, getLineProps first initialized back in Sept/Oct 2020 - - -import numpy as np - -import wisdem.moorpy as mp - - -def getLineProps(dmm, type="chain", stud="studless", source="Orcaflex-altered", name=""): - """getLineProps version 3.2: Restructuring v3.1 to 'Orcaflex-original' and 'Orcaflex-altered' - - Motivation: The existing public, and NREL-internal references for mooring line component property - data are either proprietary, or unreliable and incomplete. The best way to derive new equations - as a function of diameter is to use data from mooring line manufacturer's catalogs. Once developed, - these new equations will serve as an updated version to compare against existing expressions. - - The goal is to have NREL's own library of mooring line property equations, but more research is needed. - The original Orcaflex equations are the best we have right now and have been altered to include - a quadratic chain MBL equation rather than a cubic, to avoid negative MBLs. - Also, different cost models are put in to the altered version to avoid the Equimar data. Many sources - researched for cost data, coefficients used are close to the old NREL internal data, but still an approximation. - - For more info, see the Mooring Component Properties Word doc. - - - This function requires at least one input: the line diameter in millimeters. - - The rest of the inputs are optional: describe the desired type of line (chain, polyester, wire, etc.), - the type of chain (studless or studlink), the source of data (Orcaflex-original or altered), or a name identifier - - The function will output a MoorPy linetype object - - """ - - if source == "Orcaflex-original": - d = dmm / 1000 # orcaflex uses meters https://www.orcina.com/webhelp/OrcaFlex/ - - if type == "chain": - c = 1.96e4 # grade 2=1.37e4; grade 3=1.96e4; ORQ=2.11e4; R4=2.74e4 - MBL = c * d**2 * (44 - 80 * d) * 1000 # [N] The same for both studless and studlink - if stud == "studless": - massden = 19.9 * d**2 * 1000 # [kg/m] - EA = 0.854e8 * d**2 * 1000 # [N] - d_vol = 1.8 * d # [m] - elif stud == "studlink" or stud == "stud": - massden = 21.9 * d**2 * 1000 # [kg/m] - EA = 1.010e8 * d**2 * 1000 # [N] - d_vol = 1.89 * d # [m] - else: - raise ValueError("getLineProps error: Choose either studless or stud chain type ") - - elif type == "nylon": - massden = 0.6476 * d**2 * 1000 # [kg/m] - EA = 1.18e5 * d**2 * 1000 # [N] - MBL = 139357 * d**2 * 1000 # [N] for wet nylon line, 163950d^2 for dry nylon line - d_vol = 0.85 * d # [m] - elif type == "polyester": - massden = 0.7978 * d**2 * 1000 # [kg/m] - EA = 1.09e6 * d**2 * 1000 # [N] - MBL = 170466 * d**2 * 1000 # [N] - d_vol = 0.86 * d # [m] - elif type == "polypropylene": - massden = 0.4526 * d**2 * 1000 # [kg/m] - EA = 1.06e6 * d**2 * 1000 # [N] - MBL = 105990 * d**2 * 1000 # [N] - d_vol = 0.80 * d # [m] - elif type == "wire-fiber" or type == "fiber": - massden = 3.6109 * d**2 * 1000 # [kg/m] - EA = 3.67e7 * d**2 * 1000 # [N] - MBL = 584175 * d**2 * 1000 # [N] - d_vol = 0.82 * d # [m] - elif type == "wire-wire" or type == "wire" or type == "IWRC": - massden = 3.9897 * d**2 * 1000 # [kg/m] - EA = 4.04e7 * d**2 * 1000 # [N] - MBL = 633358 * d**2 * 1000 # [N] - d_vol = 0.80 * d # [m] - else: - raise ValueError("getLineProps error: Linetype not valid. Choose from given rope types or chain ") - - # cost - # Derived from Equimar graph: https://tethys.pnnl.gov/sites/default/files/publications/EquiMar_D7.3.2.pdf - if type == "chain": - cost = (0.21 * (MBL / 9.81 / 1000)) * 1.29 # [$/m] - elif type == "nylon" or type == "polyester" or type == "polypropylene": - cost = (0.235 * (MBL / 9.81 / 1000)) * 1.29 # [$/m] - elif type == "wire" or type == "wire-wire" or type == "IWRC" or type == "fiber" or type == "wire-fiber": - cost = (0.18 * (MBL / 9.81 / 1000) + 90) * 1.29 # [$/m] - else: - raise ValueError("getLineProps error: Linetype not valid. Choose from given rope types or chain ") - - elif source == "Orcaflex-altered": - d = dmm / 1000 # orcaflex uses meters https://www.orcina.com/webhelp/OrcaFlex/ - - if type == "chain": - c = 2.74e4 # grade 2=1.37e4; grade 3=1.96e4; ORQ=2.11e4; R4=2.74e4 - MBL = ( - (371360 * d**2 + 51382.72 * d) * (c / 2.11e4) * 1000 - ) # this is a fit quadratic term to the cubic MBL equation. No negatives - if stud == "studless": - massden = 19.9 * d**2 * 1000 # [kg/m] - EA = 0.854e8 * d**2 * 1000 # [N] - d_vol = 1.8 * d # [m] - elif stud == "studlink" or stud == "stud": - massden = 21.9 * d**2 * 1000 # [kg/m] - EA = 1.010e8 * d**2 * 1000 # [N] - d_vol = 1.89 * d # [m] - else: - raise ValueError("getLineProps error: Choose either studless or stud chain type ") - - # cost = 2.5*massden # a ballpark for R4 chain - # cost = (0.58*MBL/1000/9.81) - 87.6 # [$/m] from old NREL-internal - # cost = 3.0*massden # rough value similar to old NREL-internal - cost = 2.585 * massden # [($/kg)*(kg/m)=($/m)] - # cost = 0.0 - - elif type == "nylon": - massden = 0.6476 * d**2 * 1000 # [kg/m] - EA = 1.18e5 * d**2 * 1000 # [N] - MBL = 139357 * d**2 * 1000 # [N] for wet nylon line, 163950d^2 for dry nylon line - d_vol = 0.85 * d # [m] - cost = (0.42059603 * MBL / 1000 / 9.81) + 109.5 # [$/m] from old NREL-internal - elif type == "polyester": - massden = 0.7978 * d**2 * 1000 # [kg/m] - EA = 1.09e6 * d**2 * 1000 # [N] - MBL = 170466 * d**2 * 1000 # [N] - d_vol = 0.86 * d # [m] - - # cost = (0.42059603*MBL/1000/9.81) + 109.5 # [$/m] from old NREL-internal - # cost = 1.1e-4*MBL # rough value similar to old NREL-internal - cost = 0.162 * (MBL / 9.81 / 1000) # [$/m] - - elif type == "polypropylene": - massden = 0.4526 * d**2 * 1000 # [kg/m] - EA = 1.06e6 * d**2 * 1000 # [N] - MBL = 105990 * d**2 * 1000 # [N] - d_vol = 0.80 * d # [m] - cost = 1.0 * ((0.42059603 * MBL / 1000 / 9.81) + 109.5) # [$/m] from old NREL-internal - elif type == "hmpe": - massden = 0.4526 * d**2 * 1000 # [kg/m] - EA = 38.17e6 * d**2 * 1000 # [N] - MBL = 619000 * d**2 * 1000 # [N] - d_vol = 1.01 * d # [m] - cost = 0.01 * MBL / 1000 / 9.81 # [$/m] from old NREL-internal - elif type == "wire-fiber" or type == "fiber": - massden = 3.6109 * d**2 * 1000 # [kg/m] - EA = 3.67e7 * d**2 * 1000 # [N] - MBL = 584175 * d**2 * 1000 # [N] - d_vol = 0.82 * d # [m] - cost = 0.53676471 * MBL / 1000 / 9.81 # [$/m] from old NREL-internal - elif type == "wire-wire" or type == "wire" or type == "IWRC": - massden = 3.9897 * d**2 * 1000 # [kg/m] - EA = 4.04e7 * d**2 * 1000 # [N] - MBL = 633358 * d**2 * 1000 # [N] - d_vol = 0.80 * d # [m] - # cost = MBL * 900./15.0e6 - # cost = (0.33*MBL/1000/9.81) + 139.5 # [$/m] from old NREL-internal - cost = 5.6e-5 * MBL # rough value similar to old NREL-internal - else: - raise ValueError("getLineProps error: Linetype not valid. Choose from given rope types or chain ") - - elif source == "NREL": - """ - getLineProps v3.1 used to have old NREL-internal equations here as a placeholder, but they were not trustworthy. - - The chain equations used data from Vicinay which matched OrcaFlex data. The wire rope equations matched OrcaFlex well, - the synthetic rope equations did not - - The idea is to have NREL's own library of mooring line property equations, but more research needs to be done. - The 'OrcaFlex-altered' source version is a start and can change name to 'NREL' in the future, but it is - still 'OrcaFlex-altered' because most of the equations are from OrcaFlex, which is the best we have right now. - - Future equations need to be optimization proof = no negative numbers anywhere (need to write an interpolation function) - Can add new line types as well, such as Aramid or HMPE - """ - pass - - # Set up a main identifier for the linetype. Useful for things like "chain_bot" or "chain_top" - if name == "": - typestring = f"{type}{dmm:.0f}" - else: - typestring = name - - notes = f"made with getLineProps - source: {source}" - - return mp.LineType(typestring, d_vol, massden, EA, MBL=MBL, cost=cost, notes=notes, input_type=type, input_d=dmm) - - -def getAnchorProps(fx, fz, type="drag-embedment", display=0): - """Calculates anchor required capacity and cost based on specified loadings and anchor type""" - - # for now this is based on API RP-2SK guidance for static analysis of permanent mooring systems - # fx and fz are horizontal and vertical load components assumed to come from a dynamic (or equivalent) analysis. - - # mooring line tenLimit specified in yaml and inversed for a SF in constraints - # take the line forces on the anchor and give 20% consideration for dynamic loads on lines - # coefficients in front of fx and fz in each anchorType are the SF for that anchor for quasi-static (pages 30-31 of RP-2SK) - - # scale QS loads by 20% to approximate dynamic loads - fx = 1.2 * fx - fz = 1.2 * fz - - # note: capacity is measured here in kg force - - euros2dollars = 1.18 # the number of dollars there currently are in a euro (3-31-21) - - if type == "drag-embedment": - capacity_x = 1.5 * fx / 9.81 - - fzCost = 0 - # if fz > 0: - # fzCost = 1e3*fz - # if display > 0: print('WARNING: Nonzero vertical load specified for a drag embedment anchor.') - - anchorMatCost = 0.188 * capacity_x + fzCost # material cost - anchorInstCost = 163548 * euros2dollars # installation cost - anchorDecomCost = 228967 * euros2dollars # decommissioning cost - - elif type == "suction": - capacity_x = 1.6 * fx / 9.81 - capacity_z = 2.0 * fz / 9.81 - capacity = np.linalg.norm([capacity_x, capacity_z]) # overall capacity, assuming in any direction for now - anchorMatCost = 1.08 * capacity # material cost - anchorInstCost = 179331 * euros2dollars # installation cost - anchorDecomCost = 125532 * euros2dollars # decommissioning cost - - elif type == "deadweight-granite": - capacity_x = ( - 1.6 * fx / 9.81 - ) # no safety factors given explicitly for deadweight anchors in the standards; assuming these safety factors are the same as piles/gravity/plates - capacity_z = ( - 2.0 * fz / 9.81 - ) # no safety factors given explicitly for deadweight anchors in the standards; assuming these safety factors are the same as piles/gravity/plates - capacity = np.linalg.norm([capacity_x, capacity_z]) - anchorMatCost = 0.05 * capacity # cost of a granite deadweight anchor is about $50 per ton (from Senu) - anchorInstCost = 0 - anchorDecomCost = 0 - - elif type == "deadweight-concrete": - capacity_x = ( - 1.6 * fx / 9.81 - ) # no safety factors given explicitly for deadweight anchors in the standards; assuming these safety factors are the same as piles/gravity/plates - capacity_z = ( - 2.0 * fz / 9.81 - ) # no safety factors given explicitly for deadweight anchors in the standards; assuming these safety factors are the same as piles/gravity/plates - capacity = np.linalg.norm([capacity_x, capacity_z]) - anchorMatCost = 0.075 * capacity # cost of a concrete deadweight anchor is about $75 per ton (from Senu) - # reinforced concrete is about $1000 per ton ($1 per kg), but we don't need reinforced concrete for deadweight anchors - anchorInstCost = 0 - anchorDecomCost = 0 - - elif type == "plate": - capacity_x = 2.0 * fx / 9.81 - capacity_z = 2.0 * fz / 9.81 - capacity = np.linalg.norm([capacity_x, capacity_z]) # overall capacity, assuming in any direction for now - raise ValueError("plate anchors not yet supported") - - elif type == "micropile": # note: no API guidance on this one - capacity_x = 2.0 * fx / 9.81 - capacity_z = 2.0 * fz / 9.81 - capacity = np.linalg.norm([capacity_x, capacity_z]) # overall capacity, assuming in any direction for now - anchorMatCost = ( - 200000 * 1.2 / 500000 - ) * capacity # [(Euros*($/Euros)/kg)*kg] linear interpolation of material cost - anchorInstCost = 0 # installation cost - anchorDecomCost = 0 # decommissioning cost - - elif type == "SEPLA": # cross between suction and plate - capacity_x = 2.0 * fx / 9.81 - capacity_z = 2.0 * fz / 9.81 - capacity = np.linalg.norm([capacity_x, capacity_z]) # overall capacity, assuming in any direction for now - anchorMatCost = 0.45 * capacity # material cost - anchorInstCost = 0 # installation cost - anchorDecomCost = 0 # decommissioning cost - - else: - raise ValueError(f"getAnchorProps received an unsupported anchor type ({type})") - - # mooring line sizing: Tension limit for QS: 50% MBS. Or FOS = 2 - - return anchorMatCost, anchorInstCost, anchorDecomCost # [USD] diff --git a/WISDEM/wisdem/moorpy/MoorProps_default.yaml b/WISDEM/wisdem/moorpy/MoorProps_default.yaml deleted file mode 100644 index 5165aa32a..000000000 --- a/WISDEM/wisdem/moorpy/MoorProps_default.yaml +++ /dev/null @@ -1,71 +0,0 @@ -# Default mooring line property coefficients for MoorPy -# The following is YAML syntax and follows a heirarchy of -# lineProps -> [line material name] -> [line material coefficients] - -# All possible lineProps coefficients are as follow: -# mass_0 : # linear mass density offset [kg/m] -# mass_d : # linear mass density per diameter [kg/m^2] -# mass_d2 : # linear mass density per diameter^2 [kg/m^3] -# mass_d3 : # linear mass density per diameter^3 [kg/m^4] -# -# EA_0 : # stiffness offset [N] -# EA_d : # stiffness per diameter [N/m] -# EA_d2 : # stiffness per diameter^2 [N/m^2] -# EA_d3 : # stiffness per diameter^3 [N/m^3] -# -# MBL_0 : # minimum breaking load offset [N] -# MBL_d : # minimum breaking load per diameter [N/m] -# MBL_d2 : # minimum breaking load per diameter^2 [N/m^2] -# MBL_d3 : # minimum breaking load per diameter^3 [N/m^3] -# -# dvol_dnom : # volume-equivalent diameter per nominal diameter [-] -# -# cost_0 : # cost offset [$/m] -# cost_d : # cost per diameter [$/m^2] -# cost_d2 : # cost per diameter^2 [$/m^3] -# cost_d3 : # cost per diameter^2 [$/m^4] -# cost_mass : # cost per mass [$/kg] -# cost_EA : # cost per stiffness [$/m/N] -# cost_MBL : # cost per MBL [$/m/N] - - -lineProps: - - chain : # R4 grade studless chain - mass_d2 : 19.9e3 # linear mass density per diameter^2 [kg/m^3] - EA_d2 : 85.4e9 # stiffness per diameter^2 [N/m^2] - MBL_d : 66.72e6 # minimum breaking load per diameter [N/m] - MBL_d2 : 482.2e6 # minimum breaking load per diameter^2 [N/m^2] - dvol_dnom : 1.8 # volume-equivalent diameter per nominal diameter [-] - cost_mass : 2.585 # cost per mass [$/kg] - - - chain_studlink : # R4 grade studlink chain - mass_d2 : 19.9e3 # linear mass density per diameter^2 [kg/m^3] - EA_d2 : 85.4e9 # stiffness per diameter^2 [N/m^2] - MBL_d : 66.72e6 # minimum breaking load per diameter [N/m] - MBL_d2 : 482.2e6 # minimum breaking load per diameter^2 [N/m^2] - dvol_dnom : 1.89 # volume-equivalent diameter per nominal diameter [-] - cost_mass : 2.585 # cost per mass [$/kg] - - - polyester : # polyester synthetic rope - mass_d2 : 797.8 # linear mass density per diameter^2 [kg/m^3] - EA_d2 : 1.09e9 # stiffness per diameter^2 [N/m^2] - MBL_d2 : 170.5e6 # minimum breaking load per diameter^2 [N/m^2] - dvol_dnom : 0.86 # volume-equivalent diameter per nominal diameter [-] - cost_MBL : 1.65e-05 # cost per MBL [$/m/N] - - nylon : # nylon synthetic rope - mass_d2 : 647.6 # linear mass density per diameter^2 [kg/m^3] - EA_d2 : 1.18e8 # stiffness per diameter^2 [N/m^2] - MBL_d2 : 139.4e6 # minimum breaking load per diameter^2 [N/m^2] - dvol_dnom : 0.85 # volume-equivalent diameter per nominal diameter [-] - cost_MBL : 4.29e-05 # cost per MBL [$/m/N] - - wire : - mass_d2 : 3989.7 # linear mass density per diameter^2 [kg/m^3] - EA_d2 : 4.04e10 # stiffness per diameter^2 [N/m^2] - MBL_d2 : 633.36e6 # minimum breaking load per diameter^2 [N/m^2] - dvol_dnom : 0.8 # volume-equivalent diameter per nominal diameter [-] - cost_d2 : 0.04542e6 # cost per diameter^2 with d in meters [$/m] diff --git a/WISDEM/wisdem/moorpy/MoorPy_Example.py b/WISDEM/wisdem/moorpy/MoorPy_Example.py deleted file mode 100644 index f6c670e3e..000000000 --- a/WISDEM/wisdem/moorpy/MoorPy_Example.py +++ /dev/null @@ -1,152 +0,0 @@ -# -------------------------------------------------------------------------------------------- -# MoorPy -# -# A mooring system visualizer and quasi-static modeler in Python. -# Matt Hall and Stein Housner -# -# -------------------------------------------------------------------------------------------- -# 2018-08-14: playing around with making a QS shared-mooring simulation tool, to replace what's in Patrick's work -# 2020-06-17: Trying to create a new quasi-static mooring system solver based on my Catenary function adapted from FAST v7, and using MoorDyn architecture - - -import numpy as np - -import wisdem.moorpy as mp - -ms = mp.System("lines.txt") -ms.initialize(plots=1) -# ms.plot() - - -""" -# catenary testing -mp.catenary(576.2346666666667, 514.6666666666666, 800, 4809884.623076923, -2.6132152062554828, CB=-64.33333333333337, HF0=0, VF0=0, Tol=1e-05, MaxIter=50, plots=2) -print("\nTEST 2") -mp.catenary(88.91360441490338, 44.99537159734132, 100.0, 854000000.0000001, 1707.0544275185273, CB=0.0, HF0=912082.6820817506, VF0=603513.100376363, Tol=1e-06, MaxIter=50, plots=1) -print("\nTEST 3") -mp.catenary(99.81149090002897, 0.8459770263789324, 100.0, 854000000.0000001, 1707.0544275185273, CB=0.0, HF0=323638.97834178555, VF0=30602.023233123222, Tol=1e-06, MaxIter=50, plots=1) -print("\nTEST 4") -mp.catenary(99.81520776134033, 0.872357398602503, 100.0, 854000000.0000001, 1707.0544275185273, CB=0.0, HF0=355255.0943810993, VF0=32555.18285808794, Tol=1e-06, MaxIter=50, plots=1) -print("\nTEST 5") -mp.catenary(99.81149195956499, 0.8459747131565791, 100.0, 854000000.0000001, 1707.0544275185273, CB=0.0, HF0=323645.55876751675, VF0=30602.27072107738, Tol=1e-06, MaxIter=50, plots=1) -print("\nTEST 6") -mp.catenary(88.91360650151807, 44.99537139684605, 100.0, 854000000.0000001, 1707.0544275185273, CB=0.0, HF0=912082.6820817146, VF0=603513.100376342, Tol=1e-06, MaxIter=50, plots=1) -print("\nTEST 7") -mp.catenary(9.516786788834565, 2.601777402222183, 10.0, 213500000.00000003, 426.86336920488003, CB=0.0, HF0=1218627.2292202935, VF0=328435.58512892434, Tol=1e-06, MaxIter=50, plots=1) -print("\nTEST 8") -mp.catenary(9.897879983411258, 0.3124565409495972, 10.0, 213500000.00000003, 426.86336920488003, CB=0.0, HF0=2191904.191415531, VF0=69957.98566771008, Tol=1e-06, MaxIter=50, plots=1) -print("\nTEST 9") -mp.catenary(107.77260514238083, 7.381234307499085, 112.08021179445676, 6784339692.139625, 13559.120871401587, CB=0.0, HF0=672316.8532881762, VF0=-552499.1313868811, Tol=1e-06, MaxIter=50, plots=1) -print("\nTEST 9.1") -mp.catenary(107.67265157943795, 7.381234307499085, 112.08021179445676, 6784339692.139625, 13559.120871401587, CB=0.0, HF0=3752787.759641461, VF0=-1678302.5929179655, Tol=1e-06, MaxIter=50, plots=1) -print("\nTEST 9.2") -mp.catenary(107.77260514238083, 7.381234307499085, 112.08021179445676, 6784339692.139625, 13559.120871401587, CB=0.0, Tol=1e-06, MaxIter=50, plots=2, HF0= 1.35e+05,VF0= 1.13e+02) -print("\nTEST 9.3") -mp.catenary(98.6712173965359, 8.515909042185399, 102.7903150736787, 5737939634.533289, 11467.878219531065, CB=0.0, HF0=118208621.36075467, VF0=-12806834.457078349, Tol=1e-07, MaxIter=50, plots=2) -""" - - -""" -test = mp.System() - -test.depth = 100 - -# Create the LineType of the line for the system -test.addLineType("main", 0.1, 100.0, 1e8) - -# add points and lines -test.addPoint(1, [ 0, 0, 0]) -test.addPoint(0, [ 100, 0, -50], DOFs=[2]) - -test.addLine(120, "main") - -# attach -test.pointList[0].attachLine(1, 1) -test.pointList[1].attachLine(1, 0) - -test.initialize(plots=1) - -test.solveEquilibrium3() - -test.plot() -""" - - -ms = mp.System() - -# --- diagonal scenario --- -""" -ms.depth = 600 -r6 = np.zeros(6) -#r6 = np.array([1,1,0,1,1,1]) -ms.addBody(0, r6) - -r = np.zeros(3) -#r = np.array([-2,1,3]) -ms.addPoint(1, r) -ms.bodyList[0].attachPoint(len(ms.pointList),r-r6[:3]) -#ms.addPoint(1, np.array([-10,0,0])) -#ms.bodyList[0].attachPoint(len(ms.pointList),np.array([-10,0,0])) - -ms.addPoint(1, np.array([-1000,-1000,-600])) - -ms.addLineType('main', 0.10, 40, 1e9) - -ms.addLine(1600, 'main') - -ms.pointList[0].attachLine(1, 1) -ms.pointList[1].attachLine(1, 0) - - -""" - -# --- orthogonal scenario --- -ms.depth = 100 -ms.addBody(0, np.zeros(6)) - -ms.addPoint(1, np.zeros(3)) # fairlead point -# ms.bodyList[0].attachPoint(len(ms.pointList), [0, 10, 0]) # translations good but some rotations are different -# ms.bodyList[0].attachPoint(len(ms.pointList), [10, 0, 0]) # looks good except 6,4 and 6,6 terms (just first-order vs. nonlinear?) -ms.bodyList[0].attachPoint( - len(ms.pointList), [0, 0, 10] -) # looks good except 4,4 and 4,6 terms (just first-order vs. nonlinear?) but 4,4 has sign flipped! - -ms.addPoint(1, [700, -380, -10]) # anchor point - -ms.addLineType("main", 0.10, 10, 1e10) - -ms.addLine(815, "main") - -ms.pointList[0].attachLine(1, 1) -ms.pointList[1].attachLine(1, 0) - -# --- end of scenario choices --- - - -ms.initialize() -ms.plot() - -a = np.array([0.1, 0, 0, 0, 0, 0]) - - -Kbody = ms.bodyList[0].getStiffness() -Kpoint = ms.pointList[0].getStiffness() -KlineA = ms.lineList[0].getStiffnessMatrix() -KpointA = ms.pointList[0].getStiffnessA() -KbodyA = ms.bodyList[0].getStiffnessA() - -# Ksystem = ms.getSystemStiffness() -KsystemA = ms.getSystemStiffnessA() - -ms.display = 3 -Ksystem = ms.getSystemStiffness(dth=0.05) - -print(ms.pointList[0].r) -print("line stiffness A") -mp.printMat(KlineA) -print("body stiffness A") -mp.printMat(KbodyA) -print("system stiffness A") -mp.printMat(KsystemA) -print("system stiffness nonlinear") -mp.printMat(Ksystem) diff --git a/WISDEM/wisdem/moorpy/__init__.py b/WISDEM/wisdem/moorpy/__init__.py deleted file mode 100644 index d84513bad..000000000 --- a/WISDEM/wisdem/moorpy/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -# make all classes and functions in MoorPy.py available under the main package -# from wisdem.moorpy.MoorPy import * - -import os - -from wisdem.moorpy.body import Body - -# new core MoorPy imports to eventually replace the above -from wisdem.moorpy.line import Line # this will make mp.Line available from doing "import wisdem.moorpy as mp" -from wisdem.moorpy.point import Point -from wisdem.moorpy.system import System -from wisdem.moorpy.helpers import * -from wisdem.moorpy.Catenary import catenary -from wisdem.moorpy.lineType import LineType - -moorpy_dir = os.path.dirname(os.path.realpath(__file__)) diff --git a/WISDEM/wisdem/moorpy/body.py b/WISDEM/wisdem/moorpy/body.py deleted file mode 100644 index 8a0e8008e..000000000 --- a/WISDEM/wisdem/moorpy/body.py +++ /dev/null @@ -1,441 +0,0 @@ -import numpy as np - -from wisdem.moorpy.helpers import ( - getH, - printVec, - rotatePosition, - rotationMatrix, - transformPosition, - translateForce3to6DOF, -) - - -class Body: - """A class for any object in the mooring system that will have its own reference frame""" - - def __init__( - self, - mooringSys, - num, - type, - r6, - m=0, - v=0, - rCG=np.zeros(3), - AWP=0, - rM=np.zeros(3), - f6Ext=np.zeros(6), - I=np.zeros(3), - CdA=np.zeros(3), - Ca=np.zeros(3), - ): - """Initialize Body attributes - - Parameters - ---------- - mooringSys : system object - The system object that contains the body object - num : int - indentifier number - type : int - the body type: 0 free to move, 1 fixed, -1 coupled externally - r6 : array - 6DOF position and orientation vector [m, rad] - m : float, optional - mass, centered at CG [kg]. The default is 0. - v : float, optional - volume, centered at reference point [m^3]. The default is 0. - rCG : array, optional - center of gravity position in body reference frame [m]. The default is np.zeros(3). - AWP : float, optional - waterplane area - used for hydrostatic heave stiffness if nonzero [m^2]. The default is 0. - rM : float or array, optional - coorindates or height of metacenter relative to body reference frame [m]. The default is np.zeros(3). - f6Ext : array, optional - applied external forces and moments vector in global orientation (not including weight/buoyancy) [N]. The default is np.zeros(6). - I : array, optional - Mass moment of inertia about 3 axes. - CdA : array, optional - Product of drag coefficient and frontal area in three directions [m^2]. - Ca : array, optional - Added mass coefficient in three directions. - attachedP: list, int - list of ID numbers of any Points attached to the Body - rPointRel: list, float - list of coordinates of each attached Point relative to the Body reference frame [m] - - Returns - ------- - None. - - """ - - self.sys = mooringSys # store a reference to the overall mooring system (instance of System class) - - self.number = num - self.type = type # 0 free to move, or -1 coupled externally - self.r6 = np.array(r6, dtype=np.float_) # 6DOF position and orientation vector [m, rad] - self.m = m # mass, centered at CG [kg] - self.v = v # volume, assumed centered at reference point [m^3] - self.rCG = np.array(rCG, dtype=np.float_) # center of gravity position in body reference frame [m] - self.AWP = AWP # waterplane area - used for hydrostatic heave stiffness if nonzero [m^2] - if np.isscalar(rM): - self.rM = np.array( - [0, 0, rM], dtype=np.float_ - ) # coordinates of body metacenter relative to body reference frame [m] - else: - self.rM = np.array(rM, dtype=np.float_) - - # >>> should streamline the below <<< - if np.isscalar(I): - self.I = np.array([I, I, I], dtype=float) - else: - self.I = np.array(I, dtype=float) - - if np.isscalar(CdA): - self.CdA = np.array([CdA, CdA, CdA], dtype=float) - else: - self.CdA = np.array(CdA, dtype=float) - - if np.isscalar(Ca): - self.Ca = np.array([Ca, Ca, Ca], dtype=float) - else: - self.Ca = np.array(Ca, dtype=float) - - self.f6Ext = np.array( - f6Ext, dtype=float - ) # for adding external forces and moments in global orientation (not including weight/buoyancy) - - self.attachedP = [] # ID numbers of any Points attached to the Body - self.rPointRel = [] # coordinates of each attached Point relative to the Body reference frame - - self.attachedR = [] # ID numbers of any Rods attached to the Body (not yet implemented) - self.r6RodRel = [] # coordinates and unit vector of each attached Rod relative to the Body reference frame - - self.R = np.eye(3) # body orientation rotation matrix - # print("Created Body "+str(self.number)) - - def attachPoint(self, pointID, rAttach): - """Adds a Point to the Body, at the specified relative position on the body. - - Parameters - ---------- - pointID : int - The identifier ID number of a point - rAttach : array - The position of the point relative to the body's frame [m] - - Returns - ------- - None. - - """ - - self.attachedP.append(pointID) - self.rPointRel.append(np.array(rAttach)) - - if self.sys.display > 1: - print("attached Point " + str(pointID) + " to Body " + str(self.number)) - - def attachRod(self, rodID, endCoords): - """Adds a Point to the Body, at the specified relative position on the body. - - Parameters - ---------- - rodID : int - The identifier ID number of a point - endCoords : array - The position of the Rods two ends relative to the body reference frame [m] - - Returns - ------- - None. - - """ - - k = (endCoords[3:] - endCoords[:3]) / np.linalg.norm(endCoords[3:] - endCoords[:3]) - - self.attachedR.append(rodID) - self.r6RodRel.append(np.hstack([endCoords[:3], k])) - - print("attached Rod " + str(rodID) + " to Body " + str(self.number)) - - def setPosition(self, r6): - """Sets the position of the Body, along with that of any dependent objects. - - Parameters - ---------- - r6 : array - 6DOF position and orientation vector of the body [m, rad] - - Raises - ------ - ValueError - If the length of the input r6 array is not of length 6 - - Returns - ------- - None. - - """ - - if len(r6) == 6: - self.r6 = np.array(r6, dtype=np.float_) # update the position of the Body itself - else: - raise ValueError( - f"Body setPosition method requires an argument of size 6, but size {len(r6):d} was provided" - ) - - self.R = rotationMatrix(self.r6[3], self.r6[4], self.r6[5]) # update body rotation matrix - - # update the position of any attached Points - for PointID, rPointRel in zip(self.attachedP, self.rPointRel): - rPoint = np.matmul(self.R, rPointRel) + self.r6[:3] # rPoint = transformPosition(rPointRel, r6) - self.sys.pointList[PointID - 1].setPosition(rPoint) - - # update the position of any attached Rods - for rodID, r6Rel in zip(self.attachedR, self.r6RodRel): - rA = np.matmul(self.R, r6Rel[:3]) + self.r6[:3] - k = np.matmul(self.R, r6Rel[3:]) - self.sys.rodList[rodID - 1].rA = rA - self.sys.rodList[rodID - 1].rB = rA + k * self.sys.rodList[rodID - 1].L - - if self.sys.display > 3: - printVec(rPoint) - breakpoint() - - def getForces(self, lines_only=False): - """Sums the forces and moments on the Body, including its own plus those from any attached objects. - - Parameters - ---------- - lines_only : boolean, optional - An option for calculating forces from just the mooring lines or not. The default is False. - - Returns - ------- - f6 : array - The 6DOF forces and moments applied to the body in its current position [N, Nm] - - """ - - f6 = np.zeros(6) - - # TODO: could save time in below by storing the body's rotation matrix when it's position is set rather than - # recalculating it in each of the following function calls. - - if lines_only == False: - # add weight, which may result in moments as well as a force - rCG_rotated = rotatePosition( - self.rCG, self.r6[3:] - ) # relative position of CG about body ref point in unrotated reference frame - f6 += translateForce3to6DOF( - rCG_rotated, np.array([0, 0, -self.m * self.sys.g]) - ) # add to net forces/moments - - # add buoyancy force and moments if applicable (this can include hydrostatic restoring moments - # if rM is considered the metacenter location rather than the center of buoyancy) - rM_rotated = rotatePosition( - self.rM, self.r6[3:] - ) # relative position of metacenter about body ref point in unrotated reference frame - f6 += translateForce3to6DOF( - rM_rotated, np.array([0, 0, self.sys.rho * self.sys.g * self.v]) - ) # add to net forces/moments - - # add hydrostatic heave stiffness (if AWP is nonzero) - f6[2] -= self.sys.rho * self.sys.g * self.AWP * self.r6[2] - - # add any externally applied forces/moments (in global orientation) - f6 += self.f6Ext - - # add forces from any attached Points (and their attached lines) - for PointID, rPointRel in zip(self.attachedP, self.rPointRel): - fPoint = self.sys.pointList[PointID - 1].getForces(lines_only=lines_only) # get net force on attached Point - rPoint_rotated = rotatePosition( - rPointRel, self.r6[3:] - ) # relative position of Point about body ref point in unrotated reference frame - f6 += translateForce3to6DOF( - rPoint_rotated, fPoint - ) # add net force and moment resulting from its position to the Body - - # All forces and moments on the body should now be summed, and are in global/unrotated orientations. - - # For application to the body DOFs, convert the moments to be about the body's local/rotated x/y/z axes <<< do we want this in all cases? - rotMat = rotationMatrix(*self.r6[3:]) # get rotation matrix for body - moment_about_body_ref = np.matmul( - rotMat.T, f6[3:] - ) # transform moments so that they are about the body's local/rotated axes - f6[3:] = moment_about_body_ref # use these moments - - return f6 - - def getStiffness(self, X=[], tol=0.0001, dx=0.1): - """Gets the stiffness matrix of a Body due only to mooring lines with all other objects free to equilibriate. - The rotational indicies of the stiffness matrix correspond to the local/rotated axes of the body rather than - the global x/y/z directions. - - Parameters - ---------- - X1 : array - The position vector (6DOF) of the main axes of the Body at which the stiffness matrix is to be calculated. - dx : float, optional - The change in displacement to be used for calculating the change in force. The default is 0.01. - - Returns - ------- - K : matrix - The stiffness matrix of the body at the given position X1. - - """ - - # print("Getting Body "+str(self.number)+" stiffness matrix...") - - if len(X) == 6: - X1 = np.array(X) - elif len(X) == 0: - X1 = self.r6 - else: - raise ValueError("Body.getStiffness expects the optional X parameter to be size 6") - - # set this Body's type to fixed so mooring system equilibrium response to its displacements can be found - type0 = self.type # store original type to restore later - self.type = 1 # set type to 1 (not free) so that it won't be adjusted when finding equilibrium - - # ensure this Body is positioned at the desired linearization point - self.setPosition(X1) # set position to linearization point - self.sys.solveEquilibrium3(tol=tol) # find equilibrium of mooring system given this Body in current position - f6 = self.getForces(lines_only=True) # get the net 6DOF forces/moments from any attached lines - - # Build a stiffness matrix by perturbing each DOF in turn - K = np.zeros([6, 6]) - - for i in range(len(K)): - X2 = X1 + np.insert(np.zeros(5), i, dx) # calculate perturbed Body position by adding dx to DOF in question - self.setPosition(X2) # perturb this Body's position - self.sys.solveEquilibrium3(tol=tol) # find equilibrium of mooring system given this Body's new position - f6_2 = self.getForces(lines_only=True) # get the net 6DOF forces/moments from any attached lines - - K[:, i] = -(f6_2 - f6) / dx # get stiffness in this DOF via finite difference and add to matrix column - - # ----------------- restore the system back to previous positions ------------------ - self.setPosition(X1) # set position to linearization point - self.sys.solveEquilibrium3(tol=tol) # find equilibrium of mooring system given this Body in current position - self.type = type0 # restore the Body's type to its original value - - return K - - def getStiffnessA(self, lines_only=False): - """Gets the analytical stiffness matrix of the Body with other objects fixed. - - Returns - ------- - K : matrix - 6x6 analytic stiffness matrix. - - """ - - # print("Getting Body "+str(self.number)+" stiffness matrix...") - - K = np.zeros([6, 6]) - - for PointID, rPointRel in zip(self.attachedP, self.rPointRel): - r = rotatePosition( - rPointRel, self.r6[3:] - ) # relative position of Point about body ref point in unrotated reference frame - f3 = self.sys.pointList[ - PointID - 1 - ].getForces() # total force on point (for additional rotational stiffness term due to change in moment arm) - K3 = self.sys.pointList[PointID - 1].getStiffnessA() # local 3D stiffness matrix of the point - - # following are from functions translateMatrix3to6 - H = getH(r) - K[:3, :3] += K3 - K[:3, 3:] += np.matmul( - K3, H - ) # only add up one off-diagonal sub-matrix for now, then we'll mirror at the end - K[3:, 3:] += np.matmul(np.matmul(H, K3), H.T) + np.matmul(getH(f3), H.T) - # K[3:,3:] += np.matmul(np.matmul(H, K3), H.T) - np.matmul( getH(f3), H) # <<< should be the same - - K[3:, :3] = K[:3, 3:].T # copy over other off-diagonal sub-matrix - - if lines_only == False: - # rotational stiffness effect of weight - rCG_rotated = rotatePosition( - self.rCG, self.r6[3:] - ) # relative position of CG about body ref point in unrotated reference frame - Kw = -np.matmul(getH([0, 0, -self.m * self.sys.g]), getH(rCG_rotated)) - - # rotational stiffness effect of buoyancy at metacenter - rM_rotated = rotatePosition( - self.rM, self.r6[3:] - ) # relative position of metacenter about body ref point in unrotated reference frame - Kb = -np.matmul(getH([0, 0, self.sys.rho * self.sys.g * self.v]), getH(rM_rotated)) - - # hydrostatic heave stiffness (if AWP is nonzero) - Kwp = self.sys.rho * self.sys.g * self.AWP - - K[3:, 3:] += Kw + Kb - K[2, 2] += Kwp - - return K - - def draw(self, ax): - """Draws the reference axis of the body - - Parameters - ---------- - ax : axes - matplotlib.pyplot axes to be used for drawing and plotting. - - Returns - ------- - linebit : list - a list to hold plotted lines of the body's frame axes. - - """ - - linebit = [] # make empty list to hold plotted lines, however many there are - - rx = transformPosition(np.array([5, 0, 0]), self.r6) - ry = transformPosition(np.array([0, 5, 0]), self.r6) - rz = transformPosition(np.array([0, 0, 5]), self.r6) - - linebit.append(ax.plot([self.r6[0], rx[0]], [self.r6[1], rx[1]], [self.r6[2], rx[2]], color="r")) - linebit.append(ax.plot([self.r6[0], ry[0]], [self.r6[1], ry[1]], [self.r6[2], ry[2]], color="g")) - linebit.append(ax.plot([self.r6[0], rz[0]], [self.r6[1], rz[1]], [self.r6[2], rz[2]], color="b")) - - self.linebit = linebit - - return linebit - - def redraw(self): - """Redraws the reference axis of the body - - Returns - ------- - linebit : list - a list to hold redrawn lines of the body's frame axes. - - """ - - linebit = self.linebit - - rx = transformPosition(np.array([5, 0, 0]), self.r6) - ry = transformPosition(np.array([0, 5, 0]), self.r6) - rz = transformPosition(np.array([0, 0, 5]), self.r6) - - linebit[0][0].set_data_3d([self.r6[0], rx[0]], [self.r6[1], rx[1]], [self.r6[2], rx[2]]) - linebit[1][0].set_data_3d([self.r6[0], ry[0]], [self.r6[1], ry[1]], [self.r6[2], ry[2]]) - linebit[2][0].set_data_3d([self.r6[0], rz[0]], [self.r6[1], rz[1]], [self.r6[2], rz[2]]) - """ - linebit[0][0].set_data([self.r6[0], rx[0]], [self.r6[1], rx[1]]) - linebit[0][0].set_3d_properties([self.r6[2], rx[2]]) - linebit[1][0].set_data([self.r6[0], ry[0]], [self.r6[1], ry[1]]) - linebit[1][0].set_3d_properties([self.r6[2], ry[2]]) - linebit[2][0].set_data([self.r6[0], rz[0]], [self.r6[1], rz[1]]) - linebit[2][0].set_3d_properties([self.r6[2], rz[2]]) - """ - return linebit - - -# diff --git a/WISDEM/wisdem/moorpy/correct_imports.sh b/WISDEM/wisdem/moorpy/correct_imports.sh deleted file mode 100755 index 24a46f393..000000000 --- a/WISDEM/wisdem/moorpy/correct_imports.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -sed -i -s 's/from moorpy/from wisdem.moorpy/g' *.py -sed -i -s 's/import moorpy/import wisdem.moorpy/g' *.py diff --git a/WISDEM/wisdem/moorpy/helpers.py b/WISDEM/wisdem/moorpy/helpers.py deleted file mode 100644 index 6281400e8..000000000 --- a/WISDEM/wisdem/moorpy/helpers.py +++ /dev/null @@ -1,831 +0,0 @@ -import os -import time - -import yaml -import numpy as np - - -# base class for MoorPy exceptions -class Error(Exception): - """Base class for MoorPy exceptions""" - - pass - - -# Catenary error class -class CatenaryError(Error): - """Derived error class for catenary function errors. Contains an error message.""" - - def __init__(self, message): - self.message = message - - -# Line Object error class -class LineError(Error): - """Derived error class for Line object errors. Contains an error message and the line number with the error.""" - - def __init__(self, num, message): - self.line_num = num - self.message = message - - -# Solve error class for any solver process -class SolveError(Error): - """Derived error class for various solver errors. Contains an error message""" - - def __init__(self, message): - self.message = message - - -# Generic MoorPy error -class MoorPyError(Error): - """Derived error class for MoorPy. Contains an error message""" - - def __init__(self, message): - self.message = str(message) - - -def printMat(mat): - """Prints a matrix to a format that is specified - - Parameters - ---------- - mat : array - Any matrix that is to be printed. - - Returns - ------- - None. - - """ - for i in range(mat.shape[0]): - print("\t".join(["{:+8.3e}"] * mat.shape[1]).format(*mat[i, :])) - - -def printVec(vec): - """Prints a vector to a format that is specified - - Parameters - ---------- - vec : array - Any vector that is to be printed. - - Returns - ------- - None. - - """ - print("\t".join(["{:+9.4e}"] * len(vec)).format(*vec)) - - -def getH(r): - """function gets the alternator matrix, H, that when multiplied with a vector, - returns the cross product of r and that vector - - Parameters - ---------- - r : array - the position vector that another vector is from a point of interest. - - Returns - ------- - H : matrix - the alternator matrix for the size-3 vector, r. - - """ - - H = np.array([[0, r[2], -r[1]], [-r[2], 0, r[0]], [r[1], -r[0], 0]]) - return H - - -def rotationMatrix(x3, x2, x1): - """Calculates a rotation matrix based on order-z,y,x instrinsic (tait-bryan?) angles, meaning - they are about the ROTATED axes. (rotation about z-axis would be (0,0,theta) ) - - Parameters - ---------- - x3, x2, x1: floats - The angles that the rotated axes are from the nonrotated axes. Normally roll,pitch,yaw respectively. [rad] - - Returns - ------- - R : matrix - The rotation matrix - """ - # initialize the sines and cosines - s1 = np.sin(x1) - c1 = np.cos(x1) - s2 = np.sin(x2) - c2 = np.cos(x2) - s3 = np.sin(x3) - c3 = np.cos(x3) - - # create the rotation matrix - R = np.array( - [ - [c1 * c2, c1 * s2 * s3 - c3 * s1, s1 * s3 + c1 * c3 * s2], - [c2 * s1, c1 * c3 + s1 * s2 * s3, c3 * s1 * s2 - c1 * s3], - [-s2, c2 * s3, c2 * c3], - ] - ) - - return R - - -def rotatePosition(rRelPoint, rot3): - """Calculates the new position of a point by applying a rotation (rotates a vector by three angles) - - Parameters - ---------- - rRelPoint : array - x,y,z coordinates of a point relative to a local frame [m] - rot3 : array - Three angles that describe the difference between the local frame and the global frame/ Normally roll,pitch,yaw. [rad] - - Returns - ------- - rRel : array - The relative rotated position of the point about the local frame [m] - """ - - # get rotation matrix from three provided angles - RotMat = rotationMatrix(rot3[0], rot3[1], rot3[2]) - - # find location of point in unrotated reference frame about reference point - rRel = np.matmul(RotMat, rRelPoint) - - return rRel - - -def transformPosition(rRelPoint, r6): - """Calculates the position of a point based on its position relative to translated and rotated 6DOF body - - Parameters - ---------- - rRelPoint : array - x,y,z coordinates of a point relative to a local frame [m] - r6 : array - 6DOF position vector of the origin of the local frame, in the global frame coorindates [m, rad] - - Returns - ------- - rAbs : array - The absolute position of the point about the global frame [m] - """ - # note: r6 should be in global orientation frame - - # absolute location = rotation of relative position + absolute position of reference point - rAbs = rotatePosition(rRelPoint, r6[3:]) + r6[:3] - - return rAbs - - -def translateForce3to6DOF(r, Fin): - """Takes in a position vector and a force vector (applied at the positon), and calculates - the resulting 6-DOF force and moment vector. - - Parameters - ---------- - r : array - x,y,z coordinates at which force is acting [m] - Fin : array - x,y,z components of force [N] - - Returns - ------- - Fout : array - The resulting force and moment vector [N, Nm] - """ - - # initialize output vector as same dtype as input vector (to support both real and complex inputs) - Fout = np.zeros(6, dtype=Fin.dtype) - - # set the first three elements of the output vector the same as the input vector - Fout[:3] = Fin - - # set the last three elements of the output vector as the cross product of r and Fin - Fout[3:] = np.cross(r, Fin) - - return Fout - - -def set_axes_equal(ax): - """Sets 3D plot axes to equal scale - - Parameters - ---------- - ax : matplotlib.pyplot axes - the axes that are to be set equal in scale to each other. - - Returns - ------- - None. - - """ - - rangex = np.diff(ax.get_xlim3d())[0] - rangey = np.diff(ax.get_ylim3d())[0] - rangez = np.diff(ax.get_zlim3d())[0] - - ax.set_box_aspect([rangex, rangey, rangez]) # note: this may require a matplotlib update - - -def dsolve2( - eval_func, - X0, - Ytarget=[], - step_func=None, - args=[], - tol=0.0001, - ytol=0, - maxIter=20, - Xmin=[], - Xmax=[], - a_max=2.0, - dX_last=[], - stepfac=4, - display=0, - dodamping=False, -): - """ - PARAMETERS - ---------- - eval_func : function - function to solve (will be passed array X, and must return array Y of same size) - X0 : array - initial guess of X - Ytarget : array (optional) - target function results (Y), assumed zero if not provided - stp_func : function (optional) - function use for adjusting the variables (computing dX) each step. - If not provided, Netwon's method with finite differencing is used. - args : list - A list of variables (e.g. the system object) to be passed to both the eval_func and step_func - tol : float or array - If scalar, the*relative* convergence tolerance (applied to step size components, dX). - If an array, must be same size as X, and specifies an absolute convergence threshold for each variable. - ytol: float, optional - If specified, this is the absolute error tolerance that must be satisfied. This overrides the tol setting which otherwise works based on x values. - Xmin, Xmax - Bounds. by default start bounds at infinity - a_max - maximum step size acceleration allowed - dX_last - Used if you want to dictate the initial step size/direction based on a previous attempt - """ - success = False - start_time = time.time() - # process inputs and format as arrays in case they aren't already - - X = np.array(X0, dtype=np.float_) # start off design variable - N = len(X) - - Xs = np.zeros([maxIter, N]) # make arrays to store X and error results of the solve - Es = np.zeros([maxIter, N]) - dXlist = np.zeros([maxIter, N]) - dXlist2 = np.zeros([maxIter, N]) - - damper = 1.0 # used to add a relaxation/damping factor to reduce the step size and combat instability - - # check the target Y value input - if len(Ytarget) == N: - Ytarget = np.array(Ytarget, dtype=np.float_) - elif len(Ytarget) == 0: - Ytarget = np.zeros(N, dtype=np.float_) - else: - raise TypeError("Ytarget must be of same length as X0") - - # ensure all tolerances are positive - if ytol == 0: # if not using ytol - if np.isscalar(tol) and tol <= 0.0: - raise ValueError("tol value passed to dsovle2 must be positive") - elif not np.isscalar(tol) and any(tol <= 0): - raise ValueError("every tol entry passed to dsovle2 must be positive") - - # if a step function wasn't provided, provide a default one - if step_func == None: - if display > 1: - print("Using default finite difference step func") - - def step_func(X, args, Y, oths, Ytarget, err, tols, iter, maxIter): - """this now assumes tols passed in is a vector and are absolute quantities""" - J = np.zeros([N, N]) # Initialize the Jacobian matrix that has to be a square matrix with nRows = len(X) - - for i in range( - N - ): # Newton's method: perturb each element of the X variable by a little, calculate the outputs from the - X2 = np.array( - X - ) # minimizing function, find the difference and divide by the perturbation (finding dForce/d change in design variable) - deltaX = ( - stepfac * tols[i] - ) # note: this function uses the tols variable that is computed in dsolve based on the tol input - X2[i] += deltaX - Y2, _, _ = eval_func(X2, args) # here we use the provided eval_func - - J[:, i] = (Y2 - Y) / deltaX # and append that column to each respective column of the Jacobian matrix - - if N > 1: - dX = -np.matmul( - np.linalg.inv(J), Y - Ytarget - ) # Take this nth output from the minimizing function and divide it by the jacobian (derivative) - else: - if J[0, 0] == 0.0: - raise ValueError("dsolve2 found a zero gradient") - - dX = np.array([-(Y[0] - Ytarget[0]) / J[0, 0]]) - - if display > 1: - print( - f" step_func iter {iter} X={X[0]:9.2e}, error={Y[0]-Ytarget[0]:9.2e}, slope={J[0,0]:9.2e}, dX={dX[0]:9.2e}" - ) - - return dX # returns dX (step to make) - - # handle bounds - if len(Xmin) == 0: - Xmin = np.zeros(N) - np.inf - elif len(Xmin) == N: - Xmin = np.array(Xmin, dtype=np.float_) - else: - raise TypeError("Xmin must be of same length as X0") - - if len(Xmax) == 0: - Xmax = np.zeros(N) + np.inf - elif len(Xmax) == N: - Xmax = np.array(Xmax, dtype=np.float_) - else: - raise TypeError("Xmax must be of same length as X0") - - if len(dX_last) == 0: - dX_last = np.zeros(N) - else: - dX_last = np.array(dX_last, dtype=np.float_) - - if display > 0: - print(f"Starting dsolve iterations>>> aiming for Y={Ytarget}") - - for iter in range(maxIter): - # call evaluation function - Y, oths, stop = eval_func(X, args) - - # compute error - err = Y - Ytarget - - if display == 2: - print(f" new iteration #{iter} with RMS error {np.linalg.norm(err):8.3e}") - if display > 2: - print(f" new iteration #{iter} with X={X} and Y={Y}") - - Xs[iter, :] = X - Es[iter, :] = err - - # stop if commanded by objective function - if stop: - break - - # handle tolerances input - if np.isscalar(tol): - tols = tol * (np.abs(X) + tol) - else: - tols = np.array(tol) - - # check maximum iteration - if iter == maxIter - 1: - if display > 0: - print("Failed to find solution after " + str(iter) + " iterations, with error of " + str(err)) - - # looks like things didn't converge, so if N=1 do a linear fit on the last 30% of points to estimate the soln - if N == 1: - m, b = np.polyfit(Es[int(0.7 * iter) : iter, 0], Xs[int(0.7 * iter) : iter, 0], 1) - X = np.array([b]) - Y = np.array([0.0]) - print(f"Using linaer fit to estimate solution at X={b}") - - break - - # >>>> COULD ALSO HAVE AN ITERATION RESTART FUNCTION? >>> - # that returns a restart boolean, as well as what values to use to restart things if true. How? - - else: - dX = step_func(X, args, Y, oths, Ytarget, err, tols, iter, maxIter) - - # if display>2: - # breakpoint() - - # Make sure we're not diverging by keeping things from reversing too much. - # Track the previous step (dX_last) and if the current step reverses too much, stop it part way. - # Stop it at a plane part way between the current X value and the previous X value (using golden ratio, why not). - - # get the point along the previous step vector where we'll draw the bounding hyperplane (could be a line, plane, or more in higher dimensions) - Xlim = X - 0.62 * dX_last - - # the equation for the plane we don't want to recross is then sum(X*dX_last) = sum(Xlim*dX_last) - if np.sum((X + dX) * dX_last) < np.sum(Xlim * dX_last): # if we cross are going to cross it - alpha = np.sum((Xlim - X) * dX_last) / np.sum( - dX * dX_last - ) # this is how much we need to scale down dX to land on it rather than cross it - - if display > 2: - print(" limiting oscillation with alpha=" + str(alpha)) - print(f" dX_last was {dX_last}, dX was going to be {dX}, now it'll be {alpha*dX}") - - dX = alpha * dX # scale down dX - - # also avoid extreme accelerations in the same direction - for i in range(N): - # should update the following for ytol >>> - if abs(dX_last[i]) > tols[i]: # only worry about accelerations if the last step was non-negligible - dX_max = ( - a_max * dX_last[i] - ) # set the maximum permissible dx in each direction based an an acceleration limit - - if dX_max == 0.0: # avoid a divide-by-zero case (if dX[i] was zero to start with) - breakpoint() - dX[i] = 0.0 - else: - a_i = dX[i] / dX_max # calculate ratio of desired dx to max dx - - if a_i > 1.0: - if display > 2: - print(f" limiting acceleration ({1.0/a_i:6.4f}) for axis {i}") - print(f" dX_last was {dX_last}, dX was going to be {dX}") - - # dX = dX*a_max/a_i # scale it down to the maximum value - dX[i] = dX[i] / a_i # scale it down to the maximum value (treat each DOF individually) - - if display > 2: - print(f" now dX will be {dX}") - - dXlist[iter, :] = dX - # if iter==196: - # breakpoint() - - # add damping if cyclic behavior is detected at the halfway point - if dodamping and iter == int(0.5 * maxIter): - if display > 2: - print(f"dsolve2 is at iteration {iter} (50% of maxIter)") - - for j in range(2, iter - 1): - iterc = iter - j - if all(np.abs(X - Xs[iterc, :]) < tols): - print(f"dsolve2 is going in circles detected at iteration {iter}") - print(f"last similar point was at iteration {iterc}") - damper = damper * 0.9 - break - - dX = damper * dX - - # enforce bounds - for i in range(N): - if X[i] + dX[i] < Xmin[i]: - dX[i] = Xmin[i] - X[i] - - elif X[i] + dX[i] > Xmax[i]: - dX[i] = Xmax[i] - X[i] - - dXlist2[iter, :] = dX - # check for convergence - if (ytol == 0 and all(np.abs(dX) < tols)) or (ytol > 0 and all(np.abs(err) < ytol)): - if display > 0: - print( - "Iteration converged after " - + str(iter) - + " iterations with error of " - + str(err) - + " and dX of " - + str(dX) - ) - print("Solution X is " + str(X)) - - # if abs(err) > 10: - # breakpoint() - - if display > 0: - print( - "Total run time: {:8.2f} seconds = {:8.2f} minutes".format( - (time.time() - start_time), ((time.time() - start_time) / 60) - ) - ) - - if any(X == Xmin) or any(X == Xmax): - success = False - print("Warning: dsolve ended on a bound.") - else: - success = True - - break - - dX_last = 1.0 * dX # remember this current value - - X = X + dX - - return ( - X, - Y, - dict(iter=iter, err=err, dX=dX_last, oths=oths, Xs=Xs, Es=Es, success=success, dXlist=dXlist, dXlist2=dXlist2), - ) - - -def getLineProps(dnommm, material, source=None, name="", rho=1025.0, g=9.81, **kwargs): - """Sets up a dictionary that represents a mooring line type based on the - specified diameter and material type. The - - - This function requires at least one input: the line diameter in millimeters. - - The rest of the inputs are optional: describe the desired type of line (chain, polyester, wire, etc.), - the type of chain (studless or studlink), the source of data (Orcaflex-original or altered), or a name identifier - - The function will output a MoorPy linetype object - - # support options for : - - # 1. dictionary passed in (this is what will be done when called from a System method) - - (a) by default, System will load in MoorPy's default line property information YAML - - (b) or user specify's alternate YAML file when making the system - - - # 2. yaml filename pass in or use default moorpy yaml and load yaml (used when called independently) - - System.linePropsDatabase will be a dictionary of stored YAML coefficients - - System.lineTypes will become a dictionary of LineType DICTIONARIES - - - Parameters - ---------- - dnommm : float - nominal diameter [mm]. - material : string - string identifier of the material type be used. - source : dict or filename (optional) - YAML file name or dictionary containing line property scaling coefficients - name : any dict index (optional) - Identifier for the line type (otherwise will be generated automatically). - """ - - # deal with the source (is it a dictionary, or reading in a new yaml?) - lineProps = loadLineProps(source) - - # raise an error if the material isn't in the source dictionary - if not material in lineProps: - raise ValueError(f"Specified mooring line material, {material}, is not in the database.") - - # calculate the relevant properties for this specific line type - mat = lineProps[material] # shorthand for the sub-dictionary of properties for the material in question - d = dnommm * 0.001 # convert nominal diameter from mm to m - d_vol = mat["dvol_dnom"] * d - mass = mat["mass_0"] + mat["mass_d"] * d + mat["mass_d2"] * d**2 + mat["mass_d3"] * d**3 - EA = mat["EA_0"] + mat["EA_d"] * d + mat["EA_d2"] * d**2 + mat["EA_d3"] * d**3 - MBL = mat["MBL_0"] + mat["MBL_d"] * d + mat["MBL_d2"] * d**2 + mat["MBL_d3"] * d**3 - cost = ( - mat["cost_0"] - + mat["cost_d"] * d - + mat["cost_d2"] * d**2 - + mat["cost_d3"] * d**3 - + mat["cost_mass"] * mass - + mat["cost_EA"] * EA - + mat["cost_MBL"] * MBL - ) - w = (mass - np.pi / 4 * d_vol**2 * rho) * g - - # Set up a main identifier for the linetype unless one is provided - if name == "": - typestring = f"{type}{dnommm:.0f}" - else: - typestring = name - - notes = f"made with getLineProps" - - lineType = dict( - name=typestring, - d_vol=d_vol, - m=mass, - EA=EA, - w=w, - MBL=MBL, - cost=cost, - notes=notes, - input_type=type, - input_d=d, - material=material, - ) - - lineType.update(kwargs) # add any custom arguments provided in the call to the lineType's dictionary - - return lineType - - -def loadLineProps(source): - """Loads a set of MoorPy mooring line property scaling coefficients from - a specified YAML file or passed dictionary. Any coefficients not included - will take a default value (zero for everything except diameter ratio, - which is 1). It returns a dictionary containing the complete mooring line - property scaling coefficient set to use for any provided mooring line types. - - Parameters - ---------- - - source : dict or filename - YAML file name or dictionary containing line property scaling coefficients - - """ - - if type(source) is dict: - source = source - - elif source is None or source == "default": - import os - - mpdir = os.path.dirname(os.path.realpath(__file__)) - with open(os.path.join(mpdir, "MoorProps_default.yaml")) as file: - source = yaml.load(file, Loader=yaml.FullLoader) - - elif type(source) is string: - with open(source) as file: - source = yaml.load(file, Loader=yaml.FullLoader) - - else: - raise Exception("loadLineProps supplied with invalid source") - - if "lineProps" in source: - lineProps = source["lineProps"] - else: - raise Exception("YAML file or dictionary must have a 'lineProps' field containing the data") - - output = dict() # output dictionary combining default values with loaded coefficients - - # combine loaded coefficients and default values into dictionary that will be saved for each material - for mat, props in lineProps.items(): - output[mat] = {} - output[mat]["mass_0"] = getFromDict(props, "mass_0", default=0.0) - output[mat]["mass_d"] = getFromDict(props, "mass_d", default=0.0) - output[mat]["mass_d2"] = getFromDict(props, "mass_d2", default=0.0) - output[mat]["mass_d3"] = getFromDict(props, "mass_d3", default=0.0) - output[mat]["EA_0"] = getFromDict(props, "EA_0", default=0.0) - output[mat]["EA_d"] = getFromDict(props, "EA_d", default=0.0) - output[mat]["EA_d2"] = getFromDict(props, "EA_d2", default=0.0) - output[mat]["EA_d3"] = getFromDict(props, "EA_d3", default=0.0) - output[mat]["MBL_0"] = getFromDict(props, "MBL_0", default=0.0) - output[mat]["MBL_d"] = getFromDict(props, "MBL_d", default=0.0) - output[mat]["MBL_d2"] = getFromDict(props, "MBL_d2", default=0.0) - output[mat]["MBL_d3"] = getFromDict(props, "MBL_d3", default=0.0) - output[mat]["dvol_dnom"] = getFromDict(props, "dvol_dnom", default=1.0) - output[mat]["cost_0"] = getFromDict(props, "cost_0", default=0.0) - output[mat]["cost_d"] = getFromDict(props, "cost_d", default=0.0) - output[mat]["cost_d2"] = getFromDict(props, "cost_d2", default=0.0) - output[mat]["cost_d3"] = getFromDict(props, "cost_d3", default=0.0) - output[mat]["cost_mass"] = getFromDict(props, "cost_mass", default=0.0) - output[mat]["cost_EA"] = getFromDict(props, "cost_EA", default=0.0) - output[mat]["cost_MBL"] = getFromDict(props, "cost_MBL", default=0.0) - - return output - - -def getFromDict(dict, key, shape=0, dtype=float, default=None): - """ - Function to streamline getting values from design dictionary from YAML file, including error checking. - - Parameters - ---------- - dict : dict - the dictionary - key : string - the key in the dictionary - shape : list, optional - The desired shape of the output. If not provided, assuming scalar output. If -1, any input shape is used. - dtype : type - Must be a python type than can serve as a function to format the input value to the right type. - default : number, optional - The default value to fill in if the item isn't in the dictionary. Otherwise will raise error if the key doesn't exist. - """ - # in future could support nested keys if type(key)==list: ... - - if key in dict: - val = dict[key] # get the value from the dictionary - if shape == 0: # scalar input expected - if np.isscalar(val): - return dtype(val) - else: - raise ValueError(f"Value for key '{key}' is expected to be a scalar but instead is: {val}") - elif shape == -1: # any input shape accepted - if np.isscalar(val): - return dtype(val) - else: - return np.array(val, dtype=dtype) - else: - if np.isscalar(val): # if a scalar value is provided and we need to produce an array (of any shape) - return np.tile(dtype(val), shape) - - elif np.isscalar(shape): # if expecting a 1D array - if len(val) == shape: - return np.array([dtype(v) for v in val]) - else: - raise ValueError(f"Value for key '{key}' is not the expected size of {shape} and is instead: {val}") - - else: # must be expecting a multi-D array - vala = np.array(val, dtype=dtype) # make array - - if list(vala.shape) == shape: # if provided with the right shape - return vala - elif len(shape) > 2: - raise ValueError("Function getFromDict isn't set up for shapes larger than 2 dimensions") - elif ( - vala.ndim == 1 and len(vala) == shape[1] - ): # if we expect an MxN array, and an array of size N is provided, tile it M times - return np.tile(vala, [shape[0], 1]) - else: - raise ValueError( - f"Value for key '{key}' is not a compatible size for target size of {shape} and is instead: {val}" - ) - - else: - if default == None: - raise ValueError(f"Key '{key}' not found in input file...") - else: - if shape == 0 or shape == -1: - return default - else: - return np.tile(default, shape) - - -def makeTower(twrH, twrRad): - """Sets up mesh points for visualizing a cylindrical structure (should align with RAFT eventually.""" - - n = 8 - X = [] - Y = [] - Z = [] - ax = np.zeros(n + 1) - ay = np.zeros(n + 1) - for jj in range(n + 1): - ax[jj] = np.cos(float(jj) / float(n) * 2.0 * np.pi) - ay[jj] = np.sin(float(jj) / float(n) * 2.0 * np.pi) - - for ii in range(int(len(twrRad) - 1)): - z0 = twrH * float(ii) / float(len(twrRad) - 1) - z1 = twrH * float(ii + 1) / float(len(twrRad) - 1) - for jj in range(n + 1): - X.append(twrRad[ii] * ax[jj]) - Y.append(twrRad[ii] * ay[jj]) - Z.append(z0) - X.append(twrRad[ii + 1] * ax[jj]) - Y.append(twrRad[ii + 1] * ay[jj]) - Z.append(z1) - - Xs = np.array(X) - Ys = np.array(Y) - Zs = np.array(Z) - - return Xs, Ys, Zs - - -def read_mooring_file(dirName, fileName): - # Taken from line system.... maybe should be a helper function? - # load data from time series for single mooring line - - print("attempting to load " + dirName + fileName) - - f = open(dirName + fileName, "r") - - channels = [] - units = [] - data = [] - i = 0 - - for line in f: # loop through lines in file - if i == 0: - for entry in line.split(): # loop over the elemets, split by whitespace - channels.append(entry) # append to the last element of the list - - elif i == 1: - for entry in line.split(): # loop over the elemets, split by whitespace - units.append(entry) # append to the last element of the list - - elif len(line.split()) > 0: - data.append([]) # add a new sublist to the data matrix - import re - - r = re.compile( - r"(?<=\d)\-(?=\d)" - ) # catch any instances where a large negative exponent has been written with the "E" - line2 = r.sub("E-", line) # and add in the E - - for entry in line2.split(): # loop over the elemets, split by whitespace - data[-1].append(entry) # append to the last element of the list - - else: - break - - i += 1 - - f.close() # close data file - - # use a dictionary for convenient access of channel columns (eg. data[t][ch['PtfmPitch'] ) - ch = dict(zip(channels, range(len(channels)))) - - data2 = np.array(data) - - data3 = data2.astype(float) - - return data3, ch, channels, units diff --git a/WISDEM/wisdem/moorpy/line.py b/WISDEM/wisdem/moorpy/line.py deleted file mode 100644 index d0a393c49..000000000 --- a/WISDEM/wisdem/moorpy/line.py +++ /dev/null @@ -1,954 +0,0 @@ -from os import path - -import numpy as np -from matplotlib import cm - -from wisdem.moorpy.helpers import LineError, CatenaryError, makeTower, rotationMatrix, read_mooring_file -from wisdem.moorpy.Catenary import catenary -from wisdem.moorpy.nonlinear import nonlinear - - -class Line: - """A class for any mooring line that consists of a single material""" - - def __init__(self, mooringSys, num, L, lineType, nSegs=100, cb=0, isRod=0, attachments=[0, 0]): - """Initialize Line attributes - - Parameters - ---------- - mooringSys : system object - The system object that contains the point object - num : int - indentifier number - L : float - line unstretched length [m] - lineType : dict - dictionary containing the coefficients needed to describe the line (could reference an entry of System.lineTypes). - nSegs : int, optional - number of segments to split the line into. Used in MoorPy just for plotting. The default is 100. - cb : float, optional - line seabed friction coefficient (will be set negative if line is fully suspended). The default is 0. - isRod : boolean, optional - determines whether the line is a rod or not. The default is 0. - attachments : TYPE, optional - ID numbers of any Points attached to the Line. The default is [0,0]. << consider removing - - Returns - ------- - None. - - """ - - self.sys = mooringSys # store a reference to the overall mooring system (instance of System class) - - self.number = num - self.isRod = isRod - - self.L = L # line unstretched length - self.type = lineType # dictionary of a System.lineTypes entry - - self.nNodes = int(nSegs) + 1 - self.cb = float(cb) # friction coefficient (will automatically be set negative if line is fully suspended) - - self.rA = np.zeros(3) # end coordinates - self.rB = np.zeros(3) - self.fA = np.zeros(3) # end forces - self.fB = np.zeros(3) - - # Perhaps this could be made less intrusive by defining it using a line.addpoint() method instead, similar to point.attachline(). - self.attached = ( - attachments # ID numbers of the Points at the Line ends [a,b] >>> NOTE: not fully supported <<<< - ) - self.th = 0 # heading of line from end A to B - self.HF = 0 # fairlead horizontal force saved for next solve - self.VF = 0 # fairlead vertical force saved for next solve - self.KA = [] # to be filled with the 2x2 end stiffness matrix from catenary - self.KB = [] # to be filled with the 2x2 end stiffness matrix from catenary - self.info = {} # to hold all info provided by catenary - - self.qs = 1 # flag indicating quasi-static analysis (1). Set to 0 for time series data - self.show = True # a flag that will be set to false if we don't want to show the line (e.g. if results missing) - # print("Created Line "+str(self.number)) - self.color = "k" - self.lw = 0.5 - - def loadData(self, dirname, rootname, sep=".MD."): - """Loads line-specific time series data from a MoorDyn output file""" - - self.qs = 0 # signals time series data - - if self.isRod == 1: - strtype = "Rod" - elif self.isRod == 0: - strtype = "Line" - - filename = dirname + rootname + sep + strtype + str(self.number) + ".out" - - if path.exists(filename): - # try: - - # load time series data - data, ch, channels, units = read_mooring_file("", filename) # remember number starts on 1 rather than 0 - - # get time info - if "Time" in ch: - self.Tdata = data[:, ch["Time"]] - self.dt = self.Tdata[1] - self.Tdata[0] - else: - raise LineError("loadData: could not find Time channel for mooring line " + str(self.number)) - - nT = len(self.Tdata) # number of time steps - - # check for position data <<<<<< - - self.xp = np.zeros([nT, self.nNodes]) - self.yp = np.zeros([nT, self.nNodes]) - self.zp = np.zeros([nT, self.nNodes]) - - for i in range(self.nNodes): - self.xp[:, i] = data[:, ch["Node" + str(i) + "px"]] - self.yp[:, i] = data[:, ch["Node" + str(i) + "py"]] - self.zp[:, i] = data[:, ch["Node" + str(i) + "pz"]] - - if self.isRod == 0: - self.Te = np.zeros([nT, self.nNodes - 1]) # read in tension data if available - if "Seg1Te" in ch: - for i in range(self.nNodes - 1): - self.Te[:, i] = data[:, ch["Seg" + str(i + 1) + "Te"]] - - self.Ku = np.zeros([nT, self.nNodes]) # read in curvature data if available - if "Node0Ku" in ch: - for i in range(self.nNodes): - self.Ku[:, i] = data[:, ch["Node" + str(i) + "Ku"]] - else: - # read in Rod buoyancy force data if available - if "Node0Box" in ch: - self.Bx = np.zeros([nT, self.nNodes]) - self.By = np.zeros([nT, self.nNodes]) - self.Bz = np.zeros([nT, self.nNodes]) - for i in range(self.nNodes): - self.Bx[:, i] = data[:, ch["Node" + str(i) + "Box"]] - self.By[:, i] = data[:, ch["Node" + str(i) + "Boy"]] - self.Bz[:, i] = data[:, ch["Node" + str(i) + "Boz"]] - - self.Ux = np.zeros([nT, self.nNodes]) # read in fluid velocity data if available - self.Uy = np.zeros([nT, self.nNodes]) - self.Uz = np.zeros([nT, self.nNodes]) - if "Node0Ux" in ch: - for i in range(self.nNodes): - self.Ux[:, i] = data[:, ch["Node" + str(i) + "Ux"]] - self.Uy[:, i] = data[:, ch["Node" + str(i) + "Uy"]] - self.Uz[:, i] = data[:, ch["Node" + str(i) + "Uz"]] - - # Read in tension data if available - if "Seg1Ten" in ch: - self.Ten = np.zeros([nT, self.nNodes - 1]) - for i in range(self.nNodes - 1): - self.Ten[:, i] = data[:, ch["Seg" + str(i + 1) + "Ten"]] - - self.xpi = self.xp[0, :] - self.ypi = self.yp[0, :] - self.zpi = self.zp[0, :] - - # calculate the dynamic LBot !!!!!!! doesn't work for sloped bathymetry yet !!!!!!!!!! - for i in range(len(self.zp[0])): - if np.max(self.zp[:, i]) > self.zp[0, 0]: - inode = i - break - else: - inode = i - self.LBotDyn = (inode - 1) * self.L / (self.nNodes - 1) - - # get length (constant) - # self.L = np.sqrt( (self.xpi[-1]-self.xpi[0])**2 + (self.ypi[-1]-self.ypi[0])**2 + (self.zpi[-1]-self.zpi[0])**2 ) - # ^^^^^^^ why are we changing the self.L value to not the unstretched length specified in MoorDyn? - # moved this below the dynamic LBot calculation because I wanted to use the original self.L - # >>> this is probably needed for Rods - should look into using for Rods only <<< - - # check for tension data <<<<<<< - - self.show = True - - else: - self.Tdata = [] - self.show = False - print(f"Error geting data for {'Rod' if self.isRod else 'Line'} {self.number}: {filename}") - - # >>> this was another option for handling issues - maybe no longer needed <<< - # except Exception as e: - # # don't fail if there's an issue finding data, just flag that the line shouldn't be shown/plotted - # print(f"Error geting data for {'Rod' if self.isRod else 'Line'} {self.number}: ") - # print(e) - # self.show = False - - def getTimestep(self, Time): - """Get the time step to use for showing time series data""" - - if Time < 0: - ts = np.int(-Time) # negative value indicates passing a time step index - else: # otherwise it's a time in s, so find closest time step - if len(self.Tdata) > 0: - for index, item in enumerate(self.Tdata): - ts = -1 - if item > Time: - ts = index - break - if ts == -1: - raise LineError(self.number, "getTimestep: requested time likely out of range") - else: - raise LineError(self.number, "getTimestep: zero time steps are stored") - - return ts - - def getLineCoords(self, Time, n=0): # formerly UpdateLine - """Gets the updated line coordinates for drawing and plotting purposes.""" - - if n == 0: - n = self.nNodes - - # special temporary case to draw a rod for visualization. This assumes the rod end points have already been set somehow - if self.qs == 1 and self.isRod > 0: - # make points for appropriately sized cylinder - d = self.type["d_vol"] - Xs, Ys, Zs = makeTower( - self.L, np.array([d / 2, d / 2]) - ) # add in makeTower method once you start using Rods - - # get unit vector and orientation matrix - k = (self.rB - self.rA) / self.L - Rmat = np.array(rotationMatrix(0, np.arctan2(np.hypot(k[0], k[1]), k[2]), np.arctan2(k[1], k[0]))) - - # translate and rotate into proper position for Rod - coords = np.vstack([Xs, Ys, Zs]) - newcoords = np.matmul(Rmat, coords) - Xs = newcoords[0, :] + self.rA[0] - Ys = newcoords[1, :] + self.rA[1] - Zs = newcoords[2, :] + self.rA[2] - - return Xs, Ys, Zs, None - - # if a quasi-static analysis, just call the catenary function to return the line coordinates - elif self.qs == 1: - depth = self.sys.depth - - dr = self.rB - self.rA - LH = np.hypot(dr[0], dr[1]) # horizontal spacing of line ends - LV = dr[2] # vertical offset from end A to end B - if LH > 0: - cosBeta = dr[0] / LH # cos of line heading - sinBeta = dr[1] / LH # sin of line heading - self.th = np.arctan2(dr[1], dr[0]) # line heading - else: # special case of vertical line: line heading is undefined - use zero as default - cosBeta = 0.0 - sinBeta = 0.0 - self.th = 0.0 - - if np.min([self.rA[2], self.rB[2]]) > -depth: - self.cb = -depth - np.min( - [self.rA[2], self.rB[2]] - ) # if this line's lower end is off the seabed, set cb negative and to the distance off the seabed - elif ( - self.cb < 0 - ): # if a line end is at the seabed, but the cb is still set negative to indicate off the seabed - self.cb = 0.0 # set to zero so that the line includes seabed interaction. - - # ----- check for linear vs nonlinear line elasticity ----- - - # If EA is found in the line properties we will run the original catenary function - if "EA" in self.type: - try: - (fAH, fAV, fBH, fBV, info) = catenary( - LH, - LV, - self.L, - self.type["EA"], - self.type["w"], - self.cb, - HF0=self.HF, - VF0=self.VF, - nNodes=n, - plots=1, - ) - except CatenaryError as error: - raise LineError(self.number, error.message) - - # (fAH, fAV, fBH, fBV, info) = catenary(LH, LV, self.L, self.type['EA'], self.type['w'], CB=self.cb, HF0=self.HF, VF0=self.VF, nNodes=n, plots=1) # call line model - - # If EA isnt found then we will use the ten-str relationship defined in the input file - else: - (fAH, fAV, fBH, fBV, info) = nonlinear( - LH, LV, self.L, self.type["Str"], self.type["Ten"], self.type["w"] - ) - - Xs = self.rA[0] + info["X"] * cosBeta - Ys = self.rA[1] + info["X"] * sinBeta - Zs = self.rA[2] + info["Z"] - Ts = info["Te"] - return Xs, Ys, Zs, Ts - - # otherwise, count on read-in time-series data - else: - # figure out what time step to use - ts = self.getTimestep(Time) - - # drawing rods - if self.isRod > 0: - k1 = ( - np.array( - [ - self.xp[ts, -1] - self.xp[ts, 0], - self.yp[ts, -1] - self.yp[ts, 0], - self.zp[ts, -1] - self.zp[ts, 0], - ] - ) - / self.L - ) # unit vector - - k = np.array(k1) # make copy - - Rmat = np.array( - rotationMatrix(0, np.arctan2(np.hypot(k[0], k[1]), k[2]), np.arctan2(k[1], k[0])) - ) # <<< should fix this up at some point, MattLib func may be wrong - - # make points for appropriately sized cylinder - d = self.type["d_vol"] - Xs, Ys, Zs = makeTower( - self.L, np.array([d / 2, d / 2]) - ) # add in makeTower method once you start using Rods - - # translate and rotate into proper position for Rod - coords = np.vstack([Xs, Ys, Zs]) - newcoords = np.matmul(Rmat, coords) - Xs = newcoords[0, :] + self.xp[ts, 0] - Ys = newcoords[1, :] + self.yp[ts, 0] - Zs = newcoords[2, :] + self.zp[ts, 0] - - return Xs, Ys, Zs, None - - # drawing lines - else: - # handle whether or not there is tension data - try: # use average to go from segment tension to node tensions <<< can skip this once MD is updated to output node tensions - Te = 0.5 * (np.append(self.Te[ts, 0], self.Te[ts, :]) + np.append(self.Te[ts, :], self.Te[ts, -1])) - except: # otherwise return zeros to avoid an error (might want a warning in some cases?) - Te = np.zeros(self.nNodes) - - return self.xp[ts, :], self.yp[ts, :], self.zp[ts, :], Te - - def getCoordinate(self, s, n=100): - """Returns position and tension at a specific point along the line's unstretched length""" - - dr = self.rB - self.rA - LH = np.hypot(dr[0], dr[1]) - - Ss = np.linspace(0, self.L, n) - Xs, Ys, Zs, Ts = self.getLineCoords(0.0, n=n) - - X = np.interp(s, Ss, Xs) * dr[0] / LH - Y = np.interp(s, Ss, Ys) * dr[1] / LH - Z = np.interp(s, Ss, Zs) - T = np.interp(s, Ss, Ts) - - return X, Y, Z, T - - def drawLine2d( - self, - Time, - ax, - color="k", - Xuvec=[1, 0, 0], - Yuvec=[0, 0, 1], - Xoff=0, - Yoff=0, - colortension=False, - cmap="rainbow", - plotnodes=[], - plotnodesline=[], - label="", - alpha=1.0, - ): - """Draw the line on 2D plot (ax must be 2D) - - Parameters - ---------- - Time : float - time value at which to draw the line - ax : axis - the axis on which the line is to be drawn - color : string, optional - color identifier in one letter (k=black, b=blue,...). The default is "k". - Xuvec : list, optional - plane at which the x-axis is desired. The default is [1,0,0]. - Yuvec : list, optional - plane at which the y-axis is desired. The default is [0,0,1]. - colortension : bool, optional - toggle to plot the lines in a colormap based on node tensions. The default is False - cmap : string, optional - colormap string type to plot tensions when colortension=True. The default is 'rainbow' - - Returns - ------- - linebit : list - list of axes and points on which the line can be plotted - - """ - - linebit = [] # make empty list to hold plotted lines, however many there are - - if self.isRod > 0: - Xs, Ys, Zs, Te = self.getLineCoords(Time) - - # apply any 3D to 2D transformation here to provide desired viewing angle - Xs2d = Xs * Xuvec[0] + Ys * Xuvec[1] + Zs * Xuvec[2] - Ys2d = Xs * Yuvec[0] + Ys * Yuvec[1] + Zs * Yuvec[2] - - for i in range(int(len(Xs) / 2 - 1)): - linebit.append( - ax.plot(Xs2d[2 * i : 2 * i + 2], Ys2d[2 * i : 2 * i + 2], lw=0.5, color=color) - ) # side edges - linebit.append( - ax.plot(Xs2d[[2 * i, 2 * i + 2]], Ys2d[[2 * i, 2 * i + 2]], lw=0.5, color=color) - ) # end A edges - linebit.append( - ax.plot(Xs2d[[2 * i + 1, 2 * i + 3]], Ys2d[[2 * i + 1, 2 * i + 3]], lw=0.5, color=color) - ) # end B edges - - # drawing lines... - else: - if self.qs == 1: - Xs, Ys, Zs, tensions = self.getLineCoords(Time) - elif self.qs == 0: - Xs, Ys, Zs, Ts = self.getLineCoords(Time) - self.rA = np.array([Xs[0], Ys[0], Zs[0]]) - self.rB = np.array([Xs[-1], Ys[-1], Zs[-1]]) - tensions = self.getLineTens() - - # apply any 3D to 2D transformation here to provide desired viewing angle - Xs2d = Xs * Xuvec[0] + Ys * Xuvec[1] + Zs * Xuvec[2] + Xoff - Ys2d = Xs * Yuvec[0] + Ys * Yuvec[1] + Zs * Yuvec[2] + Yoff - - if colortension: # if the mooring lines want to be plotted with colors based on node tensions - maxt = np.max(tensions) - mint = np.min(tensions) - for i in range(len(Xs) - 1): # for each node in the line - color_ratio = ((tensions[i] + tensions[i + 1]) / 2 - mint) / ( - maxt - mint - ) # ratio of the node tension in relation to the max and min tension - cmap_obj = cm.get_cmap(cmap) # create a cmap object based on the desired colormap - rgba = cmap_obj(color_ratio) # return the rbga values of the colormap of where the node tension is - linebit.append(ax.plot(Xs2d[i : i + 2], Ys2d[i : i + 2], color=rgba)) - else: - linebit.append( - ax.plot(Xs2d, Ys2d, lw=1, color=color, label=label, alpha=alpha) - ) # previously had lw=1 (linewidth) - - if len(plotnodes) > 0: - for i, node in enumerate(plotnodes): - if self.number == plotnodesline[i]: - linebit.append(ax.plot(Xs2d[node], Ys2d[node], "o", color=color, markersize=5)) - - self.linebit = linebit # can we store this internally? - - self.X = np.array([Xs, Ys, Zs]) - - return linebit - - def drawLine(self, Time, ax, color="k", endpoints=False, shadow=True, colortension=False, cmap_tension="rainbow"): - """Draw the line in 3D - - Parameters - ---------- - Time : float - time value at which to draw the line - ax : axis - the axis on which the line is to be drawn - color : string, optional - color identifier in one letter (k=black, b=blue,...). The default is "k". - endpoints : bool, optional - toggle to plot the end points of the lines. The default is False - shadow : bool, optional - toggle to plot the mooring line shadow on the seabed. The default is True - colortension : bool, optional - toggle to plot the lines in a colormap based on node tensions. The default is False - cmap : string, optional - colormap string type to plot tensions when colortension=True. The default is 'rainbow' - - Returns - ------- - linebit : list - list of axes and points on which the line can be plotted - """ - - if not self.show: # exit if this line isn't set to be shown - return 0 - - if color == "self": - color = self.color # attempt to allow custom colors - lw = self.lw - else: - lw = 1 - - linebit = [] # make empty list to hold plotted lines, however many there are - - if self.isRod > 0: - if color == None: - color = [0.3, 0.3, 0.3] # if no color provided, default to dark grey rather than rainbow rods - - Xs, Ys, Zs, Ts = self.getLineCoords(Time) - - for i in range(int(len(Xs) / 2 - 1)): - linebit.append( - ax.plot(Xs[2 * i : 2 * i + 2], Ys[2 * i : 2 * i + 2], Zs[2 * i : 2 * i + 2], color=color) - ) # side edges - linebit.append( - ax.plot(Xs[[2 * i, 2 * i + 2]], Ys[[2 * i, 2 * i + 2]], Zs[[2 * i, 2 * i + 2]], color=color) - ) # end A edges - linebit.append( - ax.plot( - Xs[[2 * i + 1, 2 * i + 3]], Ys[[2 * i + 1, 2 * i + 3]], Zs[[2 * i + 1, 2 * i + 3]], color=color - ) - ) # end B edges - - # scatter points for line ends - # if endpoints == True: - # linebit.append(ax.scatter([Xs[0], Xs[-1]], [Ys[0], Ys[-1]], [Zs[0], Zs[-1]], color = color)) - - # drawing lines... - else: - if self.qs == 1: # returns the node positions and tensions of the line, doesn't matter what time - Xs, Ys, Zs, tensions = self.getLineCoords(Time) - elif self.qs == 0: # returns the node positions and time data at the given time - Xs, Ys, Zs, Ts = self.getLineCoords(Time) - self.rA = np.array([Xs[0], Ys[0], Zs[0]]) - self.rB = np.array([Xs[-1], Ys[-1], Zs[-1]]) - tensions = self.getLineTens() - - if colortension: # if the mooring lines want to be plotted with colors based on node tensions - maxt = np.max(tensions) - mint = np.min(tensions) - for i in range(len(Xs) - 1): # for each node in the line - color_ratio = ((tensions[i] + tensions[i + 1]) / 2 - mint) / ( - maxt - mint - ) # ratio of the node tension in relation to the max and min tension - cmap_obj = cm.get_cmap(cmap_tension) # create a cmap object based on the desired colormap - rgba = cmap_obj(color_ratio) # return the rbga values of the colormap of where the node tension is - linebit.append(ax.plot(Xs[i : i + 2], Ys[i : i + 2], Zs[i : i + 2], color=rgba, zorder=100)) - else: - linebit.append(ax.plot(Xs, Ys, Zs, color=color, lw=lw, zorder=100)) - - if shadow: - ax.plot( - Xs, Ys, np.zeros_like(Xs) - self.sys.depth, color=[0.5, 0.5, 0.5, 0.2], lw=lw, zorder=1.5 - ) # draw shadow - - if endpoints == True: - linebit.append(ax.scatter([Xs[0], Xs[-1]], [Ys[0], Ys[-1]], [Zs[0], Zs[-1]], color=color)) - - # drawing water velocity vectors (not for Rods for now) <<< should handle this better (like in getLineCoords) <<< - if self.qs == 0: - ts = self.getTimestep(Time) - Ux = self.Ux[ts, :] - Uy = self.Uy[ts, :] - Uz = self.Uz[ts, :] - self.Ubits = ax.quiver(Xs, Ys, Zs, Ux, Uy, Uz) # make quiver plot and save handle to line object - - self.linebit = linebit # can we store this internally? - - self.X = np.array([Xs, Ys, Zs]) - - return linebit - - def redrawLine(self, Time, colortension=False, cmap_tension="rainbow"): # , linebit): - """Update 3D line drawing based on instantaneous position""" - - linebit = self.linebit - - if self.isRod > 0: - Xs, Ys, Zs, Ts = self.getLineCoords(Time) - - for i in range(int(len(Xs) / 2 - 1)): - linebit[3 * i][0].set_data( - Xs[2 * i : 2 * i + 2], Ys[2 * i : 2 * i + 2] - ) # side edges (x and y coordinates) - linebit[3 * i][0].set_3d_properties(Zs[2 * i : 2 * i + 2]) # (z coordinates) - linebit[3 * i + 1][0].set_data(Xs[[2 * i, 2 * i + 2]], Ys[[2 * i, 2 * i + 2]]) # end A edges - linebit[3 * i + 1][0].set_3d_properties(Zs[[2 * i, 2 * i + 2]]) - linebit[3 * i + 2][0].set_data(Xs[[2 * i + 1, 2 * i + 3]], Ys[[2 * i + 1, 2 * i + 3]]) # end B edges - linebit[3 * i + 2][0].set_3d_properties(Zs[[2 * i + 1, 2 * i + 3]]) - - # drawing lines... - else: - Xs, Ys, Zs, Ts = self.getLineCoords(Time) - - if colortension: - self.rA = np.array([Xs[0], Ys[0], Zs[0]]) # update the line ends based on the MoorDyn data - self.rB = np.array([Xs[-1], Ys[-1], Zs[-1]]) - tensions = self.getLineTens() # get the tensions of the line calculated quasi-statically - maxt = np.max(tensions) - mint = np.min(tensions) - cmap_obj = cm.get_cmap(cmap_tension) # create the colormap object - - for i in range( - len(Xs) - 1 - ): # for each node in the line, find the relative tension of the segment based on the max and min tensions - color_ratio = ((tensions[i] + tensions[i + 1]) / 2 - mint) / (maxt - mint) - rgba = cmap_obj(color_ratio) - linebit[i][ - 0 - ]._color = rgba # set the color of the segment to a new color based on its updated tension - linebit[i][0].set_data(Xs[i : i + 2], Ys[i : i + 2]) # set the x and y coordinates - linebit[i][0].set_3d_properties(Zs[i : i + 2]) # set the z coorindates - - else: - linebit[0][0].set_data(Xs, Ys) # (x and y coordinates) - linebit[0][0].set_3d_properties(Zs) # (z coordinates) - - # drawing water velocity vectors (not for Rods for now) - if self.qs == 0: - ts = self.getTimestep(Time) - Ux = self.Ux[ts, :] - Uy = self.Uy[ts, :] - Uz = self.Uz[ts, :] - # segments = quiver_data_to_segments(Xs, Ys, Zs, Ux, Uy, Uz, scale=2) - # self.Ubits.set_segments(segments) - - return linebit - - def setEndPosition(self, r, endB): - """Sets the end position of the line based on the input endB value. - - Parameters - ---------- - r : array - x,y,z coorindate position vector of the line end [m]. - endB : boolean - An indicator of whether the r array is at the end or beginning of the line - - Raises - ------ - LineError - If the given endB value is not a 1 or 0 - - Returns - ------- - None. - - """ - - if endB == 1: - self.rB = np.array(r, dtype=np.float_) - elif endB == 0: - self.rA = np.array(r, dtype=np.float_) - else: - raise LineError("setEndPosition: endB value has to be either 1 or 0") - - def staticSolve(self, reset=False, tol=0.0001, profiles=0): - """Solves static equilibrium of line. Sets the end forces of the line based on the end points' positions. - - Parameters - ---------- - reset : boolean, optional - Determines if the previous fairlead force values will be used for the catenary iteration. The default is False. - - tol : float - Convergence tolerance for catenary solver measured as absolute error of x and z values in m. - - profiles : int - Values greater than 0 signal for line profile data to be saved (used for plotting, getting distributed tensions, etc). - - Raises - ------ - LineError - If the horizontal force at the fairlead (HF) is less than 0 - - Returns - ------- - None. - - """ - - depth = self.sys.depth - - dr = self.rB - self.rA - LH = np.hypot(dr[0], dr[1]) # horizontal spacing of line ends - LV = dr[2] # vertical offset from end A to end B - if LH > 0: - cosBeta = dr[0] / LH # cos of line heading - sinBeta = dr[1] / LH # sin of line heading - self.th = np.arctan2(dr[1], dr[0]) # line heading - else: # special case of vertical line: line heading is undefined - use zero as default - cosBeta = 0.0 - sinBeta = 0.0 - self.th = 0.0 - - if self.rA[2] < -depth: - raise LineError("Line {} end A is lower than the seabed.".format(self.number)) - elif self.rB[2] < -depth: - raise LineError("Line {} end B is lower than the seabed.".format(self.number)) - elif np.min([self.rA[2], self.rB[2]]) > -depth: - self.cb = -depth - np.min( - [self.rA[2], self.rB[2]] - ) # if this line's lower end is off the seabed, set cb negative and to the distance off the seabed - elif self.cb < 0: # if a line end is at the seabed, but the cb is still set negative to indicate off the seabed - self.cb = 0.0 # set to zero so that the line includes seabed interaction. - - if ( - self.HF < 0 - ): # or self.VF < 0: <<<<<<<<<<< it shouldn't matter if VF is negative - this could happen for buoyant lines, etc. - raise LineError("Line HF cannot be negative") # this could be a ValueError too... - - if reset == True: # Indicates not to use previous fairlead force values to start catenary - self.HF = 0 # iteration with, and insteady use the default values. - - # ----- get line results for linear or nonlinear elasticity ----- - - # If EA is found in the line properties we will run the original catenary function - if "EA" in self.type: - try: - (fAH, fAV, fBH, fBV, info) = catenary( - LH, - LV, - self.L, - self.type["EA"], - self.type["w"], - CB=self.cb, - Tol=tol, - HF0=self.HF, - VF0=self.VF, - plots=profiles, - ) # call line model - - except CatenaryError as error: - raise LineError(self.number, error.message) - # If EA isnt found then we will use the ten-str relationship defined in the input file - else: - (fAH, fAV, fBH, fBV, info) = nonlinear(LH, LV, self.L, self.type["Str"], self.type["Ten"], self.type["w"]) - - self.HF = info["HF"] - self.VF = info["VF"] - self.KA2 = info["stiffnessA"] - self.KB2 = info["stiffnessB"] - self.LBot = info["LBot"] - self.info = info - - self.fA[0] = fAH * cosBeta - self.fA[1] = fAH * sinBeta - self.fA[2] = fAV - self.fB[0] = fBH * cosBeta - self.fB[1] = fBH * sinBeta - self.fB[2] = fBV - self.TA = np.sqrt(fAH * fAH + fAV * fAV) # end tensions - self.TB = np.sqrt(fBH * fBH + fBV * fBV) - - # ----- compute 3d stiffness matrix for both line ends (3 DOF + 3 DOF) ----- - - # solve for required variables to set up the perpendicular stiffness. Keep it horizontal - # L_xy = np.linalg.norm(self.rB[:2] - self.rA[:2]) - # T_xy = np.linalg.norm(self.fB[:2]) - - # create the rotation matrix based on the heading angle that the line is from the horizontal - R = rotationMatrix(0, 0, self.th) - - # initialize the line's analytic stiffness matrix in the "in-line" plane then rotate the matrix to be about the global frame [K'] = [R][K][R]^T - def from2Dto3Drotated(K2D, F, L): - if L > 0: - Kt = F / L # transverse stiffness term - else: - Kt = 0.0 - - K2 = np.array([[K2D[0, 0], 0, K2D[0, 1]], [0, Kt, 0], [K2D[1, 0], 0, K2D[1, 1]]]) - return np.matmul(np.matmul(R, K2), R.T) - - self.KA = from2Dto3Drotated( - info["stiffnessA"], -fBH, LH - ) # stiffness matrix describing reaction force on end A due to motion of end A - self.KB = from2Dto3Drotated( - info["stiffnessB"], -fBH, LH - ) # stiffness matrix describing reaction force on end B due to motion of end B - self.KAB = from2Dto3Drotated( - info["stiffnessAB"], fBH, LH - ) # stiffness matrix describing reaction force on end B due to motion of end A - - # self.K6 = np.block([[ from2Dto3Drotated(self.KA), from2Dto3Drotated(self.KAB.T)], - # [ from2Dto3Drotated(self.KAB), from2Dto3Drotated(self.KB) ]]) - - if profiles > 1: - import matplotlib.pyplot as plt - - plt.plot(info["X"], info["Z"]) - plt.show() - - def getEndForce(self, endB): - """Returns the force of the line at the specified end based on the endB value - - Parameters - ---------- - endB : boolean - An indicator of which end of the line is the force wanted - - Raises - ------ - LineError - If the given endB value is not a 1 or 0 - - Returns - ------- - fA or fB: array - The force vector at the end of the line - - """ - - if endB == 1: - return self.fB - elif endB == 0: - return self.fA - else: - raise LineError("getEndForce: endB value has to be either 1 or 0") - - def getStiffnessMatrix(self): - """Returns the stiffness matrix of a line derived from analytic terms in the jacobian of catenary - - Raises - ------ - LineError - If a singluar matrix error occurs while taking the inverse of the Line's Jacobian matrix. - - Returns - ------- - K2_rot : matrix - the analytic stiffness matrix of the line in the rotated frame. - - """ - - # take the inverse of the Jacobian to get the starting analytic stiffness matrix - """ - if np.isnan(self.jacobian[0,0]): #if self.LBot >= self.L and self.HF==0. and self.VF==0. << handle tricky cases here? - K = np.array([[0., 0.], [0., 1.0/self.jacobian[1,1] ]]) - else: - try: - K = np.linalg.inv(self.jacobian) - except: - raise LineError(self.number, f"Check Line Length ({self.L}), it might be too long, or check catenary ProfileType") - """ - - # solve for required variables to set up the perpendicular stiffness. Keep it horizontal - L_xy = np.linalg.norm(self.rB[:2] - self.rA[:2]) - T_xy = np.linalg.norm(self.fB[:2]) - Kt = T_xy / L_xy - - # initialize the line's analytic stiffness matrix in the "in-line" plane - KA = np.array([[self.KA2[0, 0], 0, self.KA2[0, 1]], [0, Kt, 0], [self.KA2[1, 0], 0, self.KA2[1, 1]]]) - - KB = np.array([[self.KB2[0, 0], 0, self.KB2[0, 1]], [0, Kt, 0], [self.KB2[1, 0], 0, self.KB2[1, 1]]]) - - # create the rotation matrix based on the heading angle that the line is from the horizontal - R = rotationMatrix(0, 0, self.th) - - # rotate the matrix to be about the global frame [K'] = [R][K][R]^T - KA_rot = np.matmul(np.matmul(R, KA), R.T) - KB_rot = np.matmul(np.matmul(R, KB), R.T) - - return KA_rot, KB_rot - - def getLineTens(self): - """Calls the catenary function to return the tensions of the Line for a quasi-static analysis""" - - # >>> this can probably be done using data already generated by static Solve <<< - - depth = self.sys.depth - - dr = self.rB - self.rA - LH = np.hypot(dr[0], dr[1]) # horizontal spacing of line ends - LV = dr[2] # vertical offset from end A to end B - - if np.min([self.rA[2], self.rB[2]]) > -depth: - self.cb = -depth - np.min( - [self.rA[2], self.rB[2]] - ) # if this line's lower end is off the seabed, set cb negative and to the distance off the seabed - elif self.cb < 0: # if a line end is at the seabed, but the cb is still set negative to indicate off the seabed - self.cb = 0.0 # set to zero so that the line includes seabed interaction. - - # If EA is found in the line properties we will run the original catenary function - if "EA" in self.type: - try: - (fAH, fAV, fBH, fBV, info) = catenary( - LH, - LV, - self.L, - self.type["EA"], - self.type["w"], - CB=self.cb, - Tol=tol, - HF0=self.HF, - VF0=self.VF, - plots=profiles, - ) # call line model - - except CatenaryError as error: - raise LineError(self.number, error.message) - # If EA isnt found then we will use the ten-str relationship defined in the input file - else: - (fAH, fAV, fBH, fBV, info) = nonlinear(LH, LV, self.L, self.type["Str"], self.type["Ten"], self.type["w"]) - - Ts = info["Te"] - return Ts - - def getTension(self, s): - """Returns tension at a given point along the line - - Parameters - ---------- - - s : scalar or array-like - Value or array of values for the arc length along the line from end A to end B at which - the information is desired. Positive values are arc length in m, negative values are a - relative location where 0 is end A, -1 is end B, and -0.5 is the midpoint. - - Returns - ------- - - tension value(s) - - """ - # if s < 0: - # s = -s*self.L - # if s > self.L: - # raise ValueError('Specified arc length is larger than the line unstretched length.') - - Te = np.interp(s, self.info["s"], self.info["Te"]) - - return Te - - def getPosition(self, s): - """Returns position at a given point along the line - - Parameters - ---------- - - s : scalar or array-like - Value or array of values for the arc length along the line from end A to end B at which - the information is desired. Positive values are arc length in m, negative values are a - relative location where 0 is end A, -1 is end B, and -0.5 is the midpoint. - - Returns - ------- - - position vector(s) - - """ - - # >>> should be merged with getLineCoords and getCoordinate functionality <<< - - x = np.interp(s, self.info["s"], self.info["X"]) - z = np.interp(s, self.info["s"], self.info["Z"]) - - dr = self.rB - self.rA - LH = np.hypot(dr[0], dr[1]) - Xs = self.rA[0] + x * dr[0] / LH - Ys = self.rA[1] + x * dr[1] / LH - Zs = self.rA[2] + z - - return np.vstack([Xs, Ys, Zs]) - - def attachLine(self, lineID, endB): - pass diff --git a/WISDEM/wisdem/moorpy/lineType.py b/WISDEM/wisdem/moorpy/lineType.py deleted file mode 100644 index 263982bd9..000000000 --- a/WISDEM/wisdem/moorpy/lineType.py +++ /dev/null @@ -1,44 +0,0 @@ -import numpy as np - - -class LineType: - """A class to hold the various properties of a mooring line type""" - - def __init__(self, name, d, massden, EA, MBL=0.0, cost=0.0, notes="", input_d=0.0, input_type=""): - """Initialize LineType attributes - - Parameters - ---------- - name : string - identifier string - d : float - volume-equivalent diameter [m] - massden : float - linear mass density [kg/m] used to calculate weight density (w) [N/m] - EA : float - extensional stiffness [N] - MBL : float, optional - Minimum breaking load [N]. The default is 0.0. - cost : float, optional - material cost per unit length [$/m]. The default is 0.0. - notes : string, optional - optional notes/description string. The default is "". - input_d : float, optional - the given input diameter that has not been adjusted for the line's volume [m]. The default is 0.0. - input_type : string, optional - the type of the line (e.g. chain, polyester), different from the name. The default is "". - Returns - ------- - None. - - """ - self.name = name # identifier string - self.d = d # volume-equivalent diameter [m] - self.m = massden # linear desnity [kg/m] - self.w = (massden - np.pi / 4 * d * d * 1025) * 9.81 # wet weight [N/m] - self.EA = EA # extensional stiffness [N] - self.MBL = MBL # minimum breaking load [N] - self.cost = cost # material cost of line per unit length [$/m] - self.notes = notes # optional notes/description string - self.input_d = input_d # the non-volume-equivalent, input diameter [m] - self.input_type = input_type # line type string (e.g. chain, polyester) diff --git a/WISDEM/wisdem/moorpy/nonlinear.py b/WISDEM/wisdem/moorpy/nonlinear.py deleted file mode 100644 index 8510cc6cc..000000000 --- a/WISDEM/wisdem/moorpy/nonlinear.py +++ /dev/null @@ -1,170 +0,0 @@ -import numpy as np -import matplotlib.pyplot as plt -from matplotlib import cm - -from wisdem.moorpy.helpers import CatenaryError - - -def nonlinear(XF, ZF, L, Str, Ten, W, nNodes=20, plots=0): - """ - nonlinear mooring line solver. The nonlinear module is assumed to be off of the seafloor, and have no bending. The nonlinear module is called by - putting a tension-strain file in the place of linestiffness (EA). Unlike the catenary solver no iterative method is needed, but this function is heavily - borrows from the catenary function. - - Parameters - ---------- - XF : float - Horizontal distance from end 1 to end 2 [m] - ZF : float - Vertical distance from end 1 to end 2 [m] (positive up) - L : float - Unstretched length of line [m] - Str : dictionary - vector of strains from the tension-strain input file [-] - Ten : dictionary - vector of of tensions from the tension-strain input file [N] - W : float - Weight of line in fluid per unit length [N/m] - nNodes : int, optional - Number of nodes to describe the line - plots : int, optional - 1: plot output, 0: don't - - - Returns - ------- - : tuple - (end 1 horizontal tension, end 1 vertical tension, end 2 horizontal tension, end 2 vertical tension, info dictionary) [N] (positive up) - - """ - # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - # The following is originally from the catenary.py function but applies to this one aswell - # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - # make info dict to contain any additional outputs - info = dict(error=False) - - # make some arrays if needed for plotting each node - if plots > 0: - s = np.linspace( - 0, L, nNodes - ) # Unstretched arc distance along line from anchor to each node where the line position and tension can be output (meters) - Xs = np.zeros(nNodes) # Horizontal locations of each line node relative to the anchor (meters) - Zs = np.zeros(nNodes) # Vertical locations of each line node relative to the anchor (meters) - Te = np.zeros(nNodes) # Effective line tensions at each node (N) - - # flip line in the solver if it is buoyant - if W < 0: - W = -W - ZF = -ZF - CB = -10000.0 # <<< TODO: set this to the distance to sea surface <<< - flipFlag = True - else: - flipFlag = False - - # reverse line in the solver if end A is above end B - if ZF < 0: - ZF = -ZF - reverseFlag = True - else: - reverseFlag = False - - # ensure the input variables are realistic - if XF < 0.0: - raise CatenaryError("XF is negative!") - if L <= 0.0: - breakpoint() - raise CatenaryError("L is zero or negative!") - - # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - # New Code - # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - # Determine the stretched length of the nonlinear element based on the horizontal and vertical fairlead excursions - str_L = np.sqrt(XF * XF + ZF * ZF) - - # Based on the stretched length and the horizontal fairlead excursions define cos/sin and products for transformation matrix - # Define cosine and sine - c = XF / str_L - s = ZF / str_L - # Define all the products of sine and cosine - c2 = c * c - s2 = s * s - cs = c * s - - # Determine the strain in the segment with stretched length and original length - str_seg = str_L / L - 1 - - # Make the input dictionarys for str and ten a vector of floats - Str = [float(x) for x in Str] - Ten = [float(x) for x in Ten] - - # Strain in the line cant be less than zero (cant push a rope so to speak) - if str_seg < 0: - str_seg = 0 - - ten_seg = np.interp(str_seg, Str, Ten) - # small change is strain for a finite difference - d_str = 1e-5 - # finite difference to take derivative of ten-strain curve (dT/dstr = EA) - EA_est = (np.interp(str_seg + d_str, Str, Ten) - np.interp(str_seg, Str, Ten)) / d_str - - # Breakdown the horizontal components of the tension - FxA = ten_seg * c - FxB = -FxA - - # Breakdown the vertical components of the tension and subtract the weight of the nonlinear element - FzA = ten_seg * s - 0.5 * W * L - FzB = -ten_seg * s - 0.5 * W * L - - # Tension at both ends of the line - TA = np.sqrt(FxA * FxA + FzA * FzA) - TB = np.sqrt(FxB * FxB + FzB * FzB) - - # Estimate Stiffness Numerically (Potentially find something better) - # could also be hard to do because the input tension strain files are arbitrary - - # Stiffness matrcies for the ends of the line (In this case since we already assume the element can only deform axially - # this is essentially just a truss element with the nonlinear stiffness that we calculated - # Ka = (EA_est/L)*np.array([[c2, cs],[cs, s2]]) - # Kb = (EA_est/L)*np.array([[c2, cs],[cs, s2]]) - # Kab = -(EA_est/L)*np.array([[c2, cs],[cs, s2]]) - - Ka = np.array( - [ - [ - c2 * (EA_est / str_L) + s2 * ten_seg / (L * (1 + str_seg)), - cs * (EA_est / str_L) - cs * ten_seg / (L * (1 + str_seg)), - ], - [ - cs * (EA_est / str_L) - cs * ten_seg / (L * (1 + str_seg)), - s2 * (EA_est / str_L) + c2 * ten_seg / (L * (1 + str_seg)), - ], - ] - ) - Kb = Ka - Kab = -Ka - - # Assign values to info - # Fairlead forces - info["HF"] = -FxB - info["VF"] = -FzB - info["HA"] = FxA - info["VA"] = FzA - # Line stiffnesses - info["stiffnessA"] = Ka - info["stiffnessB"] = Kb - info["stiffnessAB"] = Kab - # Length on the bottom is zero as we assumed earlier - info["LBot"] = 0 - # self.info = info - # For plotting (assumed straight line so no issue and tension varies linearly - info["X"] = np.linspace(0, XF, nNodes) - info["Z"] = np.linspace(0, ZF, nNodes) - info["s"] = np.linspace(0, str_L, nNodes) - info["Te"] = np.linspace(TA, TB, nNodes) - - print(info["stiffnessA"]) - print(info["stiffnessB"]) - print(info["stiffnessAB"]) - - return (FxA, FzA, FxB, FzB, info) diff --git a/WISDEM/wisdem/moorpy/point.py b/WISDEM/wisdem/moorpy/point.py deleted file mode 100644 index 8c21e4593..000000000 --- a/WISDEM/wisdem/moorpy/point.py +++ /dev/null @@ -1,337 +0,0 @@ -import numpy as np - - -class Point: - """A class for any object in the mooring system that can be described by three translational coorindates""" - - def __init__( - self, mooringSys, num, type, r, m=0, v=0, fExt=np.zeros(3), DOFs=[0, 1, 2], d=0, zSpan=[-1, 1], CdA=0.0, Ca=0.0 - ): - """Initialize Point attributes - - Parameters - ---------- - mooringSys : system object - The system object that contains the point object - num : int - indentifier number - type : int - the point type: 0 free to move, 1 fixed, -1 coupled externally - r : array - x,y,z coorindate position vector [m]. - m : float, optional - mass [kg]. The default is 0. - v : float, optional - submerged volume [m^3]. The default is 0. - CdA : float, optional - Product of drag coefficient and cross sectional area in any direction [m^2]. The default is 0. - Ca : float, optional - Added mass coefficient in any direction. - fExt : array, optional - applied external force vector in global orientation (not including weight/buoyancy). The default is np.zeros(3). - DOFs: list - list of which coordinate directions are DOFs for this point (default 0,1,2=x,y,z). E.g. set [2] for vertical motion only. - d : float, optional - diameter [m]. The default is 0. - zSpan : [float, float], optional - The lower and upper limits of the Point's volume relative to its coordinate [m]. - This only affects the change in buoyancy when crossing the free surface. The - default is [-1,1], i.e. a 2-m tall volume. - - Returns - ------- - None. - - """ - - self.sys = mooringSys # store a reference to the overall mooring system (instance of System class) - - self.number = num - self.type = type # 1: fixed/attached to something, 0 free to move, or -1 coupled externally - self.r = np.array(r, dtype=np.float_) - - self.m = float(m) - self.v = float(v) - self.CdA = float(CdA) - self.Ca = float(Ca) - self.fExt = fExt # external forces plus weight/buoyancy - self.fBot = 10.0 # this is a seabed contact force that will be added if a point is specified below the seabed - self.zSub = 0.0 # this is the depth that the point is positioned below the seabed (since r[2] will be capped at the depth) - self.zTol = 2.0 # depth tolerance to be used when updating the point's position relative to the seabed - - self.DOFs = DOFs - self.nDOF = len(DOFs) - - self.d = d # the diameter of the point, if applicable. Used for hydrostatics [m] - - self.attached = [] # ID numbers of any Lines attached to the Point - self.attachedEndB = [] # specifies which end of the line is attached (1: end B, 0: end A) - - if len(zSpan) == 2: - self.zSpan = np.array(zSpan, dtype=float) - else: - raise ValueError("Point zSpan parameter must contain two numbers.") - - # print("Created Point "+str(self.number)) - - def attachLine(self, lineID, endB): - """Adds a Line end to the Point - - Parameters - ---------- - lineID : int - The identifier ID number of a line - endB : boolean - Determines which end of the line is attached to the point - - Returns - ------- - None. - - """ - - self.attached.append(lineID) - self.attachedEndB.append(endB) - # print("attached Line "+str(lineID)+" to Point "+str(self.number)) - - def detachLine(self, lineID, endB): - """Detaches a Line end from the Point - - Parameters - ---------- - lineID : int - The identifier ID number of a line - endB : boolean - Determines which end of the line is to be detached from the point - - Returns - ------- - None. - - """ - - self.attached.pop(self.attached.index(lineID)) - self.attachedEndB.pop(self.attachedEndB.index(endB)) - print("detached Line " + str(lineID) + " from Point " + str(self.number)) - - def setPosition(self, r): - """Sets the position of the Point, along with that of any dependent objects. - - Parameters - ---------- - r : array - x,y,z coordinate position vector of the point [m] - - Raises - ------ - ValueError - If the length of the input r array is not of length 3 - - Returns - ------- - None. - - """ - - # update the position of the Point itself - if len(r) == 3: # original case, setting all three coordinates as normal, asuming x,y,z - self.r = np.array(r) - elif len(r) == self.nDOF: - self.r[ - self.DOFs - ] = r # this does a mapping based on self.DOFs, to support points with e.g. only a z DOF or only x and z DOFs - else: - raise ValueError( - f"Point setPosition method requires an argument of size 3 or nDOF, but size {len(r):d} was provided" - ) - - # update the point's depth and position based on relation to seabed - self.zSub = np.max([-self.zTol, -self.r[2] - self.sys.depth]) # depth of submergence in seabed if > -zTol - self.r = np.array( - [self.r[0], self.r[1], np.max([self.r[2], -self.sys.depth])] - ) # don't let it sink below the seabed - - # update the position of any attached Line ends - for LineID, endB in zip(self.attached, self.attachedEndB): - self.sys.lineList[LineID - 1].setEndPosition(self.r, endB) - - if len(self.r) < 3: - print("Double check how this point's position vector is calculated") - breakpoint() - - def getForces(self, lines_only=False, seabed=True, xyz=False): - """Sums the forces on the Point, including its own plus those of any attached Lines. - - Parameters - ---------- - lines_only : boolean, optional - An option for calculating forces from just the mooring lines or not. The default is False. - seabed : bool, optional - if False, will not include the effect of the seabed pushing the point up - xyz : boolean, optional - if False, returns only forces corresponding to enabled DOFs. If true, returns forces in x,y,z regardless of DOFs. - - Returns - ------- - f : array - The force vector applied to the point in its current position [N] - - """ - - f = np.zeros(3) # create empty force vector on the point - - if lines_only == False: - """ - radius = self.d/2 # can do this, or find the radius using r=(3*self.v/(4*np.pi))**(1/3) - x = max(0, radius**2 - self.r[2]**2) - dWP = 2*np.sqrt(x) # diameter at the waterplane [m] - AWP = np.pi/4 * dWP**2 # waterplane area [m] - #v_half = (4/3)*np.pi*(np.sqrt(x)**3) * 0.5 # volume of the half sphere that is cut by the waterplane [m^3] - #v = abs(-min(0, np.sign(self.r[2]))*self.v - v_half) # submerged volume of the point [m^3] - """ - f[2] += -self.m * self.sys.g # add weight - - # f[2] += self.v*self.sys.rho*self.sys.g # add buoyancy using submerged volume - - if self.r[2] + self.zSpan[1] < 0.0: # add buoyancy if fully submerged - f[2] += self.v * self.sys.rho * self.sys.g - elif ( - self.r[2] + self.zSpan[0] < 0.0 - ): # add some buoyancy if part-submerged (linear variation, constant Awp) - f[2] += ( - self.v * self.sys.rho * self.sys.g * (self.r[2] + self.zSpan[0]) / (self.zSpan[0] - self.zSpan[1]) - ) - # (no buoyancy force added if it's fully out of the water, which would be very exciting for the Point) - - f += np.array(self.fExt) # add external forces - # f[2] -= self.sys.rho*self.sys.g*AWP*self.r[2] # hydrostatic heave stiffness - - # handle case of Point resting on or below the seabed, to provide a restoring force - # add smooth transition to fz=0 at seabed (starts at zTol above seabed) - f[2] += max(self.m - self.v * self.sys.rho, 0) * self.sys.g * (self.zSub + self.zTol) / self.zTol - - # add forces from attached lines - for LineID, endB in zip(self.attached, self.attachedEndB): - f += self.sys.lineList[LineID - 1].getEndForce(endB) - - if xyz: - return f - else: - return f[self.DOFs] # return only the force(s) in the enable DOFs - - def getStiffness(self, X=[], tol=0.0001, dx=0.01): - """Gets the stiffness matrix of the point due only to mooring lines with all other objects free to equilibrate. - NOTE: This method currently isn't set up to worry about nDOF and DOFs settings of the Point. It only works for DOFs=[0,1,2]. - - Parameters - ---------- - X1 : array - The position vector of the Point at which the stiffness matrix is to be calculated. - dx : float, optional - The change in displacement to be used for calculating the change in force. The default is 0.01. - - Returns - ------- - K : matrix - The stiffness matrix of the point at the given position X1. - - """ - - # print("Getting Point "+str(self.number)+" stiffness matrix...") - - if len(X) == 3: - X1 = np.array(X) - elif len(X) == 0: - X1 = self.r - else: - raise ValueError("Point.getStiffness expects the optional X parameter to be size 3") - - # set this Point's type to fixed so mooring system equilibrium response to its displacements can be found - type0 = self.type # store original type to restore later - self.type = 1 # set type to 1 (not free) so that it won't be adjusted when finding equilibrium - - # if this Point is attached to a Body, set that Body's type to fixed so equilibrium can be found - for body in self.sys.bodyList: # search through all the bodies in the mooring system - if self.number in body.attachedP: # find the one that this Point is attached to (if at all) - num = body.number # store body number to index later - Btype0 = body.type # store original body type to restore later - body.type = 1 # set body type to 1 (not free) so that it won't be adjusted when finding equilibrium - - # ensure this Point is positioned at the desired linearization point - self.setPosition(X1) # set position to linearization point - self.sys.solveEquilibrium3(tol=tol) # find equilibrium of mooring system given this Point in current position - f = self.getForces(lines_only=True) # get the net 6DOF forces/moments from any attached lines - - # Build a stiffness matrix by perturbing each DOF in turn - K = np.zeros([3, 3]) - - for i in range(len(K)): - X2 = X1 + np.insert( - np.zeros(2), i, dx - ) # calculate perturbed Point position by adding dx to DOF in question - self.setPosition(X2) # perturb this Point's position - self.sys.solveEquilibrium3(tol=tol) # find equilibrium of mooring system given this Point's new position - f_2 = self.getForces(lines_only=True) # get the net 3DOF forces/moments from any attached lines - - K[:, i] = -(f_2 - f) / dx # get stiffness in this DOF via finite difference and add to matrix column - - # ----------------- restore the system back to previous positions ------------------ - self.setPosition(X1) # set position to linearization point - self.sys.solveEquilibrium3(tol=tol) # find equilibrium of mooring system given this Point in current position - self.type = type0 # restore the Point's type to its original value - for body in self.sys.bodyList: - if self.number in body.attachedP: - num = body.number - self.sys.bodyList[ - num - 1 - ].type = Btype0 # restore the type of the Body that the Point is attached to back to original value - - return K - - def getStiffnessA(self, lines_only=False, xyz=False): - """Gets analytical stiffness matrix of Point due only to mooring lines with other objects fixed. - - Returns - ------- - K : matrix - 3x3 analytic stiffness matrix. - - """ - - # print("Getting Point "+str(self.number)+" analytic stiffness matrix...") - - K = np.zeros([3, 3]) # create an empty 3x3 stiffness matrix - - # append the stiffness matrix of each line attached to the point - for lineID, endB in zip(self.attached, self.attachedEndB): - line = self.sys.lineList[lineID - 1] - # KA, KB = line.getStiffnessMatrix() - - if endB == 1: # assuming convention of end A is attached to the point, so if not, - # KA, KB = KB, KA # swap matrices of ends A and B - K += line.KB - else: - K += line.KA - - # NOTE: can rotate the line's stiffness matrix in either Line.getStiffnessMatrix() or here in Point.getStiffnessA() - - # add seabed or hydrostatic terms if needed - if lines_only == False: - # if partially submerged, apply a hydrostatic stiffness based on buoyancy - if self.r[2] + self.zSpan[1] > 0.0 and self.r[2] + self.zSpan[0] < 0.0: - K[2, 2] += ( - self.sys.rho * self.sys.g * self.v / (self.zSpan[1] - self.zSpan[0]) - ) # assumes volume is distributed evenly across zSpan - - # if less than zTol above the seabed (could even be below the seabed), apply a stiffness (should bring wet weight to zero at seabed) - if self.r[2] < self.zTol - self.sys.depth: - K[2, 2] += max(self.m - self.v * self.sys.rho, 0) * self.sys.g / self.zTol - - # if on seabed, apply a large stiffness to help out system equilibrium solve (if it's transitioning off, keep it a small step to start with) - if self.r[2] == -self.sys.depth: - K[2, 2] += 1.0e12 - - if xyz: # if asked to output all DOFs, do it - return K - else: # otherwise only return rows/columns of active DOFs - return K[:, self.DOFs][self.DOFs, :] diff --git a/WISDEM/wisdem/moorpy/system.py b/WISDEM/wisdem/moorpy/system.py deleted file mode 100644 index 3be578398..000000000 --- a/WISDEM/wisdem/moorpy/system.py +++ /dev/null @@ -1,3635 +0,0 @@ -import warnings -from os import path - -import yaml -import numpy as np -import matplotlib as mpl -import matplotlib.pyplot as plt -import matplotlib.animation as animation -from matplotlib import cm -from scipy.sparse import csr_matrix -from scipy.sparse.linalg import spsolve -from mpl_toolkits.mplot3d import Axes3D -from mpl_toolkits.mplot3d.art3d import Poly3DCollection -from scipy.sparse.linalg.dsolve import MatrixRankWarning - -from wisdem.moorpy.body import Body -from wisdem.moorpy.line import Line -from wisdem.moorpy.point import Point - -# import wisdem.moorpy.MoorSolve as msolve -from wisdem.moorpy.helpers import ( - SolveError, - MoorPyError, - getH, - dsolve2, - printVec, - getLineProps, - loadLineProps, - rotatePosition, - rotationMatrix, - set_axes_equal, - read_mooring_file, -) -from wisdem.moorpy.lineType import LineType - - -class System: - """A class for the whole mooring system""" - - # >>> note: system module will need to import Line, Point, Body for its add/creation routines - # (but line/point/body modules shouldn't import system) <<< - - def __init__(self, file="", dirname="", rootname="", depth=0, rho=1025, g=9.81, qs=1, Fortran=True, lineProps=None): - """Creates an empty MoorPy mooring system data structure and will read an input file if provided. - - Parameters - ---------- - file : string, optional - An input file, usually a MoorDyn input file, that can be read into a MoorPy system. The default is "". - depth : float, optional - Water depth of the system. The default is 0. - rho : float, optional - Water density of the system. The default is 1025. - g : float, optional - Gravity of the system. The default is 9.81. - - Returns - ------- - None. - - """ - - # lists to hold mooring system objects - self.bodyList = [] - self.rodList = ( - [] - ) # note: Rods are currently only fully supported when plotting MoorDyn output, not in MoorPy modeling - # <<< TODO: add support for Rods eventually, for compatability with MoorDyn systems - self.pointList = [] - self.lineList = [] - self.lineTypes = {} - self.rodTypes = {} - - # load mooring line property scaling coefficients for easy use when creating line types - self.lineProps = loadLineProps(lineProps) - - # the ground body (number 0, type 1[fixed]) never moves but is the parent of all anchored things - self.groundBody = Body( - self, 0, 1, np.zeros(6) - ) # <<< implementation not complete <<<< be careful here if/when MoorPy is split up - - # constants used in the analysis - self.depth = depth # water depth [m] - self.rho = rho # water density [kg/m^3] - self.g = g # gravitational acceleration [m/s^2] - - self.nDOF = 0 # number of (free) degrees of freedom of the mooring system (needs to be set elsewhere) - self.freeDOFs = [] # array of the values of the free DOFs of the system at different instants (2D list) - - self.nCpldDOF = 0 # number of (coupled) degrees of freedom of the mooring system (needs to be set elsewhere) - self.cpldDOFs = [] # array of the values of the coupled DOFs of the system at different instants (2D list) - - self.display = 0 # a flag that controls how much printing occurs in methods within the System (Set manually. Values > 0 cause increasing output.) - - self.MDoptions = ( - {} - ) # dictionary that can hold any MoorDyn options read in from an input file, so they can be saved in a new MD file if need be - - # read in data from an input file if a filename was provided - if len(file) > 0: - self.load(file) - - # set the quasi-static/dynamic toggle for the entire mooring system - self.qs = qs - if self.qs == 0: # if the mooring system is desired to be used as a portrayal of MoorDyn data - # Load main mooring file - if Fortran: - self.loadData(dirname, rootname, sep=".MD.") - else: - self.loadData(dirname, rootname, sep="_") - - if len(file) == 0 or len(rootname) == 0: - raise ValueError( - "The MoorDyn input file name and the root name of the MoorDyn output files (e.g. the .fst file name without extension) need to be given." - ) - # load in the MoorDyn data for each line to set the xp,yp,zp positions of each node in the line - # Each row in the xp matrix is a time step and each column is a node in the line - for line in self.lineList: - # try: - if Fortran: # for output filename style for MD-F - line.loadData(dirname, rootname, sep=".MD.") - # line.loadData(dirname, rootname, sep='.') - else: # for output filename style for MD-C - line.loadData(dirname, rootname, sep="_") - # except: - # raise ValueError("There is likely not a .MD.Line#.out file in the directory. Make sure Line outputs are set to 'p' in the MoorDyn input file") - - for rod in self.rodList: - if isinstance(rod, Line): - if Fortran: # for output filename style for MD-F - rod.loadData(dirname, rootname, sep=".MD.") - else: # for output filename style for MD-C - rod.loadData(dirname, rootname, sep="_") - - def addBody(self, mytype, r6, m=0, v=0, rCG=np.zeros(3), AWP=0, rM=np.zeros(3), f6Ext=np.zeros(6)): - """Convenience function to add a Body to a mooring system - - Parameters - ---------- - type : int - the body type: 0 free to move, 1 fixed, -1 coupled externally - r6 : array - 6DOF position and orientation vector [m, rad]. - m : float, optional - mass, centered at CG [kg]. The default is 0. - v : float, optional - volume, centered at reference point [m^3]. The default is 0. - rCG : array, optional - center of gravity position in body reference frame [m]. The default is np.zeros(3). - AWP : float, optional - waterplane area - used for hydrostatic heave stiffness if nonzero [m^2]. The default is 0. - rM : float or array, optional - coordinates or height of metacenter relative to body reference frame [m]. The default is np.zeros(3). - f6Ext : array, optional - applied external forces and moments vector in global orientation (not including weight/buoyancy) [N]. The default is np.zeros(6). - - Returns - ------- - None. - - """ - - self.bodyList.append( - Body(self, len(self.bodyList) + 1, mytype, r6, m=m, v=v, rCG=rCG, AWP=AWP, rM=rM, f6Ext=f6Ext) - ) - - # handle display message if/when MoorPy is reorganized by classes - - def addRod(self, rodType, rA, rB, nSegs=1, bodyID=0): - """draft method to add a quasi-Rod to the system. Rods are not yet fully figured out for MoorPy""" - - if not isinstance(rodType, dict): - if rodType in self.rodTypes: - rodType = self.rodTypes[rodType] - else: - ValueError( - "The specified rodType name does not correspond with any rodType stored in this MoorPy System" - ) - - rA = np.array(rA) - rB = np.array(rB) - - if nSegs == 0: # this is the zero-length special case - lUnstr = 0 - self.rodList.append(Point(self, len(self.pointList) + 1, 0, rA)) - else: - lUnstr = np.linalg.norm(rB - rA) - self.rodList.append(Line(self, len(self.rodList) + 1, lUnstr, rodType, nSegs=nSegs, isRod=1)) - - if bodyID > 0: - self.bodyList[bodyID - 1].attachRod(len(self.rodList), np.hstack([rA, rB])) - - else: # (in progress - unsure if htis works) <<< - self.rodList[-1].rA = rA # .setEndPosition(rA, 0) # set initial end A position - self.rodList[-1].rB = rB # .setEndPosition(rB, 1) # set initial end B position - - def addPoint(self, mytype, r, m=0, v=0, fExt=np.zeros(3), DOFs=[0, 1, 2], d=0): - """Convenience function to add a Point to a mooring system - - Parameters - ---------- - type : int - the point type: 0 free to move, 1 fixed, -1 coupled externally - r : array - x,y,z coordate position vector [m]. - m : float, optional - mass [kg]. The default is 0. - v : float, optional - volume [m^3]. The default is 0. - fExt : array, optional - applied external force vector in global orientation (not including weight/buoyancy) [N]. The default is np.zeros(3). - DOFs : list, optional - list of which coordinate directions are DOFs for this point (default 0,1,2=x,y,z). E.g. set [2] for vertical motion only.. The default is [0,1,2]. - - Returns - ------- - None. - - """ - - self.pointList.append(Point(self, len(self.pointList) + 1, mytype, r, m=m, v=v, fExt=fExt, DOFs=DOFs, d=d)) - - return len(self.pointList) # return the index of the added point - # print("Created Point "+str(self.pointList[-1].number)) - # handle display message if/when MoorPy is reorganized by classes - - def addLine(self, lUnstr, lineType, nSegs=40, pointA=0, pointB=0, cb=0): - """Convenience function to add a Line to a mooring system - - Parameters - ---------- - lUnstr : float - unstretched line length [m]. - lineType : string or dict - string identifier of lineType for this line already added to the system, or dict specifying custom line type. - nSegs : int, optional - number of segments to split the line into. The default is 20. - pointA int, optional - Point number to attach end A of the line to. - pointB int, optional - Point number to attach end B of the line to. - - Returns - ------- - None. - - """ - - if not isinstance(lineType, dict): # If lineType is not a dict, presumably it is a key for System.LineTypes. - if lineType in self.lineTypes: # So make sure it matches up with a System.LineType - lineType = self.lineTypes[lineType] # in which case that entry will get passed to Line.init - else: - ValueError( - "The specified lineType name does not correspond with any lineType stored in this MoorPy System" - ) - - self.lineList.append(Line(self, len(self.lineList) + 1, lUnstr, lineType, nSegs=nSegs, cb=cb)) - - if pointA > 0: - if pointA <= len(self.pointList): - self.pointList[pointA - 1].attachLine(self.lineList[-1].number, 0) - else: - raise Exception(f"Provided pointA of {pointA} exceeds number of points.") - if pointB > 0: - if pointB <= len(self.pointList): - self.pointList[pointB - 1].attachLine(self.lineList[-1].number, 1) - else: - raise Exception(f"Provided pointB of {pointB} exceeds number of points.") - - # print("Created Line "+str(self.lineList[-1].number)) - # handle display message if/when MoorPy is reorganized by classes - - """ - def removeLine(self, lineID): - '''Removes a line from the system.''' - - if lineID > 0 and lineID <= len(self.lineList): - - # detach line from Points - for point in self.pointList: - if lineID in point.attached: - endB = point.attachedEndB[point.attached.index(lineID)] # get whether it's end B of the line attached to this ponit - point.detachLine(lineID, endB) - - # remove line from list - self.lineList.pop(lineID-1) - >>> This doesn't currently work because it would required adjusting indexing of all references to lines in the system <<< - - else: - raise Exception("Invalid line number") - - """ - - def addLineType(self, type_string, d, mass, EA, name=""): - """Convenience function to add a LineType to a mooring system or adjust - the values of an existing line type if it has the same name/key. - - Parameters - ---------- - type_string : string - string identifier of the LineType object that is to be added. - d : float - volume-equivalent diameter [m]. - mass : float - mass of line per length, or mass density [kg/m], used to calculate weight density (w) [N/m] - EA : float - extensional stiffness [N]. - - Returns - ------- - None. - - """ - if len(name) == 0: - name = type_string + str(d) - - w = (mass - np.pi / 4 * d**2 * self.rho) * self.g - - lineType = dict( - name=name, d_vol=d, w=w, m=mass, EA=EA, material=type_string - ) # make dictionary for this line type - - lineType["material"] = "unspecified" # fill this in so it's available later - - if type_string in self.lineTypes: # if there is already a line type with this name - self.lineTypes[type_string].update( - lineType - ) # update the existing dictionary values rather than overwriting with a new dictionary - else: - self.lineTypes[type_string] = lineType - - def setLineType(self, dnommm, material, source=None, name="", **kwargs): - """Add or update a System lineType using the new dictionary-based method. - - Parameters - ---------- - dnommm : float - nominal diameter [mm]. - material : string - string identifier of the material type be used. - source : dict or filename (optional) - YAML file name or dictionary containing line property scaling coefficients - name : string (optional) - Identifier for the line type (otherwise will be generated automatically). - - Returns - ------- - None. - """ - - # compute the actual values for this line type - lineType = getLineProps(dnommm, material, source=source, name=name, rho=self.rho, g=self.g) - - lineType.update(kwargs) # add any custom arguments provided in the call to the lineType's dictionary - - # add the dictionary to the System's lineTypes master dictionary - if lineType["name"] in self.lineTypes: # if there is already a line type with this name - self.lineTypes[lineType["name"]].update( - lineType - ) # update the existing dictionary values rather than overwriting with a new dictionary - else: - self.lineTypes[lineType["name"]] = lineType # otherwise save a new entry - - return lineType # return the dictionary in case it's useful separately - - def setRodType(self, d, name="", **kwargs): - """hasty replication of setLineType for rods""" - - # compute the actual values for this line type - - if len(name) == 0: - name = len(self.rodList) + 1 - - rodType = dict(name=name, d_vol=d, w=0, m=0) # make dictionary for this rod type - - rodType.update(kwargs) # add any custom arguments provided in the call - - # add the dictionary to the System's lineTypes master dictionary - if rodType["name"] in self.rodTypes: # if there is already a line type with this name - self.rodTypes[rodType["name"]].update( - rodType - ) # update the existing dictionary values rather than overwriting with a new dictionary - else: - self.rodTypes[rodType["name"]] = rodType # otherwise save a new entry - - return rodType # return the dictionary in case it's useful separately - - def load(self, filename): - """Loads a MoorPy System from a MoorDyn-style input file - - Parameters - ---------- - filename : string - the file name of a MoorDyn-style input file. - - Raises - ------ - ValueError - DESCRIPTION. - - Returns - ------- - None. - - """ - - # create/empty the lists to start with - - RodDict = {} # create empty dictionary for rod types - self.lineTypes = {} # create empty dictionary for line types - self.rodTypes = {} # create empty dictionary for line types - - # ensure the mooring system's object lists are empty before adding to them - self.bodyList = [] - self.rodList = [] - self.pointList = [] - self.lineList = [] - - # figure out if it's a YAML file or MoorDyn-style file based on the extension, then open and process - print("attempting to read " + filename) - - # assuming YAML format - if ".yaml" in filename.lower() or ".yml" in filename.lower(): - with open(filename) as file: - mooring = yaml.load(file, Loader=yaml.FullLoader) # get dict from YAML file - - self.parseYAML(mooring) - - # assuming normal form - else: - f = open(filename, "r") - - # read in the data - - for line in f: # loop through each line in the file - # get line type property sets - if line.count("---") > 0 and ( - line.upper().count("LINE DICTIONARY") > 0 or line.upper().count("LINE TYPES") > 0 - ): - line = next(f) # skip this header line, plus channel names and units lines - line = next(f) - line = next(f) - while line.count("---") == 0: - entries = ( - line.split() - ) # entries: TypeName Diam Mass/m EA BA/-zeta EI Cd Ca CdAx CaAx - # self.addLineType(entries[0], float(entries[1]), float(entries[2]), float(entries[3])) - - type_string = entries[0] - d = float(entries[1]) - mass = float(entries[2]) - w = (mass - np.pi / 4 * d**2 * self.rho) * self.g - lineType = dict(name=type_string, d_vol=d, w=w, m=mass) # make dictionary for this rod type - - # support linear (EA) or nonlinear (filename string) option for elasticity - # if there is a text file in the EA input - if entries[3].find(".txt") != -1: - # Then we read in ten-strain file - ten_str_fname = entries[3] - ten_str = open(ten_str_fname[1:-1], "r") - - # Read line in ten-strain file until we hit '---' signifying the end of the file - for line in ten_str: - # skip first 3 lines (Header for input file) - line = next(ten_str) - line = next(ten_str) - line = next(ten_str) - # Preallocate Arrays - str_array = [] - ten_array = [] - # Loop through lines until you hit '---' signifying the end of the file - while line.count("---") == 0: - ten_str_entries = line.split() # split entries ten_str_entries: strain tension - str_array.append(ten_str_entries[0]) # First one is strain - ten_array.append(ten_str_entries[1]) # Second one is tension - line = next(ten_str) # go to next line - lineType[ - "Str" - ] = str_array # make new entry in the dictionary to carry tension and strain arrays - lineType["Ten"] = ten_array - - else: - try: - lineType["EA"] = float( - entries[3].split("|")[0] - ) # get EA, and only take first value if multiples are given - except: - lineType["EA"] = 1e9 - print("EA entry not recognized - using placeholder value of 1000 MN") - if ( - len(entries) >= 10 - ): # read in other elasticity and hydro coefficients as well if enough columns are provided - lineType["BA"] = float(entries[4].split("|")[0]) - lineType["EI"] = float(entries[5]) - lineType["Cd"] = float(entries[6]) - lineType["Ca"] = float(entries[7]) - lineType["CdAx"] = float(entries[8]) - lineType["CaAx"] = float(entries[9]) - lineType["material"] = type_string - - if type_string in self.lineTypes: # if there is already a line type with this name - self.lineTypes[type_string].update( - lineType - ) # update the existing dictionary values rather than overwriting with a new dictionary - else: - self.lineTypes[type_string] = lineType - - line = next(f) - - # get rod type property sets - if line.count("---") > 0 and ( - line.upper().count("ROD DICTIONARY") > 0 or line.upper().count("ROD TYPES") > 0 - ): - line = next(f) # skip this header line, plus channel names and units lines - line = next(f) - line = next(f) - while line.count("---") == 0: - entries = ( - line.split() - ) # entries: TypeName Diam Mass/m Cd Ca CdEnd CaEnd - # RodTypesName.append(entries[0]) # name string - # RodTypesD.append( entries[1]) # diameter - # RodDict[entries[0]] = entries[1] # add dictionary entry with name and diameter - - type_string = entries[0] - d = float(entries[1]) - mass = float(entries[2]) - w = (mass - np.pi / 4 * d**2 * self.rho) * self.g - - rodType = dict(name=type_string, d_vol=d, w=w, m=mass) # make dictionary for this rod type - - if len(entries) >= 7: # read in hydro coefficients as well if enough columns are provided - rodType["Cd"] = float(entries[3]) - rodType["Ca"] = float(entries[4]) - rodType["CdEnd"] = float(entries[5]) - rodType["CaEnd"] = float(entries[6]) - - if type_string in self.rodTypes: # if there is already a rod type with this name - self.rodTypes[type_string].update( - rodType - ) # update the existing dictionary values rather than overwriting with a new dictionary - else: - self.rodTypes[type_string] = rodType - - line = next(f) - - # get properties of each Body - if line.count("---") > 0 and ( - line.upper().count("BODIES") > 0 - or line.upper().count("BODY LIST") > 0 - or line.upper().count("BODY PROPERTIES") > 0 - ): - line = next(f) # skip this header line, plus channel names and units lines - line = next(f) - line = next(f) - while line.count("---") == 0: - entries = ( - line.split() - ) # entries: ID Attachment X0 Y0 Z0 r0 p0 y0 M CG* I* V CdA* Ca* - num = int(entries[0]) - entry0 = entries[1].lower() - # num = np.int("".join(c for c in entry0 if not c.isalpha())) # remove alpha characters to identify Body # - - if ("fair" in entry0) or ("coupled" in entry0) or ("ves" in entry0): # coupled case - bodyType = -1 - elif ("con" in entry0) or ("free" in entry0): # free case - bodyType = 0 - else: # for now assuming unlabeled free case - bodyType = 0 - # if we detected there were unrecognized chars here, could: raise ValueError(f"Body type not recognized for Body {num}") - # bodyType = -1 # manually setting the body type as -1 for FAST.Farm SM investigation - - r6 = np.array(entries[2:8], dtype=float) # initial position and orientation [m, rad] - r6[3:] = r6[3:] * np.pi / 180.0 # convert from deg to rad - # rCG = np.array(entries[7:10], dtype=float) # location of body CG in body reference frame [m] - m = np.float_(entries[8]) # mass, centered at CG [kg] - v = np.float_(entries[11]) # volume, assumed centered at reference point [m^3] - - # process CG - strings_rCG = entries[9].split("|") # split by braces, if any - if len(strings_rCG) == 1: # if only one entry, it is the z coordinate - rCG = np.array([0.0, 0.0, float(strings_rCG[0])]) - elif len(strings_rCG) == 3: # all three coordinates provided - rCG = np.array(strings_rCG, dtype=float) - else: - raise Exception(f"Body {num} CG entry (col 10) must have 1 or 3 numbers.") - - # process mements of inertia - strings_I = entries[10].split("|") # split by braces, if any - if len(strings_I) == 1: # if only one entry, use it for all directions - Inert = np.array(3 * strings_I, dtype=float) - elif len(strings_I) == 3: # all three coordinates provided - Inert = np.array(strings_I, dtype=float) - else: - raise Exception(f"Body {num} inertia entry (col 11) must have 1 or 3 numbers.") - - # process drag ceofficient by area product - strings_CdA = entries[12].split("|") # split by braces, if any - if len(strings_CdA) == 1: # if only one entry, use it for all directions - CdA = np.array(3 * strings_CdA, dtype=float) - elif len(strings_CdA) == 3: # all three coordinates provided - CdA = np.array(strings_CdA, dtype=float) - else: - raise Exception(f"Body {num} CdA entry (col 13) must have 1 or 3 numbers.") - - # process added mass coefficient - strings_Ca = entries[13].split("|") # split by braces, if any - if len(strings_Ca) == 1: # if only one entry, use it for all directions - Ca = np.array(strings_Ca, dtype=float) - elif len(strings_Ca) == 3: # all three coordinates provided - Ca = np.array(strings_Ca, dtype=float) - else: - raise Exception(f"Body {num} Ca entry (col 14) must have 1 or 3 numbers.") - - # add the body - self.bodyList.append(Body(self, num, bodyType, r6, m=m, v=v, rCG=rCG, I=Inert, CdA=CdA, Ca=Ca)) - - line = next(f) - - # get properties of each rod - if line.count("---") > 0 and ( - line.upper().count("RODS") > 0 - or line.upper().count("ROD LIST") > 0 - or line.upper().count("ROD PROPERTIES") > 0 - ): - line = next(f) # skip this header line, plus channel names and units lines - line = next(f) - line = next(f) - while line.count("---") == 0: - entries = ( - line.split() - ) # entries: RodID RodType Attachment Xa Ya Za Xb Yb Zb NumSegs Flags/Outputs - num = int(entries[0]) - rodType = self.rodTypes[entries[1]] - attachment = entries[2].lower() - dia = rodType["d_vol"] # find diameter based on specified rod type string - rA = np.array(entries[3:6], dtype=float) - rB = np.array(entries[6:9], dtype=float) - nSegs = int(entries[9]) - # >>> note: this is currently only set up for use with MoorDyn output data <<< - - if nSegs == 0: # this is the zero-length special case - lUnstr = 0 - self.rodList.append(Point(self, num, 0, rA)) - else: - lUnstr = np.linalg.norm(rB - rA) - self.rodList.append(Line(self, num, lUnstr, rodType, nSegs=nSegs, isRod=1)) - - if ("body" in attachment) or ("turbine" in attachment): - # attach to body here - BodyID = int("".join(filter(str.isdigit, attachment))) - if len(self.bodyList) < BodyID: - self.bodyList.append(Body(self, 1, 0, np.zeros(6))) - - self.bodyList[BodyID - 1].attachRod(num, np.hstack([rA, rB])) - - else: # (in progress - unsure if htis works) <<< - self.rodList[-1].rA = rA # .setEndPosition(rA, 0) # set initial end A position - self.rodList[-1].rB = rB # .setEndPosition(rB, 1) # set initial end B position - - line = next(f) - - # get properties of each Point - if line.count("---") > 0 and ( - line.upper().count("POINTS") > 0 - or line.upper().count("POINT LIST") > 0 - or line.upper().count("POINT PROPERTIES") > 0 - ): - line = next(f) # skip this header line, plus channel names and units lines - line = next(f) - line = next(f) - while line.count("---") == 0: - entries = ( - line.split() - ) # entries: ID Attachment X Y Z Mass Volume CdA Ca - entry0 = entries[0].lower() - entry1 = entries[1].lower() - - num = np.int( - "".join(c for c in entry0 if not c.isalpha()) - ) # remove alpha characters to identify Point # - - if ("anch" in entry1) or ("fix" in entry1): - pointType = 1 - # attach to ground body for ease of identifying anchors - self.groundBody.attachPoint(num, entries[2:5]) - - elif ("body" in entry1) or ("turbine" in entry1): - pointType = 1 - # attach to body here - BodyID = int("".join(filter(str.isdigit, entry1))) - if len(self.bodyList) < BodyID: - self.bodyList.append(Body(self, 1, 0, np.zeros(6))) - - rRel = np.array(entries[2:5], dtype=float) - self.bodyList[BodyID - 1].attachPoint(num, rRel) - - elif ("fair" in entry1) or ("ves" in entry1) or ("couple" in entry1): - # for coupled point type, just set it up that same way in MoorPy (attachment to a body not needed, right?) - pointType = -1 - """ - # attach to a generic platform body (and make it if it doesn't exist) - if len(self.bodyList) > 1: - raise ValueError("Generic Fairlead/Vessel-type points aren't supported when multiple bodies are defined.") - if len(self.bodyList) == 0: - #print("Adding a body to attach fairlead points to.") - self.bodyList.append( Body(self, 1, 0, np.zeros(6)))#, m=m, v=v, rCG=rCG) ) - - rRel = np.array(entries[2:5], dtype=float) - self.bodyList[0].attachPoint(num, rRel) - """ - - elif ("con" in entry1) or ("free" in entry1): - pointType = 0 - else: - print("Point type not recognized") - - if "seabed" in entries[4]: - entries[4] = -self.depth - r = np.array(entries[2:5], dtype=float) - m = float(entries[5]) - v = float(entries[6]) - CdA = float(entries[7]) - Ca = float(entries[8]) - self.pointList.append(Point(self, num, pointType, r, m=m, v=v, CdA=CdA, Ca=Ca)) - line = next(f) - - # get properties of each line - if line.count("---") > 0 and ( - line.upper().count("LINES") > 0 - or line.upper().count("LINE LIST") > 0 - or line.upper().count("LINE PROPERTIES") > 0 - ): - line = next(f) # skip this header line, plus channel names and units lines - line = next(f) - line = next(f) - while line.count("---") == 0: - entries = line.split() # entries: ID LineType AttachA AttachB UnstrLen NumSegs Outputs - - num = np.int(entries[0]) - lUnstr = np.float_(entries[4]) - lineType = self.lineTypes[entries[1]] - nSegs = np.int(entries[5]) - - # lineList.append( Line(dirName, num, lUnstr, dia, nSegs) ) - self.lineList.append( - Line(self, num, lUnstr, lineType, nSegs=nSegs) - ) # attachments = [int(entries[4]), int(entries[5])]) ) - - # attach end A - numA = int("".join(filter(str.isdigit, entries[2]))) # get number from the attachA string - if entries[2][0] in ["r", "R"]: # if id starts with an "R" or "Rod" - if numA <= len(self.rodList) and numA > 0: - if entries[2][-1] in ["a", "A"]: - self.rodList[numA - 1].attachLine( - num, 0 - ) # add line (end A, denoted by 0) to rod >>end A, denoted by 0<< - elif entries[2][-1] in ["b", "B"]: - self.rodList[numA - 1].attachLine( - num, 0 - ) # add line (end A, denoted by 0) to rod >>end B, denoted by 1<< - else: - raise ValueError( - f"Rod end (A or B) must be specified for line {num} end A attachment. Input was: {entries[2]}" - ) - else: - raise ValueError(f"Rod ID ({numA}) out of bounds for line {num} end A attachment.") - - else: # if J starts with a "C" or "Con" or goes straight ot the number then it's attached to a Connection - if numA <= len(self.pointList) and numA > 0: - self.pointList[numA - 1].attachLine(num, 0) # add line (end A, denoted by 0) to Point - else: - raise ValueError(f"Point ID ({numA}) out of bounds for line {num} end A attachment.") - - # attach end B - numB = int("".join(filter(str.isdigit, entries[3]))) # get number from the attachA string - if entries[3][0] in ["r", "R"]: # if id starts with an "R" or "Rod" - if numB <= len(self.rodList) and numB > 0: - if entries[3][-1] in ["a", "A"]: - self.rodList[numB - 1].attachLine( - num, 1 - ) # add line (end B, denoted by 1) to rod >>end A, denoted by 0<< - elif entries[3][-1] in ["b", "B"]: - self.rodList[numB - 1].attachLine( - num, 1 - ) # add line (end B, denoted by 1) to rod >>end B, denoted by 1<< - else: - raise ValueError( - f"Rod end (A or B) must be specified for line {num} end B attachment. Input was: {entries[2]}" - ) - else: - raise ValueError(f"Rod ID ({numB}) out of bounds for line {num} end B attachment.") - - else: # if J starts with a "C" or "Con" or goes straight ot the number then it's attached to a Connection - if numB <= len(self.pointList) and numB > 0: - self.pointList[numB - 1].attachLine(num, 1) # add line (end B, denoted by 1) to Point - else: - raise ValueError(f"Point ID ({numB}) out of bounds for line {num} end B attachment.") - - line = next(f) # advance to the next line - - # get options entries - if line.count("---") > 0 and "options" in line.lower(): - # print("READING OPTIONS") - line = next(f) # skip this header line - - while line.count("---") == 0: - entries = line.split() - entry0 = entries[0].lower() - entry1 = entries[1].lower() - - # grab any parameters used by MoorPy - if entry1 == "g" or entry1 == "gravity": - self.g = float(entry0) - - elif entry1 == "wtrdepth" or entry1 == "depth" or entry1 == "wtrdpth": - try: - self.depth = float(entry0) - except: - self.depth = 0.0 - print("Warning: non-numeric depth in input file - MoorPy will ignore it.") - - elif entry1 == "rho" or entry1 == "wtrdnsty": - self.rho = float(entry0) - - # also store a dict of all parameters that can be regurgitated during an unload - self.MDoptions[entry1] = entry0 - - line = next(f) - - f.close() # close data file - - # any error check? <<< - - print(f"Mooring input file '{filename}' loaded successfully.") - - def parseYAML(self, data): - """Creates a MoorPy System from a YAML dictionary - >>> work in progress <<< - - Parameters - ---------- - data : dictionary - YAML dictionary to be parsed through. - - Raises - ------ - ValueError - DESCRIPTION. - - Returns - ------- - None. - - """ - - # line types - for d in data["line_types"]: - dia = float(d["diameter"]) - w = float(d["mass_density"]) * self.g - EA = float(d["stiffness"]) - if d["breaking_load"]: - MBL = float(d["breaking_load"]) - else: - MBL = 0 - self.lineTypes[d["name"]] = dict(name=d["name"], d_vol=dia, w=w, EA=EA, MBL=MBL) - - # rod types TBD - - # bodies TBDish - if "bodies" in data: - pass # <<<<<<<<<< need to fill this in once the YAML format is full defined - - # rods TBD - - # points - pointDict = dict() - for i, d in enumerate(data["points"]): - pointDict[d["name"]] = i # make dictionary based on names pointing to point indices, for name-based linking - - entry0 = d["name"].lower() - entry1 = d["type"].lower() - - # num = np.int("".join(c for c in entry0 if not c.isalpha())) # remove alpha characters to identify Point # - num = i + 1 # not counting on things being numbered in YAML files - - if ("anch" in entry1) or ("fix" in entry1): - pointType = 1 - # attach to ground body for ease of identifying anchors - self.groundBody.attachPoint(num, d["location"]) - - elif "body" in entry1: - pointType = 1 - # attach to body here - BodyID = int("".join(filter(str.isdigit, entry1))) - rRel = np.array(d["location"], dtype=float) - self.bodyList[BodyID - 1].attachPoint(num, rRel) - - elif ("fair" in entry1) or ("ves" in entry1): - pointType = 1 # <<< this used to be -1. I need to figure out a better way to deal with this for different uses! <<<<<< - # attach to a generic platform body (and make it if it doesn't exist) - if len(self.bodyList) > 1: - raise ValueError("Generic Fairlead/Vessel-type points aren't supported when bodies are defined.") - if len(self.bodyList) == 0: - # print("Adding a body to attach fairlead points to.") - self.bodyList.append(Body(self, 1, 0, np.zeros(6))) # , m=m, v=v, rCG=rCG) ) - - rRel = np.array(d["location"], dtype=float) - self.bodyList[0].attachPoint(num, rRel) - - elif ("con" in entry1) or ("free" in entry1): - pointType = 0 - else: - print("Point type not recognized") - - r = np.array(d["location"], dtype=float) - - if "mass" in d: - m = np.float_(d["mass"]) - else: - m = 0.0 - - if "volume" in d: - v = np.float_(d["volume"]) - else: - v = 0.0 - - self.pointList.append(Point(self, num, pointType, r, m=m, v=v)) - - # lines - for i, d in enumerate(data["lines"]): - num = i + 1 - - lUnstr = np.float_(d["length"]) - - self.lineList.append(Line(self, num, lUnstr, self.lineTypes[d["type"]])) - - # attach ends (name matching here) - self.pointList[pointDict[d["endA"]]].attachLine(num, 0) - self.pointList[pointDict[d["endB"]]].attachLine(num, 1) - - # get options entries - if "water_depth" in data: - self.depth = data["water_depth"] - - if "rho" in data: - self.rho = data["rho"] - elif "water_density" in data: - self.rho = data["water_density"] - - def readBathymetryFile(self, filename): - f = open(filename, "r") - - # skip the header - line = next(f) - # collect the number of grid values in the x and y directions from the second and third lines - line = next(f) - nGridX = int(line.split()[1]) - line = next(f) - nGridY = int(line.split()[1]) - # allocate the Xs, Ys, and main bathymetry grid arrays - bathGrid_Xs = np.zeros(nGridX) - bathGrid_Ys = np.zeros(nGridY) - bathGrid = np.zeros([nGridX, nGridY]) - # read in the fourth line to the Xs array - line = next(f) - bathGrid_Xs = [float(line.split()[i]) for i in range(nGridX)] - # read in the remaining lines in the file into the Ys array (first entry) and the main bathymetry grid - for i in range(nGridY): - line = next(f) - entries = line.split() - bathGrid_Ys[i] = entries[0] - bathGrid[i, :] = entries[1:] - - return bathGrid_Xs, bathGrid_Ys, bathGrid - - def unload(self, fileName, MDversion=2, line_dL=0, rod_dL=0, flag="p", outputList=[]): - """Unloads a MoorPy system into a MoorDyn-style input file - - Parameters - ---------- - fileName : string - file name of output file to hold MoorPy System. - line_dL : float, optional - Optional specified for target segment length when discretizing Lines - rod_dL : float, optional - Optional specified for target segment length when discretizing Rods - outputList : list of strings, optional - Optional list of additional requested output channels - - Returns - ------- - None. - - """ - if MDversion == 1: - # For version MoorDyn v1 - - # Collection of default values, each can be customized when the method is called - - # Set up the dictionary that will be used to write the OPTIONS section - MDoptionsDict = dict(dtM=0.001, kb=3.0e6, cb=3.0e5, TmaxIC=60) # start by setting some key default values - # Other available options: Echo=False, dtIC=2, CdScaleIC=10, threshIC=0.01 - MDoptionsDict.update(self.MDoptions) # update the dict with any settings saved from an input file - MDoptionsDict.update( - dict(g=self.g, WtrDepth=self.depth, rho=self.rho) - ) # lastly, apply any settings used by MoorPy - MDoptionsDict.update(dict(WriteUnits=0)) # need this for WEC-Sim - - # Some default settings to fill in if coefficients aren't set - # lineTypeDefaults = dict(BA=-1.0, EI=0.0, Cd=1.2, Ca=1.0, CdAx=0.2, CaAx=0.0) - lineTypeDefaults = dict(BA=-1.0, cIntDamp=-0.8, EI=0.0, Can=1.0, Cat=1.0, Cdn=1.0, Cdt=0.5) - rodTypeDefaults = dict(Cd=1.2, Ca=1.0, CdEnd=1.0, CaEnd=1.0) - - # bodyDefaults = dict(IX=0, IY=0, IZ=0, CdA_xyz=[0,0,0], Ca_xyz=[0,0,0]) - - # Figure out mooring line attachments (Create a ix2 array of connection points from a list of m points) - connection_points = np.empty( - [len(self.lineList), 2] - ) # First column is Anchor Node, second is Fairlead node - for point_ind, point in enumerate(self.pointList, start=1): # Loop through all the points - for line, line_pos in zip( - point.attached, point.attachedEndB - ): # Loop through all the lines #s connected to this point - if line_pos == 0: # If the A side of this line is connected to the point - connection_points[line - 1, 0] = point_ind # Save as as an Anchor Node - # connection_points[line -1,0] = self.pointList.index(point) + 1 - elif line_pos == 1: # If the B side of this line is connected to the point - connection_points[line - 1, 1] = point_ind # Save as a Fairlead node - # connection_points[line -1,1] = self.pointList.index(point) + 1 - - # Outputs List - Outputs = [ - f"FairTen{i+1}" for i in range(len(self.lineList)) - ] # for now, have a fairlead tension output for each line - # Outputs.append("Con2Fz","Con3Fz","Con6Fz","Con7Fz","Con10Fz","Con11Fz","L3N20T","L6N20T","L9N20T") - - print("attempting to write " + fileName + " for MoorDyn v" + str(MDversion)) - # Array to add strings to for each line of moordyn input file - L = [] - - # Generate text for the MoorDyn input file - L.append("Mooring line data file for MoorDyn in Lines.dll") - # L.append(f"MoorDyn v{MDversion} Input File ") - # L.append("Generated by MoorPy") - # L.append("{:5} Echo - echo the input file data (flag)".format(str(Echo).upper())) - - # L.append("---------------------- LINE TYPES -----------------------------------------------------") - L.append("---------------------- LINE DICTIONARY -----------------------------------------------------") - # L.append(f"{len(self.lineTypes)} NTypes - number of LineTypes") - # L.append("LineType Diam MassDen EA cIntDamp EI Can Cat Cdn Cdt") - # L.append(" (-) (m) (kg/m) (N) (Pa-s) (N-m^2) (-) (-) (-) (-)") - L.append("LineType Diam MassDenInAir EA BA/-zeta Can Cat Cdn Cdt") - L.append(" (-) (m) (kg/m) (N) (Pa-s/-) (-) (-) (-) (-)") - - for key, lineType in self.lineTypes.items(): - di = lineTypeDefaults.copy() # start with a new dictionary of just the defaults - di.update(lineType) # then copy in the lineType's existing values - # L.append("{:<12} {:7.4f} {:8.2f} {:7.3e} {:7.3e} {:7.3e} {:<7.3f} {:<7.3f} {:<7.2f} {:<7.2f}".format( - # key, di['d_vol'], di['m'], di['EA'], di['cIntDamp'], di['EI'], di['Can'], di['Cat'], di['Cdn'], di['Cdt'])) - L.append( - "{:<12} {:7.4f} {:8.2f} {:7.3e} {:7.3e} {:<7.3f} {:<7.3f} {:<7.2f} {:<7.2f}".format( - key, di["d_vol"], di["m"], di["EA"], di["BA"], di["Can"], di["Cat"], di["Cdn"], di["Cdt"] - ) - ) - - # L.append("---------------------- POINTS ---------------------------------------------------------") - L.append("---------------------- NODE PROPERTIES ---------------------------------------------------------") - # L.append(f"{len(self.pointList)} NConnects - number of connections including anchors and fairleads") - L.append("Node Type X Y Z M V FX FY FZ CdA CA ") - L.append("(-) (-) (m) (m) (m) (kg) (m^3) (kN) (kN) (kN) (m^2) (-)") - # L.append("ID Attachment X Y Z Mass Volume CdA Ca") - # L.append("(#) (-) (m) (m) (m) (kg) (m^3) (m^2) (-)") - - for point in self.pointList: - point_pos = point.r # get point position in global reference frame to start with - if point.type == 1: # point is fixed or attached (anch, body, fix) - point_type = "Fixed" - - # Check if the point is attached to body - for body in self.bodyList: - for attached_Point in body.attachedP: - if attached_Point == point.number: - # point_type = "Body" + str(body.number) - point_type = "Vessel" - point_pos = body.rPointRel[ - body.attachedP.index(attached_Point) - ] # get point position in the body reference frame - - elif point.type == 0: # point is coupled externally (con, free) - point_type = "Connect" - - elif point.type == -1: # point is free to move (fair, ves) - point_type = "Vessel" - - L.append( - "{:<4d} {:9} {:8.2f} {:8.2f} {:8.2f} {:9.2f} {:6.2f} {:6.2f} {:6.2f} {:6.2f} {:6.2f} {:6.2f}".format( - point.number, - point_type, - point_pos[0], - point_pos[1], - point_pos[2], - point.m, - point.v, - point.fExt[0], - point.fExt[1], - point.fExt[2], - point.CdA, - point.Ca, - ) - ) - - # L.append("---------------------- LINES -----------------------------------------------------") - L.append("---------------------- LINE PROPERTIES -----------------------------------------------------") - # L.append(f"{len(self.lineList)} NLines - number of line objects") - # L.append("Line LineType UnstrLen NumSegs AttachA AttachB Outputs") - # L.append("(-) (-) (m) (-) (-) (-) (-)") - # L.append("ID LineType AttachA AttachB UnstrLen NumSegs LineOutputs") - # L.append("(#) (name) (#) (#) (m) (-) (-)") - L.append("Line LineType UnstrLen NumSegs NodeAnch NodeFair Flags/Outputs") - L.append("(-) (-) (m) (-) (-) (-) (-)") - - for i, line in enumerate(self.lineList): - L.append( - "{:<4d} {:<15} {:8.3f} {:5d} {:7d} {:8d} {}".format( - line.number, - line.type["name"], - line.L, - line.nNodes - 1, - int(connection_points[i, 0]), - int(connection_points[i, 1]), - flag, - ) - ) - - # L.append("---------------------- OPTIONS ----------------------------------------") - L.append("---------------------- SOLVER OPTIONS ----------------------------------------") - - for key, val in MDoptionsDict.items(): - L.append(f"{val:<15} {key}") - - """ - #Solver Options - L.append("{:<9.3f}dtM - time step to use in mooring integration (s)".format(float(dtm))) - L.append("{:<9.0e}kbot - bottom stiffness (Pa/m)".format(kbot)) - L.append("{:<9.0e}cbot - bottom damping (Pa-s/m)".format(cbot)) - L.append("{:<9.0f}dtIC - time interval for analyzing convergence during IC gen (s)".format(int(dtIC))) - L.append("{:<9.0f}TmaxIC - max time for ic gen (s)".format(int(TmaxIC))) - L.append("{:<9.0f}CdScaleIC - factor by which to scale drag coefficients during dynamic relaxation (-)".format(int(CdScaleIC))) - L.append("{:<9.2f}threshIC - threshold for IC convergence (-)".format(threshIC)) - - #Failure Header - """ - - L.append("--------------------------- OUTPUTS --------------------------------------------") - - Outputs = Outputs + outputList # add any user-specified outputs passed to unload - - for Output in Outputs: - L.append(Output) - # L.append("END") - - L.append("--------------------- need this line ------------------") - - # Write the text file - with open(fileName, "w") as out: - for x in range(len(L)): - out.write(L[x]) - out.write("\n") - - print("Successfully written " + fileName + " input file using MoorDyn v1") - - elif MDversion == 2: - # For version MoorDyn v?.?? - - # Collection of default values, each can be customized when the method is called - - # Header - # version = - # description = - - # Set up the dictionary that will be used to write the OPTIONS section - MDoptionsDict = dict(dtM=0.001, kb=3.0e6, cb=3.0e5, TmaxIC=60) # start by setting some key default values - MDoptionsDict.update(self.MDoptions) # update the dict with any settings saved from an input file - MDoptionsDict.update( - dict(g=self.g, depth=self.depth, rho=self.rho) - ) # lastly, apply any settings used by MoorPy - - # Some default settings to fill in if coefficients aren't set - lineTypeDefaults = dict(BA=-1.0, EI=0.0, Cd=1.2, Ca=1.0, CdAx=0.2, CaAx=0.0) - rodTypeDefaults = dict(Cd=1.2, Ca=1.0, CdEnd=1.0, CaEnd=1.0) - - # Figure out mooring line attachments (Create a ix2 array of connection points from a list of m points) - connection_points = np.empty( - [len(self.lineList), 2] - ) # First column is Anchor Node, second is Fairlead node - for point_ind, point in enumerate(self.pointList, start=1): # Loop through all the points - for line, line_pos in zip( - point.attached, point.attachedEndB - ): # Loop through all the lines #s connected to this point - if line_pos == 0: # If the A side of this line is connected to the point - connection_points[line - 1, 0] = point_ind # Save as as an Anchor Node - # connection_points[line -1,0] = self.pointList.index(point) + 1 - elif line_pos == 1: # If the B side of this line is connected to the point - connection_points[line - 1, 1] = point_ind # Save as a Fairlead node - # connection_points[line -1,1] = self.pointList.index(point) + 1 - - # Line Properties - flag = "p" # "-" - - # Outputs List - Outputs = [ - f"FairTen{i+1}" for i in range(len(self.lineList)) - ] # for now, have a fairlead tension output for each line - Outputs = Outputs + outputList # add any user-specified outputs passed to unload - - print("attempting to write " + fileName + " for MoorDyn v" + str(MDversion)) - # Array to add strings to for each line of moordyn input file - L = [] - - # Generate text for the MoorDyn input file - - L.append(f"MoorDyn v{MDversion} Input File ") - # if "description" in locals(): - # L.append("MoorDyn input for " + description) - # else: - L.append("Generated by MoorPy") - - L.append("---------------------- LINE TYPES --------------------------------------------------") - L.append("TypeName Diam Mass/m EA BA/-zeta EI Cd Ca CdAx CaAx") - L.append("(name) (m) (kg/m) (N) (N-s/-) (N-m^2) (-) (-) (-) (-)") - - for key, lineType in self.lineTypes.items(): - di = lineTypeDefaults.copy() # start with a new dictionary of just the defaults - di.update(lineType) # then copy in the lineType's existing values - L.append( - "{:<12} {:7.4f} {:8.2f} {:7.3e} {:7.3e} {:7.3e} {:<7.3f} {:<7.3f} {:<7.2f} {:<7.2f}".format( - key, - di["d_vol"], - di["m"], - di["EA"], - di["BA"], - di["EI"], - di["Cd"], - di["Ca"], - di["CdAx"], - di["CaAx"], - ) - ) - - L.append("--------------------- ROD TYPES -----------------------------------------------------") - L.append("TypeName Diam Mass/m Cd Ca CdEnd CaEnd") - L.append("(name) (m) (kg/m) (-) (-) (-) (-)") - - for key, rodType in self.rodTypes.items(): - di = rodTypeDefaults.copy() - di.update(rodType) - L.append( - "{:<15} {:7.4f} {:8.2f} {:<7.3f} {:<7.3f} {:<7.3f} {:<7.3f}".format( - key, di["d_vol"], di["m"], di["Cd"], di["Ca"], di["CdEnd"], di["CaEnd"] - ) - ) - - L.append("----------------------- BODIES ------------------------------------------------------") - L.append( - "ID Attachment X0 Y0 Z0 r0 p0 y0 Mass CG* I* Volume CdA* Ca*" - ) - L.append( - "(#) (-) (m) (m) (m) (deg) (deg) (deg) (kg) (m) (kg-m^2) (m^3) (m^2) (-)" - ) - - for body in self.bodyList: - attach = ["coupled", "free", "fixed"][ - [-1, 0, 1].index(body.type) - ] # pick correct string based on body type - L.append( - "{:<4d} {:10} {:<6.2f} {:<6.2f} {:<6.2f} {:<6.2f} {:<6.2f} {:<6.2f} ".format( - body.number, - attach, - body.r6[0], - body.r6[1], - body.r6[2], - np.rad2deg(body.r6[3]), - np.rad2deg(body.r6[4]), - np.rad2deg(body.r6[5]), - ) - + "{:<9.4e} {:.2f}|{:.2f}|{:.2f} {:9.3e} {:6.2f} {:6.2f} {:5.2f}".format( - body.m, body.rCG[0], body.rCG[1], body.rCG[2], body.I[0], body.v, body.CdA[0], body.Ca[0] - ) - ) - - # below is a more thorough approach to see about in future - # )+ "{:<9.2f} {:<5.2f}|{:<5.2f}|{:<5.2f} {:<5.2f}|{:<5.2f}|{:<5.2f} {:<5.2f} {:<5.2f}|{:<5.2f}|{:<5.2f} {:<5.2f}|{:<5.2f}|{:<5.2f}".format( - # body.m, body.rCG[0],body.rCG[1],body.rCG[2], body.I[0],body.I[1],body.I[2], - # body.v, body.CdA[0],body.CdA[1],body.CdA[2], body.Ca[0],body.Ca[1],body.Ca[2])) - - L.append("---------------------- RODS ---------------------------------------------------------") - L.append("ID RodType Attachment Xa Ya Za Xb Yb Zb NumSegs RodOutputs") - L.append("(#) (name) (#/key) (m) (m) (m) (m) (m) (m) (-) (-)") - - # Rod Properties Table TBD <<< - - L.append("---------------------- POINTS -------------------------------------------------------") - L.append("ID Attachment X Y Z Mass Volume CdA Ca") - L.append("(#) (-) (m) (m) (m) (kg) (mˆ3) (m^2) (-)") - - for point in self.pointList: - point_pos = point.r # get point position in global reference frame to start with - if point.type == 1: # point is fixed or attached (anch, body, fix) - point_type = "Fixed" - - # Check if the point is attached to body - for body in self.bodyList: - for attached_Point in body.attachedP: - if attached_Point == point.number: - point_type = "Body" + str(body.number) - point_pos = body.rPointRel[ - body.attachedP.index(attached_Point) - ] # get point position in the body reference frame - - elif point.type == 0: # point is coupled externally (con, free) - point_type = "Free" - - elif point.type == -1: # point is free to move (fair, ves) - point_type = "Coupled" - - L.append( - "{:<4d} {:9} {:8.2f} {:8.2f} {:8.2f} {:9.2f} {:6.2f} {:6.2f} {:6.2f}".format( - point.number, - point_type, - point_pos[0], - point_pos[1], - point_pos[2], - point.m, - point.v, - point.CdA, - point.Ca, - ) - ) - - L.append("---------------------- LINES --------------------------------------------------------") - L.append("ID LineType AttachA AttachB UnstrLen NumSegs LineOutputs") - L.append("(#) (name) (#) (#) (m) (-) (-)") - - for i, line in enumerate(self.lineList): - nSegs = ( - int(np.ceil(line.L / line_dL)) if line_dL > 0 else line.nNodes - 1 - ) # if target dL given, set nSegs based on it instead of line.nNodes - - L.append( - "{:<4d} {:<15} {:^5d} {:^5d} {:8.3f} {:4d} {}".format( - line.number, - line.type["name"], - int(connection_points[i, 0]), - int(connection_points[i, 1]), - line.L, - nSegs, - flag, - ) - ) - - L.append("---------------------- OPTIONS ------------------------------------------------------") - - for key, val in MDoptionsDict.items(): - L.append(f"{val:<15} {key}") - - # Failure Header - # Failure Table - - L.append("----------------------- OUTPUTS -----------------------------------------------------") - - for Output in Outputs: - L.append(Output) - L.append("END") - - L.append("--------------------- need this line ------------------------------------------------") - - # Write the text file - with open(fileName, "w") as out: - for x in range(len(L)): - out.write(L[x]) - out.write("\n") - - print("Successfully written " + fileName + " input file using MoorDyn v2") - - def getDOFs(self): - """returns updated nDOFs and nCpldDOFs if the body and point types ever change - - Returns - ------- - nDOF : int - number of free degrees of freedom based on body and point types. - nCpldDOF : int - number of coupled degrees of freedom based on body ad point types. - - """ - - nDOF = 0 - nCpldDOF = 0 - - for body in self.bodyList: - if body.type == 0: - nDOF += 6 - if body.type == -1: - nCpldDOF += 6 - - for point in self.pointList: - if point.type == 0: - nDOF += point.nDOF - if point.type == -1: - nCpldDOF += point.nDOF - - return nDOF, nCpldDOF - - def initialize(self, plots=0): - """Initializes the mooring system objects to their initial positions - - Parameters - ---------- - plots : bool, optional - toggle to plot the system at initialization or not. The default is 0. - - Returns - ------- - None. - - """ - - self.nDOF, self.nCpldDOF = self.getDOFs() - - for body in self.bodyList: - body.setPosition(body.r6) - - for point in self.pointList: - point.setPosition(point.r) - - for line in self.lineList: - line.staticSolve( - profiles=1 - ) # flag to enable additional line outputs used for plotting, tension results, etc. - - for point in self.pointList: - point.getForces() - - for body in self.bodyList: - body.getForces() - - # draw initial mooring system if desired - if plots == 1: - self.plot(title="Mooring system at initialization") - - def transform(self, trans=[0, 0], rot=0, scale=[1, 1, 1]): - """Applies scaling (can flip if negative), rotation, and translations (in that order) to the mooring system positions - - Parameters - ---------- - trans : array, optional - how far to shift the whole mooring system in x and y directions [m]. The default is [0,0]. - rot : float, optional - how much to rotate the entire mooring system in the yaw direction [degrees]. The default is 0. - scale : array, optional - how much to scale the mooring system x and y dimensions by (relative) (NOT IMPLEMENTED). The default is [1,1] (unity). - - """ - - if len(scale) == 3: - scale = np.array(scale) - else: - raise ValueError("scale parameter must be of length 3") - - rotMat = rotationMatrix(0, 0, rot * np.pi / 180.0) - tVec = np.array([trans[0], trans[1], 0.0]) - - # little functions to transform r or r6 vectors in place - def transform3(X): - Xrot = np.matmul(rotMat, X * scale) - X = Xrot + tVec - return X - - def transform6(X): - Xrot = np.matmul(rotMat, X[:3] * scale) - # X = np.hstack([Xrot + tVec, X[3], X[4], X[5]+rot*np.pi/180.0]) # this line would be to also rotate the body, but that's double counting if we also rotate the fairlead positions - X = np.hstack([Xrot + tVec, X[3], X[4], X[5]]) - return X - - # update positions of all objects - for body in self.bodyList: - body.r6 = transform6(body.r6) - for point in self.pointList: - point.r = transform3(point.r) - for body in self.bodyList: - if point.number in body.attachedP: - i = body.attachedP.index(point.number) - rRel = body.rPointRel[i] # get relative location of point on body - body.rPointRel[i] = np.matmul(rotMat, rRel * scale) # apply rotation to relative location - - def getPositions(self, DOFtype="free", dXvals=[]): - """Returns a vector with the DOF values of objects in the System. DOFs can be of 'free' objects, - 'coupled' objects, or 'both'. - - Parameters - ---------- - DOFtype : string, optional - Specifies whether to consider 'free' DOFs, 'coupled' DOFs, or 'both'. The default is 'free'. - - dXvals : list or array, optional - If provided, a second vector filled with a value coresponding to each DOF type returned. - If dXvals is size 2, it contains the values for translational and rotational DOFs, respectively. - If dXvals is size 3, it expects the values for point DOFs, body translational DOFs, and body - rotational DOFs, respectively. - - Returns - ------- - X : array - The DOF values - bodies, then points. - - dX : array, if dXvals is provided - A vector with the corresponding dXvals value for each returned DOF value. - - """ - - if DOFtype == "free": - types = [0] - elif DOFtype == "coupled": - types = [-1] - elif DOFtype == "both": - types = [0, -1] - else: - raise ValueError("getPositions called with invalid DOFtype input. Must be free, coupled, or both") - - X = np.array([], dtype=np.float_) - if len(dXvals) > 0: - dX = [] - - # gather DOFs from bodies - for body in self.bodyList: - if body.type in types: - X = np.append(X, body.r6) - if len(dXvals) > 0: - dX += 3 * [dXvals[-2]] + 3 * [dXvals[-1]] - - # gather DOFs from points - for point in self.pointList: - if point.type in types: - X = np.append( - X, point.r[point.DOFs] - ) # note: only including active DOFs of the point (may be less than all 3) - if len(dXvals) > 0: - dX += point.nDOF * [dXvals[0]] - - if len(dXvals) > 0: - dX = np.array(dX, dtype=np.float_) - return X, dX - else: - return X - - def setPositions(self, X, DOFtype="free"): - """Sets the DOF values of some objects in the System - 'free' objects, - 'coupled' objects, or 'both'. - - Parameters - ---------- - X : array - A list or array containing the values of all relevant DOFs -- for bodies first, then for points. - If type is 'both', X provides the free DOFs followed by the coupled DOFs. - DOFtype : string, optional - Specifies whether to consider 'free' DOFs, 'coupled' DOFs, or 'both'. The default is 'free'. - - """ - - i = 0 # index used to split off input positions X for each free object - - # check to ensure len(X) matches nDOF, nCpldDOF or nDOF+nCpldDOF - nDOF, nCpldDOF = self.getDOFs() - if DOFtype == "free": - types = [0] - if len(X) != nDOF: - raise ValueError("Inconsistency between the vector of positions and the free DOFs") - elif DOFtype == "coupled": - types = [-1] - if len(X) != nCpldDOF: - raise ValueError("Inconsistency between the vector of positions and the coupled DOFs") - elif DOFtype == "both": - types = [0, -1] - if len(X) != nDOF + nCpldDOF: - raise ValueError("Inconsistency between the vector of positions and the free and coupled DOFs") - else: - raise ValueError("setPositions called with invalid DOFtype input. Must be free, coupled, or both") - - # update positions of bodies - for body in self.bodyList: - if body.type in types: - body.setPosition(X[i : i + 6]) - i += 6 - - # update position of Points - for point in self.pointList: - if point.type in types: - point.setPosition( - X[i : i + point.nDOF] - ) # note: only including active DOFs of the point (may be less than all 3) - i += point.nDOF - - def getForces(self, DOFtype="free", lines_only=False): - """Returns a vector with the net forces/moments along DOFs in the System. - DOFs can be of 'free' objects, 'coupled' objects, or 'both'. - - Parameters - ---------- - DOFtype : string, optional - Specifies whether to consider 'free' DOFs, 'coupled' DOFs, or 'both'. The default is 'free'. - lines_only : boolean, optional - An option for calculating forces from just the mooring lines or not. The default is False, - meaning forces will include weight, buoyancy, and any external loads assigned to bodies or points. - - Returns - ------- - f : array - The force values. - - """ - - nDOF, nCpldDOF = self.getDOFs() - - # initialize force array based on DOFtype specified - if DOFtype == "free": - types = [0] - f = np.zeros(nDOF) - elif DOFtype == "coupled": - types = [-1] - f = np.zeros(nCpldDOF) - elif DOFtype == "both": - types = [0, -1] - f = np.zeros(nDOF + nCpldDOF) - else: - raise ValueError("getForces called with invalid DOFtype input. Must be free, coupled, or both") - - i = 0 # index used in assigning outputs in output vector - - # gather net loads from bodies - for body in self.bodyList: - if body.type in types: - f[i : i + 6] = body.getForces(lines_only=lines_only) - i += 6 - - # gather net loads from points - for point in self.pointList: - if point.type in types: - f[i : i + point.nDOF] = point.getForces( - lines_only=lines_only - ) # note: only including active DOFs of the point (may be less than all 3) - i += point.nDOF - - return np.array(f) - - def getTensions(self): - """Returns a vector with the line end tensions for all lines in the system. - - Returns - ------- - T : array - The tension values for all line ends A then all line ends B [N]. - - """ - - n = len(self.lineList) - - T = np.zeros(n * 2) - - for i in range(n): - T[i] = self.lineList[i].TA - T[n + i] = self.lineList[i].TB - - return T - - def mooringEq(self, X, DOFtype="free", lines_only=False, tol=0.001, profiles=0): - """Error function used in solving static equilibrium by calculating the forces on free objects - - Parameters - ---------- - X : array - A list or array containing the values of all relevant DOFs -- for bodies first, then for points. - If type is 'both', X provides the free DOFs followed by the coupled DOFs. - DOFtype : string, optional - Specifies whether to consider 'free' DOFs, 'coupled' DOFs, or 'both'. The default is 'free'. - tol : float, optional - Tolerance to use in catenary calculations [m]. - - Returns - ------- - f : array - The forces (and moments) on all applicable DOFs in the system. f is the same size as X. - - """ - - if self.display > 3: - print(f" mooringEq X={X}") - - # update DOFs - self.setPositions(X, DOFtype=DOFtype) - - # solve profile and forces of all lines - for line in self.lineList: - line.staticSolve(tol=tol, profiles=profiles) - - # get reactions in DOFs - f = self.getForces(DOFtype=DOFtype, lines_only=lines_only) - - if self.display > 3: - print(f" mooringEq f={f}") - - return f - - """ - def solveEquilibrium(self, DOFtype="free", plots=0, rmsTol=10, maxIter=200): - '''Solves for the static equilibrium of the system using the stiffness matrix, while updating positions of all free objects. - - Parameters - ---------- - DOFtype : string, optional - Specifies whether to consider 'free' DOFs, 'coupled' DOFs, or 'both'. The default is 'free'. - plots : int, optional - Determines whether to plot the equilibrium process or not. The default is 0. - rmsTol : float, optional - The maximum RMS tolerance that the calculated forces and moments should be from 0. The default is 10 (units of N and/or N-m). - maxIter : int, optional - The maximum number of interations to try to solve for equilibrium. The default is 200. - - Raises - ------ - SolveError - If the system fails to solve for equilirbium in the given tolerance and iteration number - - Returns - ------- - None. - - - NOTE: this does not do anything intelligent with catenary tolerances. - - ''' - - # Note: this approach appears to be reliable since it has some safeguards. - - # TO DO: make an option so these functions can find equilibrium of free AND coupled objects <<<< - - # fill in some arrays for each DOF - ''' - X0 = [] # vector of current DOFs - db = [] # step size bound - - for body in self.bodyList: - if body.type==0: - X0 += [*Body.r6 ] # add free Body position and orientation to vector - db += [ 5, 5, 5, 0.3,0.3,0.3] # put a strict bound on how quickly rotations can occur - - for point in self.pointList: - if point.type==0: - X0 += [*Point.r ] # add free Point position to vector - db += [ 5., 5., 5.] # specify maximum step size for point positions - - X0 = np.array(X0, dtype=np.float_) - db = np.array(db, dtype=np.float_) - ''' - X0, db = self.getPositions(DOFtype=DOFtype, dXvals=[5.0, 0.3]) - - n = len(X0) - - # clear some arrays to log iteration progress - self.freeDOFs.clear() # clear stored list of positions, so it can be refilled for this solve process - self.Xs = [] # for storing iterations from callback fn - self.Fs = [] - - - if self.display > 1: - print(f" solveEquilibrium called for {n} DOFs (DOFtype={DOFtype})") - - # do the main iteration, using Newton's method to find the zeros of the system's net force/moment functions - for iter in range(maxIter): - #print('X0 is', X0) - - # first get net force vector from current position - F0 = self.mooringEq(X0, DOFtype=DOFtype) - - # if there are no DOFs to solve equilibrium, exit (doing this after calling mooringEq so that lines are solved) - if n == 0: - if self.display > 1: - print(f' 0 DOFs to equilibrate so exiting') - break - - if self.display > 1: - print(f' i{iter}, X0 {X0}, F0 {F0}') - - # log current position and resulting force (note: this may need updating based on DOFtype - self.freeDOFs.append(X0) - self.Xs.append(X0) - self.Fs.append(F0) - - # check for equilibrium, and finish if condition is met - rmse = np.linalg.norm(F0) # root mean square of all force/moment errors - if np.linalg.norm(F0) < rmsTol: - #print("Equilibrium solution completed after "+str(iter)+" iterations with RMS error of "+str(rmse)) - break - elif iter==maxIter-1: - - if self.display > 1: - print("Failed to find equilibrium after "+str(iter)+" iterations, with RMS error of "+str(rmse)) - - - if self.display > 2: - for i in range(iter+1): - print(f" i={i}, RMSE={np.linalg.norm(self.Fs[i]):6.2e}, X={self.Xs[i]}") - - K = self.getSystemStiffness(DOFtype=DOFtype) - - print("===========================") - print("current system stiffness:") - print(K) - - print("\n Current force ") - print(F0) - - - raise SolveError(f"solveEquilibrium failed to find equilibrium after {iter} iterations, with RMS error of {rmse}") - - # get stiffness matrix - K = self.getSystemStiffness(DOFtype=DOFtype) - - - # adjust positions according to stiffness matrix to move toward net zero forces (but only a fraction of the way!) - dX = np.matmul(np.linalg.inv(K), F0) # calculate position adjustment according to Newton's method - - # >>> TODO: handle singular matrix error <<< - - #dXd= np.zeros(len(F0)) # a diagonal-only approach in each DOF in isolation - - - for i in range(n): # but limit adjustment to keep things under control - - #dX[i] = 0.5*dX[i] + 0.5*F0[i]/K[i,i] # alternative approach using diagonal stiffness only - - if dX[i] > db[i]: - dX[i] = db[i] - elif dX[i] < -db[i]: - dX[i] = -db[i] - - #if iter == 6: - # breakpoint() - - X0 = X0 + 1.0*dX - #print(X0) - #print(self.mooringEq(X0)) - # features to add: - # - reduce catenary error tolerance in proportion to how close we are to the solution - # - also adapt stiffness solver perturbation size as we approach the solution - - - - if self.display > 1: - print(F0) - - # show an animation of the equilibrium solve if applicable - if plots > 0: - self.animateSolution() - """ - - def solveEquilibrium3( - self, - DOFtype="free", - plots=0, - tol=0.05, - rmsTol=0.0, - maxIter=500, - display=0, - no_fail=False, - finite_difference=False, - ): - self.solveEquilibrium( - DOFtype=DOFtype, - plots=plots, - tol=tol, - rmsTol=rmsTol, - maxIter=maxIter, - display=display, - no_fail=no_fail, - finite_difference=finite_difference, - ) - - def solveEquilibrium( - self, - DOFtype="free", - plots=0, - tol=0.05, - rmsTol=0.0, - maxIter=500, - display=0, - no_fail=False, - finite_difference=False, - ): - """Solves for the static equilibrium of the system using the dsolve function approach in MoorSolve - - Parameters - ---------- - - DOFtype : string, optional - Specifies whether to consider 'free' DOFs, 'coupled' DOFs, or 'both'. The default is 'free'. - plots : int, optional - Determines whether to plot the equilibrium process or not. The default is 0. - tol : float, optional - The absolute tolerance on positions when calculating equilibriumk [m] - maxIter : int, optional - The maximum number of interations to try to solve for equilibrium. The default is 200. - no_fail : bool - False raises an error if convergence fails. True doesn't. - finite_difference : bool - False uses the analytical methods for system stiffness, true uses original finite difference methods. - - Raises - ------ - SolveError - If the system fails to solve for equilibrium in the given tolerance and iteration number - - Returns - ------- - success : bool - True/False whether converged to within tolerance. - - """ - - self.DOFtype_solve_for = DOFtype - # create arrays for the initial positions of the objects that need to find equilibrium, and the max step sizes - X0, db = self.getPositions(DOFtype=DOFtype, dXvals=[30, 0.02]) - - # temporary for backwards compatibility <<<<<<<<<< - """ - if rmsTol != 0.0: - tols = np.zeros(len(X0)) + rmsTol - print("WHAT IS PASSING rmsTol in to solveEquilibrium?") - breakpoint() - elif np.isscalar(tol): - if tol < 0: - tols = -tol*db # tolerances set relative to max step size - lineTol = 0.05*tols[0] # hard coding a tolerance for catenary calcs <<<<<<<<<<< - else: - tols = 1.0*tol # normal case, passing dsovle(2) a scalar for tol - else: - tols = np.array(tol) # assuming tolerances are passed in for each free variable - """ - - # store z indices for later seabed contact handling, and create vector of tolerances - zInds = [] - tols = [] - i = 0 # index to go through system DOF vector - if DOFtype == "free": - types = [0] - elif DOFtype == "coupled": - types = [-1] - elif DOFtype == "both": - types = [0, -1] - - for body in self.bodyList: - if body.type in types: - zInds.append(i + 2) - i += 6 - rtol = tol / max( - [np.linalg.norm(rpr) for rpr in body.rPointRel] - ) # estimate appropriate body rotational tolerance based on attachment point radii - tols += 3 * [tol] + 3 * [rtol] - - for point in self.pointList: - if point.type in types: - if 2 in point.DOFs: - zInds.append(i + point.DOFs.index(2)) # may need to check this bit <<<< - i += point.nDOF # note: only including active DOFs of the point (z may not be one of them) - - tols += point.nDOF * [tol] - - tols = np.array(tols) - lineTol = 0.01 * tol - n = len(X0) - - # if there are no DOFs, just update the mooring system force calculations then exit - if n == 0: - self.mooringEq(X0, DOFtype=DOFtype, tol=lineTol, profiles=1) - if display > 0: - print("There are no DOFs so solveEquilibrium is returning without adjustment.") - return True - - # clear some arrays to log iteration progress - self.freeDOFs.clear() # clear stored list of positions, so it can be refilled for this solve process - self.Xs = [] # for storing iterations from callback fn - self.Es = [] - - def eval_func_equil(X, args): - Y = self.mooringEq(X, DOFtype=DOFtype, tol=lineTol) - oths = dict(status=1) # other outputs - returned as dict for easy use - - self.Xs.append(X) # temporary - self.Es.append(Y) - - return Y, oths, False - - def step_func_equil(X, args, Y, oths, Ytarget, err, tol_, iter, maxIter): - # get stiffness matrix - if finite_difference: - K = self.getSystemStiffness(DOFtype=DOFtype) - else: - K = self.getSystemStiffnessA(DOFtype=DOFtype) - - # adjust positions according to stiffness matrix to move toward net zero forces - - # else: # Normal case where all DOFs are adjusted - try: # try the normal solve first to avoid calculating the determinant every time - if n > 20: # if huge, count on the system being sparse and use a sparse solver - # with warnings.catch_warnings(): - # warnings.simplefilter("error", category=MatrixRankWarning) - Kcsr = csr_matrix(K) - dX = spsolve(Kcsr, Y) - else: - dX = np.linalg.solve(K, Y) # calculate position adjustment according to Newton's method - except: - if np.linalg.det(K) == 0.0: # if the stiffness matrix is singular, we will modify the approach - # first try ignoring any DOFs with zero stiffness - indices = list(range(n)) # list of DOF indices that will remain active for this step - mask = [True] * n # this is a mask to be applied to the array K indices - - for i in range(n - 1, -1, -1): # go through DOFs and flag any with zero stiffness for exclusion - if K[i, i] == 0: - mask[i] = False - del indices[i] - - K_select = K[mask, :][:, mask] - Y_select = Y[mask] - - dX = np.zeros(n) - - if np.linalg.det(K_select) == 0.0: - dX_select = Y_select / np.diag( - K_select - ) # last-ditch attempt to get a step despite matrix singularity - else: - dX_select = np.linalg.solve(K_select, Y_select) - dX[indices] = dX_select # assign active step DOFs, other DOFs will be zero - - else: - raise Exception("why did it fail even though det isn't zero?") - - # but limit adjustment magnitude (still preserve direction) to keep things under control - overratio = np.max(np.abs(dX) / db) - if overratio > 1.0: - dX = dX / overratio - """ - for i in range(n): - if dX[i] > db[i]: - dX[i] = db[i] - elif dX[i] < -db[i]: - dX[i] = -db[i] - """ - - # avoid oscillations about the seabed - for i in zInds: - if X[i] + dX[i] <= -self.depth or (X[i] <= -self.depth and Y[i] <= 0.0): - dX[i] = -self.depth - X[i] - - # if iter > 100: - # print(iter) - # breakpoint() - - return dX - - # Call dsolve function - # X, Y, info = msolve.dsolve(eval_func_equil, X0, step_func=step_func_equil, tol=tol, maxIter=maxIter) - # try: - X, Y, info = dsolve2( - eval_func_equil, - X0, - step_func=step_func_equil, - tol=tols, - a_max=1.4, - maxIter=maxIter, - display=display, - dodamping=True, - ) # <<<< - # except Exception as e: - # raise MoorPyError(e) - # Don't need to call Ytarget in dsolve because it's already set to be zeros - - if display > 1: - print(X) - print(Y) - - self.Xs2 = info["Xs"] # List of positions as it finds equilibrium for every iteration - self.Es2 = info[ - "Es" - ] # List of errors that the forces are away from 0, which in this case, is the same as the forces - - # Update equilibrium position at converged X values - F = self.mooringEq(X, DOFtype=DOFtype, tol=lineTol, profiles=1) - - # Print statements if it ever reaches the maximum number of iterations - if info["iter"] == maxIter - 1: - if display > 1: - if finite_difference: - K = self.getSystemStiffness(DOFtype=DOFtype) - else: - K = self.getSystemStiffnessA(DOFtype=DOFtype) - - print("solveEquilibrium did not converge!") - print(f"current system stiffness: {K}") - print(f"\n Current force {F}") - - # plot the convergence failure - self.plotEQsolve(iter=info["iter"] + 1) - - # breakpoint() - - if no_fail: - return False - else: - raise SolveError( - f"solveEquilibrium failed to find equilibrium after {info['iter']} iterations, with residual forces of {F}" - ) - - # show an animation of the equilibrium solve if applicable - if plots > 0: - self.animateSolution() - - return True - - def plotEQsolve(self, iter=-1): - """Plots trajectories of solving equilibrium from solveEquilibrium.""" - - n = self.Xs2.shape[1] - - if n < 8: - fig, ax = plt.subplots(2 * n, 1, sharex=True) - for i in range(n): - ax[i].plot(self.Xs2[:iter, i]) - ax[n + i].plot(self.Es2[:iter, i]) - ax[-1].set_xlabel("iteration") - else: - fig, ax = plt.subplots(n, 2, sharex=True) - for i in range(n): - ax[i, 0].plot(self.Xs2[:iter, i]) - ax[i, 1].plot(self.Es2[:iter, i]) - ax[-1, 0].set_xlabel("iteration, X") - ax[-1, 1].set_xlabel("iteration, Error") - plt.show() - - def getSystemStiffness(self, DOFtype="free", dx=0.1, dth=0.1, solveOption=1, lines_only=False, plots=0): - """Calculates the stiffness matrix for all selected degrees of freedom of a mooring system - whether free, coupled, or both (other DOFs are considered fixed). - - Parameters - ---------- - - DOFtype : string, optional - Specifies whether to consider 'free' DOFs, 'coupled' DOFs, or 'both'. The default is 'free'. - dx : float, optional - The change in displacement to be used for calculating the change in force. The default is 0.1. - dth : float, optional - The change in rotation to be used for calculating the change in force. The default is 0.1. - solveOption : boolean, optional - Indicator of which solve option to use. The default is 1. - plots : boolean, optional - Determines whether the stiffness calculation process is plotted and/or animated or not. The default is 0. - - Raises - ------ - ValueError - If the solveOption is not a 1 or 0 - - Returns - ------- - K : matrix - nDOF x nDOF stiffness matrix of the system - - """ - - if not DOFtype in ["free", "coupled", "both"]: - raise ValueError("setPositions called with invalid DOFtype input. Must be free, coupled, or both") - - if self.display > 2: - print("Getting mooring system stiffness matrix...") - - lineTol = 0.05 * dx # manually specify an adaptive catenary solve tolerance <<<< - - # ------------------ get the positions to linearize about ----------------------- - - X1, dX = self.getPositions(DOFtype=DOFtype, dXvals=[dx, dth]) - - n = len(X1) - - # F1 = self.getForces(DOFtype=DOFtype) # get mooring forces/moments about linearization point - F1 = self.mooringEq( - X1, DOFtype=DOFtype, lines_only=lines_only, tol=lineTol - ) # get mooring forces/moments about linearization point (call this ensures point forces reflect current reported positions (even if on seabed) - - K = np.zeros([n, n]) # allocate stiffness matrix - - if plots > 0: - self.freeDOFs.clear() # clear the positions history to refill if animating this process <<<< needs updating for DOFtype - - # ------------------------- perform linearization -------------------------------- - - if solveOption == 0: # ::: forward difference approach ::: - for i in range(n): # loop through each DOF - X2 = np.array(X1, dtype=np.float_) - X2[i] += dX[i] # perturb positions by dx in each DOF in turn - F2p = self.mooringEq( - X2, DOFtype=DOFtype, lines_only=lines_only, tol=lineTol - ) # system net force/moment vector from positive perturbation - - if self.display > 2: - print(F2p) - if plots > 0: - self.freeDOFs.append(X2) - - K[:, i] = -(F2p - F1) / dX[i] # take finite difference of force w.r.t perturbation - - elif solveOption == 1: # ::: adaptive central difference approach ::: - nTries = 3 # number of refinements to allow -1 - - for i in range(n): # loop through each DOF - dXi = 1.0 * dX[i] - - # potentially iterate with smaller step sizes if we're at a taut-slack transition (but don't get too small, or else numerical errors) - for j in range(nTries): - if self.display > 2: - print(" ") - X2 = np.array(X1, dtype=np.float_) - X2[i] += dXi # perturb positions by dx in each DOF in turn - F2p = self.mooringEq( - X2, DOFtype=DOFtype, lines_only=lines_only, tol=lineTol - ) # system net force/moment vector from positive perturbation - if self.display > 2: - printVec(self.pointList[0].r) - printVec(self.lineList[0].rB) - if plots > 0: - self.freeDOFs.append(X2.copy()) - - X2[i] -= 2.0 * dXi - F2m = self.mooringEq( - X2, DOFtype=DOFtype, lines_only=lines_only, tol=lineTol - ) # system net force/moment vector from negative perturbation - if self.display > 2: - printVec(self.pointList[0].r) - printVec(self.lineList[0].rB) - if plots > 0: - self.freeDOFs.append(X2.copy()) - - if self.display > 2: - print( - f"i={i}, j={j} and dXi={dXi}. F2m, F1, and F2p are {F2m[i]:6.2f} {F1[i]:6.2f} {F2p[i]:6.2f}" - ) - printVec(F2p - F1) - printVec(F1 - F2m) - printVec(F2m) - printVec(F1) - printVec(F2p) - - # Break if the force is zero or the change in the first derivative is small - if abs(F1[i]) == 0 or abs(F2m[i] - 2.0 * F1[i] + F2p[i]) < 0.1 * np.abs( - F1[i] - ): # note: the 0.1 is the adjustable tolerance - break - elif j == nTries - 1: - if self.display > 2: - print("giving up on refinement") - else: - # Otherwise, we're at a tricky point and should stay in the loop to keep narrowing the step size - # until the derivatives agree better. Decrease the step size by 10X. - dXi = 0.1 * dXi - - K[:, i] = -0.5 * (F2p - F2m) / dXi # take finite difference of force w.r.t perturbation - - else: - raise ValueError("getSystemStiffness was called with an invalid solveOption (only 0 and 1 are supported)") - - # ----------------- restore the system back to previous positions ------------------ - self.setPositions(X1, DOFtype=DOFtype) - - # show an animation of the stiffness perturbations if applicable - if plots > 0: - self.animateSolution() - - return K - - def getCoupledStiffness(self, dx=0.1, dth=0.1, solveOption=1, lines_only=False, tensions=False, nTries=3, plots=0): - """Calculates the stiffness matrix for coupled degrees of freedom of a mooring system - with free uncoupled degrees of freedom equilibrated. - - Parameters - ---------- - dx : float, optional - The change in displacement to be used for calculating the change in force. The default is 0.1. - dth : float, optional - The change in rotation to be used for calculating the change in force. The default is 0.1. - solveOption : boolean, optional - Indicator of which solve option to use. The default is 1. - plots : boolean, optional - Determines whether the stiffness calculation process is plotted and/or animated or not. The default is 0. - lines_only : boolean - Whether to consider only line forces and ignore body/point properties. - tensions : boolean - Whether to also compute and return mooring line tension jacobians - - Raises - ------ - ValueError - If the solveOption is not a 1 or 0 - - Returns - ------- - K : matrix - nCpldDOF x nCpldDOF stiffness matrix of the system - - """ - self.nDOF, self.nCpldDOF = self.getDOFs() - - if self.display > 2: - print("Getting mooring system stiffness matrix...") - - lineTol = 0.05 * dx # manually specify an adaptive catenary solve tolerance <<<< - eqTol = 0.05 * dx # manually specify an adaptive tolerance for when calling solveEquilibrium - - # ------------------ get the positions to linearize about ----------------------- - - # get the positions about which the system is linearized, and an array containting - # the perturbation size in each coupled DOF of the system - X1, dX = self.getPositions(DOFtype="coupled", dXvals=[dx, dth]) - - self.solveEquilibrium(tol=eqTol) # let the system settle into equilibrium - - F1 = self.getForces( - DOFtype="coupled", lines_only=lines_only - ) # get mooring forces/moments about linearization point - K = np.zeros([self.nCpldDOF, self.nCpldDOF]) # allocate stiffness matrix - - if tensions: - T1 = self.getTensions() - J = np.zeros([len(T1), self.nCpldDOF]) # allocate Jacobian of tensions w.r.t. coupled DOFs - - if plots > 0: - self.cpldDOFs.clear() # clear the positions history to refill if animating this process - - # ------------------------- perform linearization -------------------------------- - - if solveOption == 0: # ::: forward difference approach ::: - for i in range(self.nCpldDOF): # loop through each DOF - X2 = np.array(X1, dtype=np.float_) - X2[i] += dX[i] # perturb positions by dx in each DOF in turn - self.setPositions(X2, DOFtype="coupled") # set the perturbed coupled DOFs - self.solveEquilibrium() # let the system settle into equilibrium - F2p = self.getForces( - DOFtype="coupled", lines_only=lines_only - ) # get resulting coupled DOF net force/moment response - if tensions: - T2p = self.getTensions() - - if self.display > 2: - print(F2p) - if plots > 0: - self.cpldDOFs.append(X2) - - K[:, i] = -(F2p - F1) / dX[i] # take finite difference of force w.r.t perturbation - if tensions: - J[:, i] = (T2p - T1) / dX[i] - - elif solveOption == 1: # ::: adaptive central difference approach ::: - # nTries = 1 # number of refinements to allow -1 - - for i in range(self.nCpldDOF): # loop through each DOF - dXi = 1.0 * dX[i] - # print(f'__________ nCpldDOF = {i+1} __________') - # potentially iterate with smaller step sizes if we're at a taut-slack transition (but don't get too small, or else numerical errors) - for j in range(nTries): - # print(f'-------- nTries = {j+1} --------') - X2 = np.array(X1, dtype=np.float_) - X2[i] += dXi # perturb positions by dx in each DOF in turn - self.setPositions(X2, DOFtype="coupled") # set the perturbed coupled DOFs - # print(f'solving equilibrium {i+1}+_{self.nCpldDOF}') - self.solveEquilibrium(tol=eqTol) # let the system settle into equilibrium - F2p = self.getForces( - DOFtype="coupled", lines_only=lines_only - ) # get resulting coupled DOF net force/moment response - if tensions: - T2p = self.getTensions() - - if plots > 0: - self.cpldDOFs.append(X2.copy()) - - X2[i] -= 2.0 * dXi # now perturb from original to -dx - self.setPositions(X2, DOFtype="coupled") # set the perturbed coupled DOFs - # print(f'solving equilibrium {i+1}-_{self.nCpldDOF}') - self.solveEquilibrium(tol=eqTol) # let the system settle into equilibrium - F2m = self.getForces( - DOFtype="coupled", lines_only=lines_only - ) # get resulting coupled DOF net force/moment response - if tensions: - T2m = self.getTensions() - - if plots > 0: - self.cpldDOFs.append(X2.copy()) - - if j == 0: - F2pi = F2p - F2mi = F2m - - if self.display > 2: - print( - f"j = {j} and dXi = {dXi}. F2m, F1, and F2p are {F2m[i]:6.2f} {F1[i]:6.2f} {F2p[i]:6.2f}" - ) - print(abs(F2m[i] - 2.0 * F1[i] + F2p[i])) - # print(0.1*np.abs(F1[i])) - print(0.1 * np.abs(F2pi[i] - F2mi[i])) - print(abs(F1[i]) < 1) - # print(abs(F2m[i]-2.0*F1[i]+F2p[i]) < 0.1*np.abs(F1[i])) - print(abs(F2m[i] - 2.0 * F1[i] + F2p[i]) < 0.1 * np.abs(F2pi[i] - F2mi[i])) - - # Break if the force is zero or the change in the first derivative is small - # if abs(F1[i]) < 1 or abs(F2m[i]-2.0*F1[i]+F2p[i]) < 0.1*np.abs(F1[i]): # note: the 0.1 is the adjustable tolerance - if abs(F1[i]) < 1 or abs(F2m[i] - 2.0 * F1[i] + F2p[i]) < 0.1 * np.abs( - F2pi[i] - F2mi[i] - ): # note: the 0.1 is the adjustable tolerance - break - elif j == nTries - 1: - if self.display > 2: - print("giving up on refinement") - else: - # Otherwise, we're at a tricky point and should stay in the loop to keep narrowing the step size - # untill the derivatives agree better. Decrease the step size by 10X. - dXi = 0.1 * dXi - - K[:, i] = -0.5 * (F2p - F2m) / dXi # take finite difference of force w.r.t perturbation - if tensions: - J[:, i] = 0.5 * (T2p - T2m) / dX[i] - - else: - raise ValueError("getSystemStiffness was called with an invalid solveOption (only 0 and 1 are supported)") - - # ----------------- restore the system back to previous positions ------------------ - self.mooringEq(X1, DOFtype="coupled", tol=lineTol) - self.solveEquilibrium(tol=eqTol) - - # show an animation of the stiffness perturbations if applicable - if plots > 0: - self.animateSolution() - - if tensions: - return K, J - else: - return K - - def getSystemStiffnessA(self, DOFtype="free", lines_only=False, rho=1025, g=9.81): - """A method to calculate the system's stiffness matrix based entirely on analytic gradients from catenary - - Parameters - ---------- - DOFtype : string, optional - specifies whether to consider 'free' DOFs, 'coupled' DOFs, or 'both'. The default is "free". - hydro : bool, optional <<<<< replaced this with lines_only for now for consistency with others. Could reconsider (for all functions) - specifies whether to include hydrostatic stiffness components of bodies. The default is 0 (to not include). - rho : float, optional - DESCRIPTION. The default is 1025. - g : float, optional - DESCRIPTION. The default is 9.81. - - Raises - ------ - ValueError - Raised if an invalid DOFtype is used. - - Returns - ------- - K : matrix - complete analytic stiffness matrix of the system for the specified DOFs. - - """ - - # note: This is missing some pieces, and needs to check more. - # So far this seems to not capture yaw stiffness for non-bridle configs... - # it would require proper use of chain rule for the derivatives - - # find the total number of free and coupled DOFs in case any object types changed - self.nDOF, self.nCpldDOF = self.getDOFs() - - # self.solveEquilibrium() # should we make sure the system is in equilibrium? - - # allocate stiffness matrix according to the DOFtype specified - if DOFtype == "free": - K = np.zeros([self.nDOF, self.nDOF]) - d = [0] - elif DOFtype == "coupled": - K = np.zeros([self.nCpldDOF, self.nCpldDOF]) - d = [-1] - elif DOFtype == "both": - K = np.zeros([self.nDOF + self.nCpldDOF, self.nDOF + self.nCpldDOF]) - d = [0, -1] - else: - raise ValueError("getSystemStiffnessA called with invalid DOFtype input. Must be free, coupled, or both") - - # The following will go through and get the lower-triangular stiffness terms, - # calculated as the force/moment on Body/Point 2 from translation/rotation of Body/Point 1. - - # go through DOFs, looking for lines that couple to anchors or other DOFs - - i = 0 # start counting number of DOFs at zero - - # go through each movable body in the system - for body1 in self.bodyList: - if ( - body1.type in d - ): # >>>> when DOFtype==both, this approach gives different indexing than what is in setPositions/getForces and getSystemStiffness <<<<< - # i = (body1.number-1)*6 # start counting index for body DOFs based on body number to keep indexing consistent - - # get body's self-stiffness matrix (now only cross-coupling terms will be handled on a line-by-line basis) - K6 = body1.getStiffnessA(lines_only=lines_only) - K[i : i + 6, i : i + 6] += K6 - - # go through each attached point - for pointID1, rPointRel1 in zip(body1.attachedP, body1.rPointRel): - point1 = self.pointList[pointID1 - 1] - - r1 = rotatePosition( - rPointRel1, body1.r6[3:] - ) # relative position of Point about body ref point in unrotated reference frame - H1 = getH(r1) # produce alternator matrix of current point's relative position to current body - - for ( - lineID - ) in ( - point1.attached - ): # go through each attached line to the Point, looking for when its other end is attached to something that moves - endFound = 0 # simple flag to indicate when the other end's attachment has been found - j = ( - i + 6 - ) # first index of the DOFs this line is attached to. Start it off at the next spot after body1's DOFs - - # get cross-coupling stiffness of line: force on end attached to body1 due to motion of other end - if point1.attachedEndB == 1: - KB = self.lineList[lineID - 1].KAB - else: - KB = self.lineList[lineID - 1].KAB.T - """ - KA, KB = self.lineList[lineID-1].getStiffnessMatrix() - # flip sign for coupling - if point1.attachedEndB == 1: # assuming convention of end A is attached to the first point, so if not, - KB = -KA # swap matrices of ends A and B - else: - KB = -KB - """ - # look through Bodies further on in the list (coupling with earlier Bodies will already have been taken care of) - for body2 in self.bodyList[self.bodyList.index(body1) + 1 :]: - if body2.type in d: - # go through each attached Point - for pointID2, rPointRel2 in zip(body2.attachedP, body2.rPointRel): - point2 = self.pointList[pointID2 - 1] - - if ( - lineID in point2.attached - ): # if the line is also attached to this Point2 in Body2 - # following are analagous to what's in functions getH and translateMatrix3to6 except for cross coupling between two bodies - r2 = rotatePosition( - rPointRel2, body2.r6[3:] - ) # relative position of Point about body ref point in unrotated reference frame - H2 = getH(r2) - - # loads on body1 due to motions of body2 - K66 = np.block( - [ - [KB, np.matmul(KB, H1)], - [np.matmul(H2.T, KB), np.matmul(np.matmul(H2, KB), H1.T)], - ] - ) - - K[i : i + 6, j : j + 6] += K66 - K[j : j + 6, i : i + 6] += K66.T # mirror - - # note: the additional rotational stiffness due to change in moment arm does not apply to this cross-coupling case - - endFound = 1 # signal that the line has been handled so we can move on to the next thing - break - - j += 6 # if this body has DOFs we're considering, then count them - - # look through free Points - if endFound == 0: # if the end of this line hasn't already been found attached to a body - for point2 in self.pointList: - if point2.type in d: # if it's a free point and - if lineID in point2.attached: # the line is also attached to it - # only add up one off-diagonal sub-matrix for now, then we'll mirror at the end - # K[i :i+3, j:j+3] += K3 - # K[i+3:i+6, j:j+3] += np.matmul(H1.T, K3) - K63 = np.vstack([KB, np.matmul(H1.T, KB)]) - K63 = K63[ - :, point2.DOFs - ] # trim the matrix to only use the enabled DOFs of each point - - K[i : i + 6, j : j + point2.nDOF] += K63 - K[j : j + point2.nDOF, i : i + 6] += K63.T # mirror - - break - - j += point2.nDOF # if this point has DOFs we're considering, then count them - - # note: No cross-coupling with fixed points. The body's own stiffness matrix is now calculated at the start. - - i += 6 # moving along to the next body... - - # go through each movable point in the system - for point in self.pointList: - if point.type in d: - n = point.nDOF - - # >>> TODO: handle case of free end point resting on seabed <<< - - # get point's self-stiffness matrix - K1 = point.getStiffnessA(lines_only=lines_only) - K[i : i + n, i : i + n] += K1 - - # go through attached lines and add cross-coupling terms - for lineID in point.attached: - j = i + n - - # go through movable points to see if one is attached - for point2 in self.pointList[self.pointList.index(point) + 1 :]: - if point2.type in d: - if lineID in point2.attached: # if this point is at the other end of the line - """ - KA, KB = self.lineList[lineID-1].getStiffnessMatrix() # get full 3x3 stiffness matrix of the line that attaches them - # flip sign for coupling - if point.attachedEndB == 1: # assuming convention of end A is attached to the first point, so if not, - KB = -KA # swap matrices of ends A and B - else: - KB = -KB - """ - # get cross-coupling stiffness of line: force on end attached to point1 due to motion of other end - if point.attachedEndB == 1: - KB = self.lineList[lineID - 1].KAB - else: - KB = self.lineList[lineID - 1].KAB.T - - KB = KB[point.DOFs, :][ - :, point2.DOFs - ] # trim the matrix to only use the enabled DOFs of each point - - K[i : i + n, j : j + point2.nDOF] += KB - K[j : j + point2.nDOF, i : i + n] += KB.T # mirror - - j += point2.nDOF # if this point has DOFs we're considering, then count them - - i += n - - return K - - def getAnchorLoads(self, sfx, sfy, sfz, N): - """Calculates anchor loads - Parameters - ---------- - sfx : float - Safety factor for forces in X direction - sfy : float - Safety factor for forces in Y direction - sfz : float - Safety factor for forces in Z direction - N : int - Number of timesteps to skip for transients - Returns - ------- - Array of maximum anchor loads in order of fixed points (tons) - - """ - anchorloads = [] - for point in self.pointList: - # Only calculate anchor load if point is fixed - if point.type == 1: - confz = self.data[N:, self.ch["CON" + str(point.number) + "FZ"]] / 1000 - confy = self.data[N:, self.ch["CON" + str(point.number) + "FY"]] / 1000 - confx = self.data[N:, self.ch["CON" + str(point.number) + "FZ"]] / 1000 - convec = np.linalg.norm([(confz * sfz), (confx * sfx), (confy * sfy)], axis=0) / 9.81 - anchorloads.append(max(convec)) - return anchorloads - - def ropeContact(self, lineNums, N): - """Determines whether Node 1 is off the ground for lines in lineNums - Parameters - ---------- - lineNums : list of integers - Line number to calculate rope contact for corresponds to MoorDyn file ***STARTS AT 1 - N : int - Number of timesteps to skip for transients - Returns - ------- - min_node1_z: list of floats - Minimum height of node 1 above seabed for lines in lineNums (m) - - """ - - # iterate through lines in line list.... would be nice to automatically iterate through lines that are attached to fixed points - min_node1_z = [] - for line in self.lineList: - if line.number in lineNums: - anchorzs = line.zp[N:, 1] + float(self.MDoptions["wtrdpth"]) # Does not work for bathymetries - min_node1_z.append(min(anchorzs)) - return min_node1_z - - def sagDistance(self, lineNums, N): - """Calculates sag distance for center node for each line in lineNums - Parameters - ---------- - lineNums : list of integers - Line number to calculate sag distance for corresponds to MoorDyn file ***STARTS AT 1 - N : int - Number of timesteps to skip for transients - Returns - ------- - minsagz: list of floats - Minimum distance below waterline for center node in order of lines in lineNums(m) - maxsagz: list of floats - Maximum distance below waterline for center node in order of lines in lineNums (m) - """ - maxsagz = [] - minsagz = [] - for line in self.lineList: - if line.number in lineNums: - sagz = -line.zp[N:, int(line.nNodes / 2)] # maybe add something to handle odd number of nodes - maxsagz.append(max(sagz)) - minsagz.append(min(sagz)) - return minsagz, maxsagz - - def checkTensions(self, N=None): - """Checks the line tensions and MBLs of a MoorPy system in its current state with the quasi-static model. - Returns: list of tension/MBL for each line. - Parameters - ---------- - N : int, only required if qs == 0 - Number of timesteps to skip for transients - """ - - # NOTE this function has very limited functionality because imported systems will not have line MBLs.... still thinking about the best way to handle this - if self.qs == 1: - ratios = [] - for line in self.lineList: - if hasattr(line.type, "MBL"): - ratios.append(max(line.TA, line.TB) / line.type["MBL"]) - else: - print("Line does not have an MBL") - return - return ratios - else: - ratios = [] - for line in self.lineList: - # Only works if tensions are in lineN.MD.out files - if hasattr(line, "Ten"): - if hasattr(line.type, "MBL"): - ratios.append(np.amax(line.Ten[N:, :]) / line.type["MBL"]) - else: - print("Line does not have an MBL") - return - else: - print("Line does not hold tension data") - return - return ratios - - def loadData(self, dirname, rootname, sep=".MD."): - """Loads time series data from main MoorDyn output file (for example driver.MD.out) - Parameters - ---------- - dirname: str - Directory name - rootname: str - MoorDyn output file rootname - sep: str - MoorDyn file name seperator - """ - - # Temporarily storing all data in main output file in system.data ..... probably will want to change this at some point - if path.exists(dirname + rootname + ".MD.out"): - self.data, self.ch, self.channels, self.units = read_mooring_file( - dirname + rootname + sep, "out" - ) # remember number starts on 1 rather than 0 - - def plot(self, ax=None, bounds="default", rbound=0, color=None, **kwargs): - """Plots the mooring system objects in their current positions - Parameters - ---------- - bounds : string, optional - signifier for the type of bounds desired in the plot. The default is "default". - ax : axes, optional - Plot on an existing set of axes - color : string, optional - Some way to control the color of the plot ... TBD <<< - hidebox : bool, optional - If true, hides the axes and box so just the plotted lines are visible. - rbound : float, optional - A bound to be placed on each axis of the plot. If 0, the bounds will be the max values on each axis. The default is 0. - title : string, optional - A title of the plot. The default is "". - linelabels : bool, optional - Adds line numbers to plot in text. Default is False. - pointlabels: bool, optional - Adds point numbers to plot in text. Default is False. - endpoints: bool, optional - Adds visible end points to lines. Default is False. - bathymetry: bool, optional - Creates a bathymetry map of the seabed based on an input file. Default is False. - - Returns - ------- - fig : figure object - To hold the axes of the plot - ax: axis object - To hold the points and drawing of the plot - - """ - - # kwargs that can be used for plot or plot2d - title = kwargs.get("title", "") # optional title for the plot - time = kwargs.get("time", 0) # the time in seconds of when you want to plot - linelabels = kwargs.get("linelabels", False) # toggle to include line number labels in the plot - pointlabels = kwargs.get("pointlabels", False) # toggle to include point number labels in the plot - draw_body = kwargs.get("draw_body", True) # toggle to draw the Bodies or not - draw_anchors = kwargs.get("draw_anchors", False) # toggle to draw the anchors of the mooring system or not - bathymetry = kwargs.get( - "bathymetry", False - ) # toggle (and string) to include bathymetry or not. Can do full map based on text file, or simple squares - cmap_bath = kwargs.get("cmap", "ocean") # matplotlib colormap specification - alpha = kwargs.get("opacity", 1.0) # the transparency of the bathymetry plot_surface - rang = kwargs.get( - "rang", "hold" - ) # colorbar range: if range not used, set it as a placeholder, it will get adjusted later - cbar_bath = kwargs.get("cbar_bath", False) # toggle to include a colorbar for a plot or not - colortension = kwargs.get( - "colortension", False - ) # toggle to draw the mooring lines in colors based on node tensions - cmap_tension = kwargs.get("cmap_tension", "rainbow") # the type of color spectrum desired for colortensions - cbar_tension = kwargs.get( - "cbar_tension", False - ) # toggle to include a colorbar of the tensions when colortension=True - figsize = kwargs.get("figsize", (6, 4)) # the dimensions of the figure to be plotted - # kwargs that are currently only used in plot - hidebox = kwargs.get("hidebox", False) # toggles whether to show the axes or not - endpoints = kwargs.get("endpoints", False) # toggle to include the line end points in the plot - waterplane = kwargs.get("waterplane", False) # option to plot water surface - shadow = kwargs.get("shadow", True) # toggle to draw the mooring line shadows or not - cbar_bath_size = kwargs.get( - "colorbar_size", 1.0 - ) # the scale of the colorbar. Not the same as aspect. Aspect adjusts proportions - # bound kwargs - xbounds = kwargs.get( - "xbounds", None - ) # the bounds of the x-axis. The midpoint of these bounds determines the origin point of orientation of the plot - ybounds = kwargs.get( - "ybounds", None - ) # the bounds of the y-axis. The midpoint of these bounds determines the origin point of orientation of the plot - zbounds = kwargs.get( - "zbounds", None - ) # the bounds of the z-axis. The midpoint of these bounds determines the origin point of orientation of the plot - - # sort out bounds - xs = [] - ys = [] - zs = [0, -self.depth] - - for point in self.pointList: - xs.append(point.r[0]) - ys.append(point.r[1]) - zs.append(point.r[2]) - - # if axes not passed in, make a new figure - if ax == None: - fig = plt.figure(figsize=figsize) - # fig = plt.figure(figsize=(20/2.54,12/2.54), dpi=300) - ax = plt.axes(projection="3d") - else: - fig = ax.get_figure() - - # set bounds - if rbound == 0: - if len(xs) > 0: - rbound = max([max(xs), max(ys), -min(xs), -min(ys)]) # this is the most extreme coordinate - else: - rbound = self.depth - - # set the DATA bounds on the axis - if bounds == "default": - ax.set_zlim([-self.depth, 0]) - elif bounds == "rbound": - ax.set_xlim([-rbound, rbound]) - ax.set_ylim([-rbound, rbound]) - ax.set_zlim([-rbound, rbound]) - elif bounds == "mooring": - ax.set_xlim([-rbound, 0]) - ax.set_ylim([-rbound / 2, rbound / 2]) - ax.set_zlim([-self.depth, 0]) - - # set the AXIS bounds on the axis (changing these bounds can change the perspective of the matplotlib figure) - if (np.array([xbounds, ybounds, zbounds]) != None).any(): - ax.autoscale(enable=False, axis="both") - if xbounds != None: - ax.set_xbound(xbounds[0], xbounds[1]) - if ybounds != None: - ax.set_ybound(ybounds[0], ybounds[1]) - if zbounds != None: - ax.set_zbound(zbounds[0], zbounds[1]) - - # draw things - if draw_body: - for body in self.bodyList: - body.draw(ax) - - for rod in self.rodList: - if len(self.rodList) == 0: # usually, there are no rods in the rodList - pass - else: - # if self.qs==0 and len(rod.Tdata) == 0: - # pass - if isinstance(rod, Line) and rod.show: - rod.drawLine(time, ax, color=color, shadow=shadow) - # if isinstance(rod, Point): # zero-length special case - # not plotting points for now - - if draw_anchors: - for line in self.lineList: - if line.zp[0, 0] == -self.depth: - itime = int(time / line.dt) - r = [line.xp[itime, 0], line.yp[itime, 0], line.zp[itime, 0]] - if color == None: - c = "tab:blue" - else: - c = color - plt.plot(r[0], r[1], r[2], "v", color=c, markersize=5) - - j = 0 - for line in self.lineList: - if self.qs == 0 and len(line.Tdata) == 0: - pass - else: - j = j + 1 - if color == None and "material" in line.type: - if "chain" in line.type["material"] or "Cadena80" in line.type["material"]: - line.drawLine( - time, - ax, - color=[0.1, 0, 0], - endpoints=endpoints, - shadow=shadow, - colortension=colortension, - cmap_tension=cmap_tension, - ) - elif ( - "rope" in line.type["material"] - or "polyester" in line.type["material"] - or "Dpoli169" in line.type["material"] - ): - line.drawLine( - time, - ax, - color=[0.3, 0.5, 0.5], - endpoints=endpoints, - shadow=shadow, - colortension=colortension, - cmap_tension=cmap_tension, - ) - elif "nylon" in line.type["material"]: - line.drawLine( - time, - ax, - color=[0.8, 0.8, 0.2], - endpoints=endpoints, - shadow=shadow, - colortension=colortension, - cmap_tension=cmap_tension, - ) - else: - line.drawLine( - time, - ax, - color=[0.5, 0.5, 0.5], - endpoints=endpoints, - shadow=shadow, - colortension=colortension, - cmap_tension=cmap_tension, - ) - else: - line.drawLine( - time, - ax, - color=color, - endpoints=endpoints, - shadow=shadow, - colortension=colortension, - cmap_tension=cmap_tension, - ) - - # Add line labels - if linelabels == True: - ax.text( - (line.rA[0] + line.rB[0]) / 2, (line.rA[1] + line.rB[1]) / 2, (line.rA[2] + line.rB[2]) / 2, j - ) - - if cbar_tension: - maxten = max([max(line.getLineTens()) for line in self.lineList]) # find the max tension in the System - minten = min([min(line.getLineTens()) for line in self.lineList]) # find the min tension in the System - bounds = range(int(minten), int(maxten), int((maxten - minten) / 256)) - norm = mpl.colors.BoundaryNorm( - bounds, 256 - ) # set the bounds in a norm object, with 256 being the length of all colorbar strings - fig.colorbar(cm.ScalarMappable(norm=norm, cmap=cmap_tension), label="Tension (N)") # add the colorbar - fig.tight_layout() - - # Add point labels - i = 0 - for point in self.pointList: - points = [] - i = i + 1 - if pointlabels == True: - ax.text(point.r[0], point.r[1], point.r[2], i, c="r") - - if bathymetry == True: # if bathymetry is true, then make squares at each anchor point - if point.attachedEndB[0] == 0 and point.r[2] < -400: - points.append([point.r[0] + 250, point.r[1] + 250, point.r[2]]) - points.append([point.r[0] + 250, point.r[1] - 250, point.r[2]]) - points.append([point.r[0] - 250, point.r[1] - 250, point.r[2]]) - points.append([point.r[0] - 250, point.r[1] + 250, point.r[2]]) - - Z = np.array(points) - verts = [[Z[0], Z[1], Z[2], Z[3]]] - ax.add_collection3d( - Poly3DCollection(verts, facecolors="limegreen", linewidths=1, edgecolors="g", alpha=alpha) - ) - - if isinstance(bathymetry, str): # or, if it's a string, load in the bathymetry file - # parse through the MoorDyn bathymetry file - bathGrid_Xs, bathGrid_Ys, bathGrid = self.readBathymetryFile(bathymetry) - if rang == "hold": - rang = (np.min(-bathGrid), np.max(-bathGrid)) - """ - # First method: plot nice 2D squares using Poly3DCollection - nX = len(bathGrid_Xs) - nY = len(bathGrid_Ys) - # store a list of points in the grid - Z = [[bathGrid_Xs[j],bathGrid_Ys[i],-bathGrid[i,j]] for i in range(nY) for j in range(nX)] - # plot every square in the grid (e.g. 16 point grid yields 9 squares) - verts = [] - for i in range(nY-1): - for j in range(nX-1): - verts.append([Z[j+nX*i],Z[(j+1)+nX*i],Z[(j+1)+nX*(i+1)],Z[j+nX*(i+1)]]) - ax.add_collection3d(Poly3DCollection(verts, facecolors='limegreen', linewidths=1, edgecolors='g', alpha=0.5)) - verts = [] - """ - # Second method: plot a 3D surface, plot_surface - X, Y = np.meshgrid(bathGrid_Xs, bathGrid_Ys) - - bath = ax.plot_surface(X, Y, -bathGrid, cmap=cmap_bath, vmin=rang[0], vmax=rang[1], alpha=alpha) - - if ( - cbar_bath_size != 1.0 - ): # make sure the colorbar is turned on just in case it isn't when the other colorbar inputs are used - cbar_bath = True - if cbar_bath: - fig.colorbar(bath, shrink=cbar_bath_size, label="depth (m)") - - # draw water surface if requested - if waterplane: - waterXs = np.array([min(xs), max(xs)]) - waterYs = np.array([min(ys), max(ys)]) - waterX, waterY = np.meshgrid(waterXs, waterYs) - ax.plot_surface(waterX, waterY, np.array([[-50, -50], [-50, -50]]), alpha=0.5) - - fig.suptitle(title) - - set_axes_equal(ax) - - ax.set_zticks([-self.depth, 0]) # set z ticks to just 0 and seabed - - if hidebox: - ax.axis("off") - - return fig, ax # return the figure and axis object in case it will be used later to update the plot - - def plot2d(self, Xuvec=[1, 0, 0], Yuvec=[0, 0, 1], ax=None, color=None, **kwargs): - """Makes a 2D plot of the mooring system objects in their current positions - - Parameters - ---------- - Xuvec : list, optional - plane at which the x-axis is desired. The default is [1,0,0]. - Yuvec : lsit, optional - plane at which the y-axis is desired. The default is [0,0,1]. - ax : axes, optional - Plot on an existing set of axes - color : string, optional - Some way to control the color of the plot ... TBD <<< - title : string, optional - A title of the plot. The default is "". - - Returns - ------- - fig : figure object - To hold the axes of the plot - ax: axis object - To hold the points and drawing of the plot - - """ - - # kwargs that can be used for plot or plot2d - title = kwargs.get("title", "") # optional title for the plot - time = kwargs.get("time", 0) # the time in seconds of when you want to plot - linelabels = kwargs.get("linelabels", False) # toggle to include line number labels in the plot - pointlabels = kwargs.get("pointlabels", False) # toggle to include point number labels in the plot - draw_body = kwargs.get("draw_body", False) # toggle to draw the Bodies or not - draw_anchors = kwargs.get("draw_anchors", False) # toggle to draw the anchors of the mooring system or not - bathymetry = kwargs.get( - "bathymetry", False - ) # toggle (and string) to include bathymetry contours or not based on text file - cmap_bath = kwargs.get("cmap_bath", "ocean") # matplotlib colormap specification - alpha = kwargs.get("opacity", 1.0) # the transparency of the bathymetry plot_surface - rang = kwargs.get( - "rang", "hold" - ) # colorbar range: if range not used, set it as a placeholder, it will get adjusted later - cbar_bath = kwargs.get("colorbar", False) # toggle to include a colorbar for a plot or not - colortension = kwargs.get( - "colortension", False - ) # toggle to draw the mooring lines in colors based on node tensions - cmap_tension = kwargs.get("cmap_tension", "rainbow") # the type of color spectrum desired for colortensions - cbar_tension = kwargs.get( - "cbar_tension", False - ) # toggle to include a colorbar of the tensions when colortension=True - figsize = kwargs.get("figsize", (6, 4)) # the dimensions of the figure to be plotted - # kwargs that are currently only used in plot2d - levels = kwargs.get("levels", 7) # the number (or array) of levels in the contour plot - cbar_bath_aspect = kwargs.get( - "cbar_bath_aspect", 20 - ) # the proportion of the colorbar. Default is 20 height x 1 width - cbar_bath_ticks = kwargs.get( - "cbar_bath_ticks", None - ) # the desired tick labels on the colorbar (can be an array) - plotnodes = kwargs.get("plotnodes", []) # the list of node numbers that are desired to be plotted - plotnodesline = kwargs.get( - "plotnodesline", [] - ) # the list of line numbers that match up with the desired node to be plotted - label = kwargs.get("label", "") # the label/marker name of a line in the System - draw_fairlead = kwargs.get("draw_fairlead", False) # toggle to draw large points for the fairleads - - # if axes not passed in, make a new figure - if ax == None: - fig, ax = plt.subplots(1, 1, figsize=figsize) - else: - fig = plt.gcf() # will this work like this? <<< - - if draw_body: - for body in self.bodyList: - # body.draw(ax) - r = body.r6[0:3] - x = r[Xuvec.index(1)] - y = r[Yuvec.index(1)] - plt.plot(x, y, "ko", markersize=5) - - for rod in self.rodList: - if isinstance(rod, Line): - rod.drawLine2d(time, ax, color=color, Xuvec=Xuvec, Yuvec=Yuvec) - - if draw_fairlead: - for line in self.lineList: - if line.number == 1: - itime = int(time / line.dt) - r = [line.xp[itime, -1], line.yp[itime, -1], line.zp[itime, -1]] - x = r[Xuvec.index(1)] - y = r[Yuvec.index(1)] - if color == None: - c = "tab:blue" - else: - c = color - plt.plot(x, y, "o", color=c, markersize=5) - - if draw_anchors: - for line in self.lineList: - if line.zp[0, 0] == -self.depth: - itime = int(time / line.dt) - r = [line.xp[itime, 0], line.yp[itime, 0], line.zp[itime, 0]] - x = r[Xuvec.index(1)] - y = r[Yuvec.index(1)] - if color == None: - c = "tab:blue" - else: - c = color - plt.plot(x, y, "v", color=c, markersize=5) - - j = 0 - for line in self.lineList: - if line != self.lineList[0]: - label = "" - j = j + 1 - if color == None and "material" in line.type: - if "chain" in line.type["material"]: - line.drawLine2d( - time, - ax, - color=[0.1, 0, 0], - Xuvec=Xuvec, - Yuvec=Yuvec, - colortension=colortension, - cmap=cmap_tension, - plotnodes=plotnodes, - plotnodesline=plotnodesline, - label=label, - alpha=alpha, - ) - elif "rope" in line.type["material"] or "polyester" in line.type["material"]: - line.drawLine2d( - time, - ax, - color=[0.3, 0.5, 0.5], - Xuvec=Xuvec, - Yuvec=Yuvec, - colortension=colortension, - cmap=cmap_tension, - plotnodes=plotnodes, - plotnodesline=plotnodesline, - label=label, - alpha=alpha, - ) - else: - line.drawLine2d( - time, - ax, - color=[0.3, 0.3, 0.3], - Xuvec=Xuvec, - Yuvec=Yuvec, - colortension=colortension, - cmap=cmap_tension, - plotnodes=plotnodes, - plotnodesline=plotnodesline, - label=label, - alpha=alpha, - ) - else: - line.drawLine2d( - time, - ax, - color=color, - Xuvec=Xuvec, - Yuvec=Yuvec, - colortension=colortension, - cmap=cmap_tension, - plotnodes=plotnodes, - plotnodesline=plotnodesline, - label=label, - alpha=alpha, - ) - - # Add Line labels - if linelabels == True: - xloc = np.dot( - [(line.rA[0] + line.rB[0]) / 2, (line.rA[1] + line.rB[1]) / 2, (line.rA[2] + line.rB[2]) / 2], Xuvec - ) - yloc = np.dot( - [(line.rA[0] + line.rB[0]) / 2, (line.rA[1] + line.rB[1]) / 2, (line.rA[2] + line.rB[2]) / 2], Yuvec - ) - ax.text(xloc, yloc, j) - - if cbar_tension: - maxten = max([max(line.getLineTens()) for line in self.lineList]) # find the max tension in the System - minten = min([min(line.getLineTens()) for line in self.lineList]) # find the min tension in the System - bounds = range(int(minten), int(maxten), int((maxten - minten) / 256)) - norm = mpl.colors.BoundaryNorm( - bounds, 256 - ) # set the bounds in a norm object, with 256 being the length of all colorbar strings - fig.colorbar(cm.ScalarMappable(norm=norm, cmap=cmap_tension), label="Tension (N)") # add the colorbar - fig.tight_layout() - - # Add point labels - i = 0 - for point in self.pointList: - i = i + 1 - if pointlabels == True: - xloc = np.dot([point.r[0], point.r[1], point.r[2]], Xuvec) - yloc = np.dot([point.r[0], point.r[1], point.r[2]], Yuvec) - ax.text(xloc, yloc, i, c="r") - - if isinstance(bathymetry, str): # or, if it's a string, load in the bathymetry file - # parse through the MoorDyn bathymetry file - bathGrid_Xs, bathGrid_Ys, bathGrid = self.readBathymetryFile(bathymetry) - - X, Y = np.meshgrid(bathGrid_Xs, bathGrid_Ys) - Z = -bathGrid - if rang == "hold": - rang = (np.min(Z), np.max(Z)) - - Xind = Xuvec.index(1) - Yind = Yuvec.index(1) - Zind = int(3 - Xind - Yind) - W = [X, Y, Z] - - # plot a contour profile of the bathymetry - bath = ax.contourf( - W[Xind], W[Yind], W[Zind], cmap=cmap_bath, levels=levels, alpha=alpha, vmin=rang[0], vmax=rang[1] - ) - - if ( - cbar_bath_aspect != 20 or cbar_bath_ticks != None - ): # make sure the colorbar is turned on just in case it isn't when the other colorbar inputs are used - cbar_bath = True - if cbar_bath: - fig.colorbar(bath, label="depth (m)", aspect=cbar_bath_aspect, ticks=cbar_bath_ticks) - - ax.axis("equal") - ax.set_title(title) - - return fig, ax # return the figure and axis object in case it will be used later to update the plot - - def animateSolution(self, DOFtype="free"): - """Creates an animation of the system - - Returns - ------- - None. - - """ - - # first draw a plot of DOFs and forces - x = np.array(self.Xs) - f = np.array(self.Es) - fig, ax = plt.subplots(2, 1, sharex=True) - for i in range(len(self.Es[0])): - ax[0].plot(x[:, i]) # <<< warning this is before scale and offset! - ax[1].plot(f[:, i], label=i + 1) - ax[1].legend() - - # self.mooringEq(self.freeDOFs[0]) # set positions back to the first ones of the iteration process - self.mooringEq( - self.Xs[0], DOFtype=self.DOFtype_solve_for - ) # set positions back to the first ones of the iteration process - # ^^^^^^^ this only works for free DOF animation cases (not coupled DOF ones) <<<<< ...should be good now - - fig, ax = self.plot() # make the initial plot to then animate - - nFreeDOF, nCpldDOF = self.getDOFs() - if DOFtype == "free": - nDOF = nFreeDOF - elif DOFtype == "coupled": - nDOF = nCpldDOF - elif DOFtype == "both": - nDOF = nFreeDOF + nCpldDOF - - # ms_delay = 10000/len(self.freeDOFs) # time things so the animation takes 10 seconds - - line_ani = animation.FuncAnimation( - fig, - self.animate, - np.arange(0, len(self.Xs), 1), # fargs=(ax), - interval=1000, - blit=False, - repeat_delay=2000, - repeat=True, - ) - - return line_ani - - def animate(self, ts): - """Redraws mooring system positions at step ts. Currently set up in a hack-ish way to work for animations - involving movement of either free DOFs or coupled DOFs (but not both) - """ - - # following sets positions of all objects and may eventually be made into self.setPositions(self.positions[i]) - - X = self.Xs[ts] # Xs are already specified in solveEquilibrium's DOFtype - - if self.DOFtype_solve_for == "free": - types = [0] - elif self.DOFtype_solve_for == "coupled": - types = [-1] - elif self.DOFtype_solve_for == "both": - types = [0, -1] - else: - raise ValueError("System.animate called but there is an invalid DOFtype being used") - """ - if len(self.freeDOFs) > 0: - X = self.freeDOFs[ts] # get freeDOFs of current instant - type = 0 - elif len(self.cpldDOFs) > 0: - X = self.cpldDOFs[ts] # get freeDOFs of current instant - type = -1 - else: - raise ValueError("System.animate called but no animation data is saved in freeDOFs or cpldDOFs") - """ - - # print(ts) - - i = 0 # index used to split off input positions X for each free object - - # update position of free Bodies - for body in self.bodyList: - if body.type in types: - body.setPosition(X[i : i + 6]) # update position of free Body - i += 6 - body.redraw() # redraw Body - - # update position of free Points - for point in self.pointList: - if point.type in types: - point.setPosition(X[i : i + 3]) # update position of free Point - i += 3 - # redraw Point? - - # redraw all lines - for line in self.lineList: - line.redrawLine(0) - - # ax.set_title("iteration "+str(ts)) - # eventually could show net forces too? <<< if using a non MINPACK method, use callback and do this - - pass # I added this line to get the above commented lines (^^^) to be included in the animate method - - def updateCoords(self, tStep, colortension, cmap_tension, label, dt): - """Update animation function. This gets called by animateLines every iteration of the animation and - redraws the lines and rods in their next positions.""" - - for rod in self.rodList: - if ( - isinstance(rod, Line) and rod.show - ): # draw it if MoorPy is representing it as as Rod-Line object, and it's set to be shown - rod.redrawLine(-tStep) - - for line in self.lineList: - if len(line.Tdata) > 0: - line.redrawLine(-tStep, colortension=colortension, cmap_tension=cmap_tension) - - label.set_text(f"time={np.round(tStep*dt,1)}") - - return - - def animateLines(self, interval=200, repeat=True, delay=0, runtime=-1, **kwargs): - """ - Parameters - ---------- - dirname : string - The name of the directory folder you are in. - rootname : string - The name of the front portion of the main file name, like spar_WT1, or DTU_10MW_NAUTILUS_GoM. - interval : int, optional - The time between animation frames in milliseconds. The default is 200. - repeat : bool, optional - Whether or not to repeat the animation. The default is True. - delay : int, optional - The time between consecutive animation runs in milliseconds. The default is 0. - runtime: int, optional - The desired time that the animation should run to in seconds. The default is -1, which means to run the full simulation - - Returns - ------- - line_ani : animation - an animation of the mooring lines based off of MoorDyn data. - Needs to be stored, returned, and referenced in a variable - """ - - bathymetry = kwargs.get("bathymetry", False) # toggles whether to show the axes or not - opacity = kwargs.get("opacity", 1.0) # the transparency of the bathymetry plot_surface - hidebox = kwargs.get("hidebox", False) # toggles whether to show the axes or not - rang = kwargs.get( - "rang", "hold" - ) # colorbar range: if range not used, set it as a placeholder, it will get adjusted later - speed = kwargs.get("speed", 10) # the resolution of the animation; how fluid/speedy the animation is - colortension = kwargs.get( - "colortension", False - ) # toggle to draw the mooring lines in colors based on node tensions - cmap_tension = kwargs.get("cmap_tension", "rainbow") # the type of color spectrum desired for colortensions - draw_body = kwargs.get("draw_body", True) - # bound kwargs - xbounds = kwargs.get( - "xbounds", None - ) # the bounds of the x-axis. The midpoint of these bounds determines the origin point of orientation of the plot - ybounds = kwargs.get( - "ybounds", None - ) # the bounds of the y-axis. The midpoint of these bounds determines the origin point of orientation of the plot - zbounds = kwargs.get( - "zbounds", None - ) # the bounds of the z-axis. The midpoint of these bounds determines the origin point of orientation of the plot - - # not adding cbar_tension colorbar yet since the tension magnitudes might change in the animation and the colorbar won't reflect that - # can use any other kwargs that go into self.plot() - - if self.qs == 1: - raise ValueError( - "This System is set to be quasi-static. Import MoorDyn data and make qs=0 to use this method" - ) - - # create the figure and axes to draw the animation - fig, ax = self.plot( - draw_body=draw_body, - bathymetry=bathymetry, - opacity=opacity, - hidebox=hidebox, - rang=rang, - colortension=colortension, - xbounds=xbounds, - ybounds=ybounds, - zbounds=zbounds, - ) - """ - # can do this section instead of self.plot(). They do the same thing - fig = plt.figure(figsize=(20/2.54,12/2.54)) - ax = Axes3D(fig) - for imooring in self.lineList: - imooring.drawLine(0, ax) - """ - # set figure x/y/z bounds - """ - d = 1600 # can make this an input later - ax.set_xlim((-d,d)) - ax.set_ylim((-d,d)); - ax.set_zlim((-self.depth, 300)) - - - # make the axes scaling equal - rangex = np.diff(ax.get_xlim3d())[0] - rangey = np.diff(ax.get_ylim3d())[0] - rangez = np.diff(ax.get_zlim3d())[0] - ax.set_box_aspect([rangex, rangey, rangez]) - """ - ax.set_xlabel("x") - ax.set_ylabel("y") - ax.set_zlabel("z") - label = ax.text(-100, 100, 0, "time=0", ha="center", va="center", fontsize=10, color="k") - - # find idyn, the index of the first line in the lineList that contains a series of Tdata - idyn = ( - len(self.lineList) - 1 - ) # note, the idyn approach is not robust to different Lines having output, or Rods. Should reconsider. - for line in self.lineList: - if len(line.Tdata) > 0: - idyn = line.number - 1 - break - - if runtime == -1: # if the full simulation is desired to be animated - nFrames = len(self.lineList[idyn].Tdata) - else: # if only part of the simulation is to be animated, up to a certain runtime in seconds - itime = int(np.where(self.lineList[idyn].Tdata == runtime)[0]) - nFrames = len(self.lineList[idyn].Tdata[0:itime]) - - dt = ( - self.lineList[idyn].Tdata[1] - self.lineList[idyn].Tdata[0] - ) # time step length (s) <<< should get this from main MoorDyn output file <<< - - # Animation: update the figure with the updated coordinates from update_Coords function - # NOTE: the animation needs to be stored in a variable, return out of the method, and referenced when calling self.animatelines() - line_ani = animation.FuncAnimation( - fig, - self.updateCoords, - np.arange(1, nFrames - 1, speed), - fargs=(colortension, cmap_tension, label, dt), - interval=1, - repeat=repeat, - repeat_delay=delay, - blit=False, - ) - # works well when np.arange(...nFrames...) is used. Others iterable ways to do this - - return line_ani - - def unload_md_driver(self, outFileName, outroot="driver", MDinputfile="test.dat", depth=600): - """Function to output moordyn driver input file - Parameters - ---------- - outFileName: moordyn driver input file name - outroot: root name for output files (ex if outroot = 'driver', the MD output file will be driver.MD.out) - MDinputfile: name of the moordyn input file - depth: water depth - Returns - ------- - None. - """ - - Echo = False - density = 1025 - gravity = 9.80665 - TMax = 60.0225 - dtC = 0.0125 - numturbines = 0 - inputsmode = 0 - inputsfile = "" - ref = [0, 0] - T1 = [0, 0, 0, 0, 0, 0] - L = [] - - # Input File Header - L.append(" MoorDyn Driver Input File ") - L.append("Another comment line") - L.append("{:5} Echo - echo the input file data (flag)".format(str(Echo).upper())) - L.append("---------------- ENVIRONMENTAL CONDITIONS ------------------") - L.append("{:<1.5f}\t\tgravity - gravity (m/s^2)".format(gravity)) - L.append("{:<4.1f}\t\trhoW - water density (kg/m^3)".format(density)) - L.append("{:<4.1f}\t\tWtrDpth - water depth".format(depth)) - L.append("---------------- MOORDYN ------------------") - L.append("{:}\tMDInputFile - Primary MoorDyn input file name (quoted string)".format(MDinputfile)) - L.append( - '"{:}"\tOutRootName - The name which prefixes all HydroDyn generated files (quoted string)'.format( - str(outroot) - ) - ) - L.append("{:<2.4f}\t\tTMax - Number of time steps in the simulations (-)".format(TMax)) - L.append("{:<1.4f}\t\tdtC - TimeInterval for the simulation (sec)".format(dtC)) - L.append( - "{:<2.0f}\t\tInputsMode - MoorDyn coupled object inputs (0: all inputs are zero for every timestep, 1: time-series inputs) (switch)".format( - inputsmode - ) - ) - L.append( - '"{:}"\t\tInputsFile - Filename for the MoorDyn inputs file for when InputsMod = 1 (quoted string)'.format( - inputsfile - ) - ) - L.append( - "{:<2.0f}\t\tNumTurbines - Number of wind turbines (-) [>=1 to use FAST.Farm mode. 0 to use OpenFAST mode.]".format( - numturbines - ) - ) - L.append("---------------- Initial Positions ------------------") - L.append("ref_X ref_Y surge_init sway_init heave_init roll_init pitch_init yaw_init") - L.append( - "(m) (m) (m) (m) (m) (m) (m) (m) [followed by NumTurbines rows of data]" - ) - L.append( - "{:2.8f} {:2.8f} {:2.8f} {:2.8f} {:2.8f} {:2.8f} {:2.8f} {:2.8f} ".format( - ref[0], ref[1], T1[0], T1[1], T1[2], T1[3], T1[4], T1[5] - ) - ) - L.append("END of driver input file") - - with open(outFileName, "w") as out: - for x in range(len(L)): - out.write(L[x]) - out.write("\n") diff --git a/WISDEM/wisdem/nrelcsm/nrel_csm_cost_2015.py b/WISDEM/wisdem/nrelcsm/nrel_csm_cost_2015.py index 863e0bd20..f14f2a789 100644 --- a/WISDEM/wisdem/nrelcsm/nrel_csm_cost_2015.py +++ b/WISDEM/wisdem/nrelcsm/nrel_csm_cost_2015.py @@ -677,7 +677,7 @@ def compute(self, inputs, outputs): # --------------------------------------------------------------------------------- class ElecConnecCost2015(om.ExplicitComponent): """ - Compute electrical connection cost in the form of :math:`cost = k*mass`. + Compute electrical connection cost in the form of :math:`cost = k*rating`. Value of :math:`k` was NOT updated in 2015 and remains the same as original CSM, $41.85 USD/kg. Cost includes materials and manufacturing costs. @@ -711,7 +711,7 @@ def compute(self, inputs, outputs): # --------------------------------------------------------------------------------- class ControlsCost2015(om.ExplicitComponent): """ - Compute controls cost in the form of :math:`cost = k*mass`. + Compute controls cost in the form of :math:`cost = k*rating`. Value of :math:`k` was NOT updated in 2015 and remains the same as original CSM, $21.15 USD/kg. Cost includes materials and manufacturing costs. diff --git a/WISDEM/wisdem/nrelcsm/nrel_csm_mass_2015.py b/WISDEM/wisdem/nrelcsm/nrel_csm_mass_2015.py index 94d0411a4..aac50a12f 100644 --- a/WISDEM/wisdem/nrelcsm/nrel_csm_mass_2015.py +++ b/WISDEM/wisdem/nrelcsm/nrel_csm_mass_2015.py @@ -256,7 +256,7 @@ def compute(self, inputs, outputs): # calculate the lss mass outputs["lss_mass"] = ( - lss_mass_coeff * (blade_mass * machine_rating / 1000.0) ** lss_mass_exp + lss_mass_intercept + lss_mass_coeff * (blade_mass * machine_rating * 1e-3) ** lss_mass_exp + lss_mass_intercept ) @@ -321,7 +321,7 @@ class RotorTorque(om.ExplicitComponent): ------- rated_rpm : float, [rpm] rpm of rotor at rated power - rotor_torque : float, [N*m] + rotor_torque : float, [MN*m] torque from rotor at rated power """ @@ -333,17 +333,17 @@ def setup(self): self.add_input("max_efficiency", 0.0) self.add_output("rated_rpm", 0.0, units="rpm") - self.add_output("rotor_torque", 0.0, units="N*m") + self.add_output("rotor_torque", 0.0, units="kN*m") def compute(self, inputs, outputs): # Rotor force calculations for nacelle inputs maxTipSpd = inputs["max_tip_speed"] maxEfficiency = inputs["max_efficiency"] - ratedHubPower_W = inputs["machine_rating"] * 1000.0 / maxEfficiency + ratedHubPower_kW = inputs["machine_rating"] / maxEfficiency rotorSpeed = maxTipSpd / (0.5 * inputs["rotor_diameter"]) outputs["rated_rpm"] = rotorSpeed / (2 * np.pi) * 60.0 - outputs["rotor_torque"] = ratedHubPower_W / rotorSpeed + outputs["rotor_torque"] = ratedHubPower_kW / rotorSpeed # -------------------------------------------------------------------- @@ -370,7 +370,7 @@ class GearboxMass(om.ExplicitComponent): """ def setup(self): - self.add_input("rotor_torque", 0.0, units="N*m") + self.add_input("rotor_torque", 0.0, units="kN*m") self.add_input("gearbox_mass_coeff", 113.0) self.add_input("gearbox_mass_exp", 0.71) @@ -382,7 +382,7 @@ def compute(self, inputs, outputs): gearbox_mass_exp = inputs["gearbox_mass_exp"] # calculate the gearbox mass - outputs["gearbox_mass"] = gearbox_mass_coeff * (rotor_torque / 1000.0) ** gearbox_mass_exp + outputs["gearbox_mass"] = gearbox_mass_coeff * rotor_torque ** gearbox_mass_exp # -------------------------------------------------------------------- @@ -456,7 +456,7 @@ def compute(self, inputs, outputs): class GeneratorMass(om.ExplicitComponent): """ Compute generator mass in the form of :math:`mass = k*power + b`. - Value of :math:`k` was updated in 2015 to be 2300. + Value of :math:`k` was updated in 2015 to be 2.3 (for rating in kW). Value of :math:`b` was updated in 2015 to be 3400. Parameters @@ -477,7 +477,7 @@ class GeneratorMass(om.ExplicitComponent): def setup(self): self.add_input("machine_rating", 0.0, units="kW") - self.add_input("generator_mass_coeff", 2300.0) + self.add_input("generator_mass_coeff", 2.3) self.add_input("generator_mass_intercept", 3400.0) self.add_output("generator_mass", 0.0, units="kg") @@ -488,7 +488,7 @@ def compute(self, inputs, outputs): generator_mass_intercept = inputs["generator_mass_intercept"] # calculate the generator mass - outputs["generator_mass"] = generator_mass_coeff * machine_rating / 1000.0 + generator_mass_intercept + outputs["generator_mass"] = generator_mass_coeff * machine_rating + generator_mass_intercept # -------------------------------------------------------------------- @@ -707,7 +707,7 @@ def compute(self, inputs, outputs, discrete_inputs, discrete_outputs): class TransformerMass(om.ExplicitComponent): """ Compute transformer mass in the form of :math:`mass = k*power + b`. - Value of :math:`k` was updated in 2015 to be 1915. + Value of :math:`k` was updated in 2015 to be 1.915 (for rating in kW). Value of :math:`b` was updated in 2015 to be 1910. Parameters @@ -728,7 +728,7 @@ class TransformerMass(om.ExplicitComponent): def setup(self): self.add_input("machine_rating", 0.0, units="kW") - self.add_input("transformer_mass_coeff", 1915.0) + self.add_input("transformer_mass_coeff", 1.9150) self.add_input("transformer_mass_intercept", 1910.0) self.add_output("transformer_mass", 0.0, units="kg") @@ -739,7 +739,7 @@ def compute(self, inputs, outputs): transformer_mass_intercept = inputs["transformer_mass_intercept"] # calculate the transformer mass - outputs["transformer_mass"] = transformer_mass_coeff * machine_rating / 1000.0 + transformer_mass_intercept + outputs["transformer_mass"] = transformer_mass_coeff * machine_rating + transformer_mass_intercept # -------------------------------------------------------------------- @@ -751,12 +751,12 @@ class TowerMass(om.ExplicitComponent): Parameters ---------- - hub_height : float, [m] - hub height of wind turbine above ground / sea level + tower_length : float, [m] + This is the hub height of wind turbine above ground for onshore turbines. For offshore, this should be entered as the length from transition piece to hub height. tower_mass_coeff : float - k inthe tower mass equation: k*hub_height^b + k in the tower mass equation: k*tower_length^b tower_mass_exp : float - b in the tower mass equation: k*hub_height^b + b in the tower mass equation: k*tower_length^b Returns ------- @@ -766,19 +766,19 @@ class TowerMass(om.ExplicitComponent): """ def setup(self): - self.add_input("hub_height", 0.0, units="m") + self.add_input("tower_length", 0.0, units="m") self.add_input("tower_mass_coeff", 19.828) self.add_input("tower_mass_exp", 2.0282) self.add_output("tower_mass", 0.0, units="kg") def compute(self, inputs, outputs): - hub_height = inputs["hub_height"] + tower_length = inputs["tower_length"] tower_mass_coeff = inputs["tower_mass_coeff"] tower_mass_exp = inputs["tower_mass_exp"] # calculate the tower mass - outputs["tower_mass"] = tower_mass_coeff * hub_height**tower_mass_exp + outputs["tower_mass"] = tower_mass_coeff * tower_length**tower_mass_exp # Turbine mass adder diff --git a/WISDEM/wisdem/optimization_drivers/nlopt_driver.py b/WISDEM/wisdem/optimization_drivers/nlopt_driver.py index 22b04b048..193c43a3c 100644 --- a/WISDEM/wisdem/optimization_drivers/nlopt_driver.py +++ b/WISDEM/wisdem/optimization_drivers/nlopt_driver.py @@ -458,7 +458,7 @@ def _objfunc(self, x_new, grad): except Exception as msg: self._exc_info = msg - return float(f_new) + return float(f_new[0]) def _confunc(self, x_new, grad, name, dbl, idx): """ diff --git a/WISDEM/wisdem/postprocessing/compare_designs.py b/WISDEM/wisdem/postprocessing/compare_designs.py index 78a34e8f8..7e51811b3 100644 --- a/WISDEM/wisdem/postprocessing/compare_designs.py +++ b/WISDEM/wisdem/postprocessing/compare_designs.py @@ -824,7 +824,7 @@ def run(list_of_sims, list_of_labels, modeling_options, analysis_options): "Rated pitch": ["control.rated_pitch", "deg"], "Rated thrust": ["rotorse.rp.powercurve.rated_T", "kN"], "Rated torque": ["rotorse.rp.powercurve.rated_Q", "kN*m"], - "Blade mass": ["rotorse.rs.bjs.blade_mass", "kg"], + "Blade mass": ["rotorse.blade_mass", "kg"], "Blade cost": ["rotorse.re.precomp.total_blade_cost", "USD"], "Tip defl": ["tcons.tip_deflection", "m"], "Tip defl ratio": ["tcons.tip_deflection_ratio", None], diff --git a/WISDEM/wisdem/postprocessing/default_modeling_options.yaml b/WISDEM/wisdem/postprocessing/default_modeling_options.yaml index 2d18cdcc2..1697c70b9 100644 --- a/WISDEM/wisdem/postprocessing/default_modeling_options.yaml +++ b/WISDEM/wisdem/postprocessing/default_modeling_options.yaml @@ -1,13 +1,42 @@ # Generic modeling options file to run standard WISDEM case General: verbosity: False # When set to True, the code prints to screen many infos -RotorSE: - flag: True - spar_cap_ss: Spar_cap_ss - spar_cap_ps: Spar_cap_ps -DriveSE: - flag: True -TowerSE: # Options of TowerSE module - flag: True -BOS: - flag: True +WISDEM: + RotorSE: + flag: True + spar_cap_ss: spar_cap_ss + spar_cap_ps: spar_cap_ps + peak_thrust_shaving: True + thrust_shaving_coeff: 0.8 + DriveSE: + flag: True + TowerSE: + flag: True + wind: PowerWind # Wind used + gamma_f: 1.35 # Safety factor for fatigue loads + gamma_m: 1.3 # Safety factor for material properties + gamma_n: 1.0 # Safety factor for ... + gamma_b: 1.1 # Safety factor for ... + gamma_fatigue: 1.755 # Safety factor for fatigue loads + buckling_method: dnvgl # Buckling code type [eurocode or dnvgl] + buckling_length: 15 # Buckling parameter + frame3dd: + shear: True + geom: True + tol: 1e-9 + FixedBottomSE: # Options of TowerSE module + flag: True + wind: PowerWind # Wind used + gamma_f: 1.35 # Safety factor for fatigue loads + gamma_m: 1.3 # Safety factor for material properties + gamma_n: 1.0 # Safety factor for ... + gamma_b: 1.1 # Safety factor for ... + gamma_fatigue: 1.755 # Safety factor for fatigue loads + buckling_method: dnvgl # Buckling code type [eurocode or dnvgl] + buckling_length: 15 # Buckling parameter + frame3dd: + shear: True + geom: True + tol: 1e-9 + BOS: + flag: True diff --git a/WISDEM/wisdem/postprocessing/wisdem_get.py b/WISDEM/wisdem/postprocessing/wisdem_get.py index 7eae052ec..dfc49f2d7 100644 --- a/WISDEM/wisdem/postprocessing/wisdem_get.py +++ b/WISDEM/wisdem/postprocessing/wisdem_get.py @@ -38,6 +38,13 @@ def get_transition_height(prob): return prob["towerse.foundation_height"] +def get_tower_outfitting(prob): + if is_monopile(prob): + return np.r_[prob["fixedse.member.outfitting_factor"], prob["towerse.member.outfitting_factor"][1:]] + else: + return prob["towerse.member.outfitting_factor"] + + def get_tower_E(prob): if is_monopile(prob): return np.r_[prob["fixedse.member.E"], prob["towerse.member.E"][1:]] diff --git a/WISDEM/wisdem/rotorse/parametrize_rotor.py b/WISDEM/wisdem/rotorse/parametrize_rotor.py index 89b98f99a..6078ac486 100644 --- a/WISDEM/wisdem/rotorse/parametrize_rotor.py +++ b/WISDEM/wisdem/rotorse/parametrize_rotor.py @@ -191,16 +191,16 @@ def compute(self, inputs, outputs): opt_ps = self.opt_options["design_variables"]["blade"]["structure"]["spar_cap_ss"]["flag"] for i in range(self.n_layers): if layer_name[i] == spar_cap_ss_name and opt_ss and opt_ps: - opt_m_interp = np.interp(inputs["s"], inputs["s_opt_spar_cap_ss"], inputs["spar_cap_ss_opt"]) + opt_m_interp = PchipInterpolator(inputs["s_opt_spar_cap_ss"], inputs["spar_cap_ss_opt"])(inputs["s"]) ss_before_ps = True elif layer_name[i] == spar_cap_ps_name and opt_ss and opt_ps: if ( self.opt_options["design_variables"]["blade"]["structure"]["spar_cap_ps"]["equal_to_suction"] == False ) or ss_before_ps == False: - opt_m_interp = np.interp(inputs["s"], inputs["s_opt_spar_cap_ps"], inputs["spar_cap_ps_opt"]) + opt_m_interp = PchipInterpolator(inputs["s_opt_spar_cap_ps"], inputs["spar_cap_ps_opt"])(inputs["s"]) else: - opt_m_interp = np.interp(inputs["s"], inputs["s_opt_spar_cap_ss"], inputs["spar_cap_ss_opt"]) + opt_m_interp = PchipInterpolator(inputs["s_opt_spar_cap_ss"], inputs["spar_cap_ss_opt"])(inputs["s"]) else: opt_m_interp = inputs["layer_thickness_original"][i, :] @@ -214,15 +214,15 @@ def compute(self, inputs, outputs): opt_ps = self.opt_options["design_variables"]["blade"]["structure"]["te_ss"]["flag"] for i in range(self.n_layers): if layer_name[i] == te_ss_name and opt_ss and opt_ps: - opt_m_interp = np.interp(inputs["s"], inputs["s_opt_te_ss"], inputs["te_ss_opt"]) + opt_m_interp = PchipInterpolator(inputs["s_opt_te_ss"], inputs["te_ss_opt"])(inputs["s"]) ss_before_ps = True elif layer_name[i] == te_ps_name and opt_ss and opt_ps: if ( self.opt_options["design_variables"]["blade"]["structure"]["te_ps"]["equal_to_suction"] == False ) or ss_before_ps == False: - opt_m_interp = np.interp(inputs["s"], inputs["s_opt_te_ps"], inputs["te_ps_opt"]) + opt_m_interp = PchipInterpolator(inputs["s_opt_te_ps"], inputs["te_ps_opt"])(inputs["s"]) else: - opt_m_interp = np.interp(inputs["s"], inputs["s_opt_te_ss"], inputs["te_ss_opt"]) + opt_m_interp = PchipInterpolator(inputs["s_opt_te_ss"], inputs["te_ss_opt"])(inputs["s"]) else: opt_m_interp = outputs["layer_thickness_param"][i, :] diff --git a/WISDEM/wisdem/rotorse/rotor.py b/WISDEM/wisdem/rotorse/rotor.py index 55ed1d1db..b46fbeb61 100644 --- a/WISDEM/wisdem/rotorse/rotor.py +++ b/WISDEM/wisdem/rotorse/rotor.py @@ -82,10 +82,13 @@ def setup(self): self.add_subsystem("wt_class", TurbineClass()) + re_promote_add = ["chord", "theta", "r", "precurve", "presweep", + "blade_mass", "blade_span_cg", "blade_moment_of_inertia", + "mass_all_blades", "I_all_blades"] self.add_subsystem( "re", RotorElasticity(modeling_options=modeling_options, opt_options=opt_options), - promotes=promoteGeom + ["chord", "theta", "r", "precurve", "presweep"], + promotes=promoteGeom + re_promote_add, ) self.add_subsystem( @@ -103,7 +106,7 @@ def setup(self): self.add_subsystem( "rs", RotorStructure(modeling_options=modeling_options, opt_options=opt_options, freq_run=False), - promotes=promoteGeom + promoteCC + ["s", "precurveTip", "presweepTip"], + promotes=promoteGeom + promoteCC + ["s", "precurveTip", "presweepTip", "blade_span_cg"], ) if modeling_options["WISDEM"]["RotorSE"]["bjs"]: @@ -148,7 +151,6 @@ def setup(self): self.add_subsystem("total_bc", TotalBladeCosts()) if modeling_options["WISDEM"]["RotorSE"]["bjs"]: - self.connect("re.precomp.blade_mass", "rs.bjs.blade_mass_re") self.connect("rc_in.total_blade_cost", "total_bc.inner_blade_cost") self.connect("rc_out.total_blade_cost", "total_bc.outer_blade_cost") self.connect("rs.bjs.joint_total_cost", "total_bc.joint_cost") diff --git a/WISDEM/wisdem/rotorse/rotor_elasticity.py b/WISDEM/wisdem/rotorse/rotor_elasticity.py index 092c81da2..c1da551f4 100644 --- a/WISDEM/wisdem/rotorse/rotor_elasticity.py +++ b/WISDEM/wisdem/rotorse/rotor_elasticity.py @@ -281,6 +281,7 @@ def setup(self): # Outputs - Overall beam properties self.add_output("blade_mass", val=0.0, units="kg", desc="mass of one blade") + self.add_output("blade_span_cg", val=0.0, units="m", desc="Distance along the blade span for its center of gravity") self.add_output( "blade_moment_of_inertia", val=0.0, units="kg*m**2", desc="mass moment of inertia of blade about hub" ) @@ -834,7 +835,8 @@ def web_stacking( outputs["yl_te"] = yl_te # Compute mass and inertia of blade and rotor - blade_mass = np.trapz(rhoA, inputs["r"]) + blade_mass = np.trapz(rhoA_joint, inputs["r"]) + blade_span_cg = np.trapz(rhoA_joint * inputs["r"], inputs["r"]) / blade_mass blade_moment_of_inertia = np.trapz(rhoA_joint * inputs["r"] ** 2.0, inputs["r"]) tilt = inputs["uptilt"] n_blades = discrete_inputs["n_blades"] @@ -849,6 +851,7 @@ def web_stacking( I_all_blades = np.r_[Ixx, Iyy, Izz, Ixy, Ixz, Iyz] outputs["blade_mass"] = blade_mass + outputs["blade_span_cg"] = blade_span_cg outputs["blade_moment_of_inertia"] = blade_moment_of_inertia outputs["mass_all_blades"] = mass_all_blades outputs["I_all_blades"] = I_all_blades @@ -908,6 +911,11 @@ def setup(self): "xl_te", "yu_te", "yl_te", + "blade_mass", + "blade_span_cg", + "blade_moment_of_inertia", + "mass_all_blades", + "I_all_blades", ], ) # Check rail transportabiliy diff --git a/WISDEM/wisdem/rotorse/rotor_power.py b/WISDEM/wisdem/rotorse/rotor_power.py index d34f691fd..d72a50352 100644 --- a/WISDEM/wisdem/rotorse/rotor_power.py +++ b/WISDEM/wisdem/rotorse/rotor_power.py @@ -393,9 +393,9 @@ def compute(self, inputs, outputs, discrete_inputs, discrete_outputs): pitch = np.zeros(Uhub.shape) + inputs["control_pitch"] # Unpack variables - P_rated = float(inputs["rated_power"]) - R_tip = float(inputs["Rtip"]) - tsr = float(inputs["tsr_operational"]) + P_rated = float(inputs["rated_power"][0]) + R_tip = float(inputs["Rtip"][0]) + tsr = float(inputs["tsr_operational"][0]) driveType = discrete_inputs["drivetrainType"] ## POWERCURVE PRELIMS ## @@ -424,7 +424,7 @@ def compute(self, inputs, outputs, discrete_inputs, discrete_outputs): ) # driveEta = np.c_[lss_rpm, float(inputs['gearbox_efficiency'])*gen_eff] - driveEta = float(inputs["gearbox_efficiency"]) * gen_eff + driveEta = float(inputs["gearbox_efficiency"][0]) * gen_eff # Set baseline power production myout, derivs = self.ccblade.evaluate(Uhub, Omega_tsr * 30.0 / np.pi, pitch, coefficients=True) @@ -469,7 +469,7 @@ def const_Urated(x): Omega_i = min([Uhub_i * tsr / R_tip, Omega_max]) Omega_i_rpm = Omega_i * 30.0 / np.pi myout, _ = self.ccblade.evaluate([Uhub_i], [Omega_i_rpm], [pitch_i], coefficients=False) - P_aero_i = float(myout["P"]) + P_aero_i = float(myout["P"][0]) # P_i,_ = compute_P_and_eff(P_aero_i.flatten(), P_rated, Omega_i_rpm, driveType, driveEta) eff_i = np.interp(Omega_i_rpm, lss_rpm, driveEta) P_i = float(P_aero_i * eff_i) @@ -528,7 +528,7 @@ def const_Urated(x): Ct_aero_rated, Cq_aero_rated, Cm_aero_rated, - ) = [float(myout[key]) for key in ["P", "T", "Q", "Mb", "CP", "CT", "CQ", "CMb"]] + ) = [float(myout[key][0]) for key in ["P", "T", "Q", "Mb", "CP", "CT", "CQ", "CMb"]] eff_rated = np.interp(Omega_rpm_rated, lss_rpm, driveEta) Cp_rated = Cp_aero_rated * eff_rated P_rated = P_rated @@ -543,11 +543,11 @@ def const_Urated_Tpeak(x): Omega_i = min([Uhub_i * tsr / R_tip, Omega_max]) Omega_i_rpm = Omega_i * 30.0 / np.pi myout, _ = self.ccblade.evaluate([Uhub_i], [Omega_i_rpm], [pitch_i], coefficients=False) - P_aero_i = float(myout["P"]) + P_aero_i = float(myout["P"][0]) # P_i,_ = compute_P_and_eff(P_aero_i.flatten(), P_rated, Omega_i_rpm, driveType, driveEta) eff_i = np.interp(Omega_i_rpm, lss_rpm, driveEta) P_i = float(P_aero_i * eff_i) - T_i = float(myout["T"]) + T_i = float(myout["T"][0]) return 1e-4 * (P_i - P_rated), 1e-4 * (T_i - max_T) # Have to search over both pitch and speed @@ -580,7 +580,7 @@ def const_Urated_Tpeak(x): Ct_aero_rated, Cq_aero_rated, Cm_aero_rated, - ) = [float(myout[key]) for key in ["P", "T", "Q", "Mb", "CP", "CT", "CQ", "CMb"]] + ) = [float(myout[key][0]) for key in ["P", "T", "Q", "Mb", "CP", "CT", "CQ", "CMb"]] eff_rated = np.interp(Omega_rpm_rated, lss_rpm, driveEta) Cp_rated = Cp_aero_rated * eff_rated P_rated = P_rated @@ -640,15 +640,18 @@ def maximizePower(pitch_i, Uhub_i, Omega_rpm_i): def constr_Tmax(pitch_i, Uhub_i, Omega_rpm_i): myout, _ = self.ccblade.evaluate([Uhub_i], [Omega_rpm_i], [pitch_i], coefficients=False) - return 1e-5 * (max_T - float(myout["T"])) + return 1e-5 * (max_T - float(myout["T"][0])) # Maximize power until rated for i in range(i_3): # No need to optimize if already doing well or if flag # fix_pitch_regI12, which locks pitch in region I 1/2, is on + # For the 1.04 value on thrust shaving, that is about the level of compliance we see for the Region 2.5 + # points coming out of the optimization routines in the next block of code. This way, a Region 2 point that is + # at optimal TSR-rpm and 0-deg pitch but 1% over the thrust target can be allowed to stand. if ( ((Omega[i] == Omega_tsr[i]) and not self.peak_thrust_shaving) - or ((Omega[i] == Omega_tsr[i]) and self.peak_thrust_shaving and (T[i] <= max_T)) + or ((Omega[i] == Omega_tsr[i]) and self.peak_thrust_shaving and (T[i]/max_T <= 1.04)) or ((Omega[i] == Omega_min) and self.fix_pitch_regI12) or (found_rated and (i == i_rated)) ): diff --git a/WISDEM/wisdem/rotorse/rotor_structure.py b/WISDEM/wisdem/rotorse/rotor_structure.py index a8ea4538b..8561f37af 100644 --- a/WISDEM/wisdem/rotorse/rotor_structure.py +++ b/WISDEM/wisdem/rotorse/rotor_structure.py @@ -29,6 +29,8 @@ def setup(self): self.add_input("precurve", val=np.zeros(n_span), units="m", desc="location in blade x-coordinate") self.add_input("presweep", val=np.zeros(n_span), units="m", desc="location in blade y-coordinate") self.add_input("precone", val=0.0, units="deg", desc="precone angle") + self.add_input("Rhub", val=0.0, units="m", desc="hub radius") + self.add_input("blade_span_cg", val=0.0, units="m", desc="Distance along the blade span for its center of gravity") # Outputs self.add_output( @@ -44,13 +46,16 @@ def setup(self): "z_az", val=np.zeros(n_span), units="m", desc="location of blade in azimuth z-coordinate system" ) self.add_output("s", val=np.zeros(n_span), units="m", desc="cumulative path length along blade") + self.add_output("blades_cg_hubcc", val=0.0, units="m", desc="cg of all blades relative to hub along shaft axis. Distance is should be interpreted as negative for upwind and positive for downwind turbines") def compute(self, inputs, outputs): r = inputs["r"] precurve = inputs["precurve"] presweep = inputs["presweep"] precone = inputs["precone"] - + r_cg = inputs["blade_span_cg"] + Rhub = inputs["Rhub"] + n = len(r) dx_dx = np.eye(3 * n) @@ -67,6 +72,11 @@ def compute(self, inputs, outputs): outputs["z_az"] = z_az outputs["s"] = s + # Compute cg location of all blades in hub coordinates + cone_cg = np.interp(r_cg, r, totalCone) + cg = (r_cg + Rhub) * np.sin(np.deg2rad(cone_cg)) + outputs["blades_cg_hubcc"] = cg + class TotalLoads(ExplicitComponent): # OpenMDAO component that takes as input the rotor configuration (tilt, cone), the blade twist and mass distributions, and the blade aerodynamic loading, and computes the total loading including gravity and centrifugal forces @@ -1305,7 +1315,6 @@ def setup(self): val=False, desc="whether discrete calculation is allowed. Set to False if in optimization loop. [bool]", ) # (hardcoded) TODO could add as user input - self.add_input("blade_mass_re", val=0, units="kg", desc="blade mass") self.add_input( "joint_nonmaterial_cost", val=0.0, @@ -1345,7 +1354,6 @@ def setup(self): # self.add_output("layer_offset_y_bjs", val=np.zeros((n_layers, n_span)), units="m", # desc="2D array of the offset along the y axis to set the position of a layer. Positive values move the layer towards the trailing edge, negative values towards the leading edge. The first dimension represents each layer, the second dimension represents each entry along blade span.") - self.add_output("blade_mass", val=0, units="kg", desc="blade mass") self.add_output( "joint_material_cost", val=0, units="USD", desc="cost of joint metallic parts (bolts, washers, and inserts)" ) @@ -1532,7 +1540,7 @@ def compute(self, inputs, outputs, discrete_inputs, discrete_outputs): # 3- Calculate # bolts such that axial flap bolt forces > edge bolt forces # Loop through number of possible bolts per spar cap, and calculate the following. When the flap ultimate and fatigue loads both # dominate, that is the minimum # bolts. Units are force per bolt ONLY HERE. - for n_bolt_min in range(3, int(np.ceil(n_bolt_max) // 2 * 2 + 1), 2): + for n_bolt_min in range(3, np.min([5, int(np.ceil(n_bolt_max) // 2 * 2 + 1)]), 2): N = int(np.floor(n_bolt_min / 2)) N_array = np.linspace(1, N, N) Fax_flap_ultimate_per_bolt = Mflap_ultimate / (d_b2b * n_bolt_min) @@ -1772,7 +1780,6 @@ def compute(self, inputs, outputs, discrete_inputs, discrete_outputs): t_reinf_ratio = t_req_reinf / t_reinf w_reinf_ratio = w_req_reinf / w_reinf - outputs["blade_mass"] = inputs["blade_mass_re"] + m_add # outputs['layer_offset_y_bjs'] = offset # outputs['layer_start_nd_bjs'] = layer_start_nd # outputs['layer_end_nd_bjs'] = layer_end_nd @@ -1785,7 +1792,8 @@ def compute(self, inputs, outputs, discrete_inputs, discrete_outputs): outputs["joint_material_cost"] = cost_joint_materials outputs["joint_total_cost"] = cost_joint_materials + inputs["joint_nonmaterial_cost"] - + + class RotorStructure(Group): # OpenMDAO group to compute the blade elastic properties, deflections, and loading def initialize(self): @@ -1835,11 +1843,11 @@ def setup(self): # self.add_subsystem('aero_storm_1yr', CCBladeLoads(modeling_options = modeling_options), promotes=promoteListAeroLoads) # self.add_subsystem('aero_storm_50yr', CCBladeLoads(modeling_options = modeling_options), promotes=promoteListAeroLoads) # Add centrifugal and gravity loading to aero loading - promotes = ["tilt", "theta", "rhoA", "z", "totalCone", "z_az"] + #promotes = ["tilt", "theta", "rhoA", "z", "totalCone", "z_az"] self.add_subsystem( "curvature", BladeCurvature(modeling_options=modeling_options), - promotes=["r", "precone", "precurve", "presweep", "3d_curv", "x_az", "y_az", "z_az"], + promotes=["r", "precone", "precurve", "presweep", "Rhub", "blade_span_cg", "3d_curv", "x_az", "y_az", "z_az"], ) promoteListTotalLoads = ["r", "theta", "tilt", "rhoA", "3d_curv", "z_az"] self.add_subsystem( diff --git a/WISDEM/wisdem/servose/servose.py b/WISDEM/wisdem/servose/servose.py deleted file mode 100644 index 61c22d191..000000000 --- a/WISDEM/wisdem/servose/servose.py +++ /dev/null @@ -1,738 +0,0 @@ -''' -Controller tuning script. - -Nikhar J. Abbas -January 2020 -''' - -from __future__ import print_function -import numpy as np -import datetime -import numpy as np -import os -from openmdao.api import IndepVarComp, ExplicitComponent, Group, Problem -from scipy import interpolate, gradient -from scipy.optimize import minimize_scalar, minimize, brentq -from scipy.interpolate import PchipInterpolator -from wisdem.ccblade import CCAirfoil, CCBlade -from wisdem.commonse.distribution import RayleighCDF, WeibullWithMeanCDF -from wisdem.commonse.utilities import vstack, trapz_deriv, linspace_with_deriv, smooth_min, smooth_abs -from wisdem.commonse.environment import PowerWind - -class ServoSE(Group): - def initialize(self): - self.options.declare('modeling_options') - self.options.declare('opt_options') - - def setup(self): - modeling_options = self.options['modeling_options'] - - self.add_subsystem('powercurve', RegulatedPowerCurve(modeling_options = modeling_options), promotes = ['v_min', 'v_max','rated_power','omega_min','omega_max', 'control_maxTS','tsr_operational','control_pitch','drivetrainType','r','chord', 'theta','Rhub', 'Rtip', 'hub_height','precone', 'tilt','yaw','precurve','precurveTip','presweep','presweepTip', 'airfoils_aoa','airfoils_Re','airfoils_cl','airfoils_cd','airfoils_cm', 'nBlades', 'rho', 'mu']) - self.add_subsystem('gust', GustETM()) - self.add_subsystem('cdf', WeibullWithMeanCDF(nspline=modeling_options['servose']['n_pc_spline'])) - self.add_subsystem('aep', AEP(nspline=modeling_options['servose']['n_pc_spline']), promotes=['AEP']) - - # Connections to the Weibull CDF - self.connect('powercurve.V_spline', 'cdf.x') - - # Connections to the aep computation component - self.connect('cdf.F', 'aep.CDF_V') - self.connect('powercurve.P_spline', 'aep.P') - -class GustETM(ExplicitComponent): - # OpenMDAO component that generates an "equivalent gust" wind speed by summing an user-defined wind speed at hub height with 3 times sigma. sigma is the turbulent wind speed standard deviation for the extreme turbulence model, see IEC-61400-1 Eq. 19 paragraph 6.3.2.3 - - def setup(self): - # Inputs - self.add_input('V_mean', val=0.0, units='m/s', desc='IEC average wind speed for turbine class') - self.add_input('V_hub', val=0.0, units='m/s', desc='hub height wind speed') - self.add_discrete_input('turbulence_class', val='A', desc='IEC turbulence class') - self.add_input('std', val=3.0, desc='number of standard deviations for strength of gust') - - # Output - self.add_output('V_gust', val=0.0, units='m/s', desc='gust wind speed') - - def compute(self, inputs, outputs, discrete_inputs, discrete_outputs): - V_mean = inputs['V_mean'] - V_hub = inputs['V_hub'] - std = inputs['std'] - turbulence_class = discrete_inputs['turbulence_class'] - - if turbulence_class.upper() == 'A': - Iref = 0.16 - elif turbulence_class.upper() == 'B': - Iref = 0.14 - elif turbulence_class.upper() == 'C': - Iref = 0.12 - else: - raise ValueError('Unknown Turbulence Class: '+str(turbulence_class)+' . Permitted values are A / B / C') - - c = 2.0 - sigma = c * Iref * (0.072*(V_mean/c + 3)*(V_hub/c - 4) + 10) - V_gust = V_hub + std*sigma - outputs['V_gust'] = V_gust - -class RegulatedPowerCurve(Group): - - def initialize(self): - self.options.declare('modeling_options') - - def setup(self): - modeling_options = self.options['modeling_options'] - - self.add_subsystem('compute_power_curve', ComputePowerCurve(modeling_options=modeling_options), promotes=['*']) - - self.add_subsystem('compute_splines', ComputeSplines(modeling_options=modeling_options), promotes=['*']) - -class ComputePowerCurve(ExplicitComponent): - """ - Iteratively call CCBlade to compute the power curve. - """ - - def initialize(self): - self.options.declare('modeling_options') - - def setup(self): - modeling_options = self.options['modeling_options'] - self.n_span = n_span = modeling_options['blade']['n_span'] - # self.n_af = n_af = af_init_options['n_af'] # Number of airfoils - self.n_aoa = n_aoa = modeling_options['airfoils']['n_aoa']# Number of angle of attacks - self.n_Re = n_Re = modeling_options['airfoils']['n_Re'] # Number of Reynolds, so far hard set at 1 - self.n_tab = n_tab = modeling_options['airfoils']['n_tab']# Number of tabulated data. For distributed aerodynamic control this could be > 1 - # self.n_xy = n_xy = af_init_options['n_xy'] # Number of coordinate points to describe the airfoil geometry - self.regulation_reg_III = modeling_options['servose']['regulation_reg_III'] - # n_span = self.n_span = self.options['n_span'] - self.n_pc = modeling_options['servose']['n_pc'] - self.n_pc_spline = modeling_options['servose']['n_pc_spline'] - # n_aoa = self.options['n_aoa'] - # n_re = self.options['n_re'] - - # parameters - self.add_input('v_min', val=0.0, units='m/s', desc='cut-in wind speed') - self.add_input('v_max', val=0.0, units='m/s', desc='cut-out wind speed') - self.add_input('rated_power', val=0.0, units='W', desc='electrical rated power') - self.add_input('omega_min', val=0.0, units='rpm', desc='minimum allowed rotor rotation speed') - self.add_input('omega_max', val=0.0, units='rpm', desc='maximum allowed rotor rotation speed') - self.add_input('control_maxTS', val=0.0, units='m/s', desc='maximum allowed blade tip speed') - self.add_input('tsr_operational', val=0.0, desc='tip-speed ratio in Region 2 (should be optimized externally)') - self.add_input('control_pitch', val=0.0, units='deg', desc='pitch angle in region 2 (and region 3 for fixed pitch machines)') - self.add_discrete_input('drivetrainType', val='GEARED') - self.add_input('gearbox_efficiency', val=0.0, desc='Gearbox efficiency') - self.add_input('generator_efficiency', val=0.0, desc='Generator efficiency') - - self.add_input('r', val=np.zeros(n_span), units='m', desc='radial locations where blade is defined (should be increasing and not go all the way to hub or tip)') - self.add_input('chord', val=np.zeros(n_span), units='m', desc='chord length at each section') - self.add_input('theta', val=np.zeros(n_span), units='deg', desc='twist angle at each section (positive decreases angle of attack)') - self.add_input('Rhub', val=0.0, units='m', desc='hub radius') - self.add_input('Rtip', val=0.0, units='m', desc='tip radius') - self.add_input('hub_height',val=0.0, units='m', desc='hub height') - self.add_input('precone', val=0.0, units='deg', desc='precone angle', ) - self.add_input('tilt', val=0.0, units='deg', desc='shaft tilt', ) - self.add_input('yaw', val=0.0, units='deg', desc='yaw error', ) - self.add_input('precurve', val=np.zeros(n_span), units='m', desc='precurve at each section') - self.add_input('precurveTip', val=0.0, units='m', desc='precurve at tip') - self.add_input('presweep', val=np.zeros(n_span), units='m', desc='presweep at each section') - self.add_input('presweepTip', val=0.0, units='m', desc='presweep at tip') - - # self.add_discrete_input('airfoils', val=[0]*n_span, desc='CCAirfoil instances') - self.add_input('airfoils_cl', val=np.zeros((n_span, n_aoa, n_Re, n_tab)), desc='lift coefficients, spanwise') - self.add_input('airfoils_cd', val=np.zeros((n_span, n_aoa, n_Re, n_tab)), desc='drag coefficients, spanwise') - self.add_input('airfoils_cm', val=np.zeros((n_span, n_aoa, n_Re, n_tab)), desc='moment coefficients, spanwise') - self.add_input('airfoils_aoa', val=np.zeros((n_aoa)), units='deg', desc='angle of attack grid for polars') - self.add_input('airfoils_Re', val=np.zeros((n_Re)), desc='Reynolds numbers of polars') - self.add_discrete_input('nBlades', val=0, desc='number of blades') - self.add_input('rho', val=1.225, units='kg/m**3', desc='density of air') - self.add_input('mu', val=1.81e-5, units='kg/(m*s)', desc='dynamic viscosity of air') - self.add_input('shearExp', val=0.0, desc='shear exponent') - self.add_discrete_input('nSector', val=4, desc='number of sectors to divide rotor face into in computing thrust and power') - self.add_discrete_input('tiploss', val=True, desc='include Prandtl tip loss model') - self.add_discrete_input('hubloss', val=True, desc='include Prandtl hub loss model') - self.add_discrete_input('wakerotation', val=True, desc='include effect of wake rotation (i.e., tangential induction factor is nonzero)') - self.add_discrete_input('usecd', val=True, desc='use drag coefficient in computing induction factors') - - - # outputs - self.add_output('V', val=np.zeros(self.n_pc), units='m/s', desc='wind vector') - self.add_output('Omega', val=np.zeros(self.n_pc), units='rpm', desc='rotor rotational speed') - self.add_output('pitch', val=np.zeros(self.n_pc), units='deg', desc='rotor pitch schedule') - self.add_output('P', val=np.zeros(self.n_pc), units='W', desc='rotor electrical power') - self.add_output('T', val=np.zeros(self.n_pc), units='N', desc='rotor aerodynamic thrust') - self.add_output('Q', val=np.zeros(self.n_pc), units='N*m', desc='rotor aerodynamic torque') - self.add_output('M', val=np.zeros(self.n_pc), units='N*m', desc='blade root moment') - self.add_output('Cp', val=np.zeros(self.n_pc), desc='rotor electrical power coefficient') - self.add_output('Cp_aero', val=np.zeros(self.n_pc), desc='rotor aerodynamic power coefficient') - self.add_output('Ct_aero', val=np.zeros(self.n_pc), desc='rotor aerodynamic thrust coefficient') - self.add_output('Cq_aero', val=np.zeros(self.n_pc), desc='rotor aerodynamic torque coefficient') - self.add_output('Cm_aero', val=np.zeros(self.n_pc), desc='rotor aerodynamic moment coefficient') - - self.add_output('V_R25', val=0.0, units='m/s', desc='region 2.5 transition wind speed') - self.add_output('rated_V', val=0.0, units='m/s', desc='rated wind speed') - self.add_output('rated_Omega', val=0.0, units='rpm', desc='rotor rotation speed at rated') - self.add_output('rated_pitch', val=0.0, units='deg', desc='pitch setting at rated') - self.add_output('rated_T', val=0.0, units='N', desc='rotor aerodynamic thrust at rated') - self.add_output('rated_Q', val=0.0, units='N*m', desc='rotor aerodynamic torque at rated') - self.add_output('ax_induct_regII', val=np.zeros(n_span), desc='rotor axial induction at cut-in wind speed along blade span') - self.add_output('tang_induct_regII', val=np.zeros(n_span), desc='rotor tangential induction at cut-in wind speed along blade span') - self.add_output('aoa_regII',val=np.zeros(n_span), units='deg', desc='angle of attack distribution along blade span at cut-in wind speed') - self.add_output('Cp_regII', val=0.0, desc='power coefficient at cut-in wind speed') - self.add_output('cl_regII', val=np.zeros(n_span), desc='lift coefficient distribution along blade span at cut-in wind speed') - self.add_output('cd_regII', val=np.zeros(n_span), desc='drag coefficient distribution along blade span at cut-in wind speed') - - # self.declare_partials('*', '*', method='fd', form='central', step=1e-6) - - def compute(self, inputs, outputs, discrete_inputs, discrete_outputs): - - # Create Airfoil class instances - af = [None]*self.n_span - for i in range(self.n_span): - if self.n_tab > 1: - ref_tab = int(np.floor(self.n_tab/2)) - af[i] = CCAirfoil(inputs['airfoils_aoa'], inputs['airfoils_Re'], inputs['airfoils_cl'][i,:,:,ref_tab], inputs['airfoils_cd'][i,:,:,ref_tab], inputs['airfoils_cm'][i,:,:,ref_tab]) - else: - af[i] = CCAirfoil(inputs['airfoils_aoa'], inputs['airfoils_Re'], inputs['airfoils_cl'][i,:,:,0], inputs['airfoils_cd'][i,:,:,0], inputs['airfoils_cm'][i,:,:,0]) - - self.ccblade = CCBlade(inputs['r'], inputs['chord'], inputs['theta'], af, inputs['Rhub'], inputs['Rtip'], discrete_inputs['nBlades'], inputs['rho'], inputs['mu'], inputs['precone'], inputs['tilt'], inputs['yaw'], inputs['shearExp'], inputs['hub_height'], discrete_inputs['nSector'], inputs['precurve'], inputs['precurveTip'],inputs['presweep'], inputs['presweepTip'], discrete_inputs['tiploss'], discrete_inputs['hubloss'],discrete_inputs['wakerotation'], discrete_inputs['usecd']) - - # JPJ: what is this grid for? Seems to be a special distribution of velocities - # for the hub - grid0 = np.cumsum(np.abs(np.diff(np.cos(np.linspace(-np.pi/4.,np.pi/2.,self.n_pc + 1))))) - grid1 = (grid0 - grid0[0])/(grid0[-1]-grid0[0]) - Uhub = grid1 * (inputs['v_max'] - inputs['v_min']) + inputs['v_min'] - - P_aero = np.zeros( Uhub.shape ) - Cp_aero = np.zeros( Uhub.shape ) - Ct_aero = np.zeros( Uhub.shape ) - Cq_aero = np.zeros( Uhub.shape ) - Cm_aero = np.zeros( Uhub.shape ) - P = np.zeros( Uhub.shape ) - Cp = np.zeros( Uhub.shape ) - T = np.zeros( Uhub.shape ) - Q = np.zeros( Uhub.shape ) - M = np.zeros( Uhub.shape ) - pitch = np.zeros( Uhub.shape ) + inputs['control_pitch'] - - # Unpack variables - P_rated = inputs['rated_power'] - R_tip = inputs['Rtip'] - tsr = inputs['tsr_operational'] - driveType = discrete_inputs['drivetrainType'] - driveEta = inputs['gearbox_efficiency'] * inputs['generator_efficiency'] - - # Set rotor speed based on TSR - Omega_tsr = Uhub * tsr / R_tip - - # Determine maximum rotor speed (rad/s)- either by TS or by control input - Omega_max = min([inputs['control_maxTS'] / R_tip, inputs['omega_max']*np.pi/30.]) - - # Apply maximum and minimum rotor speed limits - Omega = np.maximum(np.minimum(Omega_tsr, Omega_max), inputs['omega_min']*np.pi/30.) - Omega_rpm = Omega * 30. / np.pi - - # Set baseline power production - myout, derivs = self.ccblade.evaluate(Uhub, Omega_rpm, pitch, coefficients=True) - P_aero, T, Q, M, Cp_aero, Ct_aero, Cq_aero, Cm_aero = [myout[key] for key in ['P','T','Q','M','CP','CT','CQ','CM']] - P, eff = compute_P_and_eff(P_aero, P_rated, driveType, driveEta) - Cp = Cp_aero*eff - - - # Find Region 3 index - region_bool = np.nonzero(P >= P_rated)[0] - if len(region_bool)==0: - i_3 = self.n_pc - region3 = False - else: - i_3 = region_bool[0] + 1 - region3 = True - - # Guess at Region 2.5, but we will do a more rigorous search below - if Omega_max < Omega_tsr[-1]: - U_2p5 = np.interp(Omega[-1], Omega_tsr, Uhub) - outputs['V_R25'] = U_2p5 - else: - U_2p5 = Uhub[-1] - i_2p5 = np.nonzero(U_2p5 <= Uhub)[0][0] - - # Find rated index and guess at rated speed - if P_aero[-1] > P_rated: - U_rated = np.interp(P_rated, P_aero*eff, Uhub) - else: - U_rated = Uhub[-1] - i_rated = np.nonzero(U_rated <= Uhub)[0][0] - - # Function to be used inside of power maximization until Region 3 - def maximizePower(pitch, Uhub, Omega_rpm): - myout, _ = self.ccblade.evaluate([Uhub], [Omega_rpm], [pitch], coefficients=False) - return -myout['P'] - - # Maximize power until Region 3 - region2p5 = False - for i in range(i_3): - # No need to optimize if already doing well - if Omega[i] == Omega_tsr[i]: continue - - # Find pitch value that gives highest power rating - pitch0 = pitch[i] if i==0 else pitch[i-1] - bnds = [pitch0-10., pitch0+10.] - pitch[i] = minimize_scalar(lambda x: maximizePower(x, Uhub[i], Omega_rpm[i]), - bounds=bnds, method='bounded', options={'disp':False, 'xatol':1e-2, 'maxiter':40})['x'] - - # Find associated power - myout, _ = self.ccblade.evaluate([Uhub[i]], [Omega_rpm[i]], [pitch[i]], coefficients=True) - P_aero[i], T[i], Q[i], M[i], Cp_aero[i], Ct_aero[i], Cq_aero[i], Cm_aero[i] = [myout[key] for key in ['P','T','Q','M','CP','CT','CQ','CM']] - P[i], eff = compute_P_and_eff(P_aero[i], P_rated, driveType, driveEta) - Cp[i] = Cp_aero[i]*eff - - # Note if we find Region 2.5 - if ( (not region2p5) and (Omega[i] == Omega_max) and (P[i] < P_rated) ): - region2p5 = True - i_2p5 = i - - # Stop if we find Region 3 early - if P[i] > P_rated: - i_3 = i+1 - i_rated = i - break - - # Solve for rated velocity - # JPJ: why rename i_rated to i here? It removes clarity in the following 50 lines that we're looking at the rated properties - i = i_rated - if i < self.n_pc-1: - def const_Urated(x): - pitch = x[0] - Uhub_i = x[1] - Omega_i = min([Uhub_i * tsr / R_tip, Omega_max]) - myout, _ = self.ccblade.evaluate([Uhub_i], [Omega_i*30./np.pi], [pitch], coefficients=False) - P_aero_i = myout['P'] - P_i,eff = compute_P_and_eff(P_aero_i.flatten(), P_rated, driveType, driveEta) - return (P_i - P_rated) - - if region2p5: - # Have to search over both pitch and speed - x0 = [0.0, Uhub[i]] - bnds = [ np.sort([pitch[i-1], pitch[i+1]]), [Uhub[i-1], Uhub[i+1]] ] - const = {} - const['type'] = 'eq' - const['fun'] = const_Urated - params_rated = minimize(lambda x: x[1], x0, method='slsqp', bounds=bnds, constraints=const, tol=1e-3) - - if params_rated.success and not np.isnan(params_rated.x[1]): - U_rated = params_rated.x[1] - pitch[i] = params_rated.x[0] - else: - U_rated = U_rated # Use guessed value earlier - pitch[i] = 0.0 - else: - # Just search over speed - pitch[i] = 0.0 - try: - U_rated = brentq(lambda x: const_Urated([0.0, x]), Uhub[i-1], Uhub[i+1], - xtol = 1e-4, rtol = 1e-5, maxiter=40, disp=False) - except ValueError: - U_rated = minimize_scalar(lambda x: np.abs(const_Urated([0.0, x])), bounds=[Uhub[i-1], Uhub[i+1]], - method='bounded', options={'disp':False, 'xatol':1e-3, 'maxiter':40})['x'] - - Omega_rated = min([U_rated * tsr / R_tip, Omega_max]) - Omega[i:] = np.minimum(Omega[i:], Omega_rated) # Stay at this speed if hit rated too early - Omega_rpm = Omega * 30. / np.pi - myout, _ = self.ccblade.evaluate([U_rated], [Omega_rpm[i]], [pitch[i]], coefficients=True) - P_aero[i], T[i], Q[i], M[i], Cp_aero[i], Ct_aero[i], Cq_aero[i], Cm_aero[i] = [myout[key] for key in ['P','T','Q','M','CP','CT','CQ','CM']] - P[i], eff = compute_P_and_eff(P_aero[i], P_rated, driveType, driveEta) - Cp[i] = Cp_aero[i]*eff - P[i] = P_rated - - # Store rated speed in array - Uhub[i_rated] = U_rated - - # Store outputs - outputs['rated_V'] = np.float64(U_rated) - outputs['rated_Omega'] = Omega_rpm[i] - outputs['rated_pitch'] = pitch[i] - outputs['rated_T'] = T[i] - outputs['rated_Q'] = Q[i] - - # JPJ: this part can be converted into a BalanceComp with a solver. - # This will be less expensive and allow us to get derivatives through the process. - if region3: - # Function to be used to stay at rated power in Region 3 - def rated_power_dist(pitch, Uhub, Omega_rpm): - myout, _ = self.ccblade.evaluate([Uhub], [Omega_rpm], [pitch], coefficients=False) - P_aero = myout['P'] - P, eff = compute_P_and_eff(P_aero, P_rated, driveType, driveEta) - return (P - P_rated) - - # Solve for Region 3 pitch - options = {'disp':False} - if self.regulation_reg_III: - for i in range(i_3, self.n_pc): - pitch0 = pitch[i-1] - try: - pitch[i] = brentq(lambda x: rated_power_dist(x, Uhub[i], Omega_rpm[i]), pitch0, pitch0+10., - xtol = 1e-4, rtol = 1e-5, maxiter=40, disp=False) - except ValueError: - pitch[i] = minimize_scalar(lambda x: np.abs(rated_power_dist(x, Uhub[i], Omega_rpm[i])), bounds=[pitch0-5., pitch0+15.], - method='bounded', options={'disp':False, 'xatol':1e-3, 'maxiter':40})['x'] - - myout, _ = self.ccblade.evaluate([Uhub[i]], [Omega_rpm[i]], [pitch[i]], coefficients=True) - P_aero[i], T[i], Q[i], M[i], Cp_aero[i], Ct_aero[i], Cq_aero[i], Cm_aero[i] = [myout[key] for key in ['P','T','Q','M','CP','CT','CQ','CM']] - P[i], eff = compute_P_and_eff(P_aero[i], P_rated, driveType, driveEta) - Cp[i] = Cp_aero[i]*eff - #P[i] = P_rated - - else: - P[i_3:] = P_rated - T[i_3:] = 0 - Q[i_3:] = P[i_3:] / Omega[i_3:] - M[i_3:] = 0 - pitch[i_3:] = 0 - Cp[i_3:] = P[i_3:] / (0.5 * inputs['rho'] * np.pi * R_tip**2 * Uhub[i_3:]**3) - Ct_aero[i_3:] = 0 - Cq_aero[i_3:] = 0 - Cm_aero[i_3:] = 0 - - - outputs['T'] = T - outputs['Q'] = Q - outputs['Omega'] = Omega_rpm - - outputs['P'] = P - outputs['Cp'] = Cp - outputs['Cp_aero'] = Cp_aero - outputs['Ct_aero'] = Ct_aero - outputs['Cq_aero'] = Cq_aero - outputs['Cm_aero'] = Cm_aero - outputs['V'] = Uhub - outputs['M'] = M - outputs['pitch'] = pitch - - self.ccblade.induction_inflow = True - tsr_vec = Omega_rpm / 30. * np.pi * R_tip / Uhub - id_regII = np.argmin(abs(tsr_vec - inputs['tsr_operational'])) - loads, derivs = self.ccblade.distributedAeroLoads(Uhub[id_regII], Omega_rpm[id_regII], pitch[id_regII], 0.0) - - # outputs - outputs['ax_induct_regII'] = loads['a'] - outputs['tang_induct_regII'] = loads['ap'] - outputs['aoa_regII'] = loads['alpha'] - outputs['cl_regII'] = loads['Cl'] - outputs['cd_regII'] = loads['Cd'] - outputs['Cp_regII'] = Cp_aero[id_regII] - -class ComputeSplines(ExplicitComponent): - """ - Compute splined quantities for V, P, and Omega. - """ - - def initialize(self): - self.options.declare('modeling_options') - - def setup(self): - modeling_options = self.options['modeling_options'] - self.n_pc = modeling_options['servose']['n_pc'] - self.n_pc_spline = modeling_options['servose']['n_pc_spline'] - - self.add_input('v_min', val=0.0, units='m/s', desc='cut-in wind speed') - self.add_input('v_max', val=0.0, units='m/s', desc='cut-out wind speed') - self.add_input('V', val=np.zeros(self.n_pc), units='m/s', desc='wind vector') - self.add_input('Omega', val=np.zeros(self.n_pc), units='rpm', desc='rotor rotational speed') - self.add_input('P', val=np.zeros(self.n_pc), units='W', desc='rotor electrical power') - - self.add_output('V_spline', val=np.zeros(self.n_pc_spline), units='m/s', desc='wind vector') - self.add_output('P_spline', val=np.zeros(self.n_pc_spline), units='W', desc='rotor electrical power') - self.add_output('Omega_spline', val=np.zeros(self.n_pc_spline), units='rpm', desc='omega') - - self.declare_partials(of='V_spline', wrt='v_min') - self.declare_partials(of='V_spline', wrt='v_max') - - self.declare_partials(of='P_spline', wrt='v_min', method='fd') - self.declare_partials(of='P_spline', wrt='v_max', method='fd') - self.declare_partials(of='P_spline', wrt='V', method='fd') - self.declare_partials(of='P_spline', wrt='P', method='fd') - - self.declare_partials(of='Omega_spline', wrt='v_min', method='fd') - self.declare_partials(of='Omega_spline', wrt='v_max', method='fd') - self.declare_partials(of='Omega_spline', wrt='V', method='fd') - self.declare_partials(of='Omega_spline', wrt='Omega', method='fd') - - def compute(self, inputs, outputs): - # Fit spline to powercurve for higher grid density - V_spline = np.linspace(inputs['v_min'], inputs['v_max'], self.n_pc_spline) - spline = PchipInterpolator(inputs['V'], inputs['P']) - P_spline = spline(V_spline) - spline = PchipInterpolator(inputs['V'], inputs['Omega']) - Omega_spline = spline(V_spline) - - # outputs - outputs['V_spline'] = V_spline.flatten() - outputs['P_spline'] = P_spline.flatten() - outputs['Omega_spline'] = Omega_spline.flatten() - - def compute_partials(self, inputs, partials): - linspace_with_deriv - V_spline, dy_dstart, dy_dstop = linspace_with_deriv(inputs['v_min'], inputs['v_max'], self.n_pc_spline) - partials['V_spline', 'v_min'] = dy_dstart - partials['V_spline', 'v_max'] = dy_dstop - -# Class to define a constraint so that the blade cannot operate in stall conditions -class NoStallConstraint(ExplicitComponent): - def initialize(self): - - self.options.declare('modeling_options') - - def setup(self): - - modeling_options = self.options['modeling_options'] - self.n_span = n_span = modeling_options['blade']['n_span'] - self.n_aoa = n_aoa = modeling_options['airfoils']['n_aoa']# Number of angle of attacks - self.n_Re = n_Re = modeling_options['airfoils']['n_Re'] # Number of Reynolds, so far hard set at 1 - self.n_tab = n_tab = modeling_options['airfoils']['n_tab']# Number of tabulated data. For distributed aerodynamic control this could be > 1 - - self.add_input('s', val=np.zeros(n_span), desc='1D array of the non-dimensional spanwise grid defined along blade axis (0-blade root, 1-blade tip)') - self.add_input('aoa_along_span', val=np.zeros(n_span), units = 'deg', desc = 'Angle of attack along blade span') - self.add_input('stall_margin', val=3.0, units = 'deg', desc = 'Minimum margin from the stall angle') - self.add_input('min_s', val=0.25, desc = 'Minimum nondimensional coordinate along blade span where to define the constraint (blade root typically stalls)') - self.add_input('airfoils_cl', val=np.zeros((n_span, n_aoa, n_Re, n_tab)), desc='lift coefficients, spanwise') - self.add_input('airfoils_cd', val=np.zeros((n_span, n_aoa, n_Re, n_tab)), desc='drag coefficients, spanwise') - self.add_input('airfoils_cm', val=np.zeros((n_span, n_aoa, n_Re, n_tab)), desc='moment coefficients, spanwise') - self.add_input('airfoils_aoa', val=np.zeros((n_aoa)), units='deg', desc='angle of attack grid for polars') - - self.add_output('no_stall_constraint', val=np.zeros(n_span), desc = 'Constraint, ratio between angle of attack plus a margin and stall angle') - self.add_output('stall_angle_along_span',val=np.zeros(n_span), units = 'deg', desc = 'Stall angle along blade span') - - def compute(self, inputs, outputs): - - verbosity = True - - i_min = np.argmin(abs(inputs['min_s'] - inputs['s'])) - - for i in range(self.n_span): - unsteady = eval_unsteady(inputs['airfoils_aoa'], inputs['airfoils_cl'][i,:,0,0], inputs['airfoils_cd'][i,:,0,0], inputs['airfoils_cm'][i,:,0,0]) - outputs['stall_angle_along_span'][i] = unsteady['alpha1'] - if outputs['stall_angle_along_span'][i] == 0: - outputs['stall_angle_along_span'][i] = 1e-6 # To avoid nan - - for i in range(i_min, self.n_span): - outputs['no_stall_constraint'][i] = (inputs['aoa_along_span'][i] + inputs['stall_margin']) / outputs['stall_angle_along_span'][i] - - if verbosity == True: - if outputs['no_stall_constraint'][i] > 1: - print('Blade is stalling at span location %.2f %%' % (inputs['s'][i]*100.)) - -class AEP(ExplicitComponent): - def initialize(self): - - self.options.declare('nspline') - - def setup(self): - n_pc_spline = self.options['nspline'] - """integrate to find annual energy production""" - - # inputs - self.add_input('CDF_V', val=np.zeros(n_pc_spline), units='m/s', desc='cumulative distribution function evaluated at each wind speed') - self.add_input('P', val=np.zeros(n_pc_spline), units='W', desc='power curve (power)') - self.add_input('lossFactor', val=1.0, desc='multiplicative factor for availability and other losses (soiling, array, etc.)') - - # outputs - self.add_output('AEP', val=0.0, units='kW*h', desc='annual energy production') - - #self.declare_partials('*', '*', method='fd', form='central', step=1e-6) - - def compute(self, inputs, outputs): - - lossFactor = inputs['lossFactor'] - P = inputs['P'] - CDF_V = inputs['CDF_V'] - - factor = lossFactor/1e3*365.0*24.0 - outputs['AEP'] = factor*np.trapz(P, CDF_V) # in kWh - ''' - dAEP_dP, dAEP_dCDF = trapz_deriv(P, CDF_V) - dAEP_dP *= factor - dAEP_dCDF *= factor - - dAEP_dlossFactor = np.array([outputs['AEP']/lossFactor]) - self.J = {} - self.J['AEP', 'CDF_V'] = np.reshape(dAEP_dCDF, (1, len(dAEP_dCDF))) - self.J['AEP', 'P'] = np.reshape(dAEP_dP, (1, len(dAEP_dP))) - self.J['AEP', 'lossFactor'] = dAEP_dlossFactor - - def compute_partials(self, inputs, J): - J = self.J - ''' - -def compute_P_and_eff(aeroPower, ratedPower, drivetrainType, drivetrainEff): - - if drivetrainEff == 0.0: - drivetrainType = drivetrainType.upper() - if drivetrainType == 'GEARED': - constant = 0.01289 - linear = 0.08510 - quadratic = 0.0 - - elif drivetrainType == 'SINGLE_STAGE': - constant = 0.01331 - linear = 0.03655 - quadratic = 0.06107 - - elif drivetrainType == 'MULTI_DRIVE': - constant = 0.01547 - linear = 0.04463 - quadratic = 0.05790 - - elif drivetrainType == 'PM_DIRECT_DRIVE': - constant = 0.01007 - linear = 0.02000 - quadratic = 0.06899 - elif drivetrainType == 'CONSTANT_EFF': - constant = 0.00 - linear = 0.07 - quadratic = 0.0 - elif drivetrainType == 'DIRECT DRIVE': - constant = 0.00 - linear = 0.07 - quadratic = 0.0 - else: - exit('The drivetrain model is not supported! Please check servose.py') - - Pbar0 = aeroPower / ratedPower - - # handle negative power case (with absolute value) - Pbar1, dPbar1_dPbar0 = smooth_abs(Pbar0, dx=0.01) - - # truncate idealized power curve for purposes of efficiency calculation - Pbar, dPbar_dPbar1, _ = smooth_min(Pbar1, 1.0, pct_offset=0.01) - - # compute efficiency - eff = 1.0 - (constant/Pbar + linear + quadratic*Pbar) - else: - eff = drivetrainEff - - return aeroPower * eff, eff - -def eval_unsteady(alpha, cl, cd, cm): - # calculate unsteady coefficients from polars for OpenFAST's Aerodyn - - unsteady = {} - - alpha_rad = np.radians(alpha) - cn = cl*np.cos(alpha_rad) + cd*np.sin(alpha_rad) - - # alpha0, Cd0, Cm0 - aoa_l = [-30.] - aoa_h = [30.] - idx_low = np.argmin(abs(alpha-aoa_l)) - idx_high = np.argmin(abs(alpha-aoa_h)) - - if max(np.abs(np.gradient(cl)))>0.: - unsteady['alpha0'] = np.interp(0., cl[idx_low:idx_high], alpha[idx_low:idx_high]) - unsteady['Cd0'] = np.interp(0., cl[idx_low:idx_high], cd[idx_low:idx_high]) - unsteady['Cm0'] = np.interp(0., cl[idx_low:idx_high], cm[idx_low:idx_high]) - else: - unsteady['alpha0'] = 0. - unsteady['Cd0'] = cd[np.argmin(abs(alpha-0.))] - unsteady['Cm0'] = 0. - - - unsteady['eta_e']= 1 - unsteady['T_f0'] = "Default" - unsteady['T_V0'] = "Default" - unsteady['T_p'] = "Default" - unsteady['T_VL'] = "Default" - unsteady['b1'] = "Default" - unsteady['b2'] = "Default" - unsteady['b5'] = "Default" - unsteady['A1'] = "Default" - unsteady['A2'] = "Default" - unsteady['A5'] = "Default" - unsteady['S1'] = 0 - unsteady['S2'] = 0 - unsteady['S3'] = 0 - unsteady['S4'] = 0 - - def find_breakpoint(x, y, idx_low, idx_high, multi=1.): - lin_fit = np.interp(x[idx_low:idx_high], [x[idx_low],x[idx_high]], [y[idx_low],y[idx_high]]) - idx_break = 0 - lin_diff = 0 - for i, (fit, yi) in enumerate(zip(lin_fit, y[idx_low:idx_high])): - if multi==0: - diff_i = np.abs(yi-fit) - else: - diff_i = multi*(yi-fit) - if diff_i>lin_diff: - lin_diff = diff_i - idx_break = i - idx_break += idx_low - return idx_break - - # Cn1 - idx_alpha0 = np.argmin(abs(alpha-unsteady['alpha0'])) - - if max(np.abs(np.gradient(cm)))>1.e-10: - aoa_h = alpha[idx_alpha0]+35. - idx_high = np.argmin(abs(alpha-aoa_h)) - - cm_temp = cm[idx_low:idx_high] - idx_cm_min = [i for i,local_min in enumerate(np.r_[True, cm_temp[1:] < cm_temp[:-1]] & np.r_[cm_temp[:-1] < cm_temp[1:], True]) if local_min] + idx_low - idx_high = idx_cm_min[-1] - - - idx_Cn1 = find_breakpoint(alpha, cm, idx_alpha0, idx_high) - unsteady['Cn1'] = cn[idx_Cn1] - else: - idx_Cn1 = np.argmin(abs(alpha-0.)) - unsteady['Cn1'] = 0. - - - - # Cn2 - if max(np.abs(np.gradient(cm)))>1.e-10: - aoa_l = np.mean([alpha[idx_alpha0], alpha[idx_Cn1]])-30. - idx_low = np.argmin(abs(alpha-aoa_l)) - - cm_temp = cm[idx_low:idx_high] - idx_cm_min = [i for i,local_min in enumerate(np.r_[True, cm_temp[1:] < cm_temp[:-1]] & np.r_[cm_temp[:-1] < cm_temp[1:], True]) if local_min] + idx_low - idx_high = idx_cm_min[-1] - - idx_Cn2 = find_breakpoint(alpha, cm, idx_low, idx_alpha0, multi=0.) - unsteady['Cn2'] = cn[idx_Cn2] - else: - idx_Cn2 = np.argmin(abs(alpha-0.)) - unsteady['Cn2'] = 0. - - # C_nalpha - if max(np.abs(np.gradient(cm)))>1.e-10: - # unsteady['C_nalpha'] = np.gradient(cn, alpha_rad)[idx_alpha0] - unsteady['C_nalpha'] = max(np.gradient(cn[idx_alpha0:idx_Cn1], alpha_rad[idx_alpha0:idx_Cn1])) - - else: - unsteady['C_nalpha'] = 0. - - # alpha1, alpha2 - # finding the break point in drag as a proxy for Trailing Edge separation, f=0.7 - # 3d stall corrections cause erroneous f calculations - if max(np.abs(np.gradient(cm)))>1.0e-10: - aoa_l = [0.] - idx_low = np.argmin(abs(alpha-aoa_l)) - idx_alpha1 = find_breakpoint(alpha, cd, idx_low, idx_Cn1, multi=-1.) - unsteady['alpha1'] = alpha[idx_alpha1] - else: - idx_alpha1 = np.argmin(abs(alpha-0.)) - unsteady['alpha1'] = 0. - unsteady['alpha2'] = -1.*unsteady['alpha1'] - - - unsteady['St_sh'] = "Default" - unsteady['k0'] = 0 - unsteady['k1'] = 0 - unsteady['k2'] = 0 - unsteady['k3'] = 0 - unsteady['k1_hat'] = 0 - unsteady['x_cp_bar'] = "Default" - unsteady['UACutout'] = "Default" - unsteady['filtCutOff'] = "Default" - - unsteady['Alpha'] = alpha - unsteady['Cl'] = cl - unsteady['Cd'] = cd - unsteady['Cm'] = cm - - return unsteady \ No newline at end of file diff --git a/WISDEM/wisdem/test/test_commonse/test_distribution.py b/WISDEM/wisdem/test/test_commonse/test_distribution.py index fa274aace..4cb2ca54d 100644 --- a/WISDEM/wisdem/test/test_commonse/test_distribution.py +++ b/WISDEM/wisdem/test/test_commonse/test_distribution.py @@ -20,7 +20,7 @@ def test_distributions(self): prob.model.add_subsystem("comp2", WeibullWithMeanCDF(nspline=nspline), promotes_inputs=["*"]) prob.model.add_subsystem("comp3", RayleighCDF(nspline=nspline), promotes_inputs=["*"]) - prob.setup(force_alloc_complex=True) + prob.setup() # Add some arbitrary inputs prob.set_val("x", np.random.rand(nspline), units="m/s") @@ -30,9 +30,9 @@ def test_distributions(self): prob.run_model() - check = prob.check_partials(out_stream=None, compact_print=True, method="fd") + check = prob.check_partials(out_stream=None, compact_print=True, method="fd", step=1e-4) - assert_check_partials(check, atol=1e-5) + assert_check_partials(check, atol=1e-3, rtol=1e-4) def suite(): diff --git a/WISDEM/wisdem/test/test_commonse/test_wind_wave.py b/WISDEM/wisdem/test/test_commonse/test_wind_wave.py index f5c33f93e..03879ed15 100644 --- a/WISDEM/wisdem/test/test_commonse/test_wind_wave.py +++ b/WISDEM/wisdem/test/test_commonse/test_wind_wave.py @@ -98,7 +98,7 @@ def test_wave_derivs(self): prob.run_model() - check = prob.check_partials(out_stream=None, compact_print=True, method="fd") + check = prob.check_partials(out_stream=None, compact_print=True, method="fd", step=1e-4) assert_check_partials(check, rtol=5e-5, atol=1e-1) @@ -123,7 +123,7 @@ def test_wind_derivs(self): prob.run_model() - check = prob.check_partials(out_stream=None, compact_print=True, method="fd") + check = prob.check_partials(out_stream=None, compact_print=True, method="fd", step=1e-4) assert_check_partials(check, rtol=5e-5, atol=1e-1) diff --git a/WISDEM/wisdem/test/test_drivetrainse/test_components.py b/WISDEM/wisdem/test/test_drivetrainse/test_components.py index b6d24fbb4..6e616cbde 100644 --- a/WISDEM/wisdem/test/test_drivetrainse/test_components.py +++ b/WISDEM/wisdem/test/test_drivetrainse/test_components.py @@ -448,6 +448,7 @@ def testRNA(self): inputs["hub_system_mass"] = 25e3 inputs["hub_system_I"] = 25e3 * np.arange(1, 7) inputs["hub_system_cm"] = 2.0 + inputs["blades_cm"] = 0.0 inputs["shaft_start"] = np.zeros(3) myobj.compute(inputs, outputs, discrete_inputs, discrete_outputs) diff --git a/WISDEM/wisdem/test/test_drivetrainse/test_drive_structure.py b/WISDEM/wisdem/test/test_drivetrainse/test_drive_structure.py index f6f53c918..3d590172c 100644 --- a/WISDEM/wisdem/test/test_drivetrainse/test_drive_structure.py +++ b/WISDEM/wisdem/test/test_drivetrainse/test_drive_structure.py @@ -20,18 +20,18 @@ def setUp(self): self.discrete_inputs["upwind"] = True - self.inputs["L_12"] = 2.0 - self.inputs["L_h1"] = 1.0 - self.inputs["L_generator"] = 3.25 - # self.inputs['L_2n'] = 1.5 - # self.inputs['L_grs'] = 1.1 - # self.inputs['L_gsn'] = 1.1 - self.inputs["L_hss"] = 0.75 - self.inputs["L_gearbox"] = 1.2 - self.inputs["overhang"] = 6.25 - self.inputs["drive_height"] = 4.875 - self.inputs["tilt"] = 4.0 - self.inputs["access_diameter"] = 0.9 + self.inputs["L_12"] = np.array([2.0]) + self.inputs["L_h1"] = np.array([1.0]) + self.inputs["L_generator"] = np.array([3.25]) + # self.inputs['L_2n'] = np.array([1.5]) + # self.inputs['L_grs'] = np.array([1.1]) + # self.inputs['L_gsn'] = np.array([1.1]) + self.inputs["L_hss"] = np.array([0.75]) + self.inputs["L_gearbox"] = np.array([1.2]) + self.inputs["overhang"] = np.array([6.25]) + self.inputs["drive_height"] = np.array([4.875]) + self.inputs["tilt"] = np.array([4.0]) + self.inputs["access_diameter"] = np.array([0.9]) myones = np.ones(5) self.inputs["lss_diameter"] = 3.3 * myones @@ -42,55 +42,55 @@ def setUp(self): self.inputs["nose_wall_thickness"] = 0.1 * myones self.inputs["bedplate_wall_thickness"] = 0.06 * np.ones(npts) - self.inputs["bedplate_flange_width"] = 1.5 - self.inputs["bedplate_flange_thickness"] = 0.05 - # self.inputs['bedplate_web_height'] = 1.0 - self.inputs["bedplate_web_thickness"] = 0.05 + self.inputs["bedplate_flange_width"] = np.array([1.5]) + self.inputs["bedplate_flange_thickness"] = np.array([0.05]) + # self.inputs['bedplate_web_height'] = np.array([1.0]) + self.inputs["bedplate_web_thickness"] = np.array([0.05]) - self.inputs["D_top"] = 6.5 - self.inputs["hub_diameter"] = 4.0 + self.inputs["D_top"] = np.array([6.5]) + self.inputs["hub_diameter"] = np.array([4.0]) - self.inputs["other_mass"] = 200e3 - self.inputs["mb1_mass"] = 10e3 + self.inputs["other_mass"] = np.array([200e3]) + self.inputs["mb1_mass"] = np.array([10e3]) self.inputs["mb1_I"] = 10e3 * 0.5 * 2**2 * np.ones(3) - self.inputs["mb2_mass"] = 10e3 + self.inputs["mb2_mass"] = np.array([10e3]) self.inputs["mb2_I"] = 10e3 * 0.5 * 1.5**2 * np.ones(3) - self.inputs["mb1_max_defl_ang"] = 0.008 - self.inputs["mb2_max_defl_ang"] = 0.008 + self.inputs["mb1_max_defl_ang"] = np.array([0.008]) + self.inputs["mb2_max_defl_ang"] = np.array([0.008]) - self.inputs["m_stator"] = 100e3 - self.inputs["cm_stator"] = -0.3 + self.inputs["m_stator"] = np.array([100e3]) + self.inputs["cm_stator"] = np.array([-0.3]) self.inputs["I_stator"] = np.array([1e6, 5e5, 5e5, 0.0, 0.0, 0.0]) - self.inputs["generator_rotor_mass"] = 100e3 - self.inputs["cm_rotor"] = -0.3 + self.inputs["generator_rotor_mass"] = np.array([100e3]) + self.inputs["cm_rotor"] = np.array([-0.3]) self.inputs["generator_rotor_I"] = np.array([1e6, 5e5, 5e5, 0.0, 0.0, 0.0]) - self.inputs["generator_stator_mass"] = 100e3 - self.inputs["cm_rotor"] = -0.3 + self.inputs["generator_stator_mass"] = np.array([100e3]) + self.inputs["cm_rotor"] = np.array([-0.3]) self.inputs["generator_stator_I"] = np.array([1e6, 5e5, 5e5, 0.0, 0.0, 0.0]) - self.inputs["generator_mass"] = 200e3 + self.inputs["generator_mass"] = np.array([200e3]) self.inputs["generator_I"] = np.array([2e6, 1e6, 1e6, 0.0, 0.0, 0.0]) - self.inputs["gearbox_mass"] = 100e3 + self.inputs["gearbox_mass"] = np.array([100e3]) self.inputs["gearbox_I"] = np.array([1e6, 5e5, 5e5]) - self.inputs["brake_mass"] = 10e3 + self.inputs["brake_mass"] = np.array([10e3]) self.inputs["brake_I"] = np.array([1e4, 5e3, 5e3]) - self.inputs["carrier_mass"] = 10e3 + self.inputs["carrier_mass"] = np.array([10e3]) self.inputs["carrier_I"] = np.array([1e4, 5e3, 5e3]) - self.inputs["gear_ratio"] = 1.0 + self.inputs["gear_ratio"] = np.array([1.0]) self.inputs["F_mb1"] = np.array([2409.750e3, -1716.429e3, 74.3529e3]).reshape((3, 1)) self.inputs["F_mb2"] = np.array([2409.750e3, -1716.429e3, 74.3529e3]).reshape((3, 1)) self.inputs["M_mb1"] = np.array([-1.83291e7, 6171.7324e3, 5785.82946e3]).reshape((3, 1)) self.inputs["M_mb2"] = np.array([-1.83291e7, 6171.7324e3, 5785.82946e3]).reshape((3, 1)) - self.inputs["hub_system_mass"] = 100e3 - self.inputs["hub_system_cm"] = 2.0 + self.inputs["hub_system_mass"] = np.array([100e3]) + self.inputs["hub_system_cm"] = np.array([2.0]) self.inputs["hub_system_I"] = np.array([2409.750e3, -1716.429e3, 74.3529e3, 0.0, 0.0, 0.0]) self.inputs["F_hub"] = np.array([2409.750e3, 0.0, 74.3529e2]).reshape((3, 1)) self.inputs["M_hub"] = np.array([-1.83291e4, 6171.7324e2, 5785.82946e2]).reshape((3, 1)) @@ -100,23 +100,31 @@ def setUp(self): self.inputs["lss_rho"] = self.inputs["hss_rho"] = self.inputs["bedplate_rho"] = 7850.0 self.inputs["lss_Xy"] = self.inputs["hss_Xy"] = self.inputs["bedplate_Xy"] = 250e6 - self.inputs["shaft_deflection_allowable"] = 1e-4 - self.inputs["shaft_angle_allowable"] = 1e-3 - self.inputs["stator_deflection_allowable"] = 1e-4 - self.inputs["stator_angle_allowable"] = 1e-3 + self.inputs["shaft_deflection_allowable"] = np.array([1e-4]) + self.inputs["shaft_angle_allowable"] = np.array([1e-3]) + self.inputs["stator_deflection_allowable"] = np.array([1e-4]) + self.inputs["stator_angle_allowable"] = np.array([1e-3]) self.opt["gamma_f"] = 1.35 self.opt["gamma_m"] = 1.3 self.opt["gamma_n"] = 1.0 + + for k in self.inputs: + if type(self.inputs[k]) == type(np.array([])): continue + self.inputs[k] = np.array([self.inputs[k]]) + def compute_layout(self, direct=True): myobj = lay.DirectLayout() if direct else lay.GearedLayout() myobj.compute(self.inputs, self.outputs, self.discrete_inputs, self.discrete_outputs) for k in self.outputs.keys(): - self.inputs[k] = self.outputs[k] + if type(self.outputs[k]) == type(np.array([])): + self.inputs[k] = self.outputs[k] + else: + self.inputs[k] = np.array([ self.outputs[k] ]) def testBaseF_BaseM(self): - self.inputs["tilt"] = 0.0 + self.inputs["tilt"] = np.array([0.0]) self.inputs["F_mb1"] = np.zeros(3).reshape((3, 1)) self.inputs["F_mb2"] = np.zeros(3).reshape((3, 1)) self.inputs["M_mb1"] = np.zeros(3).reshape((3, 1)) @@ -157,7 +165,7 @@ def testBaseF_BaseM(self): npt.assert_almost_equal(self.outputs["base_F"][2], F0[2] - 500e3 * gravity + 2 * 50e2) def testBaseF_BaseM_withTilt(self): - self.inputs["tilt"] = 5.0 + self.inputs["tilt"] = np.array([5.0]) self.inputs["F_mb1"] = np.zeros(3).reshape((3, 1)) self.inputs["F_mb2"] = np.zeros(3).reshape((3, 1)) self.inputs["M_mb1"] = np.zeros(3).reshape((3, 1)) @@ -199,7 +207,7 @@ def testBaseF_BaseM_withTilt(self): npt.assert_almost_equal(self.outputs["base_F"][1], 2 * self.inputs["F_mb2"][1]) def testBaseF_BaseM_Downwind(self): - self.inputs["tilt"] = 0.0 + self.inputs["tilt"] = np.array([0.0]) self.discrete_inputs["upwind"] = False self.inputs["F_mb1"] = np.zeros(3).reshape((3, 1)) self.inputs["F_mb2"] = np.zeros(3).reshape((3, 1)) @@ -241,7 +249,7 @@ def testBaseF_BaseM_Downwind(self): npt.assert_almost_equal(self.outputs["base_F"][2], F0[2] - 500e3 * gravity + 2 * 50e2) def testBaseF_BaseM_withTilt_Downwind(self): - self.inputs["tilt"] = 5.0 + self.inputs["tilt"] = np.array([5.0]) self.discrete_inputs["upwind"] = False self.inputs["F_mb1"] = np.zeros(3).reshape((3, 1)) self.inputs["F_mb2"] = np.zeros(3).reshape((3, 1)) @@ -284,7 +292,7 @@ def testBaseF_BaseM_withTilt_Downwind(self): npt.assert_almost_equal(self.outputs["base_F"][1], 2 * self.inputs["F_mb2"][1]) def testBaseF_BaseM_Geared(self): - self.inputs["tilt"] = 0.0 + self.inputs["tilt"] = np.array([0.0]) self.inputs["F_mb1"] = np.zeros(3).reshape((3, 1)) self.inputs["F_mb2"] = np.zeros(3).reshape((3, 1)) self.inputs["F_torq"] = np.zeros(3).reshape((3, 1)) @@ -323,7 +331,7 @@ def testBaseF_BaseM_Geared(self): npt.assert_almost_equal(self.outputs["base_F"][2, 0], F0[2] - 500e3 * gravity + 4 * 50e2, decimal=0) def testBaseF_BaseM_withTilt_Geared(self): - self.inputs["tilt"] = 5.0 + self.inputs["tilt"] = np.array([5.0]) self.inputs["F_mb1"] = np.zeros(3).reshape((3, 1)) self.inputs["F_mb2"] = np.zeros(3).reshape((3, 1)) self.inputs["F_torq"] = np.zeros(3).reshape((3, 1)) @@ -361,7 +369,7 @@ def testBaseF_BaseM_withTilt_Geared(self): npt.assert_almost_equal(self.outputs["base_F"][1, 0], 4 * self.inputs["F_mb1"][1, 0], decimal=1) def testRunRotatingDirect_noTilt(self): - self.inputs["tilt"] = 0.0 + self.inputs["tilt"] = np.array([0.0]) self.inputs["F_hub"] = np.zeros(3).reshape((3, 1)) self.inputs["M_hub"] = np.zeros(3).reshape((3, 1)) self.compute_layout() @@ -377,7 +385,7 @@ def testRunRotatingDirect_noTilt(self): npt.assert_almost_equal(self.outputs["M_mb1"], 0.0, decimal=2) npt.assert_almost_equal(self.outputs["M_mb2"][[0, 2]], 0.0, decimal=2) npt.assert_almost_equal(self.outputs["M_torq"], 0.0, decimal=2) - self.assertAlmostEqual( + npt.assert_almost_equal( self.outputs["lss_spring_constant"], 80.8e9 * np.pi * (3.3**4 - 2.4**4) / 32 / self.inputs["L_lss"], 4 ) @@ -409,7 +417,7 @@ def testRunRotatingDirect_noTilt(self): ) def testRunRotatingDirect_withTilt(self): - self.inputs["tilt"] = 5.0 + self.inputs["tilt"] = np.array([5.0]) self.inputs["F_hub"] = np.zeros(3).reshape((3, 1)) self.inputs["M_hub"] = np.zeros(3).reshape((3, 1)) self.compute_layout() @@ -426,7 +434,7 @@ def testRunRotatingDirect_withTilt(self): npt.assert_almost_equal(self.outputs["M_mb1"], 0.0, decimal=2) npt.assert_almost_equal(self.outputs["M_mb2"][[0, 2]], 0.0, decimal=2) npt.assert_almost_equal(self.outputs["M_torq"], 0.0, decimal=2) - self.assertAlmostEqual( + npt.assert_almost_equal( self.outputs["lss_spring_constant"], 80.8e9 * np.pi * (3.3**4 - 2.4**4) / 32 / self.inputs["L_lss"], 4 ) @@ -458,8 +466,8 @@ def testRunRotatingDirect_withTilt(self): ) def testRunRotatingGeared_noTilt(self): - self.inputs["tilt"] = 0.0 - self.inputs["gear_ratio"] = 50.0 + self.inputs["tilt"] = np.array([0.0]) + self.inputs["gear_ratio"] = np.array([50.0]) self.inputs["F_hub"] = np.zeros(3).reshape((3, 1)) self.inputs["M_hub"] = np.zeros(3).reshape((3, 1)) self.compute_layout(False) @@ -507,8 +515,8 @@ def testRunRotatingGeared_noTilt(self): ) def testRunRotatingGeared_withTilt(self): - self.inputs["tilt"] = 5.0 - self.inputs["gear_ratio"] = 50.0 + self.inputs["tilt"] = np.array([5.0]) + self.inputs["gear_ratio"] = np.array([50.0]) self.inputs["F_hub"] = np.zeros(3).reshape((3, 1)) self.inputs["M_hub"] = np.zeros(3).reshape((3, 1)) self.compute_layout(False) @@ -557,8 +565,8 @@ def testRunRotatingGeared_withTilt(self): ) def testHSS_noTilt(self): - self.inputs["tilt"] = 0.0 - self.inputs["gear_ratio"] = 50.0 + self.inputs["tilt"] = np.array([0.0]) + self.inputs["gear_ratio"] = np.array([50.0]) self.inputs["F_hub"] = np.zeros(3).reshape((3, 1)) self.inputs["M_hub"] = np.zeros(3).reshape((3, 1)) self.compute_layout(False) @@ -581,8 +589,8 @@ def testHSS_noTilt(self): npt.assert_almost_equal(self.outputs["M_generator"].flatten(), np.r_[2 * g[0] / 50.0, M0[1], 0.0], decimal=2) def testHSS_withTilt(self): - self.inputs["tilt"] = 5.0 - self.inputs["gear_ratio"] = 50.0 + self.inputs["tilt"] = np.array([5.0]) + self.inputs["gear_ratio"] = np.array([50.0]) self.inputs["F_hub"] = np.zeros(3).reshape((3, 1)) self.inputs["M_hub"] = np.zeros(3).reshape((3, 1)) self.compute_layout(False) @@ -607,22 +615,22 @@ def testHSS_withTilt(self): def testShaftTheoryLSS(self): # https://www.engineersedge.com/calculators/torsional-stress-calculator.htm - self.inputs["tilt"] = 0.0 + self.inputs["tilt"] = np.array([0.0]) self.inputs["F_hub"] = np.zeros(3).reshape((3, 1)) self.inputs["M_hub"] = np.array([1e5, 0.0, 0.0]).reshape((3, 1)) - self.inputs["brake_mass"] = 0.0 + self.inputs["brake_mass"] = np.array([0.0]) self.inputs["brake_I"] = np.zeros(3) - self.inputs["generator_rotor_mass"] = 0.0 - self.inputs["cm_rotor"] = 0.0 + self.inputs["generator_rotor_mass"] = np.array([0.0]) + self.inputs["cm_rotor"] = np.array([0.0]) self.inputs["generator_rotor_I"] = np.zeros(6) - self.inputs["hub_system_mass"] = 0.0 - self.inputs["hub_system_cm"] = 0.0 + self.inputs["hub_system_mass"] = np.array([0.0]) + self.inputs["hub_system_cm"] = np.array([0.0]) self.inputs["hub_system_I"] = np.zeros(6) myones = np.ones(5) self.inputs["lss_diameter"] = 5 * myones self.inputs["lss_wall_thickness"] = 0.5 * myones - self.inputs["G"] = 100e9 - self.inputs["lss_rho"] = 1e-6 + self.inputs["G"] = np.array([100e9]) + self.inputs["lss_rho"] = np.array([1e-6]) self.compute_layout() myobj = ds.Hub_Rotor_LSS_Frame(n_dlcs=1, modeling_options=self.opt, direct_drive=True) myobj.compute(self.inputs, self.outputs, self.discrete_inputs, self.discrete_outputs) @@ -633,23 +641,23 @@ def testShaftTheoryLSS(self): def testShaftTheoryHSS(self): # https://www.engineersedge.com/calculators/torsional-stress-calculator.htm - self.inputs["tilt"] = 0.0 - self.inputs["gear_ratio"] = 50.0 + self.inputs["tilt"] = np.array([0.0]) + self.inputs["gear_ratio"] = np.array([50.0]) self.inputs["s_hss"] = np.array([0.0, 0.5, 1.0]) self.inputs["M_hub"] = np.array([1e5, 0.0, 0.0]).reshape((3, 1)) - self.inputs["s_generator"] = 0.0 - self.inputs["generator_mass"] = 0.0 + self.inputs["s_generator"] = np.array([0.0]) + self.inputs["generator_mass"] = np.array([0.0]) self.inputs["generator_I"] = np.zeros(3) - self.inputs["brake_mass"] = 0.0 + self.inputs["brake_mass"] = np.array([0.0]) self.inputs["brake_I"] = np.zeros(3) - self.inputs["hub_system_mass"] = 0.0 - self.inputs["hub_system_cm"] = 0.0 + self.inputs["hub_system_mass"] = np.array([0.0]) + self.inputs["hub_system_cm"] = np.array([0.0]) self.inputs["hub_system_I"] = np.zeros(6) myones = np.ones(3) self.inputs["hss_diameter"] = 5 * myones self.inputs["hss_wall_thickness"] = 0.5 * myones - self.inputs["G"] = 100e9 - self.inputs["hss_rho"] = 1e-6 + self.inputs["G"] = np.array([100e9]) + self.inputs["hss_rho"] = np.array([1e-6]) self.compute_layout() myobj = ds.HSS_Frame(modeling_options=self.opt, n_dlcs=1) myobj.compute(self.inputs, self.outputs) diff --git a/WISDEM/wisdem/test/test_drivetrainse/test_drivetrainse.py b/WISDEM/wisdem/test/test_drivetrainse/test_drivetrainse.py index 34903696f..bd1ceaab5 100644 --- a/WISDEM/wisdem/test/test_drivetrainse/test_drivetrainse.py +++ b/WISDEM/wisdem/test/test_drivetrainse/test_drivetrainse.py @@ -35,7 +35,9 @@ def set_common(prob, opt): ] = "steel" prob["material_names"] = ["steel"] - prob["blade_mass"] = 17000.0 + prob["blade_mass"] = 170.0 + prob["blades_mass"] = 3*prob["blade_mass"] + prob["blades_cm"] = 2.0 prob["pitch_system.BRFM"] = 1.0e6 prob["pitch_system_scaling_factor"] = 0.54 diff --git a/WISDEM/wisdem/test/test_examples/test_examples.py b/WISDEM/wisdem/test/test_examples/test_examples.py index fabaf9ab4..92f48301b 100644 --- a/WISDEM/wisdem/test/test_examples/test_examples.py +++ b/WISDEM/wisdem/test/test_examples/test_examples.py @@ -53,6 +53,7 @@ "16_inverse_design/inverse_spar_design", "17_jacket/jacket_driver", "18_rotor_tower_monopile/design_run", + "19_rotor_drivetrain_tower/wisdem_driver" ] diff --git a/WISDEM/wisdem/test/test_fixed_bottomse/test_monopile.py b/WISDEM/wisdem/test/test_fixed_bottomse/test_monopile.py index a3f4ea810..abebd79d1 100644 --- a/WISDEM/wisdem/test/test_fixed_bottomse/test_monopile.py +++ b/WISDEM/wisdem/test/test_fixed_bottomse/test_monopile.py @@ -133,11 +133,6 @@ def setUp(self): self.modeling_options["WISDEM"]["TowerSE"] = {} self.modeling_options["WISDEM"]["TowerSE"]["n_height"] = 0 - self.modeling_options["flags"] = {} - self.modeling_options["flags"]["tower"] = False - self.modeling_options["WISDEM"]["TowerSE"] = {} - self.modeling_options["WISDEM"]["TowerSE"]["n_height"] = 0 - def testProblemFixedPile(self): self.modeling_options["WISDEM"]["FixedBottomSE"]["n_height"] = 3 self.modeling_options["WISDEM"]["FixedBottomSE"]["n_layers"] = 1 @@ -229,7 +224,7 @@ def testProblemFixedPile(self): npt.assert_equal(prob.model.monopile.frame.ENMIyz, np.r_[20.0, 0, 0]) self.assertEqual(prob.model.monopile.frame.addGravityLoadForExtraNodeMass, [False, True, True]) - npt.assert_equal(prob.model.monopile.frame.loadCases[0].NF, np.array([7])) + npt.assert_equal(prob.model.monopile.frame.loadCases[0].NF, np.array([6])) npt.assert_equal(prob.model.monopile.frame.loadCases[0].Fx, np.array([2e3])) npt.assert_equal(prob.model.monopile.frame.loadCases[0].Fy, np.array([3e3])) npt.assert_equal(prob.model.monopile.frame.loadCases[0].Fz, np.array([4e3])) @@ -322,7 +317,7 @@ def testProblemFixedPile_GBF(self): npt.assert_equal(prob.model.monopile.frame.ENMIyz, np.r_[20.0, 0, 0]) self.assertEqual(prob.model.monopile.frame.addGravityLoadForExtraNodeMass, [False, True, True]) - npt.assert_equal(prob.model.monopile.frame.loadCases[0].NF, np.array([7])) + npt.assert_equal(prob.model.monopile.frame.loadCases[0].NF, np.array([6])) npt.assert_equal(prob.model.monopile.frame.loadCases[0].Fx, np.array([2e3])) npt.assert_equal(prob.model.monopile.frame.loadCases[0].Fy, np.array([3e3])) npt.assert_equal(prob.model.monopile.frame.loadCases[0].Fz, np.array([4e3])) @@ -541,38 +536,38 @@ def fill_prob(): npt.assert_almost_equal(prob["constr_taper"], [1.0, 0.9166667]) npt.assert_almost_equal(prob["env1.Uref"], [11.73732]) npt.assert_almost_equal(prob["env2.Uref"], [70.0]) - npt.assert_almost_equal(prob["monopile.f1"], [3.53554], 3) - npt.assert_almost_equal(prob["monopile.top_deflection"], [0.056755, 0.0394022], 3) + npt.assert_almost_equal(prob["monopile.f1"], [2.8398576087517053], 3) + npt.assert_almost_equal(prob["monopile.top_deflection"], [0.04355821, 0.02954024], 3) npt.assert_almost_equal( prob["post.constr_stress"].T, [ - [0.0372779, 0.0337903, 0.0482929, 0.2125795, 0.0967647, 0.0340002], - [0.0372938, 0.0338114, 0.0482945, 0.1659131, 0.0697094, 0.0242279], + [0.03621886, 0.01703012, 0.12382096, 0.13827159, 0.0554332 , 0.0103132], + [0.03654998, 0.02114141, 0.09185545, 0.11722759, 0.04804874, 0.01055353], ], 3, ) npt.assert_almost_equal( prob["post.constr_global_buckling"].T, [ - [0.1111194, 0.1078628, 0.1059669, 0.2504749, 0.1804414, 0.1316626], - [0.1111339, 0.1078719, 0.1055219, 0.2067972, 0.1554102, 0.1238287], + [0.11201532, 0.12416107, 0.19921349, 0.17590641, 0.12969364, 0.08627106], + [0.11175936, 0.11925156, 0.17013531, 0.15228978, 0.12254481, 0.08627106], ], - 3, + 1, ) npt.assert_almost_equal( prob["post.constr_shell_buckling"].T, [ - [0.0036597, 0.00307, 0.5744819, 1.7998724, 0.6496062, 0.0965889], - [0.0036624, 0.0030726, 0.5745546, 1.7705757, 0.639032, 0.095599], + [3.48351802e-03, 1.22719645e-03, 5.91172710e-01, 1.76188441e+00, 6.40073045e-01, 8.86263582e-02], + [3.53637449e-03, 1.49967206e-03, 5.79737681e-01, 1.75253067e+00, 6.36853128e-01, 9.12750704e-02], ], 3, ) - npt.assert_almost_equal(prob["monopile.mudline_F"][0, :], [1284945.63, 930340.72], 2) + npt.assert_almost_equal(prob["monopile.mudline_F"][0, :], [1284980.175382 , 930363.07603095 ], 2) npt.assert_array_less(np.abs(prob["monopile.mudline_F"][1, :]), 1e2, 2) - npt.assert_almost_equal(prob["monopile.mudline_F"][2, :], [-4732577.31, -4735037.21], 2) + npt.assert_almost_equal(prob["monopile.mudline_F"][2, :], [-4732577.31059091, -4735037.20580716], 2) npt.assert_almost_equal( prob["monopile.mudline_M"].T, - [[3989998.0, 49335629.0, -346819.0], [-1694833.0, 34839753.0, 147318.0]], + [[3983126.23029407, 32107268.56484913, -346819.26780544], [-1691961.71385695, 22367653.91976971, 147317.94383742]], 0, ) @@ -591,38 +586,38 @@ def fill_prob(): npt.assert_almost_equal(prob["constr_taper"], [1.0, 0.9166667]) npt.assert_almost_equal(prob["env1.Uref"], [11.73732]) npt.assert_almost_equal(prob["env2.Uref"], [70.0]) - npt.assert_almost_equal(prob["monopile.f1"], [3.53554], 3) - npt.assert_almost_equal(prob["monopile.top_deflection"], [0.056755, 0.0394022], 3) + npt.assert_almost_equal(prob["monopile.f1"], [2.83985761], 3) + npt.assert_almost_equal(prob["monopile.top_deflection"], [0.04355821, 0.02954024], 3) npt.assert_almost_equal( prob["post.constr_stress"].T, [ - [0.0372779, 0.0337903, 0.0482929, 0.2125795, 0.0967647, 0.0340002], - [0.0372938, 0.0338114, 0.0482945, 0.1659131, 0.0697094, 0.0242279], + [0.03621886, 0.01703012, 0.12382096, 0.13827159, 0.0554332 , 0.0103132], + [0.03654998, 0.02114141, 0.09185545, 0.11722759, 0.04804874, 0.01055353], ], - 3, + 2, ) npt.assert_almost_equal( prob["post.constr_global_buckling"].T, [ - [0.0970155, 0.0879896, 0.0828488, 0.4902017, 0.2786416, 0.1273858], - [0.0970729, 0.0880299, 0.0815925, 0.3654642, 0.2072469, 0.1050964], + [3.26314825e-02, 3.72313282e-02, 7.27690933e-02, 6.17409738e-02, 3.66561462e-02, 1.10114706e-10], + [3.25111251e-02, 3.48132378e-02, 5.84439044e-02, 5.00955704e-02, 3.31423289e-02, 8.02600909e-11], ], - 3, + 1, ) npt.assert_almost_equal( prob["post.constr_shell_buckling"].T, [ - [0.0370404, 0.0335843, 0.5411192, 1.6984705, 0.7773026, 0.1814782], - [0.037056, 0.0336, 0.54113, 1.698486, 0.7773183, 0.1850297], + [0.03704038, 0.03358431, 0.54111924, 1.69847046, 0.77730261, 0.16248498], + [0.03705603, 0.03359996, 0.54113001, 1.69848602, 0.77731831, 0.16627155], ], - 3, + 2, ) - npt.assert_almost_equal(prob["monopile.mudline_F"][0, :], [1284945.63, 930340.72], 2) + npt.assert_almost_equal(prob["monopile.mudline_F"][0, :], [1284980.175382 , 930363.07603095], 2) npt.assert_array_less(np.abs(prob["monopile.mudline_F"][1, :]), 1e2, 2) npt.assert_almost_equal(prob["monopile.mudline_F"][2, :], [-4732577.31, -4735037.21], 2) npt.assert_almost_equal( prob["monopile.mudline_M"].T, - [[3989998.0, 49335629.0, -346819.0], [-1694833.0, 34839753.0, 147318.0]], + [[3983126.23029407, 32107268.56484913, -346819.26780544], [-1691961.71385695, 22367653.91976971, 147317.94383742]], 0, ) diff --git a/WISDEM/wisdem/test/test_floatingse/test_constraints.py b/WISDEM/wisdem/test/test_floatingse/test_constraints.py index e7eeb97b4..6a70f5c17 100644 --- a/WISDEM/wisdem/test/test_floatingse/test_constraints.py +++ b/WISDEM/wisdem/test/test_floatingse/test_constraints.py @@ -26,7 +26,10 @@ def testAll(self): for k in range(n_member): inputs[f"member{k}:nodes_xyz"] = NULL * np.ones((MEMMAX, 3)) inputs[f"member{k}:constr_ballast_capacity"] = np.array([0.6]) - inputs[f"member{k}:nodes_xyz"][:2, :] = np.array([[0, 0, -1], [0, 0, 1]]) + # semi-like members with 2m spacing + x = 2 * np.cos(k*(2*np.pi)/n_member) + y = 2 * np.sin(k*(2*np.pi)/n_member) + inputs[f"member{k}:nodes_xyz"][:2, :] = np.array([[x, y, -1], [x, y, 1]]) inputs["Hsig_wave"] = 10.0 inputs["variable_ballast_mass"] = 3.0 @@ -48,15 +51,15 @@ def testAll(self): myobj = cons.FloatingConstraints(modeling_options=opt) myobj.compute(inputs, outputs) - _, free2 = util.rotate(0.0, 0.0, 0.0, -4.0, np.deg2rad(20)) - _, draft2 = util.rotate(0.0, 0.0, 0.0, -6.0, np.deg2rad(20)) + _, free2 = util.rotate(0.0, 0.0, 2.0, -4.0, -np.deg2rad(20)) # need to check when freeboard goes below surface, opposite direction + _, draft2 = util.rotate(0.0, 0.0, 2.0, -6.0, np.deg2rad(20)) npt.assert_equal(outputs["constr_fixed_margin"], 0.6 * np.ones(6)) self.assertEqual(outputs["constr_fairlead_wave"], 1.1 * 0.5) self.assertEqual(outputs["metacentric_height"], 0.1 - (5 - 1)) self.assertEqual(outputs["constr_mooring_surge"], 1e5 - 1e2) self.assertEqual(outputs["constr_mooring_heel"], 10 * 2e5 + (5 + 20) * 4e5 + 2e5 - 1e2 * (10 - 5) - 2e2) - npt.assert_equal(outputs["constr_freeboard_heel_margin"], -(-4.0 - free2)) - npt.assert_equal(outputs["constr_draft_heel_margin"], -(-6.0 - draft2)) + npt.assert_almost_equal(outputs["constr_freeboard_heel_margin"], (-4.0 - free2), decimal = 8) + npt.assert_almost_equal(outputs["constr_draft_heel_margin"], -(-6.0 - draft2), decimal = 8) def suite(): diff --git a/WISDEM/wisdem/test/test_gluecode/test_gc_modified_yaml.py b/WISDEM/wisdem/test/test_gluecode/test_gc_modified_yaml.py index 2546e2acd..f05d89216 100644 --- a/WISDEM/wisdem/test/test_gluecode/test_gc_modified_yaml.py +++ b/WISDEM/wisdem/test/test_gluecode/test_gc_modified_yaml.py @@ -27,7 +27,7 @@ def test15MW(self): fname_wt_input = test_dir + "IEA-15-240-RWT.yaml" wt_opt, _, _ = run_wisdem(fname_wt_input, fname_modeling_options, fname_analysis_options) - self.assertAlmostEqual(wt_opt["rotorse.re.precomp.blade_mass"][0], 68638.59685256994, 1) # new value: improved interpolation + self.assertAlmostEqual(wt_opt["rotorse.blade_mass"][0], 68638.59685256994, 1) # new value: improved interpolation self.assertAlmostEqual(wt_opt["rotorse.rp.AEP"][0] * 1.0e-6, 78.02354127898653, 1) self.assertAlmostEqual(wt_opt["financese.lcoe"][0] * 1.0e3, 86.09665065848567, 1) self.assertAlmostEqual(wt_opt["rotorse.rs.tip_pos.tip_deflection"][0], 25.105945564423433, 1) diff --git a/WISDEM/wisdem/test/test_gluecode/test_gc_yaml_floating.py b/WISDEM/wisdem/test/test_gluecode/test_gc_yaml_floating.py index 2171a6e66..b8a0bb365 100644 --- a/WISDEM/wisdem/test/test_gluecode/test_gc_yaml_floating.py +++ b/WISDEM/wisdem/test/test_gluecode/test_gc_yaml_floating.py @@ -28,7 +28,7 @@ def test15MW(self): fname_wt_input, fname_modeling_options, fname_analysis_options ) - self.assertAlmostEqual(wt_opt["rotorse.re.precomp.blade_mass"][0], 68638.59685256994, 1) # new value: improved interpolation + self.assertAlmostEqual(wt_opt["rotorse.blade_mass"][0], 68638.59685256994, 1) # new value: improved interpolation self.assertAlmostEqual(wt_opt["rotorse.rp.AEP"][0] * 1.0e-6, 77.93762832082594, 1) self.assertAlmostEqual(wt_opt["financese.lcoe"][0] * 1.0e3, 94.1990688526057, 1) self.assertAlmostEqual(wt_opt["rotorse.rs.tip_pos.tip_deflection"][0], 25.5319886366, 1) diff --git a/WISDEM/wisdem/test/test_gluecode/test_gluecode.py b/WISDEM/wisdem/test/test_gluecode/test_gluecode.py index bd131c314..6af5d0823 100644 --- a/WISDEM/wisdem/test/test_gluecode/test_gluecode.py +++ b/WISDEM/wisdem/test/test_gluecode/test_gluecode.py @@ -23,10 +23,10 @@ def test5MW(self): wt_opt, _, _ = run_wisdem(fname_wt_input, fname_modeling_options, fname_analysis_options) self.assertAlmostEqual( - wt_opt["rotorse.re.precomp.blade_mass"][0], 16469.892550688553, 2 + wt_opt["rotorse.blade_mass"][0], 16469.892550688553, 2 ) # new value: improved interpolation self.assertAlmostEqual(wt_opt["rotorse.rp.AEP"][0] * 1.0e-6, 23.900168464005557, 2) - self.assertAlmostEqual(wt_opt["financese.lcoe"][0] * 1.0e3, 51.8961397857, 1) + self.assertAlmostEqual(wt_opt["financese.lcoe"][0] * 1.0e3, 52.89293315329962, 1) self.assertAlmostEqual(wt_opt["rotorse.rs.tip_pos.tip_deflection"][0], 4.5072101787, 1) self.assertAlmostEqual(wt_opt["towerse.z_param"][-1], 87.7, 2) @@ -36,7 +36,7 @@ def test15MW(self): wt_opt, _, _ = run_wisdem(fname_wt_input, fname_modeling_options, fname_analysis_options) self.assertAlmostEqual( - wt_opt["rotorse.re.precomp.blade_mass"][0], 68638.59685256994, 1 + wt_opt["rotorse.blade_mass"][0], 68638.59685256994, 1 ) # new value: improved interpolation self.assertAlmostEqual(wt_opt["rotorse.rp.AEP"][0] * 1.0e-6, 77.90636811710237, 1) self.assertAlmostEqual(wt_opt["financese.lcoe"][0] * 1.0e3, 84.3298862022, 1) @@ -49,10 +49,10 @@ def test3p4MW(self): wt_opt, _, _ = run_wisdem(fname_wt_input, fname_modeling_options, fname_analysis_options) self.assertAlmostEqual( - wt_opt["rotorse.re.precomp.blade_mass"][0], 14542.248883586388, 1 + wt_opt["rotorse.blade_mass"][0], 14542.248883586388, 1 ) # new value: improved interpolation self.assertAlmostEqual(wt_opt["rotorse.rp.AEP"][0] * 1.0e-6, 13.606611767407955, 1) - self.assertAlmostEqual(wt_opt["financese.lcoe"][0] * 1.0e3, 37.8013895250, 1) + self.assertAlmostEqual(wt_opt["financese.lcoe"][0] * 1.0e3, 39.37508197421948, 1) self.assertAlmostEqual(wt_opt["rotorse.rs.tip_pos.tip_deflection"][0], 6.5221733906, 1) self.assertAlmostEqual(wt_opt["towerse.z_param"][-1], 108.0, 3) diff --git a/WISDEM/wisdem/test/test_landbosse/test_landbosse.py b/WISDEM/wisdem/test/test_landbosse/test_landbosse.py index ecc613eb5..27ebb0bd3 100644 --- a/WISDEM/wisdem/test/test_landbosse/test_landbosse.py +++ b/WISDEM/wisdem/test/test_landbosse/test_landbosse.py @@ -65,7 +65,6 @@ def compare_expected_to_actual(expected_df, actual_module_type_operation_list, v ) comparison["% delta"] = (comparison["Cost / project actual"] / comparison["Cost / project expected"] - 1) * 100 - comparison.to_csv(validation_output_csv, index=False) # If the comparison dataframe is empty, that means there are no common @@ -104,4 +103,5 @@ def test_landbosse(landbosse_costs_by_module_type_operation): result = compare_expected_to_actual( costs_by_module_type_operation, landbosse_costs_by_module_type_operation, "test.csv" ) + assert result diff --git a/WISDEM/wisdem/test/test_moorpy/__init__.py b/WISDEM/wisdem/test/test_moorpy/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/WISDEM/wisdem/test/test_moorpy/correct_imports.sh b/WISDEM/wisdem/test/test_moorpy/correct_imports.sh deleted file mode 100755 index 24a46f393..000000000 --- a/WISDEM/wisdem/test/test_moorpy/correct_imports.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -sed -i -s 's/from moorpy/from wisdem.moorpy/g' *.py -sed -i -s 's/import moorpy/import wisdem.moorpy/g' *.py diff --git a/WISDEM/wisdem/test/test_moorpy/seabed_contact.py b/WISDEM/wisdem/test/test_moorpy/seabed_contact.py deleted file mode 100644 index ff7cf3761..000000000 --- a/WISDEM/wisdem/test/test_moorpy/seabed_contact.py +++ /dev/null @@ -1,37 +0,0 @@ -# playing around with seabed contact scenarios - -# import pytest -# from numpy.testing import assert_allclose - -import numpy as np -import matplotlib.pyplot as plt - -import wisdem.moorpy as mp - -ms = mp.System(depth=200) - -ms.addPoint(1, [-100, 0, -50]) -ms.addPoint(1, [100, 0, 0]) -ms.addPoint(0, [0, 0, -90]) - -ms.addLineType("chain", 0.1, 50.0, 1e12) - -ms.addLine(120, "chain") -ms.addLine(200, "chain") - -ms.pointList[2].attachLine(1, 0) -ms.pointList[2].attachLine(2, 0) -ms.pointList[0].attachLine(1, 1) -ms.pointList[1].attachLine(2, 1) - -ms.initialize() - -ms.solveEquilibrium3() -fig, ax = ms.plot2d(color="r") - -for depth in [100, 110, 120, 130, 140]: - ms.depth = depth - ms.solveEquilibrium3() - ms.plot2d(color="k", ax=ax) - -plt.show() diff --git a/WISDEM/wisdem/test/test_moorpy/test_catenary.py b/WISDEM/wisdem/test/test_moorpy/test_catenary.py deleted file mode 100644 index f1f618f53..000000000 --- a/WISDEM/wisdem/test/test_moorpy/test_catenary.py +++ /dev/null @@ -1,63 +0,0 @@ -# tests basic catenary function - -import pytest -from numpy.testing import assert_allclose - -from wisdem.moorpy.Catenary import catenary - -# inputs of: x, z, L, EA, w, CB, HF0, VF0 -indata = [ - [400, 200, 500.0, 7510000000000.0, 800.0, 5.0, 0, 0], - [400, 200, 500.0, 7510000000000.0, 800.0, 0.0, 0, 0], - [400, 200, 500.0, 7510000000000.0, 800.0, 0.1, 0, 0], - [400, 200, 500.0, 7510000000000.0, 200.0, -372.7, 0, 0], - [89.9, 59.2, 130.0, 751000000.0, 881.05, -372.7, 0, 0], - [ - 37.96888656874307, - 20.49078283711694, - 100.0, - 751000000.0, - -881.0549577007893, - -1245.2679469540894, - 63442.20077641379, - -27995.71383270186, - ], -] - -# desired results of: fAH, fAV, fBH, fBV, LBot -desired = [ - [0.0, 0.0, -96643.43501616362, -237751.75997440016, 202.81030003199982], - [96643.42815934008, 0.0, -96643.42815934008, -237751.75535996316, 202.81030580004602], - [80418.60434855078, 0.0, -96643.42877136687, -237751.75577183915, 202.81030528520108], - [43694.580989249596, -22365.599350216216, -43694.580989249596, -77634.40064978378, 0], - [31373.229006023103, -26650.341270116318, -31373.229006023103, -87886.15872988368, 0], - [6428.437434537766, 53178.729367882406, -6428.437434537766, 34926.76640219652, 0], -] - - -@pytest.mark.parametrize("index", range(len(indata))) -def test_catenary_solutions(index): - """Run each of the test parameter sets with the catenary function and compare results to expected values.""" - - ins = indata[index] - - (fAH, fAV, fBH, fBV, info) = catenary(*ins[:5], CB=ins[5], HF0=ins[6], VF0=ins[7], Tol=0.0001, MaxIter=50, plots=3) - - print(f"ProfileType is {info['ProfileType']}") - assert_allclose([fAH, fAV, fBH, fBV, info["LBot"]], desired[index], rtol=1e-05, atol=0, verbose=True) - - -def test_catenary_symmetricU(): - """Tests the U shaped line with seabed contact against a simulation of half the line""" - - (fAH1, fAV1, fBH1, fBV1, info1) = catenary(50, 20, 65, 1e12, 100.0, CB=0, Tol=0.00001, MaxIter=50) - (fAHU, fAVU, fBHU, fBVU, infoU) = catenary(100, 0, 130, 1e12, 100.0, CB=-20, Tol=0.00001, MaxIter=50) - - assert_allclose([fAHU, fAVU, fBHU, fBVU], [-fBH1, fBV1, fBH1, fBV1], rtol=1e-05, atol=0, verbose=True) - - -if __name__ == "__main__": - for i in range(len(indata)): - test_catenary_solutions(i) - - # catenary(0.007335040615956245, 46.969250518704726, 100.0, 257826627.22942558, 512.1255141001664, CB=-532.0307494812953, HF0=2169047.825684437, VF0=1165782.713912318, Tol=2.0000000000000003e-06, MaxIter=50, plots=1) diff --git a/WISDEM/wisdem/test/test_moorpy/test_system.py b/WISDEM/wisdem/test/test_moorpy/test_system.py deleted file mode 100644 index 34e48f939..000000000 --- a/WISDEM/wisdem/test/test_moorpy/test_system.py +++ /dev/null @@ -1,425 +0,0 @@ -# tests MoorPy System functionality and results - -import numpy as np -import pytest -import matplotlib.pyplot as plt -from numpy.testing import assert_allclose - -import wisdem.moorpy as mp - -# from wisdem.moorpy.MoorProps import getLineProps -from wisdem.moorpy.helpers import getLineProps - -inCBs = [0, 1.0, 10.0] # friction coefficients as inputs for test_seabed - - -def test_tensions_swap(): - """Compares two equivalent catenary mooring lines that are defined in opposite directions.""" - - ms = mp.System(depth=60) - - # ms.lineTypes['chain'] = getLineProps(120, name='chain') # add a line type - ms.setLineType(120, "chain", name="chain") # add a line type - - ms.addPoint(1, [0, 0, -60]) - ms.addPoint(1, [100, 10, -30]) - - # line sloping up from A to B, and another in the opposite order - ms.addLine(120, "chain", pointA=1, pointB=2) - ms.addLine(120, "chain", pointA=2, pointB=1) - - ms.initialize() - - # compare tensions - assert_allclose( - np.hstack([ms.lineList[0].fA, ms.lineList[0].fB]), - np.hstack([ms.lineList[1].fB, ms.lineList[1].fA]), - rtol=0, - atol=10.0, - verbose=True, - ) - - -def test_stiffnesses_swap(): - """Compares two equivalent catenary mooring lines that are defined in opposite directions.""" - - ms = mp.System(depth=60) - - # ms.lineTypes['chain'] = getLineProps(120, name='chain') # add a line type - ms.setLineType(120, "chain", name="chain") # add a line type - - ms.addPoint(1, [0, 0, -60]) - ms.addPoint(1, [100, 10, -30]) - - # line sloping up from A to B, and another in the opposite order - ms.addLine(120, "chain", pointA=1, pointB=2) - ms.addLine(120, "chain", pointA=2, pointB=1) - - ms.initialize() - - # compare stiffnesses - assert_allclose( - np.hstack([ms.lineList[0].KA, ms.lineList[0].KB, ms.lineList[0].KAB]), - np.hstack([ms.lineList[1].KB, ms.lineList[1].KA, ms.lineList[1].KAB]), - rtol=0, - atol=10.0, - verbose=True, - ) - - -def test_stiffness_body(): - """Tests that the mooring stiffness on a body has the expected relationship to stiffness on points""" - - ms = mp.System(depth=60) - - # ms.lineTypes['chain'] = getLineProps(120, name='chain') # add a line type - ms.setLineType(120, "chain", name="chain") # add a line type - - ms.addPoint(1, [0, 0, -60]) - ms.addPoint(1, [100, 10, -30]) - - # line sloping up from A to B, and another in the opposite order - ms.addLine(120, "chain", pointA=1, pointB=2) - ms.addLine(120, "chain", pointA=2, pointB=1) - - # create body and attach lines to it - ms.addBody(1, [0, 0, 0, 0, 0, 0]) - ms.bodyList[0].attachPoint(2, [0, 10, 0]) - - ms.initialize() - - # compare stiffnesses - assert_allclose( - np.hstack([ms.lineList[0].KA, ms.lineList[0].KB, ms.lineList[0].KAB]), - np.hstack([ms.lineList[1].KB, ms.lineList[1].KA, ms.lineList[1].KAB]), - rtol=0, - atol=10.0, - verbose=True, - ) - - -def test_basic(): - depth = 600 - angle = np.arange(3) * np.pi * 2 / 3 # line headings list - anchorR = 1600 # anchor radius/spacing - fair_depth = 21 - fairR = 20 - LineLength = 1800 - typeName = "chain" # identifier string for line type - - # --------------- set up mooring system --------------------- - - # Create blank system object - ms = mp.System() - - # Set the depth of the system to the depth of the input value - ms.depth = depth - - # add a line type - # ms.lineTypes[typeName] = getLineProps(120, name=typeName) - ms.setLineType(120, typeName, name=typeName) - - # Add a free, body at [0,0,0] to the system (including some properties to make it hydrostatically stiff) - ms.addBody(0, np.zeros(6), m=1e6, v=1e3, rM=100, AWP=1e6) - - # Set the anchor points of the system - anchors = [] - for i in range(len(angle)): - ms.addPoint(1, np.array([anchorR * np.cos(angle[i]), anchorR * np.sin(angle[i]), -ms.depth], dtype=float)) - anchors.append(len(ms.pointList)) - - # Set the points that are attached to the body to the system - bodypts = [] - for i in range(len(angle)): - ms.addPoint(1, np.array([fairR * np.cos(angle[i]), fairR * np.sin(angle[i]), -fair_depth], dtype=float)) - bodypts.append(len(ms.pointList)) - ms.bodyList[0].attachPoint( - ms.pointList[bodypts[i] - 1].number, ms.pointList[bodypts[i] - 1].r - ms.bodyList[0].r6[:3] - ) - - # Add and attach lines to go from the anchor points to the body points - for i in range(len(angle)): - ms.addLine(LineLength, typeName) - line = len(ms.lineList) - ms.pointList[anchors[i] - 1].attachLine(ms.lineList[line - 1].number, 0) - ms.pointList[bodypts[i] - 1].attachLine(ms.lineList[line - 1].number, 1) - - # ------- simulate it ---------- - ms.initialize() # make sure everything's connected - ms.bodyList[0].setPosition([10, 10, 1, 0, 0, 0]) # apply an offset - ms.solveEquilibrium3() # equilibrate - see if it goes back to zero! - - # check - assert_allclose(ms.bodyList[0].r6, np.zeros(6), rtol=0, atol=0.01, verbose=True) - - -def test_multiseg(): - """Compares a single catenary mooring line with a two-line system.""" - - # single line - ms1 = mp.System() - ms1.depth = 200 - # ms1.lineTypes['chain'] = getLineProps(120, name='chain') - ms1.setLineType(120, "chain", name="chain") - - ms1.addPoint(1, [-800, 0, -200]) # anchor point - ms1.addPoint(1, [0, 0, 0]) # fairlead - ms1.addLine(860, "chain", pointA=1, pointB=2) - ms1.initialize() - ms1.solveEquilibrium3(tol=0.0001) - - # two line - ms2 = mp.System() - ms2.depth = 200 - # ms2.lineTypes['chain'] = getLineProps(120, name='chain') - ms2.setLineType(120, "chain", name="chain") - ms2.addPoint(1, [-800, 0, -200]) # anchor point - ms2.addPoint(0, [-205, 0, -100]) # point along line - ms2.addPoint(1, [0, 0, 0]) # fairlead - ms2.addLine(630, "chain", pointA=1, pointB=2) - ms2.addLine(230, "chain", pointA=2, pointB=3) - ms2.initialize() - ms2.solveEquilibrium3(tol=0.0001) - - # compare tensions - assert_allclose( - np.hstack([ms1.pointList[0].getForces(), ms1.pointList[-1].getForces()]), - np.hstack([ms2.pointList[0].getForces(), ms2.pointList[-1].getForces()]), - rtol=0, - atol=10.0, - verbose=True, - ) - - -def test_multiseg_seabed(): - """Compares a single catenary mooring line with a three-line system where two of the segments are fully along the seabed.""" - - # single line - ms1 = mp.System() - ms1.depth = 200 - # ms1.lineTypes['chain'] = getLineProps(120, name='chain') - ms1.setLineType(120, "chain", name="chain") - ms1.addPoint(1, [-800, 0, -200]) # anchor point - ms1.addPoint(1, [0, 0, 0]) # fairlead - ms1.addLine(860, "chain", pointA=1, pointB=2) - ms1.initialize() - ms1.solveEquilibrium3(tol=0.0001) - - # three line - ms2 = mp.System() - ms2.depth = 200 - # ms2.lineTypes['chain'] = getLineProps(120, name='chain') - ms2.setLineType(120, "chain", name="chain") - ms2.addPoint(1, [-800, 0, -200]) # anchor point - ms2.addPoint(0, [-700, 0, -200]) # point along line - ms2.addPoint(0, [-600, 0, -200]) # point along line - ms2.addPoint(1, [0, 0, 0]) # fairlead - ms2.addLine(100, "chain", pointA=1, pointB=2) - ms2.addLine(100, "chain", pointA=2, pointB=3) - ms2.addLine(660, "chain", pointA=3, pointB=4) - ms2.initialize() - ms2.solveEquilibrium3(tol=0.0001) - - # compare tensions - assert_allclose( - np.hstack([ms1.pointList[0].getForces(), ms1.pointList[-1].getForces()]), - np.hstack([ms2.pointList[0].getForces(), ms2.pointList[-1].getForces()]), - rtol=0, - atol=10.0, - verbose=True, - ) - - -def test_basicU(): - """Compares a system with a U-shape line with seabed contact with an equivalent case - that has a node along the U.""" - - # a seabed contact case with 2 lines to form a U - ms1 = mp.System() - - ms1.depth = 100 - - # ms1.lineTypes['chain'] = getLineProps(120, name='chain') - ms1.setLineType(120, "chain", name="chain") - - ms1.addPoint(1, [-200, 0, -100]) # anchor point - ms1.addPoint(0, [-100, 0, -50], m=0, v=50) # float - ms1.addPoint(0, [0, 0, -100]) # midpoint - ms1.addPoint(0, [100, 0, -40], m=0, v=50) # float - ms1.addPoint(1, [200, 0, -100]) # anchor point - - ms1.addLine(120, "chain", pointA=1, pointB=2) - ms1.addLine(125, "chain", pointA=2, pointB=3) - ms1.addLine(125, "chain", pointA=3, pointB=4) - ms1.addLine(120, "chain", pointA=4, pointB=5) - - # a seabed contact case with single U line - msU = mp.System() - - msU.depth = 100 - - # msU.lineTypes['chain'] = getLineProps(120, name='chain') - msU.setLineType(120, "chain", name="chain") - - msU.addPoint(1, [-200, 0, -100]) # anchor point - msU.addPoint(0, [-100, 0, -50], m=0, v=50) # float - msU.addPoint(0, [100, 0, -40], m=0, v=50) # float - msU.addPoint(1, [200, 0, -100]) # anchor point - - msU.addLine(120, "chain", pointA=1, pointB=2) - msU.addLine(250, "chain", pointA=2, pointB=3) - msU.addLine(120, "chain", pointA=3, pointB=4) - - # ------- simulate it ---------- - ms1.initialize() # make sure everything's connected - msU.initialize() # make sure everything's connected - - ms1.solveEquilibrium3(tol=0.0001) # equilibrate - see if it goes back to zero! - msU.solveEquilibrium3(tol=0.0001) # equilibrate - see if it goes back to zero! - - # compare floating point positions - assert_allclose( - np.hstack([ms1.pointList[1].r, ms1.pointList[3].r]), - np.hstack([msU.pointList[1].r, msU.pointList[2].r]), - rtol=0, - atol=0.001, - verbose=True, - ) - - -@pytest.mark.parametrize("CB", inCBs) -def test_seabed(CB): - """Compares a single catenary mooring line along the seabed with a two-line system - where the point is on the seabed, with different friction settings.""" - - # single line - ms1 = mp.System() - ms1.depth = 200 - # ms1.lineTypes['chain'] = getLineProps(120, name='chain') - ms1.setLineType(120, "chain", name="chain") - ms1.addPoint(1, [-800, 0, -200]) # anchor point - ms1.addPoint(1, [0, 0, 0]) # fairlead - ms1.addLine(860, "chain", pointA=1, pointB=2, cb=CB) - ms1.initialize() - ms1.solveEquilibrium3(tol=0.0001) - - # two line - ms2 = mp.System() - ms2.depth = 200 - # ms2.lineTypes['chain'] = getLineProps(120, name='chain') - ms2.setLineType(120, "chain", name="chain") - ms2.addPoint(1, [-800, 0, -200]) # anchor point - ms2.addPoint(0, [-405, 0, -150]) # midpoint - ms2.addPoint(1, [0, 0, 0]) # fairlead - ms2.addLine(430, "chain", pointA=1, pointB=2, cb=CB) - ms2.addLine(430, "chain", pointA=2, pointB=3, cb=CB) - ms2.initialize() - ms2.solveEquilibrium3(tol=0.0001) - - # compare tensions - assert_allclose( - np.hstack([ms1.pointList[0].getForces(), ms1.pointList[-1].getForces()]), - np.hstack([ms2.pointList[0].getForces(), ms2.pointList[-1].getForces()]), - rtol=0, - atol=10.0, - verbose=True, - ) - - -if __name__ == "__main__": - # test_basic() - - """ - # a seabed contact case with 2 lines to form a U - ms1 = mp.System() - - ms1.depth = 100 - - ms1.lineTypes['chain'] = getLineProps(120, name='chain') - - ms1.addPoint(1, [-200, 0 , -100]) # anchor point - ms1.addPoint(1, [-100, 0 , -50], m=0, v=50) # float - ms1.addPoint(0, [ 0, 0 , -100]) # midpoint - ms1.addPoint(1, [ 100, 0 , -40], m=0, v=50) # float - ms1.addPoint(1, [ 200, 0 , -100]) # anchor point - - ms1.addLine(120, 'chain', pointA=1, pointB=2) - ms1.addLine(125, 'chain', pointA=2, pointB=3) - ms1.addLine(125, 'chain', pointA=3, pointB=4) - ms1.addLine(120, 'chain', pointA=4, pointB=5) - - - # a seabed contact case with single U line - ms = mp.System() - - ms.depth = 100 - - ms.lineTypes['chain'] = getLineProps(120, name='chain') - - ms.addPoint(1, [-200, 0 , -100]) # anchor point - ms.addPoint(0, [-100, 0 , -50], m=0, v=50) # float - ms.addPoint(0, [ 100, 0 , -40], m=0, v=50) # float - ms.addPoint(1, [ 200, 0 , -100]) # anchor point - - ms.addLine(120, 'chain', pointA=1, pointB=2) - ms.addLine(250, 'chain', pointA=2, pointB=3) - ms.addLine(120, 'chain', pointA=3, pointB=4) - - - # ------- simulate it ---------- - ms1.initialize() # make sure everything's connected - ms.initialize() # make sure everything's connected - - fig, ax = ms1.plot(color='b') - ms.plot(ax=ax, color='k') - - #ms.display=2 - - ms1.solveEquilibrium3(maxIter=20) # equilibrate - see if it goes back to zero! - #ms.solveEquilibrium3(maxIter=20) # equilibrate - see if it goes back to zero! - - ms1.plot(ax=ax, color='g') - #ms.plot(ax=ax, color='r') - - # compare - print(ms1.pointList[1].getForces()) - print(ms.pointList[1].getForces()) - print(ms1.pointList[3].getForces()) - print(ms.pointList[2].getForces()) - - print(ms1.pointList[1].getStiffnessA()) - print(ms.pointList[1].getStiffnessA()) - print(ms1.pointList[3].getStiffnessA()) - print(ms.pointList[2].getStiffnessA()) - """ - - """ - # a seabed contact case with single U line - ms = mp.System() - ms.depth = 100 - ms.lineTypes['chain'] = getLineProps(120, name='chain') - # a suspension bridge shape - ms.addPoint(1, [-200, 0 , -100]) # 1 anchor point - ms.addPoint(0, [-100, 0 , -50], m=0, v=50) # 2 float - ms.addPoint(0, [ 100, 0 , -40], m=0, v=90) # 3 float - ms.addPoint(1, [ 200, 0 , -100]) # 4 anchor point - ms.addLine(120, 'chain', pointA=1, pointB=2) - ms.addLine(250, 'chain', pointA=2, pointB=3) - ms.addLine(120, 'chain', pointA=3, pointB=4) - # something in a new direction - ms.addPoint(1, [ 100, 200, -100]) # 5 north anchor - ms.addPoint(0, [ 100, 100, -50]) # 6 point along seabed - ms.addPoint(1, [ 100, -100, -50]) # 7 south anchor in midair - ms.addLine(120, 'chain', pointA=5, pointB=6) - ms.addLine(120, 'chain', pointA=6, pointB=3) - ms.addLine(250, 'chain', pointA=7, pointB=3) - # ------- simulate it ---------- - ms.initialize() - fig,ax = ms.plot(color='g') - ms.solveEquilibrium3(tol=0.0001) - ms.plot(color=[1,0,0,0.5], ax=ax) - - #>>> add a test for stiffnesses at each end of lines that have seaed contact, comparing U shape to two catenary lines. Also look at system-level stiffnes. - - plt.show() - """ diff --git a/WISDEM/wisdem/test/test_nrelcsm/test_nrel_csm_mass_2015.py b/WISDEM/wisdem/test/test_nrelcsm/test_nrel_csm_mass_2015.py index b514699e6..e3a4228dd 100644 --- a/WISDEM/wisdem/test/test_nrelcsm/test_nrel_csm_mass_2015.py +++ b/WISDEM/wisdem/test/test_nrelcsm/test_nrel_csm_mass_2015.py @@ -17,7 +17,7 @@ def testMass(self): prob["blade_has_carbon"] = False prob["blade_number"] = 3 prob["machine_rating"] = 5000.0 - prob["hub_height"] = 90.0 + prob["tower_length"] = 90.0 prob["main_bearing_number"] = 2 prob["crane"] = True prob["max_tip_speed"] = 80.0 @@ -25,28 +25,28 @@ def testMass(self): prob.run_model() - self.assertAlmostEqual(float(prob["blade_mass"]), 18590.66820649, 2) - self.assertAlmostEqual(float(prob["hub_mass"]), 44078.53687493, 2) - self.assertAlmostEqual(float(prob["pitch_system_mass"]), 10798.90594644, 2) - self.assertAlmostEqual(float(prob["spinner_mass"]), 973.0, 2) - self.assertAlmostEqual(float(prob["lss_mass"]), 22820.27928238, 2) - self.assertAlmostEqual(float(prob["main_bearing_mass"]), 2245.41649102, 2) - self.assertAlmostEqual(float(prob["rated_rpm"]), 12.1260909, 2) - self.assertAlmostEqual(float(prob["rotor_torque"]), 4375000.0, 2) - self.assertAlmostEqual(float(prob["gearbox_mass"]), 43468.32086769, 2) - self.assertAlmostEqual(float(prob["hss_mass"]), 994.7, 2) - self.assertAlmostEqual(float(prob["generator_mass"]), 14900.0, 2) - self.assertAlmostEqual(float(prob["bedplate_mass"]), 41765.26095285, 2) - self.assertAlmostEqual(float(prob["yaw_mass"]), 12329.96247921, 2) - self.assertAlmostEqual(float(prob["hvac_mass"]), 400.0, 2) - self.assertAlmostEqual(float(prob["cover_mass"]), 6836.69, 2) - self.assertAlmostEqual(float(prob["platforms_mass"]), 8220.65761911, 2) - self.assertAlmostEqual(float(prob["transformer_mass"]), 11485.0, 2) - self.assertAlmostEqual(float(prob["tower_mass"]), 182336.48057717, 2) - self.assertAlmostEqual(float(prob["hub_system_mass"]), 55850.44282136, 2) - self.assertAlmostEqual(float(prob["rotor_mass"]), 111622.44744083, 2) - self.assertAlmostEqual(float(prob["nacelle_mass"]), 173049.20418327392, 2) - self.assertAlmostEqual(float(prob["turbine_mass"]), 467008.1322012795, 2) + self.assertAlmostEqual(float(prob["blade_mass"][0]), 18590.66820649, 2) + self.assertAlmostEqual(float(prob["hub_mass"][0]), 44078.53687493, 2) + self.assertAlmostEqual(float(prob["pitch_system_mass"][0]), 10798.90594644, 2) + self.assertAlmostEqual(float(prob["spinner_mass"][0]), 973.0, 2) + self.assertAlmostEqual(float(prob["lss_mass"][0]), 22820.27928238, 2) + self.assertAlmostEqual(float(prob["main_bearing_mass"][0]), 2245.41649102, 2) + self.assertAlmostEqual(float(prob["rated_rpm"][0]), 12.1260909, 2) + self.assertAlmostEqual(float(prob["rotor_torque"][0]), 4375.0, 2) + self.assertAlmostEqual(float(prob["gearbox_mass"][0]), 43468.32086769, 2) + self.assertAlmostEqual(float(prob["hss_mass"][0]), 994.7, 2) + self.assertAlmostEqual(float(prob["generator_mass"][0]), 14900.0, 2) + self.assertAlmostEqual(float(prob["bedplate_mass"][0]), 41765.26095285, 2) + self.assertAlmostEqual(float(prob["yaw_mass"][0]), 12329.96247921, 2) + self.assertAlmostEqual(float(prob["hvac_mass"][0]), 400.0, 2) + self.assertAlmostEqual(float(prob["cover_mass"][0]), 6836.69, 2) + self.assertAlmostEqual(float(prob["platforms_mass"][0]), 8220.65761911, 2) + self.assertAlmostEqual(float(prob["transformer_mass"][0]), 11485.0, 2) + self.assertAlmostEqual(float(prob["tower_mass"][0]), 182336.48057717, 2) + self.assertAlmostEqual(float(prob["hub_system_mass"][0]), 55850.44282136, 2) + self.assertAlmostEqual(float(prob["rotor_mass"][0]), 111622.44744083, 2) + self.assertAlmostEqual(float(prob["nacelle_mass"][0]), 173049.20418327392, 2) + self.assertAlmostEqual(float(prob["turbine_mass"][0]), 467008.1322012795, 2) def testMassAndCost(self): # simple test of module @@ -59,7 +59,7 @@ def testMassAndCost(self): prob["blade_has_carbon"] = False prob["blade_number"] = 3 prob["machine_rating"] = 5000.0 - prob["hub_height"] = 90.0 + prob["tower_length"] = 90.0 prob["main_bearing_number"] = 2 prob["crane"] = True prob["max_tip_speed"] = 80.0 @@ -67,58 +67,58 @@ def testMassAndCost(self): prob.run_model() - self.assertAlmostEqual(float(prob["blade_mass"]), 18590.66820649, 2) - self.assertAlmostEqual(float(prob["hub_mass"]), 44078.53687493, 2) - self.assertAlmostEqual(float(prob["pitch_system_mass"]), 10798.90594644, 2) - self.assertAlmostEqual(float(prob["spinner_mass"]), 973.0, 2) - self.assertAlmostEqual(float(prob["lss_mass"]), 22820.27928238, 2) - self.assertAlmostEqual(float(prob["main_bearing_mass"]), 2245.41649102, 2) - self.assertAlmostEqual(float(prob["rated_rpm"]), 12.1260909, 2) - self.assertAlmostEqual(float(prob["rotor_torque"]), 4375000.0, 2) - self.assertAlmostEqual(float(prob["gearbox_mass"]), 43468.32086769, 2) - self.assertAlmostEqual(float(prob["hss_mass"]), 994.7, 2) - self.assertAlmostEqual(float(prob["generator_mass"]), 14900.0, 2) - self.assertAlmostEqual(float(prob["bedplate_mass"]), 41765.26095285, 2) - self.assertAlmostEqual(float(prob["yaw_mass"]), 12329.96247921, 2) - self.assertAlmostEqual(float(prob["hvac_mass"]), 400.0, 2) - self.assertAlmostEqual(float(prob["cover_mass"]), 6836.69, 2) - self.assertAlmostEqual(float(prob["platforms_mass"]), 8220.65761911, 2) - self.assertAlmostEqual(float(prob["transformer_mass"]), 11485.0, 2) - self.assertAlmostEqual(float(prob["tower_mass"]), 182336.48057717, 2) - self.assertAlmostEqual(float(prob["hub_system_mass"]), 55850.44282136, 2) - self.assertAlmostEqual(float(prob["rotor_mass"]), 111622.44744083, 2) - self.assertAlmostEqual(float(prob["nacelle_mass"]), 173049.20418327392, 2) - self.assertAlmostEqual(float(prob["turbine_mass"]), 467008.1322012795, 2) - - self.assertAlmostEqual(float(prob["blade_cost"]), 271423.75581475, 2) - self.assertAlmostEqual(float(prob["hub_cost"]), 171906.29381221, 2) - self.assertAlmostEqual(float(prob["pitch_system_cost"]), 238655.82141628, 2) - self.assertAlmostEqual(float(prob["spinner_cost"]), 10800.3, 2) - self.assertAlmostEqual(float(prob["hub_system_mass_tcc"]), 55850.44282136, 2) - self.assertAlmostEqual(float(prob["hub_system_cost"]), 421362.41522849, 2) - self.assertAlmostEqual(float(prob["rotor_cost"]), 1235633.68267274, 2) - self.assertAlmostEqual(float(prob["rotor_mass_tcc"]), 111622.44744083, 2) - self.assertAlmostEqual(float(prob["lss_cost"]), 271561.32346034, 2) - self.assertAlmostEqual(float(prob["main_bearing_cost"]), 10104.37420958, 2) - self.assertAlmostEqual(float(prob["gearbox_cost"]), 560741.33919321, 2) - self.assertAlmostEqual(float(prob["hss_cost"]), 6763.96, 2) - self.assertAlmostEqual(float(prob["generator_cost"]), 184760.0, 2) - self.assertAlmostEqual(float(prob["bedplate_cost"]), 121119.25676326, 2) - self.assertAlmostEqual(float(prob["yaw_system_cost"]), 102338.68857747, 2) - self.assertAlmostEqual(float(prob["hvac_cost"]), 49600.0, 2) - self.assertAlmostEqual(float(prob["controls_cost"]), 105750.0, 2) - self.assertAlmostEqual(float(prob["converter_cost"]), 0.0, 2) - self.assertAlmostEqual(float(prob["elec_cost"]), 209250.0, 2) - self.assertAlmostEqual(float(prob["cover_cost"]), 38969.133, 2) - self.assertAlmostEqual(float(prob["platforms_cost"]), 101273.24528671, 2) - self.assertAlmostEqual(float(prob["transformer_cost"]), 215918.0, 2) - self.assertAlmostEqual(float(prob["nacelle_cost"]), 2007604.267200145, 2) - self.assertAlmostEqual(float(prob["nacelle_mass_tcc"]), 173049.20418327392, 2) - self.assertAlmostEqual(float(prob["tower_parts_cost"]), 528775.7936738, 2) - self.assertAlmostEqual(float(prob["tower_cost"]), 528775.7936738, 2) - self.assertAlmostEqual(float(prob["turbine_mass_tcc"]), 467008.1322012795, 2) - self.assertAlmostEqual(float(prob["turbine_cost"]), 3772013.7435466847, 2) - self.assertAlmostEqual(float(prob["turbine_cost_kW"]), 754.402748709337, 2) + self.assertAlmostEqual(float(prob["blade_mass"][0]), 18590.66820649, 2) + self.assertAlmostEqual(float(prob["hub_mass"][0]), 44078.53687493, 2) + self.assertAlmostEqual(float(prob["pitch_system_mass"][0]), 10798.90594644, 2) + self.assertAlmostEqual(float(prob["spinner_mass"][0]), 973.0, 2) + self.assertAlmostEqual(float(prob["lss_mass"][0]), 22820.27928238, 2) + self.assertAlmostEqual(float(prob["main_bearing_mass"][0]), 2245.41649102, 2) + self.assertAlmostEqual(float(prob["rated_rpm"][0]), 12.1260909, 2) + self.assertAlmostEqual(float(prob["rotor_torque"][0]), 4375.0, 2) + self.assertAlmostEqual(float(prob["gearbox_mass"][0]), 43468.32086769, 2) + self.assertAlmostEqual(float(prob["hss_mass"][0]), 994.7, 2) + self.assertAlmostEqual(float(prob["generator_mass"][0]), 14900.0, 2) + self.assertAlmostEqual(float(prob["bedplate_mass"][0]), 41765.26095285, 2) + self.assertAlmostEqual(float(prob["yaw_mass"][0]), 12329.96247921, 2) + self.assertAlmostEqual(float(prob["hvac_mass"][0]), 400.0, 2) + self.assertAlmostEqual(float(prob["cover_mass"][0]), 6836.69, 2) + self.assertAlmostEqual(float(prob["platforms_mass"][0]), 8220.65761911, 2) + self.assertAlmostEqual(float(prob["transformer_mass"][0]), 11485.0, 2) + self.assertAlmostEqual(float(prob["tower_mass"][0]), 182336.48057717, 2) + self.assertAlmostEqual(float(prob["hub_system_mass"][0]), 55850.44282136, 2) + self.assertAlmostEqual(float(prob["rotor_mass"][0]), 111622.44744083, 2) + self.assertAlmostEqual(float(prob["nacelle_mass"][0]), 173049.20418327392, 2) + self.assertAlmostEqual(float(prob["turbine_mass"][0]), 467008.1322012795, 2) + + self.assertAlmostEqual(float(prob["blade_cost"][0]), 271423.75581475, 2) + self.assertAlmostEqual(float(prob["hub_cost"][0]), 171906.29381221, 2) + self.assertAlmostEqual(float(prob["pitch_system_cost"][0]), 238655.82141628, 2) + self.assertAlmostEqual(float(prob["spinner_cost"][0]), 10800.3, 2) + self.assertAlmostEqual(float(prob["hub_system_mass_tcc"][0]), 55850.44282136, 2) + self.assertAlmostEqual(float(prob["hub_system_cost"][0]), 421362.41522849, 2) + self.assertAlmostEqual(float(prob["rotor_cost"][0]), 1235633.68267274, 2) + self.assertAlmostEqual(float(prob["rotor_mass_tcc"][0]), 111622.44744083, 2) + self.assertAlmostEqual(float(prob["lss_cost"][0]), 271561.32346034, 2) + self.assertAlmostEqual(float(prob["main_bearing_cost"][0]), 10104.37420958, 2) + self.assertAlmostEqual(float(prob["gearbox_cost"][0]), 560741.33919321, 2) + self.assertAlmostEqual(float(prob["hss_cost"][0]), 6763.96, 2) + self.assertAlmostEqual(float(prob["generator_cost"][0]), 184760.0, 2) + self.assertAlmostEqual(float(prob["bedplate_cost"][0]), 121119.25676326, 2) + self.assertAlmostEqual(float(prob["yaw_system_cost"][0]), 102338.68857747, 2) + self.assertAlmostEqual(float(prob["hvac_cost"][0]), 49600.0, 2) + self.assertAlmostEqual(float(prob["controls_cost"][0]), 105750.0, 2) + self.assertAlmostEqual(float(prob["converter_cost"][0]), 0.0, 2) + self.assertAlmostEqual(float(prob["elec_cost"][0]), 209250.0, 2) + self.assertAlmostEqual(float(prob["cover_cost"][0]), 38969.133, 2) + self.assertAlmostEqual(float(prob["platforms_cost"][0]), 101273.24528671, 2) + self.assertAlmostEqual(float(prob["transformer_cost"][0]), 215918.0, 2) + self.assertAlmostEqual(float(prob["nacelle_cost"][0]), 2007604.267200145, 2) + self.assertAlmostEqual(float(prob["nacelle_mass_tcc"][0]), 173049.20418327392, 2) + self.assertAlmostEqual(float(prob["tower_parts_cost"][0]), 528775.7936738, 2) + self.assertAlmostEqual(float(prob["tower_cost"][0]), 528775.7936738, 2) + self.assertAlmostEqual(float(prob["turbine_mass_tcc"][0]), 467008.1322012795, 2) + self.assertAlmostEqual(float(prob["turbine_cost"][0]), 3772013.7435466847, 2) + self.assertAlmostEqual(float(prob["turbine_cost_kW"][0]), 754.402748709337, 2) def suite(): diff --git a/WISDEM/wisdem/test/test_optimization_drivers/test_nlopt_driver.py b/WISDEM/wisdem/test/test_optimization_drivers/test_nlopt_driver.py index d0e4a3945..237b3434a 100644 --- a/WISDEM/wisdem/test/test_optimization_drivers/test_nlopt_driver.py +++ b/WISDEM/wisdem/test/test_optimization_drivers/test_nlopt_driver.py @@ -1,7 +1,5 @@ """ Unit tests for the NLOpt Driver.""" -import sys -import copy import unittest import numpy as np @@ -12,7 +10,7 @@ from openmdao.test_suite.groups.sin_fitter import SineFitter from openmdao.test_suite.components.paraboloid import Paraboloid from openmdao.test_suite.components.simple_comps import NonSquareArrayComp -from openmdao.test_suite.components.expl_comp_array import TestExplCompArrayDense +from openmdao.test_suite.components.expl_comp_array import TestExplCompArrayDense as examp from wisdem.optimization_drivers.nlopt_driver import NLoptDriver @@ -371,7 +369,7 @@ def test_simple_array_comp2D(self): model = prob.model model.add_subsystem("p1", om.IndepVarComp("widths", np.zeros((2, 2))), promotes=["*"]) - model.add_subsystem("comp", TestExplCompArrayDense(), promotes=["*"]) + model.add_subsystem("comp", examp(), promotes=["*"]) model.add_subsystem( "con", om.ExecComp("c = areas - 20.0", c=np.zeros((2, 2)), areas=np.zeros((2, 2))), @@ -405,7 +403,7 @@ def test_simple_array_comp2D_eq_con(self): model = prob.model model.add_subsystem("p1", om.IndepVarComp("widths", np.zeros((2, 2))), promotes=["*"]) - model.add_subsystem("comp", TestExplCompArrayDense(), promotes=["*"]) + model.add_subsystem("comp", examp(), promotes=["*"]) model.add_subsystem( "obj", om.ExecComp("o = areas[0, 0] + areas[1, 1]", areas=np.zeros((2, 2))), @@ -434,7 +432,7 @@ def test_simple_array_comp2D_dbl_sided_con(self): model = prob.model model.add_subsystem("p1", om.IndepVarComp("widths", np.zeros((2, 2))), promotes=["*"]) - model.add_subsystem("comp", TestExplCompArrayDense(), promotes=["*"]) + model.add_subsystem("comp", examp(), promotes=["*"]) model.add_subsystem( "obj", om.ExecComp("o = areas[0, 0]", areas=np.zeros((2, 2))), @@ -467,7 +465,7 @@ def test_simple_array_comp2D_dbl_sided_con_array(self): model = prob.model model.add_subsystem("p1", om.IndepVarComp("widths", np.zeros((2, 2))), promotes=["*"]) - model.add_subsystem("comp", TestExplCompArrayDense(), promotes=["*"]) + model.add_subsystem("comp", examp(), promotes=["*"]) model.add_subsystem( "obj", om.ExecComp("o = areas[0, 0]", areas=np.zeros((2, 2))), @@ -496,7 +494,7 @@ def test_simple_array_comp2D_array_lo_hi(self): model = prob.model model.add_subsystem("p1", om.IndepVarComp("widths", np.zeros((2, 2))), promotes=["*"]) - model.add_subsystem("comp", TestExplCompArrayDense(), promotes=["*"]) + model.add_subsystem("comp", examp(), promotes=["*"]) model.add_subsystem( "con", om.ExecComp("c = areas - 20.0", c=np.zeros((2, 2)), areas=np.zeros((2, 2))), diff --git a/WISDEM/wisdem/test/test_rotorse/test_BladeJointSizing.py b/WISDEM/wisdem/test/test_rotorse/test_BladeJointSizing.py index c0bd6f64f..be028b3f6 100644 --- a/WISDEM/wisdem/test/test_rotorse/test_BladeJointSizing.py +++ b/WISDEM/wisdem/test/test_rotorse/test_BladeJointSizing.py @@ -19,7 +19,7 @@ def testBladeJointSizerBAR_USC(self): accuracy = 0 wt_opt, _, _ = run_wisdem(fname_wt_input, fname_modeling_options, fname_analysis_options) - self.assertAlmostEqual(wt_opt["rotorse.rs.bjs.blade_mass"][0], 50982.52216370957, places=accuracy) + #self.assertAlmostEqual(wt_opt["rotorse.rs.bjs.blade_mass"][0], 50982.52216370957, places=accuracy) self.assertAlmostEqual(wt_opt["rotorse.rs.bjs.L_transition_joint"][0], -0.004017126893942291, places=accuracy) self.assertAlmostEqual(wt_opt["rotorse.rs.bjs.t_reinf_ratio_joint"][0], 0.9899571827651443, places=accuracy) self.assertAlmostEqual(wt_opt["rotorse.rs.bjs.w_reinf_ratio_joint"][0], 1.2087641190997038, places=accuracy) diff --git a/WISDEM/wisdem/test/test_rotorse/test_rotor_structure.py b/WISDEM/wisdem/test/test_rotorse/test_rotor_structure.py index d3f732dee..28480ea03 100644 --- a/WISDEM/wisdem/test/test_rotorse/test_rotor_structure.py +++ b/WISDEM/wisdem/test/test_rotorse/test_rotor_structure.py @@ -1,10 +1,7 @@ import os -import copy -import time import unittest import numpy as np -import openmdao.api as om import numpy.testing as npt import wisdem.rotorse.rotor_structure as rs @@ -18,8 +15,6 @@ class TestRS(unittest.TestCase): def testBladeCurvature(self): inputs = {} outputs = {} - discrete_inputs = {} - discrete_outputs = {} npts = 101 myzero = np.zeros(npts) myone = np.ones(npts) @@ -35,11 +30,14 @@ def testBladeCurvature(self): inputs["precurve"] = myzero inputs["presweep"] = myzero inputs["precone"] = 0.0 + inputs["Rhub"] = 1.0 + inputs["blade_span_cg"] = 0.5 * inputs["r"].max() myobj.compute(inputs, outputs) npt.assert_equal(outputs["3d_curv"], myzero) npt.assert_equal(outputs["x_az"], myzero) npt.assert_equal(outputs["y_az"], myzero) npt.assert_equal(outputs["z_az"], inputs["r"]) + npt.assert_equal(outputs["blades_cg_hubcc"], 0.0) # Some coning: Z is 'r' inputs["precone"] = 3.0 @@ -48,6 +46,7 @@ def testBladeCurvature(self): npt.assert_equal(outputs["x_az"], myzero) npt.assert_equal(outputs["y_az"], myzero) npt.assert_equal(outputs["z_az"], inputs["r"]) + npt.assert_equal(outputs["blades_cg_hubcc"], 51*np.sin(np.deg2rad(3))) # Some curve: X is 'flap' inputs["precurve"] = np.linspace(0, 1, npts) @@ -59,6 +58,7 @@ def testBladeCurvature(self): npt.assert_equal(outputs["x_az"], inputs["precurve"]) npt.assert_equal(outputs["y_az"], myzero) npt.assert_equal(outputs["z_az"], inputs["r"]) + npt.assert_almost_equal(outputs["blades_cg_hubcc"], 51*np.sin(np.deg2rad(cone[50]))) # Some curve: Y is 'edge' inputs["precurve"] = myzero @@ -68,6 +68,7 @@ def testBladeCurvature(self): npt.assert_equal(outputs["x_az"], myzero) npt.assert_equal(outputs["y_az"], inputs["presweep"]) npt.assert_equal(outputs["z_az"], inputs["r"]) + npt.assert_equal(outputs["blades_cg_hubcc"], np.zeros(3)) # Some curve and sweep inputs["precurve"] = np.linspace(0, 2, npts) @@ -80,12 +81,11 @@ def testBladeCurvature(self): npt.assert_equal(outputs["x_az"], inputs["precurve"]) npt.assert_equal(outputs["y_az"], inputs["presweep"]) npt.assert_equal(outputs["z_az"], inputs["r"]) + npt.assert_almost_equal(outputs["blades_cg_hubcc"], 51*np.sin(np.deg2rad(cone[50]))) def testTotalLoads(self): inputs = {} outputs = {} - discrete_inputs = {} - discrete_outputs = {} npts = 101 myzero = np.zeros(npts) myone = np.ones(npts) diff --git a/WISDEM/wisdem/towerse/tower.py b/WISDEM/wisdem/towerse/tower.py index 63c06af66..39f6450a7 100644 --- a/WISDEM/wisdem/towerse/tower.py +++ b/WISDEM/wisdem/towerse/tower.py @@ -396,7 +396,6 @@ def compute(self, inputs, outputs): outputs["fore_aft_modes"] = mshapes_x[:NFREQ2, :] outputs["side_side_modes"] = mshapes_y[:NFREQ2, :] outputs["torsion_modes"] = mshapes_z[:NFREQ2, :] - # deflections due to loading (from cylinder top and wind/wave loads) outputs["tower_deflection"] = np.sqrt(displacements.dx**2 + displacements.dy**2).T @@ -547,7 +546,7 @@ def setup(self): self.add_subsystem( "post", - mem.CylinderPostFrame(modeling_options=mod_opt, n_dlc=nLC), + mem.CylinderPostFrame(modeling_options=mod_opt, n_dlc=nLC, n_full = n_full), promotes=[ "z_full", "d_full", diff --git a/docs/inputs/analysis_schema.rst b/docs/inputs/analysis_schema.rst index 6381c5232..f2cc3843d 100644 --- a/docs/inputs/analysis_schema.rst +++ b/docs/inputs/analysis_schema.rst @@ -36,27 +36,27 @@ properties: type: boolean default: False description: Activates as a design variable or constraint - minimum: + min: type: number maximum: 1.0 minimum: 0.1 - default: 1.0 - maximum: + default: 0.5 + max: type: number maximum: 1.0 minimum: 0.1 - default: 1.0 + default: 0.98 te_flap_ext: type: object default: {} properties: flag: *flag - minimum: + min: type: number maximum: 1.0 minimum: 0.0 default: 0.01 - maximum: + max: type: number maximum: 1.0 minimum: 0.0 @@ -188,36 +188,84 @@ properties: type: object default: {} properties: - flag: *flag - omega_min: &omega_min - type: number - default: 0.1 - minimum: 0.0 - maximum: 10.0 - unit: none - omega_max: &omega_max - type: number - default: 0.7 - minimum: 0.0 - maximum: 10.0 - unit: none - zeta_min: &zeta_min - type: number - default: 0.4 - minimum: 0.0 - maximum: 10.0 - unit: none - zeta_max: &zeta_max - type: number - default: 1.5 - minimum: 0.0 - maximum: 10.0 - unit: none + flp_kp_norm: + type: object + default: {} + properties: + flag: *flag + min: + type: number + default: 0.01 + minimum: 0.0 + maximum: 10.0 + unit: none + max: + type: number + default: 5.0 + minimum: 0.0 + maximum: 10.0 + unit: none + flp_tau: + type: object + default: {} + properties: + flag: *flag + min: + type: number + default: 5 + minimum: 0.0 + maximum: 100.0 + unit: none + max: + type: number + default: 30 + minimum: 0.0 + maximum: 100.0 + unit: none ipc_control: type: object default: {} properties: - flag: *flag + Kp: + type: object + default: {} + properties: + flag: *flag + min: + type: number + default: 0.0 + minimum: 0.0 + maximum: 1.e+3 + unit: s + max: + type: number + default: 0.0 + minimum: 0.0 + maximum: 1.e+3 + unit: s + ref: &ipc_ref + type: number + default: 1.e-8 + minimum: 1.e-10 + maximum: 1.e-5 + Ki: + type: object + default: {} + properties: + flag: *flag + min: + type: number + default: 0.0 + minimum: 0.0 + maximum: 1.e+3 + unit: none + max: + type: number + default: 1.e-7 + minimum: 0.0 + maximum: 1.e+3 + unit: none + ref: *ipc_ref TMDs: type: object description: Design variables associated with TMDs @@ -289,7 +337,6 @@ properties: lower_bound: *bound upper_bound: *bound initial: *initial - constraints: # GB: These all need gammas or safety factors type: object @@ -313,7 +360,7 @@ properties: max: *flapminmax rotor_overspeed: type: object - description: (Maximum rotor speed / rated rotor speed) - 1 + description: (Maximum rotor speed / rated rotor speed) - 1. Can be computed in both RAFT and OpenFAST. The higher fidelity option will be used when active. default: {} properties: flag: *flag @@ -325,7 +372,7 @@ properties: max: *rotor_overspeed Max_PtfmPitch: type: object - description: Maximum platform pitch displacement + description: Maximum platform pitch displacement over all cases. Can be computed in both RAFT and OpenFAST. The higher fidelity option will be used when active. default: {} properties: flag: *flag @@ -337,7 +384,7 @@ properties: unit: deg Std_PtfmPitch: type: object - description: Maximum platform pitch standard deviation + description: Maximum platform pitch standard deviation over all cases. Can be computed in both RAFT and OpenFAST. The higher fidelity option will be used when active. default: {} properties: flag: *flag @@ -347,9 +394,33 @@ properties: minimum: 0.0 maximum: 30.0 unit: deg + Max_TwrBsMyt: + type: object + description: Maximum platform pitch displacement + default: {} + properties: + flag: *flag + max: + type: number + default: 1.e+5 + minimum: 0.0 + maximum: 1.e+8 + unit: kN*m + DEL_TwrBsMyt: + type: object + description: Maximum platform pitch displacement + default: {} + properties: + flag: *flag + max: + type: number + default: 1.e+5 + minimum: 0.0 + maximum: 1.e+8 + unit: kN*m nacelle_acceleration: type: object - description: Maximum Nacelle IMU accelleration magnitude, i.e., sqrt(NcIMUTAxs^2 + NcIMUTAys^2 + NcIMUTAzs^2) + description: Maximum Nacelle IMU accelleration magnitude, i.e., sqrt(NcIMUTAxs^2 + NcIMUTAys^2 + NcIMUTAzs^2). Can be computed in both RAFT and OpenFAST. The higher fidelity option will be used when active. default: {} properties: flag: *flag @@ -383,6 +454,22 @@ properties: minimum: 0.0 maximum: 30.0 unit: deg/s + floating: + type: object + default: {} + properties: + Max_Offset: + type: object + default: {} + description: Maximum combined surge/sway offset. Can be computed in both RAFT and OpenFAST. The higher fidelity option will be used when active. + properties: + flag: *flag + max: + type: number + default: 20 + minimum: 0.0 + maximum: 20000.0 + unit: m damage: type: object default: {} @@ -412,21 +499,6 @@ properties: description: Constrain design to one where OpenFAST simulations don't fail_value default: False - Max_Offset: - type: object - default: {} - properties: - flag: - type: boolean - description: Constrain maximum offset of platform from equilibrium point - default: False - max: - type: number - default: 20 - minimum: 0.0 - maximum: 20000.0 - unit: m - merit_figure: diff --git a/docs/inputs/analysis_schema_wisdem.rst b/docs/inputs/analysis_schema_wisdem.rst index a6074c3bd..4ccb8cf55 100644 --- a/docs/inputs/analysis_schema_wisdem.rst +++ b/docs/inputs/analysis_schema_wisdem.rst @@ -90,8 +90,8 @@ Blade twist as a design variable by adding or subtracting radians from the initi *Default* = False :code:`inverse` : Boolean - When set to True, the twist is defined inverting the - blade-element momentum equations to achieve a desired margin to stall, + When set to True, the twist is defined inverting the + blade-element momentum equations to achieve a desired margin to stall, which is defined among the constraints. :code:`flag` and :code:`inverse` cannot be simultaneously be set to True @@ -99,7 +99,7 @@ Blade twist as a design variable by adding or subtracting radians from the initi :code:`n_opt` : Integer Number of equally-spaced control points of the spline - parametrizing the twist distribution along blade span. + parametrizing the twist distribution along blade span. *Default* = 8 @@ -119,7 +119,7 @@ Blade twist as a design variable by adding or subtracting radians from the initi :code:`index_start` : Integer Integer setting the first DV of the :code:`n_opt` along span that is optimized. - It is recommended to set :code:`index_start` to 1 + It is recommended to set :code:`index_start` to 1 to lock the first DV and prevent the optimizer to try to optimize the twist of the blade root cylinder. @@ -169,7 +169,7 @@ Blade chord as a design variable by scaling (multiplying) the initial value at s :code:`index_end` : Integer Integer setting the last DV of the :code:`n_opt` along span that is optimized. - It is recommended to lock the last point close to blade tip, setting :code:`index_end` to :code:`n_opt` minus 1. + It is recommended to lock the last point close to blade tip, setting :code:`index_end` to :code:`n_opt` minus 1. The last point controls the chord length at blade tip and due to the imperfect tip loss models of CCBlade, it is usually a good idea to taper the chord manually and do not let a numerical @@ -191,7 +191,7 @@ Adjust airfoil positions along the blade span. :code:`af_start` : Integer Index of airfoil where the optimization can start shifting airfoil - position. The airfoil at blade tip is always locked. It is advised + position. The airfoil at blade tip is always locked. It is advised to keep the airfoils close to blade root locked. *Default* = 4 @@ -239,7 +239,7 @@ Blade suction-side spar cap thickness as a design variable by scaling (multiplyi :code:`index_start` : Integer Integer setting the first DV of the :code:`n_opt` along span that is optimized. - It is recommended to set :code:`index_start` to 1 + It is recommended to set :code:`index_start` to 1 to lock the first DV and impose a pre- defined taper to small thicknesses and mimic a blade manufacturability constraint. @@ -248,7 +248,7 @@ Blade suction-side spar cap thickness as a design variable by scaling (multiplyi :code:`index_end` : Integer Integer setting the last DV of the :code:`n_opt` along span that is optimized. - It is recommended to lock the last point close to blade tip, setting :code:`index_end` to :code:`n_opt` minus 1. + It is recommended to lock the last point close to blade tip, setting :code:`index_end` to :code:`n_opt` minus 1. This imposes a predefined taper to small thicknesses and mimic a blade manufacturability constraint. @@ -286,7 +286,7 @@ Blade pressure-side spar cap thickness as a design variable by scaling (multiply :code:`index_start` : Integer Integer setting the first DV of the :code:`n_opt` along span that is optimized. - It is recommended to set :code:`index_start` to 1 + It is recommended to set :code:`index_start` to 1 to lock the first DV and impose a pre- defined taper to small thicknesses and mimic a blade manufacturability constraint. @@ -295,7 +295,7 @@ Blade pressure-side spar cap thickness as a design variable by scaling (multiply :code:`index_end` : Integer Integer setting the last DV of the :code:`n_opt` along span that is optimized. - It is recommended to lock the last point close to blade tip, setting :code:`index_end` to :code:`n_opt` minus 1. + It is recommended to lock the last point close to blade tip, setting :code:`index_end` to :code:`n_opt` minus 1. This imposes a predefined taper to small thicknesses and mimic a blade manufacturability constraint. diff --git a/docs/inputs/modeling_schema.rst b/docs/inputs/modeling_schema.rst index 93476e965..3f4f9c414 100644 --- a/docs/inputs/modeling_schema.rst +++ b/docs/inputs/modeling_schema.rst @@ -360,8 +360,8 @@ properties: units: s description: Amount of time between creating checkpoint files for potential restart (s) DT_Out: - type: string - default: default + type: number + default: 0 description: Time step for tabular output (s) (or 'default') OutFileFmt: type: integer @@ -494,6 +494,10 @@ properties: maximum: 90.0 unit: deg description: Upflow angle (degrees) (not used for native Bladed format WindType=7) + VelInterpCubic: + type: boolean + default: False + description: Use cubic interpolation for velocity in time (false=linear, true=cubic) [Used with WindType=2,3,4,5,7] NWindVel: type: integer default: 1 @@ -699,6 +703,62 @@ properties: type: boolean default: False description: Print summary data to '.sum' (flag) + SensorType: + type: integer + enum: [0,1,2,3] + default: 0 + description: Switch for lidar configuration (0 = None, 1 = Single Point Beam(s), 2 = Continuous, 3 = Pulsed) + NumPulseGate: + type: integer + default: 0 + description: Number of lidar measurement gates (used when SensorType = 3) + PulseSpacing: + type: number + default: 0 + description: Distance between range gates (m) (used when SensorType = 3) + NumBeam: + type: integer + enum: [0,1,2,3,4,5] + default: 0 + description: Number of lidar measurement beams (0-5)(used when SensorType = 1) + FocalDistanceX: + type: number + default: 0 + description: Focal distance coordinates of the lidar beam in the x direction (relative to hub height) (only first coordinate used for SensorType 2 and 3) (m) + FocalDistanceY: + type: number + default: 0. + description: Focal distance coordinates of the lidar beam in the y direction (relative to hub height) (only first coordinate used for SensorType 2 and 3) (m) + FocalDistanceZ: + type: number + default: 0. + description: Focal distance coordinates of the lidar beam in the z direction (relative to hub height) (only first coordinate used for SensorType 2 and 3) (m) + RotorApexOffsetPos: + type: array + default: [0.0, 0.0, 0.0] + description: Offset of the lidar from hub height (m) + items: + type: number + minItems: 3 + maxItems: 3 + URefLid: + type: number + default: 0. + minimum: 0. + description: Reference average wind speed for the lidar [m/s] + MeasurementInterval: + type: number + default: 0. + minimum: 0. + description: Time between each measurement [s] + LidRadialVel: + type: boolean + default: False + description: TRUE => return radial component, FALSE => return 'x' direction estimate + ConsiderHubMotion: + type: integer + default: 1 + description: Flag whether to consider the hub motion's impact on Lidar measurements AeroDyn: &ofaerodyn type: object default: {} @@ -717,7 +777,7 @@ properties: description: Time interval for aerodynamic calculations. Set it to 0. for default (same as main fst) WakeMod: type: integer - enum: [0, 1, 3] + enum: [0, 1, 2, 3] default: 1 description: Type of wake/induction model (switch) {0=none, 1=BEMT, 3=OLAF} AFAeroMod: @@ -747,6 +807,10 @@ properties: type: boolean default: False description: Perform cavitation check? (flag) TRUE will turn off unsteady aerodynamics + Buoyancy: + type: boolean + default: False + description: Include buoyancy effects? (flag) CompAA: type: boolean default: False @@ -796,7 +860,7 @@ properties: type: integer enum: [1, 2, 3] default: 2 - description: Type of dynamic BEMT (DBEMT) model {1=constant tau1, 2=unsteady, 3=time-dependent tau1} (-) [used only when WakeMod=2] + description: Type of dynamic BEMT (DBEMT) model {1=constant tau1, 2=time-dependent tau1, 3=constant tau1 with continuous formulation} (-) [used only when WakeMod=2] tau1_const: type: number unit: s @@ -816,27 +880,27 @@ properties: type: integer enumerate: [5] default: 5 - description: Integration method {5 Forward Euler 1st order, default 5} (switch) + description: Integration method 1 RK4, 5 Forward Euler 1st order, default 5 switch DTfvw: type: number default: 0. minimum: 0. maximum: 10. unit: s - description: Time interval for wake propagation. {default dtaero} (s). Set it to 0. for default (same as main fst) + description: Time interval for wake propagation. {default dtaero} (s) FreeWakeStart: default: 0. minimum: 0. maximum: 10. unit: s - description: Time when wake is free. (-) value = always free. {default 0.0} (s). Set it to 0. for default (same as main fst) + description: Time when wake is free. (-) value = always free. {default 0.0} (s) FullCircStart: default: 0. minimum: 0. maximum: 10. unit: s - description: Time at which full circulation is reached. {default 0.0} (s). Set it to 0. for default (same as main fst) - CircSolvingMethod: + description: Time at which full circulation is reached. {default 0.0} (s) + CircSolvMethod: type: integer enumerate: [1, 2, 3] default: 1 @@ -844,11 +908,11 @@ properties: CircSolvConvCrit: type: number default: 0.001 - description: Convergence criteria {default 0.001} [only if CircSolvingMethod=1] (-) + description: Convergence criteria {default 0.001} [only if CircSolvMethod=1] (-) CircSolvRelaxation: type: number default: 0.1 - description: Relaxation factor {default 0.1} [only if CircSolvingMethod=1] (-) + description: Relaxation factor {default 0.1} [only if CircSolvMethod=1] (-) CircSolvMaxIter: type: integer default: 30 @@ -856,22 +920,27 @@ properties: PrescribedCircFile: type: string default: 'NA' - description: File containing prescribed circulation [only if CircSolvingMethod=3] (quoted string) - nNWPanel: + description: File containing prescribed circulation [only if CircSolvMethod=3] (quoted string) + nNWPanels: type: integer minimum: 0 default: 120 description: Number of near-wake panels [integer] (-) - WakeLength: + nNWPanelsFree: type: integer minimum: 0 - default: 900 - description: Total wake distance [integer] (number of time steps) - FreeWakeLength: + default: 120 + description: Number of free near-wake panels (-) {default nNWPanels} + nFWPanels: type: integer + minimum: 0 default: 0 + description: Number of far-wake panels (-) {default 0} + nFWPanelsFree: + type: integer minimum: 0 - description: Wake length that is free [integer] (number of time steps) {default WakeLength} + default: 0 + description: Number of free far-wake panels (-) {default nFWPanels} FWShedVorticity: type: boolean default: False @@ -893,7 +962,7 @@ properties: description: Viscous diffusion function {0 None, 1 Rankine, 2 LambOseen, 3 Vatistas, 4 Denominator, 'default' 3} (switch) WakeRegMethod: type: integer - enumerate: [0, 1, 2, 3, 4] + enumerate: [0, 1, 2, 3] default: 1 description: Wake regularization method {1 Constant, 2 Stretching, 3 Age, default 1} (switch) WakeRegFactor: @@ -964,14 +1033,6 @@ properties: type: boolean default: True description: Flag to indicate whether a lookup for f' will be calculated (TRUE) or whether best-fit exponential equations will be used (FALSE); if FALSE S1-S4 must be provided in airfoil input files (flag) [used only when AFAeroMod=2] - UAStartRad: - type: number - default: 0 - description: Starting radius for dynamic stall (fraction of rotor radius) [used only when AFAeroMod=2] - UAEndRad: - type: number - default: 1 - description: Ending radius for dynamic stall (fraction of rotor radius) [used only when AFAeroMod=2] AFTabMod: type: integer enum: [1,2,3] @@ -1001,6 +1062,40 @@ properties: type: boolean default: True description: Include aerodynamic pitching moment in calculations? (flag) + VolHub: + type: number + default: 0 + description: Hub volume (m^3) + minimum: 0. + HubCenBx: + type: number + default: 0 + description: Hub center of buoyancy x direction offset (m) + minimum: -100. + maximum: 100. + VolNac: + type: number + default: 0 + description: Nacelle volume (m^3) + minimum: 0. + NacCenB: + type: array + default: [0.0, 0.0, 0.0] + description: Position of nacelle center of buoyancy from yaw bearing in nacelle coordinates (m) + items: + type: number + minItems: 3 + maxItems: 3 + minimum: -100. + maximum: 100. + TFinAero: + type: boolean + default: False + description: Calculate tail fin aerodynamics model (flag) + TFinFile: + type: string + default: "unused" + description: Input file for tail fin aerodynamics [used only when TFinAero=True] Patm: type: number minimum: 0. @@ -1022,6 +1117,12 @@ properties: minimum: 0. maximum: 10. description: Turbulence intensity used in the Eames tower shadow model. Values of TwrTI between 0.05 and 0.4 are recommended. + TwrCb: + type: number + default: 0.0 + # minimum: 0. + # maximum: 10. + description: Turbulence buoyancy coefficient SumPrint: type: boolean default: False @@ -2705,7 +2806,7 @@ properties: openfast_dir: type: string default: unused - description: OpenFAST input directory, containing .fst file + description: OpenFAST input directory, containing .fst file. Absolute path or relative to modeling input xfoil: type: object default: {} @@ -2763,7 +2864,7 @@ properties: type: number uniqueItems: True minimum: 0.0 - maximum: 50.0 + maximum: 200.0 rated_offset: type: number default: 1 @@ -2906,7 +3007,7 @@ properties: DLC: type: string default: '1.1' - enum: ['1.1', '1.2', '1.3', '1.4', '1.5', '1.6', '5.1', '6.1', '6.2', '6.3', '6.4', 'Custom'] + enum: ['1.1', '1.2', '1.3', '1.4', '1.5', '1.6', '5.1', '6.1', '6.2', '6.3', '6.4', '6.5', '12.1', 'Custom'] description: IEC design load case to run. The DLCs currently supported are 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 5.1, 6.1, 6.3, and 6.4 wind_speed: type: array @@ -2917,7 +3018,7 @@ properties: unit: m/s minItems: 1 minimum: 0.0 - maximum: 50.0 + maximum: 200.0 uniqueItems: true ws_bin_size: type: number @@ -2931,7 +3032,13 @@ properties: default: 1 minimum: 1 maximum: 100 - description: Number of turbulent wind seeds drawn from the numpy random integer generator. This entry is neglected if the entry wind_seed is defined. + description: Number of turbulent wind seeds drawn from the numpy random integer generator. This entry is neglected if the entry wind_seed is defined. If DLC 1.4, number of waves seeds. + n_azimuth: + type: integer + default: 1 + minimum: 1 + maximum: 100 + description: Number of azimuth initial conditions to use (primarily during DLC 5.1) wind_seed: type: array default: [] @@ -2941,7 +3048,7 @@ properties: unit: none minItems: 1 uniqueItems: true - wave_seed: + wave_seeds: type: array default: [] description: Wave random number generator seeds for HydroDyn @@ -2962,8 +3069,7 @@ properties: maximum: 180.0 yaw_misalign: type: array - description: Alignment of the nacelle with respect to north. This array must currently have either length=1, i.e. one constant value, or the same length of the array wind_speed - default: [0.] + description: Alignment of the nacelle with respect to north. This array must currently have either length=1, i.e. one constant value, or the same length of the array wind_speed. Default depends on DLC, specified in dlc_generator. items: type: number unit: deg @@ -3050,6 +3156,16 @@ properties: maximum: 1.e+4 default: 120. description: This is the length of the simulation where outputs will be discarded. Its default is 120 seconds (2 minutes) for all simulations. The total simulation time is the sum of analysis_time and transient_time + shutdown_time: + type: number + unit: s + minimum: 0.0 + maximum: 1.e+5 + default: 9999 + description: Time when shutdown occurs in DLC 5.1 + wind_file: + type: string + description: File path of custom wind file turbulent_wind: type: object default: {} @@ -3136,22 +3252,22 @@ properties: description: Usable length of output time series [seconds] (program will add GridWidth/MeanHHWS seconds unless UsableTime is 'ALL') HubHt: type: number - default: 1.e+2 - minimum: 1.e+1 + default: 0 + minimum: 0 maximum: 5.e+2 unit: m description: Hub height [m] (should be > 0.5*GridHeight) GridHeight: type: number - default: 1.e+2 - minimum: 1.e+1 + default: 0 + minimum: 0 maximum: 5.e+2 unit: m description: Grid height [m] GridWidth: type: number - default: 1.e+2 - minimum: 1.e+1 + default: 0 + minimum: 0 maximum: 5.e+2 unit: m description: Grid width [m] (should be >= 2*(RotorRadius+ShaftLength)) @@ -3198,7 +3314,7 @@ properties: description: Name of the file that contains input profiles for WindProfileType='USR' and/or TurbModel='USRVKM' [-] RefHt: type: number - default: 1.e+2 + default: 0 minimum: 0 maximum: 1.e+5 unit: m @@ -3206,16 +3322,21 @@ properties: URef: type: number unit: m/s - default: 1 + default: -1 description: Mean (total) velocity at the reference height [m/s] (or 'default' for JET velocity profile) [must be 1-hr mean for API model; otherwise is the mean over AnalysisTime seconds] + IECturbc: + type: number + unit: '(-)' + default: -1 + description: Turbulence intensity (fraction) for custom DLCs, if default (-1), the class letter will be used ZJetMax: type: string default: default description: Jet height [m] (used only for JET velocity profile, valid 70-490 m) PLExp: type: number - default: 0.2 - description: Power law exponent [-] (or 'default') + default: -1 + description: Power law exponent [-] (or 'default'), if default (-1), the environment option shear_exp will be used for all DLCs Z0: type: string default: default @@ -3440,7 +3561,7 @@ properties: properties: tuning_yaml: type: string - description: yaml file to tune the ROSCO controller, only used for control-only optimizations using an OpenFAST model + description: yaml file to tune the ROSCO controller, only used for control-only optimizations using an OpenFAST model. Absolute path or relative to modeling input. default: none OL2CL: diff --git a/environment.yml b/environment.yml index f14dcac70..c56101b4c 100644 --- a/environment.yml +++ b/environment.yml @@ -35,6 +35,7 @@ dependencies: - patsy - pip - pygments + - pyhams - pyoptsparse - pytest - pytest-cov @@ -42,7 +43,7 @@ dependencies: - pyyaml - pyzmq - qdldl-python - - ruamel_yaml + - ruamel.yaml - scipy - seaborn - setuptools diff --git a/examples/01_aeroelasticse/OpenFAST_models/IEA-15-240-RWT/IEA-15-240-RWT-Monopile/DISCON-Monopile.IN b/examples/01_aeroelasticse/OpenFAST_models/IEA-15-240-RWT/IEA-15-240-RWT-Monopile/DISCON-Monopile.IN index 178c26003..813cf62fb 100644 --- a/examples/01_aeroelasticse/OpenFAST_models/IEA-15-240-RWT/IEA-15-240-RWT-Monopile/DISCON-Monopile.IN +++ b/examples/01_aeroelasticse/OpenFAST_models/IEA-15-240-RWT/IEA-15-240-RWT-Monopile/DISCON-Monopile.IN @@ -1,11 +1,12 @@ ! Controller parameter input file for the IEA-15-240-RWT-Monopile wind turbine -! - File written using ROSCO version 2.6.0 controller tuning logic on 08/10/22 +! - File written using ROSCO version 2.8.0 controller tuning logic on 11/13/23 !------- DEBUG ------------------------------------------------------------ -1 ! LoggingLevel - {0: write no debug files, 1: write standard output .dbg-file, 2: LoggingLevel 1 + ROSCO LocalVars (.dbg2) 3: LoggingLevel 2 + complete avrSWAP-array (.dbg3)} +1 ! LoggingLevel - (0: write no debug files, 1: write standard output .dbg-file, 2: LoggingLevel 1 + ROSCO LocalVars (.dbg2) 3: LoggingLevel 2 + complete avrSWAP-array (.dbg3)) +0 ! Echo - (0 - no Echo, 1 - Echo input data to .echo) !------- CONTROLLER FLAGS ------------------------------------------------- -2 ! F_LPFType - {1: first-order low-pass filter, 2: second-order low-pass filter}, [rad/s] (currently filters generator speed and pitch control signals +2 ! F_LPFType - (1: first-order low-pass filter, 2: second-order low-pass filter), [rad/s] (currently filters generator speed and pitch control signals 0 ! F_NotchType - Notch on the measured generator speed and/or tower fore-aft motion (for floating) {0: disable, 1: generator speed, 2: tower-top fore-aft motion, 3: generator speed and tower-top fore-aft motion} 0 ! IPC_ControlMode - Turn Individual Pitch Control (IPC) for fatigue load reductions (pitch contribution) {0: off, 1: 1P reductions, 2: 1P+2P reductions} 2 ! VS_ControlMode - Generator torque control mode in above rated conditions {0: constant torque, 1: constant power, 2: TSR tracking PI control with constant torque, 3: TSR tracking PI control with constant power} @@ -20,8 +21,12 @@ 0 ! Flp_Mode - Flap control mode {0: no flap control, 1: steady state flap angle, 2: Proportional flap control, 2: Cyclic (1P) flap control} 0 ! OL_Mode - Open loop control mode {0: no open loop control, 1: open loop control vs. time} 0 ! PA_Mode - Pitch actuator mode {0 - not used, 1 - first order filter, 2 - second order filter} +0 ! PF_Mode - Pitch fault mode {0 - not used, 1 - constant offset on one or more blades} +0 ! AWC_Mode - Active wake control {0 - not used, 1 - complex number method, 2 - Coleman transform method} 0 ! Ext_Mode - External control mode {0 - not used, 1 - call external dynamic library} -0 ! ZMQ_Mode - Fuse ZeroMQ interaface {0: unused, 1: Yaw Control} +0 ! ZMQ_Mode - Fuse ZeroMQ interface {0: unused, 1: Yaw Control} +0 ! CC_Mode - Cable control mode [0- unused, 1- User defined, 2- Open loop control] +0 ! StC_Mode - Structural control mode [0- unused, 1- User defined, 2- Open loop control] !------- FILTERS ---------------------------------------------------------- 1.00810 ! F_LPFCornerFreq - Corner frequency (-3dB point) in the low-pass filters, [rad/s] @@ -52,6 +57,7 @@ !------- INDIVIDUAL PITCH CONTROL ----------------------------------------- 8.472000 10.590000 ! IPC_Vramp - Start and end wind speeds for cut-in ramp function. First entry: IPC inactive, second entry: IPC fully active. [m/s] +2 ! IPC_SatMode - IPC Saturation method (0 - no saturation (except by PC_MinPit), 1 - saturate by PS_BldPitchMin, 2 - saturate sotfly (full IPC cycle) by PC_MinPit, 3 - saturate softly by PS_BldPitchMin) 0.3 ! IPC_IntSat - Integrator saturation (maximum signal amplitude contribution to pitch from IPC), [rad] 0.000e+00 0.000e+00 ! IPC_KP - Proportional gain for the individual pitch controller: first parameter for 1P reductions, second for 2P reductions, [-] 0.000e+00 0.000e+00 ! IPC_KI - Integral gain for the individual pitch controller: first parameter for 1P reductions, second for 2P reductions, [-] @@ -93,8 +99,8 @@ -0.02465686 -0.02680796 -0.02895906 -0.03111016 -0.03326126 -0.03541236 -0.03756345 -0.03971455 -0.04186565 -0.04401675 -0.04616785 -0.04831895 -0.05047005 -0.05262115 -0.05477224 -0.05692334 -0.05907444 -0.06122554 -0.06337664 -0.06552774 -0.06767884 -0.06982993 -0.07198103 -0.07413213 -0.07628323 -0.07843433 -0.08058543 -0.08273653 -0.08488763 -0.08437319 -0.05533848 -0.05796693 -0.06461721 -0.07329774 -0.08334692 -0.09440458 -0.10626594 -0.11880543 -0.13196165 -0.14566704 -0.15985206 -0.17448133 -0.18958161 -0.20511150 -0.22101041 -0.23735050 -0.25401237 -0.27107323 -0.28848244 -0.30624857 -0.32435142 -0.34277122 -0.36152503 -0.38058409 -0.39991468 -0.41959174 -0.43951785 -0.45972013 -0.48018912 -0.50091553 ! WE_FOPoles - First order system poles [1/s] !------- YAW CONTROL ------------------------------------------------------ -0.00000 ! Y_uSwitch - Wind speed to switch between Y_ErrThresh. If zero, only the first value of Y_ErrThresh is used [m/s] -4.000000 8.000000 ! Y_ErrThresh - Yaw error threshold/deadband. Turbine begins to yaw when it passes this. If Y_uSwitch is zero, only the first value is used. [deg]. +0.00000 ! Y_uSwitch - Wind speed to switch between Y_ErrThresh. If zero, only the second value of Y_ErrThresh is used [m/s] +4.000000 8.000000 ! Y_ErrThresh - Yaw error threshold/deadbands. Turbine begins to yaw when it passes this. If Y_uSwitch is zero, only the second value is used. [deg]. 0.00870 ! Y_Rate - Yaw rate [rad/s] 0.00000 ! Y_MErrSet - Integrator saturation (maximum signal amplitude contribution to pitch from yaw-by-IPC), [rad] 0.00000 ! Y_IPC_IntSat - Integrator saturation (maximum signal amplitude contribution to pitch from yaw-by-IPC), [rad] @@ -129,12 +135,25 @@ 0 ! Ind_Breakpoint - The column in OL_Filename that contains the breakpoint (time if OL_Mode = 1) 0 ! Ind_BldPitch - The column in OL_Filename that contains the blade pitch input in rad 0 ! Ind_GenTq - The column in OL_Filename that contains the generator torque in Nm -0 ! Ind_YawRate - The column in OL_Filename that contains the generator torque in Nm +0 ! Ind_YawRate - The column in OL_Filename that contains the nacelle yaw rate rad/s +0 ! Ind_CableControl - The column(s) in OL_Filename that contains the cable control inputs in m [Used with CC_Mode = 2, must be the same size as CC_Group_N] +0 ! Ind_StructControl - The column(s) in OL_Filename that contains the structural control inputs [Used with StC_Mode = 2, must be the same size as StC_Group_N] !------- Pitch Actuator Model ----------------------------------------------------- 3.140000000000 ! PA_CornerFreq - Pitch actuator bandwidth/cut-off frequency [rad/s] 0.707000000000 ! PA_Damping - Pitch actuator damping ratio [-, unused if PA_Mode = 1] +!------- Pitch Actuator Faults ----------------------------------------------------- +0.00000000 0.00000000 0.00000000 ! PF_Offsets - Constant blade pitch offsets for blades 1-3 [rad] + +!------- Active Wake Control ----------------------------------------------------- +1 ! AWC_NumModes - Number of user-defined AWC forcing modes +1 ! AWC_n - Azimuthal mode number(s) (i.e., the number and direction of the lobes of the wake structure) +1 ! AWC_harmonic - Harmonic(s) to apply in the AWC Inverse Coleman Transformation (only used when AWC_Mode = 2) +0.0500 ! AWC_freq - Frequency(s) of forcing mode(s) [Hz] +1.0000 ! AWC_amp - Pitch amplitude(s) of individual forcing mode(s) [deg] +0.0000 ! AWC_clockangle - Initial angle(s) of forcing mode(s) [deg] + !------- External Controller Interface ----------------------------------------------------- "unused" ! DLL_FileName - Name/location of the dynamic library in the Bladed-DLL format "unused" ! DLL_InFile - Name of input file sent to the DLL (-) @@ -143,3 +162,12 @@ !------- ZeroMQ Interface --------------------------------------------------------- "tcp://localhost:5555" ! ZMQ_CommAddress - Communication address for ZMQ server, (e.g. "tcp://localhost:5555") 2 ! ZMQ_UpdatePeriod - Call ZeroMQ every [x] seconds, [s] + +!------- Cable Control --------------------------------------------------------- +1 ! CC_Group_N - Number of cable control groups + 0 ! CC_GroupIndex - First index for cable control group, should correspond to deltaL +20.000000 ! CC_ActTau - Time constant for line actuator [s] + +!------- Structural Controllers --------------------------------------------------------- +1 ! StC_Group_N - Number of cable control groups + 0 ! StC_GroupIndex - First index for structural control group, options specified in ServoDyn summary output diff --git a/examples/01_aeroelasticse/OpenFAST_models/IEA-15-240-RWT/IEA-15-240-RWT-UMaineSemi/DISCON-UMaineSemi.IN b/examples/01_aeroelasticse/OpenFAST_models/IEA-15-240-RWT/IEA-15-240-RWT-UMaineSemi/DISCON-UMaineSemi.IN index 4ca32b732..cf3bfd0c5 100644 --- a/examples/01_aeroelasticse/OpenFAST_models/IEA-15-240-RWT/IEA-15-240-RWT-UMaineSemi/DISCON-UMaineSemi.IN +++ b/examples/01_aeroelasticse/OpenFAST_models/IEA-15-240-RWT/IEA-15-240-RWT-UMaineSemi/DISCON-UMaineSemi.IN @@ -1,11 +1,12 @@ ! Controller parameter input file for the IEA-15-240-RWT-UMaineSemi wind turbine -! - File written using ROSCO version 2.6.0 controller tuning logic on 08/10/22 +! - File written using ROSCO version 2.8.0 controller tuning logic on 11/13/23 !------- DEBUG ------------------------------------------------------------ -1 ! LoggingLevel - {0: write no debug files, 1: write standard output .dbg-file, 2: LoggingLevel 1 + ROSCO LocalVars (.dbg2) 3: LoggingLevel 2 + complete avrSWAP-array (.dbg3)} +1 ! LoggingLevel - (0: write no debug files, 1: write standard output .dbg-file, 2: LoggingLevel 1 + ROSCO LocalVars (.dbg2) 3: LoggingLevel 2 + complete avrSWAP-array (.dbg3)) +0 ! Echo - (0 - no Echo, 1 - Echo input data to .echo) !------- CONTROLLER FLAGS ------------------------------------------------- -2 ! F_LPFType - {1: first-order low-pass filter, 2: second-order low-pass filter}, [rad/s] (currently filters generator speed and pitch control signals +2 ! F_LPFType - (1: first-order low-pass filter, 2: second-order low-pass filter), [rad/s] (currently filters generator speed and pitch control signals 2 ! F_NotchType - Notch on the measured generator speed and/or tower fore-aft motion (for floating) {0: disable, 1: generator speed, 2: tower-top fore-aft motion, 3: generator speed and tower-top fore-aft motion} 0 ! IPC_ControlMode - Turn Individual Pitch Control (IPC) for fatigue load reductions (pitch contribution) {0: off, 1: 1P reductions, 2: 1P+2P reductions} 2 ! VS_ControlMode - Generator torque control mode in above rated conditions {0: constant torque, 1: constant power, 2: TSR tracking PI control with constant torque, 3: TSR tracking PI control with constant power} @@ -20,8 +21,12 @@ 0 ! Flp_Mode - Flap control mode {0: no flap control, 1: steady state flap angle, 2: Proportional flap control, 2: Cyclic (1P) flap control} 0 ! OL_Mode - Open loop control mode {0: no open loop control, 1: open loop control vs. time} 0 ! PA_Mode - Pitch actuator mode {0 - not used, 1 - first order filter, 2 - second order filter} +0 ! PF_Mode - Pitch fault mode {0 - not used, 1 - constant offset on one or more blades} +0 ! AWC_Mode - Active wake control {0 - not used, 1 - complex number method, 2 - Coleman transform method} 0 ! Ext_Mode - External control mode {0 - not used, 1 - call external dynamic library} -0 ! ZMQ_Mode - Fuse ZeroMQ interaface {0: unused, 1: Yaw Control} +0 ! ZMQ_Mode - Fuse ZeroMQ interface {0: unused, 1: Yaw Control} +0 ! CC_Mode - Cable control mode [0- unused, 1- User defined, 2- Open loop control] +0 ! StC_Mode - Structural control mode [0- unused, 1- User defined, 2- Open loop control] !------- FILTERS ---------------------------------------------------------- 1.00810 ! F_LPFCornerFreq - Corner frequency (-3dB point) in the low-pass filters, [rad/s] @@ -52,6 +57,7 @@ !------- INDIVIDUAL PITCH CONTROL ----------------------------------------- 8.592000 10.740000 ! IPC_Vramp - Start and end wind speeds for cut-in ramp function. First entry: IPC inactive, second entry: IPC fully active. [m/s] +2 ! IPC_SatMode - IPC Saturation method (0 - no saturation (except by PC_MinPit), 1 - saturate by PS_BldPitchMin, 2 - saturate sotfly (full IPC cycle) by PC_MinPit, 3 - saturate softly by PS_BldPitchMin) 0.3 ! IPC_IntSat - Integrator saturation (maximum signal amplitude contribution to pitch from IPC), [rad] 0.000e+00 0.000e+00 ! IPC_KP - Proportional gain for the individual pitch controller: first parameter for 1P reductions, second for 2P reductions, [-] 0.000e+00 0.000e+00 ! IPC_KI - Integral gain for the individual pitch controller: first parameter for 1P reductions, second for 2P reductions, [-] @@ -93,8 +99,8 @@ -0.02465686 -0.02685047 -0.02904408 -0.03123769 -0.03343130 -0.03562491 -0.03781853 -0.04001214 -0.04220575 -0.04439936 -0.04659297 -0.04878658 -0.05098019 -0.05317380 -0.05536741 -0.05756102 -0.05975463 -0.06194824 -0.06414185 -0.06633546 -0.06852907 -0.07072268 -0.07291629 -0.07510990 -0.07730351 -0.07949712 -0.08169074 -0.08388435 -0.08607796 -0.08367786 -0.05601496 -0.05845251 -0.06491969 -0.07343523 -0.08331020 -0.09419764 -0.10588646 -0.11825801 -0.13123772 -0.14476398 -0.15881875 -0.17327736 -0.18819599 -0.20358260 -0.21929818 -0.23545859 -0.25196259 -0.26884815 -0.28608407 -0.30367233 -0.32159721 -0.33983661 -0.35840660 -0.37728873 -0.39643034 -0.41591476 -0.43565664 -0.45565512 -0.47592625 -0.49646875 ! WE_FOPoles - First order system poles [1/s] !------- YAW CONTROL ------------------------------------------------------ -0.00000 ! Y_uSwitch - Wind speed to switch between Y_ErrThresh. If zero, only the first value of Y_ErrThresh is used [m/s] -4.000000 8.000000 ! Y_ErrThresh - Yaw error threshold/deadband. Turbine begins to yaw when it passes this. If Y_uSwitch is zero, only the first value is used. [deg]. +0.00000 ! Y_uSwitch - Wind speed to switch between Y_ErrThresh. If zero, only the second value of Y_ErrThresh is used [m/s] +4.000000 8.000000 ! Y_ErrThresh - Yaw error threshold/deadbands. Turbine begins to yaw when it passes this. If Y_uSwitch is zero, only the second value is used. [deg]. 0.00870 ! Y_Rate - Yaw rate [rad/s] 0.00000 ! Y_MErrSet - Integrator saturation (maximum signal amplitude contribution to pitch from yaw-by-IPC), [rad] 0.00000 ! Y_IPC_IntSat - Integrator saturation (maximum signal amplitude contribution to pitch from yaw-by-IPC), [rad] @@ -129,12 +135,25 @@ 0 ! Ind_Breakpoint - The column in OL_Filename that contains the breakpoint (time if OL_Mode = 1) 0 ! Ind_BldPitch - The column in OL_Filename that contains the blade pitch input in rad 0 ! Ind_GenTq - The column in OL_Filename that contains the generator torque in Nm -0 ! Ind_YawRate - The column in OL_Filename that contains the generator torque in Nm +0 ! Ind_YawRate - The column in OL_Filename that contains the nacelle yaw rate rad/s +0 ! Ind_CableControl - The column(s) in OL_Filename that contains the cable control inputs in m [Used with CC_Mode = 2, must be the same size as CC_Group_N] +0 ! Ind_StructControl - The column(s) in OL_Filename that contains the structural control inputs [Used with StC_Mode = 2, must be the same size as StC_Group_N] !------- Pitch Actuator Model ----------------------------------------------------- 3.140000000000 ! PA_CornerFreq - Pitch actuator bandwidth/cut-off frequency [rad/s] 0.707000000000 ! PA_Damping - Pitch actuator damping ratio [-, unused if PA_Mode = 1] +!------- Pitch Actuator Faults ----------------------------------------------------- +0.00000000 0.00000000 0.00000000 ! PF_Offsets - Constant blade pitch offsets for blades 1-3 [rad] + +!------- Active Wake Control ----------------------------------------------------- +1 ! AWC_NumModes - Number of user-defined AWC forcing modes +1 ! AWC_n - Azimuthal mode number(s) (i.e., the number and direction of the lobes of the wake structure) +1 ! AWC_harmonic - Harmonic(s) to apply in the AWC Inverse Coleman Transformation (only used when AWC_Mode = 2) +0.0500 ! AWC_freq - Frequency(s) of forcing mode(s) [Hz] +1.0000 ! AWC_amp - Pitch amplitude(s) of individual forcing mode(s) [deg] +0.0000 ! AWC_clockangle - Initial angle(s) of forcing mode(s) [deg] + !------- External Controller Interface ----------------------------------------------------- "unused" ! DLL_FileName - Name/location of the dynamic library in the Bladed-DLL format "unused" ! DLL_InFile - Name of input file sent to the DLL (-) @@ -143,3 +162,12 @@ !------- ZeroMQ Interface --------------------------------------------------------- "tcp://localhost:5555" ! ZMQ_CommAddress - Communication address for ZMQ server, (e.g. "tcp://localhost:5555") 2 ! ZMQ_UpdatePeriod - Call ZeroMQ every [x] seconds, [s] + +!------- Cable Control --------------------------------------------------------- +1 ! CC_Group_N - Number of cable control groups + 0 ! CC_GroupIndex - First index for cable control group, should correspond to deltaL +20.000000 ! CC_ActTau - Time constant for line actuator [s] + +!------- Structural Controllers --------------------------------------------------------- +1 ! StC_Group_N - Number of cable control groups + 0 ! StC_GroupIndex - First index for structural control group, options specified in ServoDyn summary output diff --git a/examples/02_control_opt/modeling_options.yaml b/examples/02_control_opt/modeling_options.yaml index c7574202e..c1870866f 100644 --- a/examples/02_control_opt/modeling_options.yaml +++ b/examples/02_control_opt/modeling_options.yaml @@ -29,13 +29,13 @@ Level3: # Options for WEIS fidelity level 3 = nonlinear time domain flag: True from_openfast: True openfast_file: IEA-15-240-RWT-UMaineSemi.fst - openfast_dir: examples/01_aeroelasticse/OpenFAST_models/IEA-15-240-RWT/IEA-15-240-RWT-UMaineSemi + openfast_dir: ../01_aeroelasticse/OpenFAST_models/IEA-15-240-RWT/IEA-15-240-RWT-UMaineSemi AeroDyn: WakeMod: 2 ROSCO: flag: True - tuning_yaml: ROSCO/Tune_Cases/IEA15MW.yaml + tuning_yaml: ../../ROSCO/Tune_Cases/IEA15MW.yaml Kp_float: -10 @@ -49,16 +49,16 @@ DLC_driver: turbulent_wind: HubHt: 142 RefHt: 142 - GridHeight: 220 - GridWidth: 220 + GridHeight: 275 + GridWidth: 275 - DLC: "6.1" analysis_time: 10. transient_time: 0.1 turbulent_wind: HubHt: 142 RefHt: 142 - GridHeight: 220 - GridWidth: 220 + GridHeight: 275 + GridWidth: 275 URef: 46.789 PLExp: 0.14 IECturbc: 0.12 diff --git a/examples/02_control_opt/modeling_options_loads.yaml b/examples/02_control_opt/modeling_options_loads.yaml index 700d0ef9c..180e86d10 100644 --- a/examples/02_control_opt/modeling_options_loads.yaml +++ b/examples/02_control_opt/modeling_options_loads.yaml @@ -29,13 +29,13 @@ Level3: # Options for WEIS fidelity level 3 = nonlinear time domain flag: True from_openfast: True openfast_file: IEA-15-240-RWT-UMaineSemi.fst - openfast_dir: examples/01_aeroelasticse/OpenFAST_models/IEA-15-240-RWT/IEA-15-240-RWT-UMaineSemi + openfast_dir: ../01_aeroelasticse/OpenFAST_models/IEA-15-240-RWT/IEA-15-240-RWT-UMaineSemi AeroDyn: WakeMod: 2 ROSCO: flag: True - tuning_yaml: ROSCO/Tune_Cases/IEA15MW.yaml + tuning_yaml: ../../ROSCO/Tune_Cases/IEA15MW.yaml zeta_pc: 1.23 omega_pc: 0.198 U_pc: [12] @@ -86,10 +86,6 @@ DLC_driver: analysis_time: 20. shutdown_time: 10. transient_time: 0.0 - turbulent_wind: - HubHt: 140 - GridHeight: 220 - GridWidth: 220 # - DLC: "6.5" # yaw_misalign: [-8.,8.] # wave_height: [12.57] diff --git a/examples/02_control_opt/modeling_options_sm.yaml b/examples/02_control_opt/modeling_options_sm.yaml index 16308b3c2..3b7a4dd22 100644 --- a/examples/02_control_opt/modeling_options_sm.yaml +++ b/examples/02_control_opt/modeling_options_sm.yaml @@ -28,7 +28,7 @@ Level3: # Options for WEIS fidelity level 3 = nonlinear time domain flag: True from_openfast: True openfast_file: IEA-15-240-RWT-UMaineSemi.fst - openfast_dir: examples/01_aeroelasticse/OpenFAST_models/IEA-15-240-RWT/IEA-15-240-RWT-UMaineSemi + openfast_dir: ../01_aeroelasticse/OpenFAST_models/IEA-15-240-RWT/IEA-15-240-RWT-UMaineSemi simulation: DT: 0.0125 CompElast: 1 @@ -86,7 +86,7 @@ ROSCO: F_LPFType: 2 F_NotchType: 2 Fl_Mode: 1 - tuning_yaml: ROSCO/Tune_Cases/IEA15MW.yaml + tuning_yaml: ../../ROSCO/Tune_Cases/IEA15MW.yaml zeta_pc: 1.2 omega_pc: 0.2 U_pc: [12] diff --git a/examples/04_NREL5MW_OC4_semi/README.md b/examples/04_NREL5MW_OC4_semi/README.md new file mode 100644 index 000000000..7059056f1 --- /dev/null +++ b/examples/04_NREL5MW_OC4_semi/README.md @@ -0,0 +1,10 @@ +**These examples are currently under construction: FloatingSE does not technically support multiple variable ballasts, so the resulting models may be unpredictable.** + + +To run these examples, please make sure you are in your WEIS conda environment and run + +``` +python weis_driver.py +``` + +or the appropriate `weis_driver