diff --git a/.github/workflows/automated-dev-tests.yml b/.github/workflows/automated-dev-tests.yml
index ad8507476f..ef764833db 100644
--- a/.github/workflows/automated-dev-tests.yml
+++ b/.github/workflows/automated-dev-tests.yml
@@ -41,12 +41,16 @@ jobs:
- name: Setup Python
uses: actions/setup-python@v4
with:
- python-version: '3.10'
+ python-version: '3.11'
cache: 'pip'
+ - name: Set up MATLAB
+ uses: matlab-actions/setup-matlab@v1
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install numpy "Bokeh>=2.4,!=3.0.0,!=3.0.1,!=3.0.2,!=3.0.3"
+ sudo apt-get update -y
+ sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev
- name: Setup workspace
run: cmake -E make_directory ${{runner.workspace}}/openfast/build
- name: Configure build
@@ -57,12 +61,15 @@ jobs:
-DCMAKE_Fortran_COMPILER:STRING=${{env.FORTRAN_COMPILER}} \
-DCMAKE_CXX_COMPILER:STRING=${{env.CXX_COMPILER}} \
-DCMAKE_C_COMPILER:STRING=${{env.C_COMPILER}} \
+ -DPython_ROOT_DIR:STRING=${{env.pythonLocation}} \
+ -DBLA_VENDOR:STRING=OpenBLAS \
-DCMAKE_BUILD_TYPE:STRING=DEBUG \
-DBUILD_SHARED_LIBS:BOOL=OFF \
-DGENERATE_TYPES=ON \
-DVARIABLE_TRACKING=OFF \
-DBUILD_TESTING:BOOL=ON \
-DCTEST_PLOT_ERRORS:BOOL=ON \
+ -DBUILD_OPENFAST_SIMULINK_API=ON \
${GITHUB_WORKSPACE}
# -DDOUBLE_PRECISION=OFF \
- name: Build all
@@ -85,6 +92,10 @@ jobs:
uses: actions/checkout@main
with:
submodules: recursive
+ - name: Install dependencies
+ run: |
+ sudo apt-get update -y
+ sudo apt-get install -y libopenblas-dev
- name: Setup workspace
run: cmake -E make_directory ${{runner.workspace}}/openfast/build
- name: Configure build
@@ -95,6 +106,8 @@ jobs:
-DCMAKE_Fortran_COMPILER:STRING=${{env.FORTRAN_COMPILER}} \
-DCMAKE_CXX_COMPILER:STRING=${{env.CXX_COMPILER}} \
-DCMAKE_C_COMPILER:STRING=${{env.C_COMPILER}} \
+ -DPython_ROOT_DIR:STRING=${{env.pythonLocation}} \
+ -DBLA_VENDOR:STRING=OpenBLAS \
-DCMAKE_BUILD_TYPE:STRING=DEBUG \
-DBUILD_SHARED_LIBS:BOOL=OFF \
-DVARIABLE_TRACKING=OFF \
@@ -117,12 +130,14 @@ jobs:
- name: Setup Python
uses: actions/setup-python@v4
with:
- python-version: '3.10'
+ python-version: '3.11'
cache: 'pip'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install numpy "Bokeh>=2.4,!=3.0.0,!=3.0.1,!=3.0.2,!=3.0.3"
+ sudo apt-get update -y
+ sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev
- name: Setup workspace
run: cmake -E make_directory ${{runner.workspace}}/openfast/build
- name: Configure build
@@ -133,6 +148,8 @@ jobs:
-DCMAKE_Fortran_COMPILER:STRING=${{env.FORTRAN_COMPILER}} \
-DCMAKE_CXX_COMPILER:STRING=${{env.CXX_COMPILER}} \
-DCMAKE_C_COMPILER:STRING=${{env.C_COMPILER}} \
+ -DPython_ROOT_DIR:STRING=${{env.pythonLocation}} \
+ -DBLA_VENDOR:STRING=OpenBLAS \
-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo \
-DVARIABLE_TRACKING=OFF \
-DBUILD_TESTING:BOOL=ON \
@@ -159,13 +176,16 @@ jobs:
- name: Setup Python
uses: actions/setup-python@v4
with:
- python-version: '3.10'
+ python-version: '3.11'
cache: 'pip'
+ - name: Set up MATLAB
+ uses: matlab-actions/setup-matlab@v1
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install numpy "Bokeh>=2.4,!=3.0.0,!=3.0.1,!=3.0.2,!=3.0.3"
sudo apt-get update -y
+ sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev
sudo apt-get install -y libhdf5-dev libopenmpi-dev libyaml-cpp-dev # gcovr
- name: Setup workspace
run: cmake -E make_directory ${{runner.workspace}}/openfast/build
@@ -177,6 +197,8 @@ jobs:
-DCMAKE_Fortran_COMPILER:STRING=${{env.FORTRAN_COMPILER}} \
-DCMAKE_CXX_COMPILER:STRING=${{env.CXX_COMPILER}} \
-DCMAKE_C_COMPILER:STRING=${{env.C_COMPILER}} \
+ -DPython_ROOT_DIR:STRING=${{env.pythonLocation}} \
+ -DBLA_VENDOR:STRING=OpenBLAS \
-DCMAKE_BUILD_TYPE:STRING=RELWITHDEBINFO \
-DOPENMP:BOOL=ON \
-DDOUBLE_PRECISION=ON \
@@ -186,6 +208,7 @@ jobs:
-DBUILD_SHARED_LIBS:BOOL=OFF \
-DBUILD_TESTING:BOOL=ON \
-DCTEST_PLOT_ERRORS:BOOL=ON \
+ -DBUILD_OPENFAST_SIMULINK_API=ON \
${GITHUB_WORKSPACE}
- name: Build openfast-postlib
working-directory: ${{runner.workspace}}/openfast/build
@@ -209,14 +232,21 @@ jobs:
- name: Setup Python
uses: actions/setup-python@v4
with:
- python-version: '3.10'
+ python-version: '3.11'
cache: 'pip'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install numpy "Bokeh>=2.4,!=3.0.0,!=3.0.1,!=3.0.2,!=3.0.3"
sudo apt-get update -y
+ sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev
sudo apt-get install -y libhdf5-dev libopenmpi-dev libyaml-cpp-dev
+ - name: Configure build
+ working-directory: ${{runner.workspace}}/openfast/build
+ run: |
+ cmake \
+ -DPython_ROOT_DIR:STRING=${{env.pythonLocation}} \
+ ${GITHUB_WORKSPACE}
- name: Build OpenFAST C-Interfaces
working-directory: ${{runner.workspace}}/openfast/build
run: |
@@ -240,14 +270,21 @@ jobs:
- name: Setup Python
uses: actions/setup-python@v4
with:
- python-version: '3.10'
+ python-version: '3.11'
cache: 'pip'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install numpy "Bokeh>=2.4,!=3.0.0,!=3.0.1,!=3.0.2,!=3.0.3"
sudo apt-get update -y
+ sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev
sudo apt-get install -y libhdf5-dev libopenmpi-dev libyaml-cpp-dev
+ - name: Configure build
+ working-directory: ${{runner.workspace}}/openfast/build
+ run: |
+ cmake \
+ -DPython_ROOT_DIR:STRING=${{env.pythonLocation}} \
+ ${GITHUB_WORKSPACE}
- name: Build OpenFAST glue-code
working-directory: ${{runner.workspace}}/openfast/build
run: |
@@ -271,14 +308,21 @@ jobs:
- name: Setup Python
uses: actions/setup-python@v4
with:
- python-version: '3.10'
+ python-version: '3.11'
cache: 'pip'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install numpy "Bokeh>=2.4,!=3.0.0,!=3.0.1,!=3.0.2,!=3.0.3"
sudo apt-get update -y
+ sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev
sudo apt-get install -y libhdf5-dev libopenmpi-dev libyaml-cpp-dev
+ - name: Configure build
+ working-directory: ${{runner.workspace}}/openfast/build
+ run: |
+ cmake \
+ -DPython_ROOT_DIR:STRING=${{env.pythonLocation}} \
+ ${GITHUB_WORKSPACE}
- name: Build FAST.Farm
working-directory: ${{runner.workspace}}/openfast/build
run: |
@@ -304,12 +348,14 @@ jobs:
- name: Setup Python
uses: actions/setup-python@v4
with:
- python-version: '3.10'
+ python-version: '3.11'
cache: 'pip'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install numpy "Bokeh>=2.4,!=3.0.0,!=3.0.1,!=3.0.2,!=3.0.3"
+ sudo apt-get update -y
+ sudo apt-get install -y libopenblas-dev
- name: Setup workspace
run: cmake -E make_directory ${{runner.workspace}}/openfast/build
- name: Configure build
@@ -320,6 +366,7 @@ jobs:
-DCMAKE_Fortran_COMPILER:STRING=${{env.FORTRAN_COMPILER}} \
-DCMAKE_CXX_COMPILER:STRING=${{env.CXX_COMPILER}} \
-DCMAKE_C_COMPILER:STRING=${{env.C_COMPILER}} \
+ -DPython_ROOT_DIR:STRING=${{env.pythonLocation}} \
-DCMAKE_BUILD_TYPE:STRING=DEBUG \
-DBUILD_SHARED_LIBS:BOOL=OFF \
-DGENERATE_TYPES=ON \
@@ -363,14 +410,23 @@ jobs:
- name: Setup Python
uses: actions/setup-python@v4
with:
- python-version: '3.10'
+ python-version: '3.11'
cache: 'pip'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install numpy "Bokeh>=2.4,!=3.0.0,!=3.0.1,!=3.0.2,!=3.0.3"
sudo apt-get update -y
+ sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev
sudo apt-get install -y libhdf5-dev libopenmpi-dev libyaml-cpp-dev
+ - name: Configure Tests
+ working-directory: ${{runner.workspace}}/openfast/build
+ run: |
+ cmake \
+ -DPython_ROOT_DIR:STRING=${{env.pythonLocation}} \
+ -DBUILD_TESTING:BOOL=ON \
+ -DCTEST_PLOT_ERRORS:BOOL=ON \
+ ${GITHUB_WORKSPACE}
- name: Run AeroDyn tests
uses: ./.github/actions/tests-module-aerodyn
with:
@@ -412,18 +468,20 @@ jobs:
- name: Setup Python
uses: actions/setup-python@v4
with:
- python-version: '3.10'
+ python-version: '3.11'
cache: 'pip'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install numpy "Bokeh>=2.4,!=3.0.0,!=3.0.1,!=3.0.2,!=3.0.3"
sudo apt-get update -y
+ sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev
sudo apt-get install -y libhdf5-dev libopenmpi-dev libyaml-cpp-dev
- name: Configure Tests
working-directory: ${{runner.workspace}}/openfast/build
run: |
cmake \
+ -DPython_ROOT_DIR:STRING=${{env.pythonLocation}} \
-DBUILD_TESTING:BOOL=ON \
-DCTEST_PLOT_ERRORS:BOOL=ON \
${GITHUB_WORKSPACE}
@@ -471,14 +529,23 @@ jobs:
- name: Setup Python
uses: actions/setup-python@v4
with:
- python-version: '3.10'
+ python-version: '3.11'
cache: 'pip'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install numpy "Bokeh>=2.4,!=3.0.0,!=3.0.1,!=3.0.2,!=3.0.3" vtk
sudo apt-get update -y
+ sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev
sudo apt-get install -y libhdf5-dev libopenmpi-dev libyaml-cpp-dev
+ - name: Configure Tests
+ working-directory: ${{runner.workspace}}/openfast/build
+ run: |
+ cmake \
+ -DPython_ROOT_DIR:STRING=${{env.pythonLocation}} \
+ -DBUILD_TESTING:BOOL=ON \
+ -DCTEST_PLOT_ERRORS:BOOL=ON \
+ ${GITHUB_WORKSPACE}
- name: Run Interface / API tests
working-directory: ${{runner.workspace}}/openfast/build
run: |
@@ -510,24 +577,30 @@ jobs:
- name: Setup Python
uses: actions/setup-python@v4
with:
- python-version: '3.10'
+ python-version: '3.11'
cache: 'pip'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install numpy "Bokeh>=2.4,!=3.0.0,!=3.0.1,!=3.0.2,!=3.0.3"
sudo apt-get update -y
+ sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev
sudo apt-get install -y libhdf5-dev libopenmpi-dev libyaml-cpp-dev
- name: Configure Tests
working-directory: ${{runner.workspace}}/openfast/build
run: |
+ cmake \
+ -DPython_ROOT_DIR:STRING=${{env.pythonLocation}} \
+ -DBUILD_TESTING:BOOL=ON \
+ -DCTEST_PLOT_ERRORS:BOOL=ON \
+ ${GITHUB_WORKSPACE}
cmake --build . --target regression_test_controllers
- name: Run 5MW tests
working-directory: ${{runner.workspace}}/openfast/build
run: |
- ctest -VV -j8 \
+ ctest -VV -j4 \
-L openfast \
- -LE "cpp|linear|python|fastlib" \
+ -LE "cpp|linear|python|fastlib|aeromap" \
-E "5MW_OC4Semi_WSt_WavesWN|5MW_OC3Mnpl_DLL_WTurb_WavesIrr|5MW_OC4Jckt_DLL_WTurb_WavesIrr_MGrowth|5MW_OC3Trpd_DLL_WSt_WavesReg|5MW_Land_BD_DLL_WTurb"
- name: Failing test artifacts
uses: actions/upload-artifact@v3
@@ -545,6 +618,85 @@ jobs:
!${{runner.workspace}}/openfast/build/reg_tests/glue-codes/openfast/WP_Baseline
+ rtest-OF-simulink:
+ runs-on: ubuntu-22.04
+ needs: build-openfast-release
+ steps:
+ - name: Cache the workspace
+ uses: actions/cache@v3.0.4
+ with:
+ path: ${{runner.workspace}}
+ key: build-openfast-release-${{ github.sha }}
+ - name: Install dependencies
+ run: |
+ sudo apt-get update -y
+ sudo apt-get install -y libhdf5-dev libopenmpi-dev libyaml-cpp-dev libopenblas-dev libopenblas-openmp-dev
+ - name: Set up MATLAB
+ uses: matlab-actions/setup-matlab@v1
+ - name: Build FAST_SFunc
+ working-directory: ${{runner.workspace}}/openfast/build
+ run: |
+ cmake \
+ -DUSE_LOCAL_STATIC_LAPACK:BOOL=ON \
+ ${GITHUB_WORKSPACE}
+ cmake --build . --target FAST_SFunc
+ - name: Run MATLAB tests and generate artifacts
+ uses: matlab-actions/run-tests@v1
+ with:
+ source-folder: ${{runner.workspace}}/openfast/build/glue-codes/simulink; ${{runner.workspace}}/openfast/glue-codes/simulink/examples
+ test-results-junit: test-results/results.xml
+ code-coverage-cobertura: code-coverage/coverage.xml
+
+
+ rtest-OF-5MW_Land_AeroMap:
+ runs-on: ubuntu-22.04
+ needs: build-openfast-release
+ steps:
+ - name: Cache the workspace
+ uses: actions/cache@v3.0.4
+ with:
+ path: ${{runner.workspace}}
+ key: build-openfast-release-${{ github.sha }}
+ - name: Setup Python
+ uses: actions/setup-python@v3
+ with:
+ python-version: '3.11'
+ cache: 'pip'
+ - name: Install dependencies
+ run: |
+ python -m pip install --upgrade pip
+ pip install numpy "Bokeh>=2.4,!=3.0.0,!=3.0.1,!=3.0.2,!=3.0.3"
+ sudo apt-get update -y
+ sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev
+ sudo apt-get install -y libhdf5-dev libopenmpi-dev libyaml-cpp-dev
+ - name: Configure Tests
+ working-directory: ${{runner.workspace}}/openfast/build
+ run: |
+ cmake \
+ -DPython_ROOT_DIR:STRING=${{env.pythonLocation}} \
+ -DBUILD_TESTING:BOOL=ON \
+ -DCTEST_PLOT_ERRORS:BOOL=ON \
+ ${GITHUB_WORKSPACE}
+ - name: Run 5MW aero map tests
+ working-directory: ${{runner.workspace}}/openfast/build
+ run: |
+ ctest -VV -L aeromap -LE "cpp|linear|python" -R 5MW_Land_AeroMap
+ - name: Failing test artifacts
+ uses: actions/upload-artifact@v3
+ if: failure()
+ with:
+ name: rtest-OF-5MW_Land_AeroMap
+ path: |
+ ${{runner.workspace}}/openfast/build/reg_tests/modules
+ ${{runner.workspace}}/openfast/build/reg_tests/glue-codes/openfast
+ !${{runner.workspace}}/openfast/build/reg_tests/glue-codes/openfast/5MW_Baseline
+ !${{runner.workspace}}/openfast/build/reg_tests/glue-codes/openfast/AOC
+ !${{runner.workspace}}/openfast/build/reg_tests/glue-codes/openfast/AWT27
+ !${{runner.workspace}}/openfast/build/reg_tests/glue-codes/openfast/SWRT
+ !${{runner.workspace}}/openfast/build/reg_tests/glue-codes/openfast/UAE_VI
+ !${{runner.workspace}}/openfast/build/reg_tests/glue-codes/openfast/WP_Baseline
+
+
rtest-OF-5MW_OC4Semi_WSt_WavesWN:
runs-on: ubuntu-22.04
needs: build-openfast-release
@@ -564,10 +716,16 @@ jobs:
python -m pip install --upgrade pip
pip install numpy "Bokeh>=2.4,!=3.0.0,!=3.0.1,!=3.0.2,!=3.0.3"
sudo apt-get update -y
+ sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev
sudo apt-get install -y libhdf5-dev libopenmpi-dev libyaml-cpp-dev
- name: Configure Tests
working-directory: ${{runner.workspace}}/openfast/build
run: |
+ cmake \
+ -DPython_ROOT_DIR:STRING=${{env.pythonLocation}} \
+ -DBUILD_TESTING:BOOL=ON \
+ -DCTEST_PLOT_ERRORS:BOOL=ON \
+ ${GITHUB_WORKSPACE}
cmake --build . --target regression_test_controllers
- name: Run 5MW tests
working-directory: ${{runner.workspace}}/openfast/build
@@ -601,17 +759,23 @@ jobs:
- name: Setup Python
uses: actions/setup-python@v4
with:
- python-version: '3.10'
+ python-version: '3.11'
cache: 'pip'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install numpy "Bokeh>=2.4,!=3.0.0,!=3.0.1,!=3.0.2,!=3.0.3"
sudo apt-get update -y
+ sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev
sudo apt-get install -y libhdf5-dev libopenmpi-dev libyaml-cpp-dev
- name: Configure Tests
working-directory: ${{runner.workspace}}/openfast/build
run: |
+ cmake \
+ -DPython_ROOT_DIR:STRING=${{env.pythonLocation}} \
+ -DBUILD_TESTING:BOOL=ON \
+ -DCTEST_PLOT_ERRORS:BOOL=ON \
+ ${GITHUB_WORKSPACE}
cmake --build . --target regression_test_controllers
- name: Run 5MW tests
working-directory: ${{runner.workspace}}/openfast/build
@@ -645,17 +809,23 @@ jobs:
- name: Setup Python
uses: actions/setup-python@v4
with:
- python-version: '3.10'
+ python-version: '3.11'
cache: 'pip'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install numpy "Bokeh>=2.4,!=3.0.0,!=3.0.1,!=3.0.2,!=3.0.3"
sudo apt-get update -y
+ sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev
sudo apt-get install -y libhdf5-dev libopenmpi-dev libyaml-cpp-dev
- name: Configure Tests
working-directory: ${{runner.workspace}}/openfast/build
run: |
+ cmake \
+ -DPython_ROOT_DIR:STRING=${{env.pythonLocation}} \
+ -DBUILD_TESTING:BOOL=ON \
+ -DCTEST_PLOT_ERRORS:BOOL=ON \
+ ${GITHUB_WORKSPACE}
cmake --build . --target regression_test_controllers
- name: Run 5MW tests
working-directory: ${{runner.workspace}}/openfast/build
@@ -689,17 +859,23 @@ jobs:
- name: Setup Python
uses: actions/setup-python@v4
with:
- python-version: '3.10'
+ python-version: '3.11'
cache: 'pip'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install numpy "Bokeh>=2.4,!=3.0.0,!=3.0.1,!=3.0.2,!=3.0.3"
sudo apt-get update -y
+ sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev
sudo apt-get install -y libhdf5-dev libopenmpi-dev libyaml-cpp-dev
- name: Configure Tests
working-directory: ${{runner.workspace}}/openfast/build
run: |
+ cmake \
+ -DPython_ROOT_DIR:STRING=${{env.pythonLocation}} \
+ -DBUILD_TESTING:BOOL=ON \
+ -DCTEST_PLOT_ERRORS:BOOL=ON \
+ ${GITHUB_WORKSPACE}
cmake --build . --target regression_test_controllers
- name: Run 5MW tests
working-directory: ${{runner.workspace}}/openfast/build
@@ -733,17 +909,23 @@ jobs:
- name: Setup Python
uses: actions/setup-python@v4
with:
- python-version: '3.10'
+ python-version: '3.11'
cache: 'pip'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install numpy "Bokeh>=2.4,!=3.0.0,!=3.0.1,!=3.0.2,!=3.0.3"
sudo apt-get update -y
+ sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev
sudo apt-get install -y libhdf5-dev libopenmpi-dev libyaml-cpp-dev
- name: Configure Tests
working-directory: ${{runner.workspace}}/openfast/build
run: |
+ cmake \
+ -DPython_ROOT_DIR:STRING=${{env.pythonLocation}} \
+ -DBUILD_TESTING:BOOL=ON \
+ -DCTEST_PLOT_ERRORS:BOOL=ON \
+ ${GITHUB_WORKSPACE}
cmake --build . --target regression_test_controllers
- name: Run 5MW tests
working-directory: ${{runner.workspace}}/openfast/build
@@ -777,22 +959,27 @@ jobs:
- name: Setup Python
uses: actions/setup-python@v4
with:
- python-version: '3.10'
+ python-version: '3.11'
cache: 'pip'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install numpy "Bokeh>=2.4,!=3.0.0,!=3.0.1,!=3.0.2,!=3.0.3"
sudo apt-get update -y
+ sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev
sudo apt-get install -y libhdf5-dev libopenmpi-dev libyaml-cpp-dev
- name: Configure Tests
working-directory: ${{runner.workspace}}/openfast/build
run: |
- cmake --build . --target regression_test_controllers
+ cmake \
+ -DPython_ROOT_DIR:STRING=${{env.pythonLocation}} \
+ -DBUILD_TESTING:BOOL=ON \
+ -DCTEST_PLOT_ERRORS:BOOL=ON \
+ ${GITHUB_WORKSPACE}
- name: Run OpenFAST linearization tests
working-directory: ${{runner.workspace}}/openfast/build
run: |
- ctest -VV -j8 -L linear
+ ctest -VV -j4 -L linear
- name: Failing test artifacts
uses: actions/upload-artifact@v3
if: failure()
@@ -821,17 +1008,23 @@ jobs:
- name: Setup Python
uses: actions/setup-python@v4
with:
- python-version: '3.10'
+ python-version: '3.11'
cache: 'pip'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install numpy "Bokeh>=2.4,!=3.0.0,!=3.0.1,!=3.0.2,!=3.0.3"
sudo apt-get update -y
+ sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev
sudo apt-get install -y libhdf5-dev libopenmpi-dev libyaml-cpp-dev
- name: Configure Tests
working-directory: ${{runner.workspace}}/openfast/build
run: |
+ cmake \
+ -DPython_ROOT_DIR:STRING=${{env.pythonLocation}} \
+ -DBUILD_TESTING:BOOL=ON \
+ -DCTEST_PLOT_ERRORS:BOOL=ON \
+ ${GITHUB_WORKSPACE}
cmake --build . --target regression_test_controllers
- name: Run FAST.Farm tests
working-directory: ${{runner.workspace}}/openfast/build
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5b14d3dd8d..899e0d3571 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -108,10 +108,18 @@ include(${CMAKE_SOURCE_DIR}/cmake/set_rpath.cmake)
if (OPENMP OR BUILD_FASTFARM OR BUILD_OPENFAST_CPP_API)
FIND_PACKAGE(OpenMP REQUIRED)
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
- set(CMAKE_FORTRAN_FLAGS "${CMAKE_FORTRAN_FLAGS} ${OpenMP_FORTRAN_FLAGS}")
- set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
+ if (OpenMP_Fortran_FOUND)
+ set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${OpenMP_Fortran_FLAGS}")
+ link_libraries("${OpenMP_Fortran_LIBRARIES}")
+ endif()
+ if (OpenMP_C_FOUND)
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
+ link_libraries("${OpenMP_C_LIBRARIES}")
+ endif()
+ if (OpenMP_CXX_FOUND)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
+ link_libraries("${OpenMP_CXX_LIBRARIES}")
+ endif()
endif()
#-------------------------------------------------------------------------------
@@ -130,11 +138,13 @@ if (USE_LOCAL_STATIC_LAPACK)
include(ExternalProject)
ExternalProject_Add(lapack
URL http://www.netlib.org/lapack/lapack.tgz
- CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_SOURCE_DIR}/install
+ CMAKE_ARGS
+ -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_SOURCE_DIR}/install
+ -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=ON
PREFIX ${CMAKE_BINARY_DIR}/dependencies
BUILD_BYPRODUCTS ${BLAS_LIB_PATH} ${LAPACK_LIB_PATH}
)
- set(LAPACK_LIBRARIES ${BLAS_LIB_PATH} ${LAPACK_LIB_PATH} CACHE STRING "LAPACK library" FORCE)
+ set(LAPACK_LIBRARIES ${LAPACK_LIB_PATH} ${BLAS_LIB_PATH} CACHE STRING "LAPACK library" FORCE)
install(FILES ${LAPACK_LIBRARIES} DESTINATION ${CMAKE_SOURCE_DIR}/install/lib)
message(STATUS "Using LAPACK libraries: ${LAPACK_LIBRARIES}")
else()
@@ -192,7 +202,7 @@ set(OPENFAST_MODULES
map
turbsim
supercontroller
- openfoam
+ externalinflow
openfast-library
)
diff --git a/docs/OtherSupporting/OutListParameters.xlsx b/docs/OtherSupporting/OutListParameters.xlsx
index c63c101d77..af0848d30f 100644
Binary files a/docs/OtherSupporting/OutListParameters.xlsx and b/docs/OtherSupporting/OutListParameters.xlsx differ
diff --git a/docs/OtherSupporting/TurbSim/Corrections.md b/docs/OtherSupporting/TurbSim/Corrections.md
new file mode 100644
index 0000000000..8e735b0800
--- /dev/null
+++ b/docs/OtherSupporting/TurbSim/Corrections.md
@@ -0,0 +1,5 @@
+# Corrections to TurbSim_v2.00.pdf DRAFT
+
+## p. 34: Input file for User-Defined Profiles
+The User-Defined profiles listed in the "Profiles" section contain horizontal angles, not wind direction, so it should say
+ `3. Horizontal wind angle (degrees, measured counter-clockwise from above)`
\ No newline at end of file
diff --git a/docs/changelogs/v3.5.0.md b/docs/changelogs/v3.5.0.md
index 03185c77f7..27d5ac8792 100644
--- a/docs/changelogs/v3.5.0.md
+++ b/docs/changelogs/v3.5.0.md
@@ -98,6 +98,12 @@ See GitHub Actions
#1493 Allow Non-Uniform Force Point Distribution on Blades @mchurchf
+### SubDyn
+
+#1413 Implementing directional cosine matrices and section properties for rectangular members
+#1526 Remove static improvement method (SIM) from the SubDyn elastic output mesh (y3mesh)
+#1531 BugFix - diameter not set properly for rectangular beams
+
## API changes
diff --git a/docs/source/user/aerodyn/appendix.rst b/docs/source/user/aerodyn/appendix.rst
index 6fd5b7f22b..0f60e7cf7d 100644
--- a/docs/source/user/aerodyn/appendix.rst
+++ b/docs/source/user/aerodyn/appendix.rst
@@ -51,27 +51,34 @@ The blade data input file contains the nodal discretization, geometry, twist, ch
AeroDyn List of Output Channels
-------------------------------
-This is a list of output parameters for the AeroDyn module. The names are grouped by meaning, but can be ordered in the OUTPUTS section of the AeroDyn input file as you see fit. :math:`B \alpha N \beta`, refers to output node :math:`\beta` of blade :math:`\alpha`, where :math:`\alpha` is a number in the range [1,3] and :math:`\beta` is a number in the range [1,9], corresponding to entry :math:`\beta` in the :math:`\textit{BlOutNd}` list. :math:`\textit{TwN}\beta` refers to output node :math:`\beta` of the tower and is in the range [1,9], corresponding to entry :math:`\beta` in the :math:`\textit{TwOutNd}` list. A comprehensive, up-to-date list of all possible output parameters is given in the Excel file :download:`OutListParameters.xlsx <../../../OtherSupporting/OutListParameters.xlsx>`.
-The local tower coordinate system is shown in :numref:`ad_tower_geom` and the local blade coordinate system is shown in :numref:`ad_blade_local_cs` below. Figure :numref:`ad_blade_local_cs` also shows the direction of the local angles and force components.
+AeroDyn has regular outputs (see :numref:`AD-Outputs`) and nodal outputs (see :numref:`AD-Nodal-Outputs`).
-.. _ad_blade_local_cs:
+The coordinate systems used for the outputs (labeled, i, h, p, l, a) are described in :numref:`ad_coordsys`.
-.. figure:: figs/aerodyn_blade_local_cs.png
- :width: 80%
- :align: center
- :alt: aerodyn_blade_local_cs.png
- AeroDyn Local Blade Coordinate System (Looking Toward the Tip,
- from the Root) – l: Lift, d: Drag, m: Pitching, x: Normal (to Plane),
- y: Tangential (to Plane), n: Normal (to Chord),
- and t: Tangential (to Chord)
+A comprehensive, up-to-date list of all possible output parameters is given in the Excel file :download:`OutListParameters.xlsx <../../../OtherSupporting/OutListParameters.xlsx>`, in the tab `AeroDyn` and `AeroDyn_Nodes` for the regular and nodal outputs, respectively.
+The names in the Excel file are grouped by meaning, but can be ordered in the OUTPUTS section of the AeroDyn input file as you see fit.
-.. _ad-output-channel:
-.. figure:: figs/aerodyn_output_channel.pdf
- :width: 500px
- :align: center
- :alt: aerodyn_output_channel.pdf
- AeroDyn Output Channel List
+**Regular outputs**
+Some examples of regular outputs are given below (see :download:`OutListParameters.xlsx <../../../OtherSupporting/OutListParameters.xlsx>` for an exhaustive list):
+
+
+ - `RtAeroCp` : aerodynamic power coefficient.
+
+
+ - :math:`B \alpha N \beta`, refers to output node :math:`\beta` of blade :math:`\alpha`, where :math:`\alpha` is a number in the range [1,3] and :math:`\beta` is a number in the range [1,9], corresponding to entry :math:`\beta` in the :math:`\textit{BlOutNd}` list.
+
+ - :math:`\textit{TwN}\beta` refers to output node :math:`\beta` of the tower and is in the range [1,9], corresponding to entry :math:`\beta` in the :math:`\textit{TwOutNd}` list.
+
+
+**Nodal outputs**
+
+An example of nodal outputs is described below (see :download:`OutListParameters.xlsx <../../../OtherSupporting/OutListParameters.xlsx>` for an exhaustive list).
+
+The x-component of the undisturbed flow velocity (`VUnd`) at all blade nodes in the inertial frame (:math:`i`) is requested by placing :math:`VUndxi` in the AeroDyn nodal output list.
+This will result in output channels of the form `AB`:math:`\alpha N\beta` `Vundxi`, for node :math:`\beta` of blade :math:`\alpha`, where :math:`\alpha` is a number in the range [1,3] and :math:`\beta` is a number in the range [1,999] corresponding to the index of the AeroDyn blade node.
+
+
diff --git a/docs/source/user/aerodyn/conf.py b/docs/source/user/aerodyn/conf.py
index 330c0dfcef..f6bd61d28b 100644
--- a/docs/source/user/aerodyn/conf.py
+++ b/docs/source/user/aerodyn/conf.py
@@ -21,10 +21,36 @@
import subprocess
import re
-
from sphinx.highlighting import PygmentsBridge
from pygments.formatters.latex import LatexFormatter
+#sys.path.append(os.path.abspath('_extensions/'))
+
+readTheDocs = os.environ.get('READTHEDOCS', None) == 'True'
+builddir = sys.argv[-1]
+sourcedir = sys.argv[-2]
+
+# Use this to turn Doxygen on or off
+useDoxygen = False
+
+# This function was adapted from https://gitlab.kitware.com/cmb/smtk
+# Only run when on readthedocs
+def runDoxygen(sourcfile, doxyfileIn, doxyfileOut):
+ dx = open(os.path.join(sourcedir, doxyfileIn), 'r')
+ cfg = dx.read()
+ srcdir = os.path.abspath(os.path.join(os.getcwd(), '..'))
+ bindir = srcdir
+ c2 = re.sub('@CMAKE_SOURCE_DIR@', srcdir, re.sub('@CMAKE_BINARY_DIR@', bindir, cfg))
+ doxname = os.path.join(sourcedir, doxyfileOut)
+ dox = open(doxname, 'w')
+ print(c2, file=dox)
+ dox.close()
+ print("Running Doxygen on {}".format(doxyfileOut))
+ doxproc = subprocess.call(('doxygen', doxname))
+
+if readTheDocs and useDoxygen:
+ runDoxygen(sourcedir, 'Doxyfile.in', 'Doxyfile')
+
class CustomLatexFormatter(LatexFormatter):
def __init__(self, **options):
super(CustomLatexFormatter, self).__init__(**options)
@@ -32,12 +58,6 @@ def __init__(self, **options):
PygmentsBridge.latex_formatter = CustomLatexFormatter
-#sys.path.append(os.path.abspath('_extensions/'))
-
-readTheDocs = os.environ.get('READTHEDOCS', None) == 'True'
-sourcedir = sys.argv[-2]
-builddir = sys.argv[-1]
-
# -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
@@ -56,13 +76,32 @@ def __init__(self, **options):
'sphinxcontrib.bibtex',
]
-autodoc_default_flags = ['members','show-inheritance','undoc-members']
+autodoc_default_flags = [
+ 'members',
+ 'show-inheritance',
+ 'undoc-members'
+]
autoclass_content = 'both'
mathjax_path = 'https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'
# FIXME: Naively assuming build directory one level up locally, and two up on readthedocs
+if useDoxygen:
+ if readTheDocs:
+ doxylink = {
+ 'openfast': (
+ os.path.join(builddir, '..', '..', 'openfast.tag'),
+ os.path.join('html')
+ )
+ }
+ else:
+ doxylink = {
+ 'openfast': (
+ os.path.join(builddir, '..', 'openfast.tag'),
+ os.path.join('html')
+ )
+ }
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
@@ -79,7 +118,7 @@ def __init__(self, **options):
# General information about the project.
project = u'AeroDyn'
filename = project.replace(' ','_')
-copyright = u'2017, National Renewable Energy Laboratory'
+copyright = u'2023, National Renewable Energy Laboratory'
author = u'OpenFAST Team'
# The version info for the project you're documenting, acts as replacement for
@@ -96,7 +135,7 @@ def __init__(self, **options):
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
-language = None
+# language = None # Default is English and None is not a valid option
#If true, figures, tables and code-blocks are automatically numbered if they
#have a caption. At same time, the numref role is enabled. For now, it works
@@ -108,6 +147,13 @@ def __init__(self, **options):
# This patterns also effect to html_static_path and html_extra_path
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
+# FIXME: Naively assuming build directory one level up locally, and two up on readthedocs
+if useDoxygen:
+ if readTheDocs:
+ html_extra_path = [os.path.join(builddir, '..', '..', 'doxygen')]
+ else:
+ html_extra_path = [os.path.join(builddir, '..', 'doxygen')]
+
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
@@ -147,12 +193,15 @@ def __init__(self, **options):
# The paper size ('letterpaper' or 'a4paper').
#
# 'papersize': 'letterpaper',
+
# The font size ('10pt', '11pt' or '12pt').
#
# 'pointsize': '10pt',
+
# Additional stuff for the LaTeX preamble.
#
# 'preamble': '',
+
# Latex figure (float) alignment
#
# 'figure_align': 'htbp',
@@ -162,8 +211,13 @@ def __init__(self, **options):
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
- (master_doc, '{}.tex'.format(filename), u'{} Documentation'.format(project),
- u'National Renewable Energy Laboratory', 'manual'),
+ (
+ master_doc,
+ '{}.tex'.format(filename),
+ u'{} Documentation'.format(project),
+ u'National Renewable Energy Laboratory',
+ 'manual'
+ ),
]
@@ -172,8 +226,13 @@ def __init__(self, **options):
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
- (master_doc, project, u'{} Documentation'.format(project),
- [author], 1)
+ (
+ master_doc,
+ project,
+ u'{} Documentation'.format(project),
+ [author],
+ 1
+ )
]
@@ -183,19 +242,34 @@ def __init__(self, **options):
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
- (master_doc, filename, u'{} Documentation'.format(project),
- author, project, 'One line description of project.',
- 'Miscellaneous'),
+ (
+ master_doc,
+ filename,
+ u'{} Documentation'.format(project),
+ author,
+ project,
+ 'One line description of project.',
+ 'Miscellaneous'
+ ),
]
def setup(app):
- app.add_object_type("confval", "confval",
- objname="input file parameter",
- indextemplate="pair: %s; input file parameter")
- app.add_object_type("cmakeval", "cmakeval",
- objname="CMake configuration value",
- indextemplate="pair: %s; CMake configuration")
-
+ try:
+ app.add_css_file('css/math_eq.css')
+ except:
+ pass
+ app.add_object_type(
+ "confval",
+ "confval",
+ objname="input file parameter",
+ indextemplate="pair: %s; input file parameter"
+ )
+ app.add_object_type(
+ "cmakeval",
+ "cmakeval",
+ objname="CMake configuration value",
+ indextemplate="pair: %s; CMake configuration"
+ )
# --- Prolog that will be included at the top of every rst file
# Here: defining the role :red: for html and latex
rst_prolog = r"""
@@ -216,3 +290,4 @@ def setup(app):
.. role:: red
"""
+
diff --git a/docs/source/user/aerodyn/coordsys.rst b/docs/source/user/aerodyn/coordsys.rst
new file mode 100644
index 0000000000..060e480c61
--- /dev/null
+++ b/docs/source/user/aerodyn/coordsys.rst
@@ -0,0 +1,304 @@
+
+.. _ad_coordsys:
+
+Coordinate systems
+==================
+
+AeroDyn uses different coordinate system for its internal computations and its outputs.
+The output channels are typically suffixed with a letter corresponding to the coordinate system being used:
+
+* (i): inertial system
+* (h): hub system
+* (p): polar system
+* (l): local-polar system
+* None or (w): the legacy output system.
+* (n-t): the legacy airfoil system.
+
+The different systems are described below.
+
+
+
+
+Inertial system (i)
+-------------------
+
+The inertial system :math:`(i)` is the global system used by OpenFAST (see ElastoDyn documentation).
+
+
+
+Hub system (h)
+--------------
+
+The hub system :math:`(h)` rotates along the :math:`x_h` axis based on the shaft azimuthal position :math:`\psi` (see ElastoDyn documentation).
+
+
+Polar system (p)
+----------------
+
+The polar system :math:`(p_k)` is constructed from the hub coordinate system :math:`(h)`
+by rotating the :math:`x_h` axis by the azimuthal offset of each blade :math:`\psi_{0,k}` (the blades are distributed evenly across the azimuth).
+For conciseness we refer to this system as the :math:`(p)` system.
+If the number of blade is written :math:`n_B`, the azimuthal offset for blade :math:`k` is:
+
+.. math::
+
+ \begin{aligned}
+ \psi_{0,k} = 2 \pi \frac{k-1}{n_B}
+ \end{aligned}
+
+For blade 1, :math:`\psi_{0,1}=0`, therefore :math:`y_{p,1}=y_h` and :math:`z_{p,1}=z_h`.
+
+The :math:`x_{p,k}` axis is along the hub x-axis.
+
+
+In the absence of coning, the :math:`z_{p,k}` axis corresponds to the :math:`z_{b,k}` axis of the blade.
+
+
+Cone system (c)
+---------------
+
+The cone system :math:`(c)` is obtained from the polar system by a rotation about the :math:`y_{p,k}` axis of each blade :math:`k`.
+See ElastoDyn/FAST8 documentation for more details.
+AeroDyn uses this system to estimate the blade pitch angle (by comparing the :math:`(c)` and :math:`(b)` systems).
+
+
+
+Blade system (b)
+----------------
+
+The blade system :math:`(b)` is otbained from the cone system by a rotation (pitching) about the :math:`z_c` axis.
+It is used to define the location of the aerodynamic center, the local twist of the blade along the span of the blade.
+See :numref:`blade_data_input_file` and :numref:`ad_blade_geom`.
+
+
+
+
+Airfoil system (a)
+------------------
+
+**Currently the user specifies the prebend orientation in the input file and it is used to orient the airfoil** (i.e. the axis :math:`z_a`). In the future, this orientation may be computed automatically from the AC-line.
+
+
+The airfoil section system :math:`(a_{_{kj}})`, or :math:`(a)` for short, is the coordinate system where Blade Element Theory is applied, and where the airfoil shape and polar data are given.
+The airfoil coordinate system, :math:`(a_{_{kj}})` is defined for each blade :math:`k` and each blade node :math:`j`.
+The :math:`y_a` axis is along the airfoil chord (tangential to chord), towards the trailing
+edge.
+The :math:`x_a` axis is normal to chord, towards the suction side (for an asymmetric airfoil).
+See :numref:`ad_cs_airfoil`.
+
+
+
+.. _ad_cs_airfoil:
+
+.. figure:: figs/FASTAirfoilSystem.svg
+ :width: 80%
+ :align: center
+
+ The airfoil (a) coordinate system.
+
+
+The :math:`(a)` system is where Blade Element Theory (BET) is applied: the angle of attack, :math:`\alpha`, the lift, :math:`L`, and drag, :math:`D`, are all defined in the :math:`x_a-y_a` plane.
+The lifting line loads are computed in this system.
+The relative wind in this system is the projection of the 3D
+relative wind into the 2D plane of the :math:`(a)`-system, noted :math:`{}^{\perp_a}\boldsymbol{V}_\text{rel}` or :math:`\boldsymbol{V}_\text{rel,a}`.
+
+In the airfoil system, we have:
+
+.. math::
+
+ \begin{aligned}
+ C_{x_a} = C_l(\alpha) \cos\alpha + C_d(\alpha)\sin\alpha % that's Cn
+ ,\quad
+ C_{y_a} = -C_l(\alpha) \sin\alpha + C_d(\alpha)\cos\alpha % that's -Ct for the t of AeroDyn
+ ,\quad
+ C_{m_a} = C_m(\alpha)
+ \end{aligned}
+
+and the loads (per unit length) are:
+
+.. math::
+
+ \begin{aligned}
+ f_{x_a} = \frac{1}{2}\rho V_{\text{rel},a}^2 c C_{x_a}
+ ,\quad
+ f_{y_a} = \frac{1}{2}\rho V_{\text{rel},a}^2 c C_{y_a}
+ ,\quad
+ m_{z_a} = \frac{1}{2}\rho V_{\text{rel},a}^2 c^2 C_{m_a}
+ \end{aligned}
+
+
+
+Legacy (n-t) system
+-------------------
+
+In legacy AeroDyn code and documentation, the :math:`(n-t)` system is sometimes used.
+The :math:`n`-axis corresponds to the :math:`x_a` axis (normal to chord).
+The :math:`t`-axis corresponds to the :math:`-y_a` axis (opposite direction).
+
+
+
+
+Local polar system (l)
+----------------------
+
+**Currently the local polar system is only used for output purposes. It will be used in the BEM implementation in future releases.**
+
+
+The local polar coordinate system :math:`(l_{_{kj}})`, or :math:`(l)` for short, is similar to the polar coordinate system, but is rotated about the :math:`x_h` axis, such that the :math:`z_{l,kj}` axis passes through the deflected position of node :math:`j` of blade :math:`k`.
+
+:math:`x_l` is along the hub :math:`x_h` axis,
+and :math:`z_l` is the radial coordinate in the plane normal to the shaft axis.
+The coordinate system is illustrated in :numref:`ad_cs_localpolar` for a case with prebend only (left) and presweep only (right).
+
+
+
+.. _ad_cs_localpolar:
+
+.. figure:: figs/FASTLocalPolarSystem.svg
+ :width: 70%
+ :align: center
+
+ The polar (p) and local polar (l) coordinate systems.
+ Left: pure prebend.
+ Right: pure sweep.
+
+
+The local polar coordinate system is defined for each blade node as follows. The position of a deflected blade node :math:`A_j` with respect to the hub :math:`H` is :
+
+ .. math::
+
+ \begin{aligned}
+ \boldsymbol{r}_{HA_j} = \boldsymbol{r}_{A_j}-\boldsymbol{r}_H
+ \end{aligned}
+
+This vector is projected onto the rotor plane as follows:
+
+ .. math::
+
+ \begin{aligned}
+ \boldsymbol{r}_{HA_j}^\perp = \mathop{\mathrm{\boldsymbol{\mathrm{P}}}}_{\boldsymbol{\hat{x}}_h}(\boldsymbol{r}_{HA_j}) = \boldsymbol{r}_{HA_j} - (\boldsymbol{\hat{x}}_h \cdot {\boldsymbol{r}_{HA_j}}) \boldsymbol{\hat{x}}_h
+ \end{aligned}
+
+
+The vectors of the local polar coordinate system are then defined as:
+
+ .. math::
+
+ \begin{aligned}
+ \boldsymbol{\hat{x}}_{l} = \boldsymbol{\hat{x}}_h
+ ,\quad
+ \boldsymbol{\hat{z}}_{l} = \frac{ \boldsymbol{r}_{HA_j}^\perp }{\lVert\boldsymbol{r}_{HA_j}\rVert}
+ ,\quad
+ \boldsymbol{\hat{y}}_{l} = \boldsymbol{\hat{z}}_h \times \boldsymbol{\hat{x}}_h
+ \end{aligned}
+
+The local polar coordinate systems of the different blade nodes differ from
+an azimuthal rotation about the :math:`x_h` axis (and a translation
+of origin about the :math:`x_h`-axis, which is mostly irrelevant).
+
+
+Legacy local output system (w)
+------------------------------
+
+**Outputs of AeroDyn labeled "x" or "y" without any other letters defining the coordinate system are currently provided in the legacy output system.** (for instance :math:`F_x`, :math:`V_x`, or :math:`V_{dis,y}`).
+
+We write :math:`(w)` the legacy output system of OpenFAST. The legacy output system has previously been documented using Figure :numref:`ad_blade_local_cs`.
+The figure also shows the direction of the local angles and force components.
+In this figure, :math:`x` should be understood as :math:`x_w` and :math:`y` as :math:`y_w`.
+The figure is mostly valid if there is no prebend, precone or presweep.
+
+
+
+.. _ad_blade_local_cs:
+
+.. figure:: figs/aerodyn_blade_local_cs.png
+ :width: 80%
+ :align: center
+ :alt: aerodyn_blade_local_cs.png
+
+ AeroDyn Legacy Local Output Coordinate System (Looking Toward the Tip,
+ from the Root) – l: Lift, d: Drag, m: Pitching, x: Normal (to Plane),
+ y: Tangential (to Plane), n: Normal (to Chord),
+ and t: Tangential (to Chord)
+
+
+
+
+
+The :math:`(w_{kj})` is defined for each blade :math:`k` and node :math:`j`, written :math:`(w)` for conciseness.
+The :math:`(w)` system is a transformation of the airfoil system such that this system has no
+rotation about the :math:`x` (sweep) or :math:`z` (pitch/twist) axis compared to the coned coordinate system.
+
+ - The :math:`y_w`-axis (in plane) of this system is orthogonal to
+ the pitch axis, neglecting presweep and in-plane deflection.
+
+ - The :math:`x_w`-axis (out of plane) is normal to the deflected
+ blade, including precurve and out-of-plane deflection.
+
+ - The :math:`z_w`-axis (radial) is tangent to the deflected blade,
+ including precurve and out-of-plane deflection.
+
+The system is constructed as follows in AeroDyn. First, the coned
+coordinate system :math:`(c)` (located at the blade root, coned, but
+without pitching) is defined using the following substeps and
+matrices:
+
+ - :math:`\boldsymbol{R}_{bi}`: from inertial to blade root (the
+ blade root is pitched by :math:`\theta_p`).
+
+ - :math:`\boldsymbol{R}_{hi}`: from inertial to hub.
+
+ - :math:`\boldsymbol{R}_{bh} = \boldsymbol{R}_{bi} \boldsymbol{R}_{hi}^t=\mathop{\mathrm{Euler}}(\theta_1, \theta_2, -\theta_p)`:
+ from hub to blade. The third Euler angle from
+ :math:`\boldsymbol{R}_{bh}` is the opposite of the pitch angle
+ :math:`\theta_p` (wind turbines use a negative convention of pitch
+ and twist about the :math:`z` axis). By setting this Euler angle
+ to zero and constructing the transformation matrix from the two
+ first angles, one obtains:
+
+ - :math:`\boldsymbol{R}_{ch}=\mathop{\mathrm{Euler}}(\theta_1, \theta_2,0)`:
+ from hub to the coned coordinate system.
+
+ - :math:`\boldsymbol{R}_{ci}=\boldsymbol{R}_{ch} \boldsymbol{R}_{hi}`:
+ from inertial to coned coordinate system.
+
+Then, the :math:`(w)` system is defined for each airfoil cross
+section:
+
+ - :math:`\boldsymbol{R}_{ai}`: from inertial to blade airfoil
+ section (include elastic motions)
+
+ - From coned system to blade airfoil section:
+
+ .. math::
+
+ \begin{aligned}
+ \boldsymbol{R}_{ac}=\boldsymbol{R}_{ai}\boldsymbol{R}_{ci}^t=\mathop{\mathrm{Euler}}({}^w\!\tau,{}^w\!\kappa,-{}^w\!\beta)
+ \label{eq:R_acBetaFull}
+ \end{aligned}
+
+ where :math:`{}^w\!\beta` contains the full twist (aerodynamic,
+ elastic and pitch), :math:`{}^w\!\tau` would be the toe angle (but
+ it is not used) :math:`{}^w\!\kappa` is the cant angle (stored as
+ ``Curve``). We use the supperscript :math:`w` because these angles
+ are defined as part of the :math:`(w)` system.
+
+ - :math:`\boldsymbol{R}_{wc}=\mathop{\mathrm{Euler}}(0,{}^w\!\kappa,0)`:
+ from coned system to :math:`w`-system. The :math:`(w)` system
+ keeps only the rotation about :math:`y_c`
+ (:math:`\approx`\ prebend), thereby neglecting the ones about
+ :math:`x` (sweep) and :math:`z` (:math:`\approx` twist+pitch).
+
+ - :math:`\boldsymbol{R}_{wi}=\boldsymbol{R}_{wc}\boldsymbol{R}_{ci}`:
+ from inertial system to :math:`w`-system
+
+
+
+
+
+
+
+Tower system
+------------
+
+The local tower coordinate system is shown in :numref:`ad_tower_geom`.
diff --git a/docs/source/user/aerodyn/figs/FASTAirfoilSystem.svg b/docs/source/user/aerodyn/figs/FASTAirfoilSystem.svg
new file mode 100644
index 0000000000..5777caa96d
--- /dev/null
+++ b/docs/source/user/aerodyn/figs/FASTAirfoilSystem.svg
@@ -0,0 +1,705 @@
+
+
+
+
diff --git a/docs/source/user/aerodyn/figs/FASTLocalPolarSystem.svg b/docs/source/user/aerodyn/figs/FASTLocalPolarSystem.svg
new file mode 100644
index 0000000000..ffbae8227a
--- /dev/null
+++ b/docs/source/user/aerodyn/figs/FASTLocalPolarSystem.svg
@@ -0,0 +1,611 @@
+
+
+
+
diff --git a/docs/source/user/aerodyn/figs/UAAirfoilSystem.png b/docs/source/user/aerodyn/figs/UAAirfoilSystem.png
deleted file mode 100644
index e123b10289..0000000000
Binary files a/docs/source/user/aerodyn/figs/UAAirfoilSystem.png and /dev/null differ
diff --git a/docs/source/user/aerodyn/figs/UAAirfoilSystem.svg b/docs/source/user/aerodyn/figs/UAAirfoilSystem.svg
index 9247086220..ec6f2d2cc2 100644
--- a/docs/source/user/aerodyn/figs/UAAirfoilSystem.svg
+++ b/docs/source/user/aerodyn/figs/UAAirfoilSystem.svg
@@ -2,19 +2,19 @@
diff --git a/docs/source/user/aerodyn/index.rst b/docs/source/user/aerodyn/index.rst
index 9fafc5a5e6..7b414b4b28 100644
--- a/docs/source/user/aerodyn/index.rst
+++ b/docs/source/user/aerodyn/index.rst
@@ -26,6 +26,7 @@ The documentation here was derived from AeroDyn Manual for AeroDyn version 15.04
:maxdepth: 2
introduction.rst
+ coordsys.rst
input.rst
output.rst
modeling.rst
diff --git a/docs/source/user/aerodyn/introduction.rst b/docs/source/user/aerodyn/introduction.rst
index 6a1a380e80..c743fc2875 100644
--- a/docs/source/user/aerodyn/introduction.rst
+++ b/docs/source/user/aerodyn/introduction.rst
@@ -199,3 +199,6 @@ file, and the results file.
using AeroDyn.
Example input files are included in :numref:`ad_input_files`. A summary of
available output channels are found :numref:`ad_output_channels`.
+
+
+
diff --git a/docs/source/user/aerodyn/theory_ua.rst b/docs/source/user/aerodyn/theory_ua.rst
index d55699d5b5..005e478fdd 100644
--- a/docs/source/user/aerodyn/theory_ua.rst
+++ b/docs/source/user/aerodyn/theory_ua.rst
@@ -45,8 +45,8 @@ the inputs present in the profile input file (including some of the ones repeate
The airfoil section coordinate system and main variables are presented in :numref:`fig:UAAirfoilSystem` and further described below:
-.. figure:: figs/UAAirfoilSystem.png
- :width: 60%
+.. figure:: figs/UAAirfoilSystem.svg
+ :width: 70%
:name: fig:UAAirfoilSystem
Definition of aifoil section coordinate system used in the unsteady aerodynamics module
diff --git a/docs/source/user/aeromap/examples/AeroMap.dvr b/docs/source/user/aeromap/examples/AeroMap.dvr
new file mode 100644
index 0000000000..303e9fe5f3
--- /dev/null
+++ b/docs/source/user/aeromap/examples/AeroMap.dvr
@@ -0,0 +1,40 @@
+------- OpenFAST AeroMap INPUT FILE ----------------------------------------------
+AeroMap generation for FAST Certification Test #18: NREL 5.0 MW Baseline Wind Turbine (Onshore)
+---------------------- OpenFAST MODEL FILE ---------------------------------------
+"openfast.fst" FstFile - Name of the primary OpenFAST input file (-)
+---------------------- STEADY-STATE SIMULATION CONTROL --------------------------------------
+false Echo - Echo input data to .ech (flag)
+ 1e-4 Toler - Convergence tolerance for nonlinear solve residual equation [>0] (-)
+ 50 MaxIter - Maximum number of iteration steps for nonlinear solve [>0] (-)
+ 1 N_SSJac - Number of iteration steps to recalculate steady-state Jacobian (-) [1=every iteration step, 2=every other step] (Note: for large flexible blades, this almost always needs to be 1)
+ 1E+05 SSJacSclFact - Scaling factor used in steady-state Jacobians (-) [on order of blade mass in kg]
+---------------------- STEADY-STATE CASES --------------------------------------
+ 1 WindSpeedOrTSR - Choice of swept parameter (switch) { 1:wind speed; 2: TSR }
+ 25 NumCases - Number of cases to run
+RotSpeed WndSpeedOrTSR Pitch
+(rpm) (m/s or -) (deg)
+ 8.0000 3.0000 0.0000
+ 8.0000 6.0000 0.0000
+ 8.0000 9.0000 0.0000
+ 8.0000 12.0000 0.0000
+ 8.0000 15.0000 0.0000
+ 8.0000 15.0000 3.0000
+ 8.0000 12.0000 3.0000
+ 8.0000 9.0000 3.0000
+ 8.0000 6.0000 3.0000
+ 8.0000 3.0000 3.0000
+ 8.0000 3.0000 6.0000
+ 8.0000 6.0000 6.0000
+ 8.0000 9.0000 6.0000
+ 8.0000 12.0000 6.0000
+ 8.0000 15.0000 6.0000
+ 8.0000 15.0000 9.0000
+ 8.0000 12.0000 9.0000
+ 8.0000 9.0000 9.0000
+ 8.0000 6.0000 9.0000
+ 8.0000 3.0000 9.0000
+ 8.0000 3.0000 12.0000
+ 8.0000 6.0000 12.0000
+ 8.0000 9.0000 12.0000
+ 8.0000 12.0000 12.0000
+ 8.0000 15.0000 12.0000
diff --git a/docs/source/user/turbsim/examples/TurbSim_User.profiles b/docs/source/user/turbsim/examples/TurbSim_User.profiles
index 3063d952bb..63af934660 100644
--- a/docs/source/user/turbsim/examples/TurbSim_User.profiles
+++ b/docs/source/user/turbsim/examples/TurbSim_User.profiles
@@ -6,8 +6,8 @@ Made up profiles
1.0 StdScale2 - v-component scaling factor for the input standard deviation
0.534 StdScale3 - w-component scaling factor for the input standard deviation
-----------------------------------------------------------------------------------
-Height Wind Speed Wind --Direction-- Standard Deviation Length Scale
- (m) (m/s) (deg, cntr-clockwise ) (m/s) (m)
+Height Wind Speed Wind --Angle-- Standard Deviation Length Scale
+ (m) (m/s) (deg, cntr-clockwise ) (m/s) (m)
-----------------------------------------------------------------------------------
15.0 3 00 .100 3
25.0 4 00 .200 4
diff --git a/glue-codes/fast-farm/src/FAST_Farm_Subs.f90 b/glue-codes/fast-farm/src/FAST_Farm_Subs.f90
index 6eaf96b93f..144aea8635 100644
--- a/glue-codes/fast-farm/src/FAST_Farm_Subs.f90
+++ b/glue-codes/fast-farm/src/FAST_Farm_Subs.f90
@@ -2690,6 +2690,17 @@ subroutine FARM_CalcOutput(t, farm, ErrStat, ErrMsg)
!$OMP END PARALLEL DO
if (ErrStat >= AbortErrLev) return
+ ! IO operation, not done using OpenMP
+ DO nt = 1,farm%p%NumTurbines
+ call WD_WritePlaneOutputs( t, farm%WD(nt)%u, farm%WD(nt)%p, farm%WD(nt)%x, farm%WD(nt)%xd, farm%WD(nt)%z, &
+ farm%WD(nt)%OtherSt, farm%WD(nt)%y, farm%WD(nt)%m, ErrStat2, ErrMsg2 )
+ if (ErrStat2 >= AbortErrLev) then
+ call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'T'//trim(num2lstr(nt))//':'//RoutineName)
+ endif
+ END DO
+ if (ErrStat >= AbortErrLev) return
+
+
call Transfer_WD_to_AWAE(farm)
if ( farm%p%UseSC ) then
diff --git a/glue-codes/openfast-cpp/CMakeLists.txt b/glue-codes/openfast-cpp/CMakeLists.txt
index 1b9cc76bf0..2d23a99790 100644
--- a/glue-codes/openfast-cpp/CMakeLists.txt
+++ b/glue-codes/openfast-cpp/CMakeLists.txt
@@ -29,7 +29,10 @@ find_package(ZLIB REQUIRED)
find_package(HDF5 REQUIRED COMPONENTS C HL)
find_package(yaml-cpp REQUIRED)
-add_library(openfastcpplib src/OpenFAST.cpp src/SC.cpp)
+add_library(openfastcpplib
+ src/OpenFAST.cpp
+ src/SC.cpp
+)
set_property(TARGET openfastcpplib PROPERTY POSITION_INDEPENDENT_CODE ON)
target_link_libraries(openfastcpplib
openfastlib
diff --git a/glue-codes/openfast-cpp/src/OpenFAST.H b/glue-codes/openfast-cpp/src/OpenFAST.H
index 21ed980aa3..b744b3eacb 100644
--- a/glue-codes/openfast-cpp/src/OpenFAST.H
+++ b/glue-codes/openfast-cpp/src/OpenFAST.H
@@ -9,7 +9,7 @@
#include
#include