diff --git a/.github/workflows/automated-dev-tests.yml b/.github/workflows/automated-dev-tests.yml index 723b585dad..2b3de8db5d 100644 --- a/.github/workflows/automated-dev-tests.yml +++ b/.github/workflows/automated-dev-tests.yml @@ -21,68 +21,12 @@ env: C_COMPILER: gcc-12 GCOV_EXE: gcov-12 CMAKE_BUILD_PARALLEL_LEVEL: 8 - CTEST_PARALLEL_LEVEL: 2 - + CTEST_PARALLEL_LEVEL: 4 jobs: ### BUILD JOBS - - build-all-debug: - # Tests compiling in debug mode. - # Also compiles the Registry and generates new types files. - # Debug more speeds up the build. - runs-on: ubuntu-22.04 - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - submodules: recursive - - name: Setup Python - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - name: Set up MATLAB - uses: matlab-actions/setup-matlab@v2 - with: - products: Simulink - - name: Install dependencies - run: | - pip install -r requirements.txt - 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 - working-directory: ${{runner.workspace}}/openfast/build - run: | - cmake \ - -DCMAKE_INSTALL_PREFIX:PATH=${{runner.workspace}}/openfast/install \ - -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 - working-directory: ${{runner.workspace}}/openfast/build - run: | - cmake --build . --target all - - name: Cache the workspace - uses: actions/cache@v4 - with: - path: ${{runner.workspace}} - key: build-all-debug-${{ github.sha }} - build-all-debug-single: # Tests compiling in debug mode with single precision. # This workspace is not used by any other subtests, it checks type errors of the type ReKi/R8Ki @@ -91,476 +35,43 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 - 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 - working-directory: ${{runner.workspace}}/openfast/build - run: | - cmake \ - -DCMAKE_INSTALL_PREFIX:PATH=${{runner.workspace}}/openfast/install \ - -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 \ - -DDOUBLE_PRECISION:BOOL=OFF \ - ${GITHUB_WORKSPACE} - - name: Build all - working-directory: ${{runner.workspace}}/openfast/build - run: | - cmake --build . --target all - - - - build-drivers-release: - runs-on: ubuntu-22.04 - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - submodules: recursive - - name: Setup Python - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - name: Install dependencies - run: | - pip install -r requirements.txt - 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 - working-directory: ${{runner.workspace}}/openfast/build - run: | - cmake \ - -DCMAKE_INSTALL_PREFIX:PATH=${{runner.workspace}}/openfast/install \ - -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 \ - -DCTEST_PLOT_ERRORS:BOOL=ON \ - ${GITHUB_WORKSPACE} - - name: Build module drivers - working-directory: ${{runner.workspace}}/openfast/build - run: | - cmake --build . --target regression_test_module_drivers - - name: Cache the workspace - uses: actions/cache@v4 - with: - path: ${{runner.workspace}} - key: build-drivers-release-${{ github.sha }} - - - build-postlib-release: - runs-on: ubuntu-22.04 - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - submodules: recursive - - name: Setup Python - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - name: Set up MATLAB - uses: matlab-actions/setup-matlab@v2 - with: - products: Simulink - - name: Install dependencies - run: | - pip install -r requirements.txt - sudo apt-get update -y - sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev - sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev # gcovr - - name: Setup workspace - run: cmake -E make_directory ${{runner.workspace}}/openfast/build - - name: Configure build - working-directory: ${{runner.workspace}}/openfast/build - run: | - cmake \ - -DCMAKE_INSTALL_PREFIX:PATH=${{runner.workspace}}/openfast/install \ - -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 \ - -DVARIABLE_TRACKING=OFF \ - -DBUILD_FASTFARM:BOOL=ON \ - -DBUILD_OPENFAST_CPP_API:BOOL=ON \ - -DBUILD_OPENFAST_LIB_DRIVER:BOOL=ON \ - -DBUILD_OPENFAST_CPP_DRIVER:BOOL=ON \ - -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 - run: cmake --build . --target openfast_postlib - - name: Cache the workspace - uses: actions/cache@v4 - with: - path: ${{runner.workspace}} - key: build-postlib-release-${{ github.sha }} - - - build-interfaces-release: - runs-on: ubuntu-22.04 - needs: build-postlib-release - steps: - - name: Cache the workspace - uses: actions/cache@v4 - with: - path: ${{runner.workspace}} - key: build-postlib-release-${{ github.sha }} - - name: Setup Python - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - name: Install dependencies - run: | - pip install -r requirements.txt - sudo apt-get update -y - sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev - sudo apt-get install -y libhdf5-dev libnetcdf-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: | - cmake --build . --target openfastlib openfast_lib_driver openfastcpp aerodyn_inflow_c_binding moordyn_c_binding ifw_c_binding hydrodyn_c_binding regression_test_controllers - - name: Cache the workspace - uses: actions/cache@v4 - with: - path: ${{runner.workspace}} - key: build-interfaces-release-${{ github.sha }} - - - build-openfast-release: - runs-on: ubuntu-22.04 - needs: build-postlib-release - steps: - - name: Cache the workspace - uses: actions/cache@v4 - with: - path: ${{runner.workspace}} - key: build-postlib-release-${{ github.sha }} - - name: Setup Python - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - name: Install dependencies - run: | - pip install -r requirements.txt - sudo apt-get update -y - sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev - sudo apt-get install -y libhdf5-dev libnetcdf-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: | - cmake --build . --target openfast - - name: Cache the workspace - uses: actions/cache@v4 - with: - path: ${{runner.workspace}} - key: build-openfast-release-${{ github.sha }} - - - build-fastfarm-release: - runs-on: ubuntu-22.04 - needs: build-postlib-release - steps: - - name: Cache the workspace - uses: actions/cache@v4 - with: - path: ${{runner.workspace}} - key: build-postlib-release-${{ github.sha }} - - name: Setup Python - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - name: Install dependencies - run: | - pip install -r requirements.txt - sudo apt-get update -y - sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev - sudo apt-get install -y libhdf5-dev libnetcdf-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: | - cmake --build . --target FAST.Farm - - name: Cache the workspace - uses: actions/cache@v4 - with: - path: ${{runner.workspace}} - key: build-fastfarm-release-${{ github.sha }} - - - - ### BUILD AND TEST JOBS - - build-test-uadriver-debug: - # UA driver used to require -DUA_OUTS - runs-on: ubuntu-22.04 - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - submodules: recursive - - name: Setup Python - uses: actions/setup-python@v5 - with: - python-version: '3.11' - name: Install dependencies run: | - pip install -r requirements.txt sudo apt-get update -y - sudo apt-get install -y libopenblas-dev + sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Setup workspace run: cmake -E make_directory ${{runner.workspace}}/openfast/build - - name: Configure build - working-directory: ${{runner.workspace}}/openfast/build - run: | - cmake \ - -DCMAKE_INSTALL_PREFIX:PATH=${{runner.workspace}}/openfast/install \ - -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 \ - -DVARIABLE_TRACKING=OFF \ - -DBUILD_TESTING:BOOL=ON \ - -DCTEST_PLOT_ERRORS:BOOL=ON \ - ${GITHUB_WORKSPACE} - - name: Build all - working-directory: ${{runner.workspace}}/openfast/build - run: | - cmake --build . --target unsteadyaero_driver - - - name: Run UnsteadyAero tests - working-directory: ${{runner.workspace}}/openfast/build - shell: bash - run: | - ctest -VV -R "^ua_" - - - name: Failing test artifacts - uses: actions/upload-artifact@v4 - if: failure() - with: - name: rtest-uadriver - path: | - ${{runner.workspace}}/openfast/build/reg_tests/modules/unsteadyaero - - - - ### TEST JOBS - - rtest-module-drivers: - runs-on: ubuntu-22.04 - needs: build-drivers-release - steps: - - name: Cache the workspace - uses: actions/cache@v4 - with: - path: ${{runner.workspace}} - key: build-drivers-release-${{ github.sha }} - - name: Setup Python - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - name: Install dependencies - run: | - pip install -r requirements.txt - sudo apt-get update -y - sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev - sudo apt-get install -y libhdf5-dev libnetcdf-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: - test-target: regression - - name: Run BeamDyn tests - uses: ./.github/actions/tests-module-beamdyn - with: - test-target: regression - - name: Run HydroDyn tests - uses: ./.github/actions/tests-module-hydrodyn - - name: Run InflowWind tests - uses: ./.github/actions/tests-module-inflowwind - with: - test-target: regression - - name: Run MoorDyn tests - uses: ./.github/actions/tests-module-moordyn - - name: Run SeaState tests - uses: ./.github/actions/tests-module-seastate - - name: Run SubDyn tests - uses: ./.github/actions/tests-module-subdyn - - name: Failing test artifacts - uses: actions/upload-artifact@v4 - if: failure() - with: - name: rtest-module-drivers - path: | - ${{runner.workspace}}/openfast/build/reg_tests/modules - - - rtest-modules-debug: - runs-on: ubuntu-22.04 - needs: build-all-debug - steps: - - name: Cache the workspace - uses: actions/cache@v4 - with: - path: ${{runner.workspace}} - key: build-all-debug-${{ github.sha }} - - name: Setup Python - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - name: Install dependencies - run: | - pip install -r requirements.txt - sudo apt-get update -y - sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev - sudo apt-get install -y libhdf5-dev libnetcdf-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 AeroDyn tests - uses: ./.github/actions/tests-module-aerodyn - with: - # Don't run regression tests here since they currently fail inconsistently - test-target: unit - - name: Run BeamDyn tests - uses: ./.github/actions/tests-module-beamdyn - - name: Run HydroDyn tests - uses: ./.github/actions/tests-module-hydrodyn - - name: Run InflowWind tests - uses: ./.github/actions/tests-module-inflowwind - - name: Run MoorDyn tests - uses: ./.github/actions/tests-module-moordyn - - name: Run NWTC Library tests - uses: ./.github/actions/tests-module-nwtclibrary - - name: Run SeaState tests - uses: ./.github/actions/tests-module-seastate - - name: Run SubDyn tests - uses: ./.github/actions/tests-module-subdyn - - name: Run VersionInfo tests - uses: ./.github/actions/tests-module-version - - name: Failing test artifacts - uses: actions/upload-artifact@v4 - if: failure() - with: - name: rtest-modules-debug - path: | - ${{runner.workspace}}/openfast/build/reg_tests/modules - ${{runner.workspace}}/openfast/build/unit_tests - - - rtest-interfaces: - runs-on: ubuntu-22.04 - needs: build-interfaces-release - steps: - - name: Cache the workspace - uses: actions/cache@v4 - with: - path: ${{runner.workspace}} - key: build-interfaces-release-${{ github.sha }} - - name: Setup Python - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - name: Install dependencies - run: | - pip install -r requirements.txt - sudo apt-get update -y - sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev - sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - - name: Configure Tests + - name: Configure build working-directory: ${{runner.workspace}}/openfast/build run: | cmake \ - -DPython_ROOT_DIR:STRING=${{env.pythonLocation}} \ - -DBUILD_TESTING:BOOL=ON \ - -DCTEST_PLOT_ERRORS:BOOL=ON \ + -DCMAKE_INSTALL_PREFIX:PATH=${{runner.workspace}}/openfast/install \ + -DCMAKE_Fortran_COMPILER:STRING=${{env.FORTRAN_COMPILER}} \ + -DCMAKE_CXX_COMPILER:STRING=${{env.CXX_COMPILER}} \ + -DCMAKE_C_COMPILER:STRING=${{env.C_COMPILER}} \ + -DPython_ROOT_DIR:PATH=${{env.pythonLocation}} \ + -DBLA_VENDOR:STRING=OpenBLAS \ + -DCMAKE_BUILD_TYPE:STRING=DEBUG \ + -DVARIABLE_TRACKING:BOOL=OFF \ + -DDOUBLE_PRECISION:BOOL=OFF \ + -DBUILD_OPENFAST_CPP_API:BOOL=ON \ + -DBUILD_OPENFAST_LIB_DRIVER:BOOL=ON \ + -DBUILD_OPENFAST_CPP_DRIVER:BOOL=ON \ + -DBUILD_FASTFARM:BOOL=ON \ ${GITHUB_WORKSPACE} - - name: Run Interface / API tests + - name: Build all working-directory: ${{runner.workspace}}/openfast/build run: | - ctest -VV -L "cpp|python|fastlib" \ - -LE "openfast_io" - - name: Failing test artifacts - uses: actions/upload-artifact@v4 - if: failure() - with: - name: rtest-interfaces - path: | - ${{runner.workspace}}/openfast/build/reg_tests/glue-codes/openfast-cpp - ${{runner.workspace}}/openfast/build/reg_tests/glue-codes/python - ${{runner.workspace}}/openfast/build/reg_tests/modules/aerodyn - ${{runner.workspace}}/openfast/build/reg_tests/modules/moordyn - ${{runner.workspace}}/openfast/build/reg_tests/modules/inflowwind - ${{runner.workspace}}/openfast/build/reg_tests/modules/hydrodyn - !${{runner.workspace}}/openfast/build/reg_tests/glue-codes/openfast-cpp/5MW_Baseline + cmake --build . --target all - rtest-OF: + build-all-release: runs-on: ubuntu-22.04 - needs: build-openfast-release steps: - - name: Cache the workspace - uses: actions/cache@v4 + - name: Checkout + uses: actions/checkout@v4 with: - path: ${{runner.workspace}} - key: build-openfast-release-${{ github.sha }} + submodules: recursive - name: Setup Python uses: actions/setup-python@v5 with: @@ -569,48 +80,55 @@ jobs: run: | pip install -r requirements.txt sudo apt-get update -y - sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev - sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - - name: Configure Tests + sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev + - name: Setup workspace + run: cmake -E make_directory ${{runner.workspace}}/openfast/build + - name: Configure build working-directory: ${{runner.workspace}}/openfast/build run: | cmake \ - -DPython_ROOT_DIR:STRING=${{env.pythonLocation}} \ + -DCMAKE_INSTALL_PREFIX:PATH=${{runner.workspace}}/openfast/install \ + -DCMAKE_Fortran_COMPILER:STRING=${{env.FORTRAN_COMPILER}} \ + -DCMAKE_CXX_COMPILER:STRING=${{env.CXX_COMPILER}} \ + -DCMAKE_C_COMPILER:STRING=${{env.C_COMPILER}} \ + -DPython_ROOT_DIR:PATH=${{env.pythonLocation}} \ + -DBUILD_SHARED_LIBS:BOOL=OFF \ + -DBLA_VENDOR:STRING=OpenBLAS \ + -DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo \ + -DVARIABLE_TRACKING:BOOL=OFF \ -DBUILD_TESTING:BOOL=ON \ -DCTEST_PLOT_ERRORS:BOOL=ON \ + -DOPENMP:BOOL=ON \ + -DDOUBLE_PRECISION=ON \ + -DBUILD_OPENFAST_CPP_API:BOOL=ON \ + -DBUILD_OPENFAST_LIB_DRIVER:BOOL=ON \ + -DBUILD_OPENFAST_CPP_DRIVER:BOOL=ON \ + -DBUILD_FASTFARM:BOOL=ON \ ${GITHUB_WORKSPACE} - cmake --build . --target regression_test_controllers - - name: Run 5MW tests + - name: Build all working-directory: ${{runner.workspace}}/openfast/build run: | - ctest -VV -j4 \ - -L openfast \ - -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@v4 - if: failure() + cmake --build . --target all + - name: Cache the workspace + uses: actions/cache@v4 with: - name: rtest-OF - 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 + path: ${{runner.workspace}} + key: build-all-release-${{ github.sha }} - rtest-openfast_io: + + + ### BUILD AND TEST JOBS + + build-all-test-modules-debug: + # Tests compiling in debug mode. + # Also compiles the Registry and generates new types files. + # Debug more speeds up the build. runs-on: ubuntu-22.04 - needs: build-openfast-release steps: - - name: Cache the workspace - uses: actions/cache@v4 + - name: Checkout + uses: actions/checkout@v4 with: - path: ${{runner.workspace}} - key: build-openfast-release-${{ github.sha }} + submodules: recursive - name: Setup Python uses: actions/setup-python@v5 with: @@ -620,57 +138,100 @@ jobs: pip install -r requirements.txt sudo apt-get update -y sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev - sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - - name: Install openfast_io - working-directory: ${{runner.workspace}}/openfast/openfast_io - run: | - pip install -e . - - name: Configure Tests + - name: Setup workspace + run: cmake -E make_directory ${{runner.workspace}}/openfast/build + - name: Configure build working-directory: ${{runner.workspace}}/openfast/build run: | cmake \ - -DPython_ROOT_DIR:STRING=${{env.pythonLocation}} \ + -DCMAKE_INSTALL_PREFIX:PATH=${{runner.workspace}}/openfast/install \ + -DCMAKE_Fortran_COMPILER:STRING=${{env.FORTRAN_COMPILER}} \ + -DCMAKE_CXX_COMPILER:STRING=${{env.CXX_COMPILER}} \ + -DCMAKE_C_COMPILER:STRING=${{env.C_COMPILER}} \ + -DPython_ROOT_DIR:PATH=${{env.pythonLocation}} \ + -DBLA_VENDOR:STRING=OpenBLAS \ + -DCMAKE_BUILD_TYPE:STRING=DEBUG \ + -DGENERATE_TYPES:BOOL=ON \ + -DVARIABLE_TRACKING:BOOL=OFF \ -DBUILD_TESTING:BOOL=ON \ -DCTEST_PLOT_ERRORS:BOOL=ON \ ${GITHUB_WORKSPACE} - cmake --build . --target regression_test_controllers - - name: Run openfast_io tests + # -DDOUBLE_PRECISION=OFF \ + - name: Build all + working-directory: ${{runner.workspace}}/openfast/build + run: | + cmake --build . --target all + - name: Run UnsteadyAero tests working-directory: ${{runner.workspace}}/openfast/build + shell: bash run: | - ctest -VV -j4 \ - -L openfast_io + ctest -VV -R "^ua_" + - name: Run AeroDyn tests + uses: ./.github/actions/tests-module-aerodyn + with: + # Don't run regression tests here since they currently fail inconsistently + test-target: unit + - name: Run BeamDyn tests + uses: ./.github/actions/tests-module-beamdyn + - name: Run HydroDyn tests + uses: ./.github/actions/tests-module-hydrodyn + - name: Run InflowWind tests + uses: ./.github/actions/tests-module-inflowwind + - name: Run MoorDyn tests + uses: ./.github/actions/tests-module-moordyn + - name: Run NWTC Library tests + uses: ./.github/actions/tests-module-nwtclibrary + - name: Run SeaState tests + uses: ./.github/actions/tests-module-seastate + - name: Run SubDyn tests + uses: ./.github/actions/tests-module-subdyn + - name: Run VersionInfo tests + uses: ./.github/actions/tests-module-version - name: Failing test artifacts uses: actions/upload-artifact@v4 if: failure() with: - name: rtest-openfast_io + name: rtest-modules-debug path: | - ${{runner.workspace}}/openfast/build/reg_tests/openfast_io + ${{runner.workspace}}/openfast/build/reg_tests/modules + ${{runner.workspace}}/openfast/build/unit_tests - rtest-OF-simulink: + build-test-OF-simulink: runs-on: ubuntu-22.04 - needs: build-openfast-release steps: - - name: Cache the workspace - uses: actions/cache@v4 + - name: Checkout + uses: actions/checkout@v4 with: - path: ${{runner.workspace}} - key: build-openfast-release-${{ github.sha }} + submodules: recursive - 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 + sudo apt-get install -y libopenblas-dev - name: Set up MATLAB uses: matlab-actions/setup-matlab@v2 with: products: Simulink - - name: Build FAST_SFunc + - name: Setup workspace + run: cmake -E make_directory ${{runner.workspace}}/openfast/build + - name: Configure build working-directory: ${{runner.workspace}}/openfast/build run: | cmake \ + -DCMAKE_INSTALL_PREFIX:PATH=${{runner.workspace}}/openfast/install \ + -DCMAKE_Fortran_COMPILER:STRING=${{env.FORTRAN_COMPILER}} \ + -DCMAKE_CXX_COMPILER:STRING=${{env.CXX_COMPILER}} \ + -DCMAKE_C_COMPILER:STRING=${{env.C_COMPILER}} \ + -DPython_ROOT_DIR:PATH=${{env.pythonLocation}} \ + -DBUILD_OPENFAST_SIMULINK_API:BOOL=ON \ -DUSE_LOCAL_STATIC_LAPACK:BOOL=ON \ + -DCMAKE_BUILD_TYPE:STRING=DEBUG \ + -DGENERATE_TYPES:BOOL=ON \ + -DVARIABLE_TRACKING:BOOL=OFF \ ${GITHUB_WORKSPACE} + - name: Build FAST_SFunc + working-directory: ${{runner.workspace}}/openfast/build + run: | cmake --build . --target FAST_SFunc - name: Run MATLAB tests and generate artifacts uses: matlab-actions/run-tests@v2 @@ -679,68 +240,79 @@ jobs: test-results-junit: test-results/results.xml code-coverage-cobertura: code-coverage/coverage.xml + ### TEST JOBS - rtest-OF-5MW_Land_AeroMap: + rtest-module-drivers: runs-on: ubuntu-22.04 - needs: build-openfast-release + needs: build-all-release steps: - name: Cache the workspace uses: actions/cache@v4 with: path: ${{runner.workspace}} - key: build-openfast-release-${{ github.sha }} + key: build-all-release-${{ github.sha }} - name: Setup Python uses: actions/setup-python@v5 with: python-version: '3.11' - 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" + pip install -r requirements.txt 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 + sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Configure Tests working-directory: ${{runner.workspace}}/openfast/build run: | cmake \ - -DPython_ROOT_DIR:STRING=${{env.pythonLocation}} \ + -DPython_ROOT_DIR:PATH=${{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: Run AeroDyn tests + uses: ./.github/actions/tests-module-aerodyn + with: + test-target: regression + - name: Run BeamDyn tests + uses: ./.github/actions/tests-module-beamdyn + with: + test-target: regression + - name: Run HydroDyn tests + uses: ./.github/actions/tests-module-hydrodyn + - name: Run InflowWind tests + uses: ./.github/actions/tests-module-inflowwind + with: + test-target: regression + - name: Run MoorDyn tests + uses: ./.github/actions/tests-module-moordyn + - name: Run SeaState tests + uses: ./.github/actions/tests-module-seastate + - name: Run SubDyn tests + uses: ./.github/actions/tests-module-subdyn - name: Failing test artifacts uses: actions/upload-artifact@v4 if: failure() with: - name: rtest-OF-5MW_Land_AeroMap + name: rtest-module-drivers 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: + rtest-interfaces: runs-on: ubuntu-22.04 - needs: build-openfast-release + needs: build-all-release + env: + OMP_NUM_THREADS: 1 steps: - name: Cache the workspace uses: actions/cache@v4 with: path: ${{runner.workspace}} - key: build-openfast-release-${{ github.sha }} + key: build-all-release-${{ github.sha }} - name: Setup Python uses: actions/setup-python@v5 with: - python-version: '3.10' + python-version: '3.11' - name: Install dependencies run: | pip install -r requirements.txt @@ -751,40 +323,42 @@ jobs: working-directory: ${{runner.workspace}}/openfast/build run: | cmake \ - -DPython_ROOT_DIR:STRING=${{env.pythonLocation}} \ + -DPython_ROOT_DIR:PATH=${{env.pythonLocation}} \ -DBUILD_TESTING:BOOL=ON \ -DCTEST_PLOT_ERRORS:BOOL=ON \ ${GITHUB_WORKSPACE} - cmake --build . --target regression_test_controllers - - name: Run 5MW tests + - name: Run Interface / API tests working-directory: ${{runner.workspace}}/openfast/build run: | - ctest -VV -L openfast -LE "cpp|linear|python" -R 5MW_OC4Semi_WSt_WavesWN + ctest -VV \ + -L "cpp|python|fastlib" \ + -LE "openfast_io" - name: Failing test artifacts uses: actions/upload-artifact@v4 if: failure() with: - name: rtest-OF-5MW_OC4Semi_WSt_WavesWN + name: rtest-interfaces 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 + ${{runner.workspace}}/openfast/build/reg_tests/glue-codes/openfast-cpp + ${{runner.workspace}}/openfast/build/reg_tests/glue-codes/python + ${{runner.workspace}}/openfast/build/reg_tests/modules/aerodyn + ${{runner.workspace}}/openfast/build/reg_tests/modules/moordyn + ${{runner.workspace}}/openfast/build/reg_tests/modules/inflowwind + ${{runner.workspace}}/openfast/build/reg_tests/modules/hydrodyn + !${{runner.workspace}}/openfast/build/reg_tests/glue-codes/openfast-cpp/5MW_Baseline - rtest-OF-5MW_OC3Mnpl_DLL_WTurb_WavesIrr: + rtest-OF: runs-on: ubuntu-22.04 - needs: build-openfast-release + needs: build-all-release + env: + OMP_NUM_THREADS: 1 steps: - name: Cache the workspace uses: actions/cache@v4 with: path: ${{runner.workspace}} - key: build-openfast-release-${{ github.sha }} + key: build-all-release-${{ github.sha }} - name: Setup Python uses: actions/setup-python@v5 with: @@ -799,7 +373,7 @@ jobs: working-directory: ${{runner.workspace}}/openfast/build run: | cmake \ - -DPython_ROOT_DIR:STRING=${{env.pythonLocation}} \ + -DPython_ROOT_DIR:PATH=${{env.pythonLocation}} \ -DBUILD_TESTING:BOOL=ON \ -DCTEST_PLOT_ERRORS:BOOL=ON \ ${GITHUB_WORKSPACE} @@ -807,14 +381,15 @@ jobs: - name: Run 5MW tests working-directory: ${{runner.workspace}}/openfast/build run: | - ctest -VV -L openfast -LE "cpp|linear|python" -R 5MW_OC3Mnpl_DLL_WTurb_WavesIrr -j1 + ctest -VV \ + -L openfast \ + -LE "cpp|linear|python|fastlib|offshore" - name: Failing test artifacts uses: actions/upload-artifact@v4 if: failure() with: - name: rtest-OF-5MW_OC3Mnpl_DLL_WTurb_WavesIrr + name: rtest-OF 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 @@ -824,15 +399,15 @@ jobs: !${{runner.workspace}}/openfast/build/reg_tests/glue-codes/openfast/WP_Baseline - rtest-OF-5MW_OC4Jckt_DLL_WTurb_WavesIrr_MGrowth: + rtest-OF-offshore: runs-on: ubuntu-22.04 - needs: build-openfast-release + needs: build-all-release steps: - name: Cache the workspace uses: actions/cache@v4 with: path: ${{runner.workspace}} - key: build-openfast-release-${{ github.sha }} + key: build-all-release-${{ github.sha }} - name: Setup Python uses: actions/setup-python@v5 with: @@ -847,7 +422,7 @@ jobs: working-directory: ${{runner.workspace}}/openfast/build run: | cmake \ - -DPython_ROOT_DIR:STRING=${{env.pythonLocation}} \ + -DPython_ROOT_DIR:PATH=${{env.pythonLocation}} \ -DBUILD_TESTING:BOOL=ON \ -DCTEST_PLOT_ERRORS:BOOL=ON \ ${GITHUB_WORKSPACE} @@ -855,14 +430,15 @@ jobs: - name: Run 5MW tests working-directory: ${{runner.workspace}}/openfast/build run: | - ctest -VV -L openfast -LE "cpp|linear|python" -R 5MW_OC4Jckt_DLL_WTurb_WavesIrr_MGrowth + ctest -VV \ + -L openfast -L offshore \ + -LE "cpp|linear|python|fastlib" - name: Failing test artifacts uses: actions/upload-artifact@v4 if: failure() with: - name: rtest-OF-5MW_OC4Jckt_DLL_WTurb_WavesIrr_MGrowth + name: rtest-OF-offshore 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 @@ -871,16 +447,18 @@ jobs: !${{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_OC3Trpd_DLL_WSt_WavesReg: + + rtest-OF-linearization: runs-on: ubuntu-22.04 - needs: build-openfast-release + needs: build-all-release + env: + OMP_NUM_THREADS: 1 steps: - name: Cache the workspace uses: actions/cache@v4 with: path: ${{runner.workspace}} - key: build-openfast-release-${{ github.sha }} + key: build-all-release-${{ github.sha }} - name: Setup Python uses: actions/setup-python@v5 with: @@ -895,22 +473,20 @@ jobs: working-directory: ${{runner.workspace}}/openfast/build run: | cmake \ - -DPython_ROOT_DIR:STRING=${{env.pythonLocation}} \ + -DPython_ROOT_DIR:PATH=${{env.pythonLocation}} \ -DBUILD_TESTING:BOOL=ON \ -DCTEST_PLOT_ERRORS:BOOL=ON \ ${GITHUB_WORKSPACE} - cmake --build . --target regression_test_controllers - - name: Run 5MW tests + - name: Run OpenFAST linearization tests working-directory: ${{runner.workspace}}/openfast/build run: | - ctest -VV -L openfast -LE "cpp|linear|python" -R 5MW_OC3Trpd_DLL_WSt_WavesReg + ctest -VV -L linear - name: Failing test artifacts uses: actions/upload-artifact@v4 if: failure() with: - name: rtest-OF-5MW_OC3Trpd_DLL_WSt_WavesReg + name: rtest-OF-linearization 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 @@ -919,16 +495,17 @@ jobs: !${{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_Land_BD_DLL_WTurb: + rtest-OF-aeromap: runs-on: ubuntu-22.04 - needs: build-openfast-release + needs: build-all-release + env: + OMP_NUM_THREADS: 1 steps: - name: Cache the workspace uses: actions/cache@v4 with: path: ${{runner.workspace}} - key: build-openfast-release-${{ github.sha }} + key: build-all-release-${{ github.sha }} - name: Setup Python uses: actions/setup-python@v5 with: @@ -943,22 +520,20 @@ jobs: working-directory: ${{runner.workspace}}/openfast/build run: | cmake \ - -DPython_ROOT_DIR:STRING=${{env.pythonLocation}} \ + -DPython_ROOT_DIR:PATH=${{env.pythonLocation}} \ -DBUILD_TESTING:BOOL=ON \ -DCTEST_PLOT_ERRORS:BOOL=ON \ ${GITHUB_WORKSPACE} - cmake --build . --target regression_test_controllers - - name: Run 5MW tests + - name: Run aero map tests working-directory: ${{runner.workspace}}/openfast/build run: | - ctest -VV -L openfast -LE "cpp|linear|python" -R 5MW_Land_BD_DLL_WTurb + ctest -VV -L aeromap -LE "cpp|linear|python" - name: Failing test artifacts uses: actions/upload-artifact@v4 if: failure() with: - name: rtest-OF-5MW_Land_BD_DLL_WTurb + name: rtest-OF-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 @@ -968,15 +543,17 @@ jobs: !${{runner.workspace}}/openfast/build/reg_tests/glue-codes/openfast/WP_Baseline - rtest-OF-linearization: + rtest-openfast_io: runs-on: ubuntu-22.04 - needs: build-openfast-release + needs: build-all-release + env: + OMP_NUM_THREADS: 1 steps: - name: Cache the workspace uses: actions/cache@v4 with: path: ${{runner.workspace}} - key: build-openfast-release-${{ github.sha }} + key: build-all-release-${{ github.sha }} - name: Setup Python uses: actions/setup-python@v5 with: @@ -987,43 +564,43 @@ jobs: sudo apt-get update -y sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev + - name: Install openfast_io + working-directory: ${{runner.workspace}}/openfast/openfast_io + run: | + pip install -e . - name: Configure Tests working-directory: ${{runner.workspace}}/openfast/build run: | cmake \ - -DPython_ROOT_DIR:STRING=${{env.pythonLocation}} \ + -DPython_ROOT_DIR:PATH=${{env.pythonLocation}} \ -DBUILD_TESTING:BOOL=ON \ -DCTEST_PLOT_ERRORS:BOOL=ON \ ${GITHUB_WORKSPACE} - - name: Run OpenFAST linearization tests + cmake --build . --target regression_test_controllers + - name: Run openfast_io tests working-directory: ${{runner.workspace}}/openfast/build run: | - ctest -VV -L linear + ctest -VV -L openfast_io - name: Failing test artifacts uses: actions/upload-artifact@v4 if: failure() with: - name: rtest-OF-linearization + name: rtest-openfast_io 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 + ${{runner.workspace}}/openfast/build/reg_tests/openfast_io rtest-FF: runs-on: ubuntu-22.04 - needs: build-fastfarm-release + needs: build-all-release + env: + OMP_NUM_THREADS: 2 steps: - name: Cache the workspace uses: actions/cache@v4 with: path: ${{runner.workspace}} - key: build-fastfarm-release-${{ github.sha }} + key: build-all-release-${{ github.sha }} - name: Setup Python uses: actions/setup-python@v5 with: @@ -1038,7 +615,7 @@ jobs: working-directory: ${{runner.workspace}}/openfast/build run: | cmake \ - -DPython_ROOT_DIR:STRING=${{env.pythonLocation}} \ + -DPython_ROOT_DIR:PATH=${{env.pythonLocation}} \ -DBUILD_TESTING:BOOL=ON \ -DCTEST_PLOT_ERRORS:BOOL=ON \ ${GITHUB_WORKSPACE} @@ -1047,8 +624,7 @@ jobs: working-directory: ${{runner.workspace}}/openfast/build shell: bash run: | - set OMP_NUM_THREADS=2 - ctest -VV -L fastfarm --verbose + ctest -VV -j1 -L fastfarm --verbose - name: Failing test artifacts uses: actions/upload-artifact@v4 if: failure() diff --git a/docs/OtherSupporting/OutListParameters.xlsx b/docs/OtherSupporting/OutListParameters.xlsx index a480f6c047..784d6e06b8 100644 Binary files a/docs/OtherSupporting/OutListParameters.xlsx and b/docs/OtherSupporting/OutListParameters.xlsx differ diff --git a/docs/changelogs/v4.0.5.md b/docs/changelogs/v4.0.5.md new file mode 100644 index 0000000000..11173b3121 --- /dev/null +++ b/docs/changelogs/v4.0.5.md @@ -0,0 +1,116 @@ +**Feature or improvement description** +Pull request to merge `rc-4.0.5` into `main` and create a tagged release for v4.0.5 + +See the milestone and project pages for additional information + + https://github.com/OpenFAST/openfast/milestone/22 + +Test results, if applicable +See GitHub Actions + +### Release checklist: +- [ ] Update the documentation version in docs/conf.py +- [ ] Update the versions in docs/source/user/api\_change.rst +- [ ] Update version info in openfast\_io/pyproject.toml +- [ ] Verify readthedocs builds correctly +- [ ] Create an annotated tag in OpenFAST during merge (mark as most recent if necessary) +- [ ] Create a merge commit in r-test and add a corresponding annotated tag +- [ ] Upload Docker image +- [ ] Compile executables for Windows builds + - [ ] `AeroDisk_Driver_x64.exe` + - [ ] `AeroDyn_Driver_x64.exe` + - [ ] `AeroDyn_Driver_x64_OpenMP.exe` + - [ ] `AeroDyn_Inflow_c_binding_x64.dll` + - [ ] `AeroDyn_Inflow_c_binding_x64_OpenMP.dll` + - [ ] `BeamDyn_Driver_x64.exe` + - [ ] `DISCON.dll (x64)` + - [ ] `DISCON_ITIBarge.dll (x64)` + - [ ] `DISCON_OC3Hywind.dll (x64)` + - [ ] `DISCON_SC.dll (x64)` + - [ ] `FAST.Farm_x64.exe` + - [ ] `FAST.Farm_x64_OMP.exe` + - [ ] `FAST_SFunc.mexw64` + - [ ] `HydroDynDriver_x64.exe` + - [ ] `HydroDyn_C_Binding_x64.dll` + - [ ] `IinflowWind_c_binding_x64.dll` + - [ ] `InflowWind_Driver_x64.exe` + - [ ] `InflowWind_Driver_x64_OpenMP.exe` + - [ ] `MoorDyn_Driver_x64.exe` + - [ ] `MoorDyn_c_binding_x64.dll` + - [ ] `OpenFAST-Simulink_x64.dll` + - [ ] `openfast_x64.exe` + - [ ] `SeaStateDriver_x64.exe` + - [ ] `SimpleElastoDyn_x64.exe` + - [ ] `SubDyn_x64.exe` + - [ ] `Turbsim_x64.exe` + - [ ] `UnsteadyAero_x64.exe` + +# Changelog + +## Overview + +This release includes several bug fixes and improvements for _OpenFAST_, GitHub actions, and _openfast\_io_. + +## General + +### CMake build system + +### GitHub actions + +#2825 Simplify GitHub Action for regression tests (backport from dev-tc) (@deslaughter) + + +### openfast_io + +#2828 updated outlist reading in openfast\_io (@mayankchetan) + +#2818 OpenFAST IO updates: MoorDyn and StC (@dzalkind) + + + +## Solvers + +### OpenFAST + +#2831 [BugFix] WrVTK with VTK\_fps fails (@andrew-platt) + + +## Interfaces + +### cpp interface + +#2792 Fix openfastcpp restart parsing of file name (@marchdf) + +#2804 Add a checkError in openfast cpp (@marchdf) + +#2815 Fix restart parsing of file name (backport of #2792 and #2793) (@marchdf) + + +## Module changes + +### AeroDyn + +#2853 Backport #2848 (@bjonkman) + + +### BeamDyn + +#2811 BD: new output - aero only loads mapped to the root (@andrew-platt) + + +### IceFlow + +#2855 Fix Typo in "interpolation" in Ice Crushing Modules (@leopardracer) + + +### SubDyn + +#2821 bugfix: SD maximum number of output channels was incorrectly set (@andrew-platt) + + +## Input file changes + +No input file changes since v4.0.0 + +#2829 FF: typo in SeaState names in `MD_Shared` .fst files - this is not an API change (@andrew-platt) + diff --git a/docs/conf.py b/docs/conf.py index 6e5c983e0f..893919751f 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -138,7 +138,7 @@ def runDoxygen(sourcfile, doxyfileIn, doxyfileOut): # The short X.Y version. version = u'4.0' # The full version, including alpha/beta/rc tags. -release = u'v4.0.4' +release = u'v4.0.5' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/docs/source/user/api_change.rst b/docs/source/user/api_change.rst index b0600ac517..b5a5d93a15 100644 --- a/docs/source/user/api_change.rst +++ b/docs/source/user/api_change.rst @@ -24,6 +24,12 @@ FAST.Farm 12 SC_FileName "SC_DLL.dll" ============================================= ==== =============== ======================================================================================================================================================================================================== +OpenFAST v4.0.4 to OpenFAST v4.0.5 +---------------------------------- + +No input file changes were made. + + OpenFAST v4.0.3 to OpenFAST v4.0.4 ---------------------------------- diff --git a/glue-codes/openfast-cpp/src/OpenFAST.cpp b/glue-codes/openfast-cpp/src/OpenFAST.cpp index e79ad7f53b..b51aebf674 100644 --- a/glue-codes/openfast-cpp/src/OpenFAST.cpp +++ b/glue-codes/openfast-cpp/src/OpenFAST.cpp @@ -667,6 +667,7 @@ void fast::OpenFAST::init() { &extld_o_t_FAST[iTurb], &ErrStat, ErrMsg); + checkError(ErrStat, ErrMsg); turbineData[iTurb].inflowType = 0; } diff --git a/modules/beamdyn/src/BeamDyn.f90 b/modules/beamdyn/src/BeamDyn.f90 index c56d481021..ab3564d5fb 100644 --- a/modules/beamdyn/src/BeamDyn.f90 +++ b/modules/beamdyn/src/BeamDyn.f90 @@ -1746,6 +1746,27 @@ subroutine Init_MiscVars( p, u, y, m, ErrStat, ErrMsg ) CALL BD_CopyInput(u, m%u2, MESH_NEWCOPY, ErrStat2, ErrMsg2) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + ! compute mapping of applied distributed loads to the root location + ! NOTE: PtLoads are not handled at present. See comments in BeamDyn_IO.f90 for changes required. + if (p%CompAppliedLdAtRoot .and. p%BldMotionNodeLoc == BD_MESH_QP) then + ! create point mesh at root (cousin of rootmotion) + CALL MeshCopy( SrcMesh = u%RootMotion & + , DestMesh = m%LoadsAtRoot & + , CtrlCode = MESH_COUSIN & + , IOS = COMPONENT_OUTPUT & + , Force = .TRUE. & + , Moment = .TRUE. & + , ErrStat = ErrStat2 & + , ErrMess = ErrMsg2 ) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + if (ErrStat>=AbortErrLev) RETURN + + ! mapping of distributed loads to LoadsAtRoot + CALL MeshMapCreate( u%DistrLoad, m%LoadsAtRoot, m%Map_u_DistrLoad_to_R, ErrStat2, ErrMsg2 ) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + m%LoadsAtRoot%remapFlag = .false. + + endif end subroutine Init_MiscVars !----------------------------------------------------------------------------------------------------------------------------------- diff --git a/modules/beamdyn/src/BeamDyn_IO.f90 b/modules/beamdyn/src/BeamDyn_IO.f90 index ee278ca399..5840b4b160 100644 --- a/modules/beamdyn/src/BeamDyn_IO.f90 +++ b/modules/beamdyn/src/BeamDyn_IO.f90 @@ -41,7 +41,7 @@ MODULE BeamDyn_IO ! using the parameters listed in the "OutListParameters.xlsx" Excel file. Any changes to these ! lines should be modified in the Matlab script and/or Excel worksheet as necessary. ! =================================================================================================== -! This code was generated by Write_ChckOutLst.m at 29-Sep-2015 10:23:41. +! This code was generated by Write_ChckOutLst.m at 08-May-2025 15:51:30. ! Indices for computing output channels: @@ -51,387 +51,403 @@ MODULE BeamDyn_IO ! Time: - INTEGER(IntKi), PARAMETER :: Time = 0 + INTEGER(IntKi), PARAMETER :: Time = 0 ! Reaction Loads: - INTEGER(IntKi), PARAMETER :: RootFxr = 1 - INTEGER(IntKi), PARAMETER :: RootFyr = 2 - INTEGER(IntKi), PARAMETER :: RootFzr = 3 - INTEGER(IntKi), PARAMETER :: RootMxr = 4 - INTEGER(IntKi), PARAMETER :: RootMyr = 5 - INTEGER(IntKi), PARAMETER :: RootMzr = 6 + INTEGER(IntKi), PARAMETER :: RootFxr = 1 + INTEGER(IntKi), PARAMETER :: RootFyr = 2 + INTEGER(IntKi), PARAMETER :: RootFzr = 3 + INTEGER(IntKi), PARAMETER :: RootMxr = 4 + INTEGER(IntKi), PARAMETER :: RootMyr = 5 + INTEGER(IntKi), PARAMETER :: RootMzr = 6 ! Tip Motions: - INTEGER(IntKi), PARAMETER :: TipTDxr = 7 - INTEGER(IntKi), PARAMETER :: TipTDyr = 8 - INTEGER(IntKi), PARAMETER :: TipTDzr = 9 - INTEGER(IntKi), PARAMETER :: TipRDxr = 10 - INTEGER(IntKi), PARAMETER :: TipRDyr = 11 - INTEGER(IntKi), PARAMETER :: TipRDzr = 12 - INTEGER(IntKi), PARAMETER :: TipTVXg = 13 - INTEGER(IntKi), PARAMETER :: TipTVYg = 14 - INTEGER(IntKi), PARAMETER :: TipTVZg = 15 - INTEGER(IntKi), PARAMETER :: TipRVXg = 16 - INTEGER(IntKi), PARAMETER :: TipRVYg = 17 - INTEGER(IntKi), PARAMETER :: TipRVZg = 18 - INTEGER(IntKi), PARAMETER :: TipTAXl = 19 - INTEGER(IntKi), PARAMETER :: TipTAYl = 20 - INTEGER(IntKi), PARAMETER :: TipTAZl = 21 - INTEGER(IntKi), PARAMETER :: TipRAXl = 22 - INTEGER(IntKi), PARAMETER :: TipRAYl = 23 - INTEGER(IntKi), PARAMETER :: TipRAZl = 24 + INTEGER(IntKi), PARAMETER :: TipTDxr = 7 + INTEGER(IntKi), PARAMETER :: TipTDyr = 8 + INTEGER(IntKi), PARAMETER :: TipTDzr = 9 + INTEGER(IntKi), PARAMETER :: TipRDxr = 10 + INTEGER(IntKi), PARAMETER :: TipRDyr = 11 + INTEGER(IntKi), PARAMETER :: TipRDzr = 12 + INTEGER(IntKi), PARAMETER :: TipTVXg = 13 + INTEGER(IntKi), PARAMETER :: TipTVYg = 14 + INTEGER(IntKi), PARAMETER :: TipTVZg = 15 + INTEGER(IntKi), PARAMETER :: TipRVXg = 16 + INTEGER(IntKi), PARAMETER :: TipRVYg = 17 + INTEGER(IntKi), PARAMETER :: TipRVZg = 18 + INTEGER(IntKi), PARAMETER :: TipTAXl = 19 + INTEGER(IntKi), PARAMETER :: TipTAYl = 20 + INTEGER(IntKi), PARAMETER :: TipTAZl = 21 + INTEGER(IntKi), PARAMETER :: TipRAXl = 22 + INTEGER(IntKi), PARAMETER :: TipRAYl = 23 + INTEGER(IntKi), PARAMETER :: TipRAZl = 24 ! Sectional Loads: - INTEGER(IntKi), PARAMETER :: N1Fxl = 25 - INTEGER(IntKi), PARAMETER :: N1Fyl = 26 - INTEGER(IntKi), PARAMETER :: N1Fzl = 27 - INTEGER(IntKi), PARAMETER :: N2Fxl = 28 - INTEGER(IntKi), PARAMETER :: N2Fyl = 29 - INTEGER(IntKi), PARAMETER :: N2Fzl = 30 - INTEGER(IntKi), PARAMETER :: N3Fxl = 31 - INTEGER(IntKi), PARAMETER :: N3Fyl = 32 - INTEGER(IntKi), PARAMETER :: N3Fzl = 33 - INTEGER(IntKi), PARAMETER :: N4Fxl = 34 - INTEGER(IntKi), PARAMETER :: N4Fyl = 35 - INTEGER(IntKi), PARAMETER :: N4Fzl = 36 - INTEGER(IntKi), PARAMETER :: N5Fxl = 37 - INTEGER(IntKi), PARAMETER :: N5Fyl = 38 - INTEGER(IntKi), PARAMETER :: N5Fzl = 39 - INTEGER(IntKi), PARAMETER :: N6Fxl = 40 - INTEGER(IntKi), PARAMETER :: N6Fyl = 41 - INTEGER(IntKi), PARAMETER :: N6Fzl = 42 - INTEGER(IntKi), PARAMETER :: N7Fxl = 43 - INTEGER(IntKi), PARAMETER :: N7Fyl = 44 - INTEGER(IntKi), PARAMETER :: N7Fzl = 45 - INTEGER(IntKi), PARAMETER :: N8Fxl = 46 - INTEGER(IntKi), PARAMETER :: N8Fyl = 47 - INTEGER(IntKi), PARAMETER :: N8Fzl = 48 - INTEGER(IntKi), PARAMETER :: N9Fxl = 49 - INTEGER(IntKi), PARAMETER :: N9Fyl = 50 - INTEGER(IntKi), PARAMETER :: N9Fzl = 51 - INTEGER(IntKi), PARAMETER :: N1Mxl = 52 - INTEGER(IntKi), PARAMETER :: N1Myl = 53 - INTEGER(IntKi), PARAMETER :: N1Mzl = 54 - INTEGER(IntKi), PARAMETER :: N2Mxl = 55 - INTEGER(IntKi), PARAMETER :: N2Myl = 56 - INTEGER(IntKi), PARAMETER :: N2Mzl = 57 - INTEGER(IntKi), PARAMETER :: N3Mxl = 58 - INTEGER(IntKi), PARAMETER :: N3Myl = 59 - INTEGER(IntKi), PARAMETER :: N3Mzl = 60 - INTEGER(IntKi), PARAMETER :: N4Mxl = 61 - INTEGER(IntKi), PARAMETER :: N4Myl = 62 - INTEGER(IntKi), PARAMETER :: N4Mzl = 63 - INTEGER(IntKi), PARAMETER :: N5Mxl = 64 - INTEGER(IntKi), PARAMETER :: N5Myl = 65 - INTEGER(IntKi), PARAMETER :: N5Mzl = 66 - INTEGER(IntKi), PARAMETER :: N6Mxl = 67 - INTEGER(IntKi), PARAMETER :: N6Myl = 68 - INTEGER(IntKi), PARAMETER :: N6Mzl = 69 - INTEGER(IntKi), PARAMETER :: N7Mxl = 70 - INTEGER(IntKi), PARAMETER :: N7Myl = 71 - INTEGER(IntKi), PARAMETER :: N7Mzl = 72 - INTEGER(IntKi), PARAMETER :: N8Mxl = 73 - INTEGER(IntKi), PARAMETER :: N8Myl = 74 - INTEGER(IntKi), PARAMETER :: N8Mzl = 75 - INTEGER(IntKi), PARAMETER :: N9Mxl = 76 - INTEGER(IntKi), PARAMETER :: N9Myl = 77 - INTEGER(IntKi), PARAMETER :: N9Mzl = 78 + INTEGER(IntKi), PARAMETER :: N1Fxl = 25 + INTEGER(IntKi), PARAMETER :: N1Fyl = 26 + INTEGER(IntKi), PARAMETER :: N1Fzl = 27 + INTEGER(IntKi), PARAMETER :: N2Fxl = 28 + INTEGER(IntKi), PARAMETER :: N2Fyl = 29 + INTEGER(IntKi), PARAMETER :: N2Fzl = 30 + INTEGER(IntKi), PARAMETER :: N3Fxl = 31 + INTEGER(IntKi), PARAMETER :: N3Fyl = 32 + INTEGER(IntKi), PARAMETER :: N3Fzl = 33 + INTEGER(IntKi), PARAMETER :: N4Fxl = 34 + INTEGER(IntKi), PARAMETER :: N4Fyl = 35 + INTEGER(IntKi), PARAMETER :: N4Fzl = 36 + INTEGER(IntKi), PARAMETER :: N5Fxl = 37 + INTEGER(IntKi), PARAMETER :: N5Fyl = 38 + INTEGER(IntKi), PARAMETER :: N5Fzl = 39 + INTEGER(IntKi), PARAMETER :: N6Fxl = 40 + INTEGER(IntKi), PARAMETER :: N6Fyl = 41 + INTEGER(IntKi), PARAMETER :: N6Fzl = 42 + INTEGER(IntKi), PARAMETER :: N7Fxl = 43 + INTEGER(IntKi), PARAMETER :: N7Fyl = 44 + INTEGER(IntKi), PARAMETER :: N7Fzl = 45 + INTEGER(IntKi), PARAMETER :: N8Fxl = 46 + INTEGER(IntKi), PARAMETER :: N8Fyl = 47 + INTEGER(IntKi), PARAMETER :: N8Fzl = 48 + INTEGER(IntKi), PARAMETER :: N9Fxl = 49 + INTEGER(IntKi), PARAMETER :: N9Fyl = 50 + INTEGER(IntKi), PARAMETER :: N9Fzl = 51 + INTEGER(IntKi), PARAMETER :: N1Mxl = 52 + INTEGER(IntKi), PARAMETER :: N1Myl = 53 + INTEGER(IntKi), PARAMETER :: N1Mzl = 54 + INTEGER(IntKi), PARAMETER :: N2Mxl = 55 + INTEGER(IntKi), PARAMETER :: N2Myl = 56 + INTEGER(IntKi), PARAMETER :: N2Mzl = 57 + INTEGER(IntKi), PARAMETER :: N3Mxl = 58 + INTEGER(IntKi), PARAMETER :: N3Myl = 59 + INTEGER(IntKi), PARAMETER :: N3Mzl = 60 + INTEGER(IntKi), PARAMETER :: N4Mxl = 61 + INTEGER(IntKi), PARAMETER :: N4Myl = 62 + INTEGER(IntKi), PARAMETER :: N4Mzl = 63 + INTEGER(IntKi), PARAMETER :: N5Mxl = 64 + INTEGER(IntKi), PARAMETER :: N5Myl = 65 + INTEGER(IntKi), PARAMETER :: N5Mzl = 66 + INTEGER(IntKi), PARAMETER :: N6Mxl = 67 + INTEGER(IntKi), PARAMETER :: N6Myl = 68 + INTEGER(IntKi), PARAMETER :: N6Mzl = 69 + INTEGER(IntKi), PARAMETER :: N7Mxl = 70 + INTEGER(IntKi), PARAMETER :: N7Myl = 71 + INTEGER(IntKi), PARAMETER :: N7Mzl = 72 + INTEGER(IntKi), PARAMETER :: N8Mxl = 73 + INTEGER(IntKi), PARAMETER :: N8Myl = 74 + INTEGER(IntKi), PARAMETER :: N8Mzl = 75 + INTEGER(IntKi), PARAMETER :: N9Mxl = 76 + INTEGER(IntKi), PARAMETER :: N9Myl = 77 + INTEGER(IntKi), PARAMETER :: N9Mzl = 78 ! Sectional Motions: - INTEGER(IntKi), PARAMETER :: N1TDxr = 79 - INTEGER(IntKi), PARAMETER :: N1TDyr = 80 - INTEGER(IntKi), PARAMETER :: N1TDzr = 81 - INTEGER(IntKi), PARAMETER :: N2TDxr = 82 - INTEGER(IntKi), PARAMETER :: N2TDyr = 83 - INTEGER(IntKi), PARAMETER :: N2TDzr = 84 - INTEGER(IntKi), PARAMETER :: N3TDxr = 85 - INTEGER(IntKi), PARAMETER :: N3TDyr = 86 - INTEGER(IntKi), PARAMETER :: N3TDzr = 87 - INTEGER(IntKi), PARAMETER :: N4TDxr = 88 - INTEGER(IntKi), PARAMETER :: N4TDyr = 89 - INTEGER(IntKi), PARAMETER :: N4TDzr = 90 - INTEGER(IntKi), PARAMETER :: N5TDxr = 91 - INTEGER(IntKi), PARAMETER :: N5TDyr = 92 - INTEGER(IntKi), PARAMETER :: N5TDzr = 93 - INTEGER(IntKi), PARAMETER :: N6TDxr = 94 - INTEGER(IntKi), PARAMETER :: N6TDyr = 95 - INTEGER(IntKi), PARAMETER :: N6TDzr = 96 - INTEGER(IntKi), PARAMETER :: N7TDxr = 97 - INTEGER(IntKi), PARAMETER :: N7TDyr = 98 - INTEGER(IntKi), PARAMETER :: N7TDzr = 99 - INTEGER(IntKi), PARAMETER :: N8TDxr = 100 - INTEGER(IntKi), PARAMETER :: N8TDyr = 101 - INTEGER(IntKi), PARAMETER :: N8TDzr = 102 - INTEGER(IntKi), PARAMETER :: N9TDxr = 103 - INTEGER(IntKi), PARAMETER :: N9TDyr = 104 - INTEGER(IntKi), PARAMETER :: N9TDzr = 105 - INTEGER(IntKi), PARAMETER :: N1RDxr = 106 - INTEGER(IntKi), PARAMETER :: N1RDyr = 107 - INTEGER(IntKi), PARAMETER :: N1RDzr = 108 - INTEGER(IntKi), PARAMETER :: N2RDxr = 109 - INTEGER(IntKi), PARAMETER :: N2RDyr = 110 - INTEGER(IntKi), PARAMETER :: N2RDzr = 111 - INTEGER(IntKi), PARAMETER :: N3RDxr = 112 - INTEGER(IntKi), PARAMETER :: N3RDyr = 113 - INTEGER(IntKi), PARAMETER :: N3RDzr = 114 - INTEGER(IntKi), PARAMETER :: N4RDxr = 115 - INTEGER(IntKi), PARAMETER :: N4RDyr = 116 - INTEGER(IntKi), PARAMETER :: N4RDzr = 117 - INTEGER(IntKi), PARAMETER :: N5RDxr = 118 - INTEGER(IntKi), PARAMETER :: N5RDyr = 119 - INTEGER(IntKi), PARAMETER :: N5RDzr = 120 - INTEGER(IntKi), PARAMETER :: N6RDxr = 121 - INTEGER(IntKi), PARAMETER :: N6RDyr = 122 - INTEGER(IntKi), PARAMETER :: N6RDzr = 123 - INTEGER(IntKi), PARAMETER :: N7RDxr = 124 - INTEGER(IntKi), PARAMETER :: N7RDyr = 125 - INTEGER(IntKi), PARAMETER :: N7RDzr = 126 - INTEGER(IntKi), PARAMETER :: N8RDxr = 127 - INTEGER(IntKi), PARAMETER :: N8RDyr = 128 - INTEGER(IntKi), PARAMETER :: N8RDzr = 129 - INTEGER(IntKi), PARAMETER :: N9RDxr = 130 - INTEGER(IntKi), PARAMETER :: N9RDyr = 131 - INTEGER(IntKi), PARAMETER :: N9RDzr = 132 - INTEGER(IntKi), PARAMETER :: N1TVXg = 133 - INTEGER(IntKi), PARAMETER :: N1TVYg = 134 - INTEGER(IntKi), PARAMETER :: N1TVZg = 135 - INTEGER(IntKi), PARAMETER :: N2TVXg = 136 - INTEGER(IntKi), PARAMETER :: N2TVYg = 137 - INTEGER(IntKi), PARAMETER :: N2TVZg = 138 - INTEGER(IntKi), PARAMETER :: N3TVXg = 139 - INTEGER(IntKi), PARAMETER :: N3TVYg = 140 - INTEGER(IntKi), PARAMETER :: N3TVZg = 141 - INTEGER(IntKi), PARAMETER :: N4TVXg = 142 - INTEGER(IntKi), PARAMETER :: N4TVYg = 143 - INTEGER(IntKi), PARAMETER :: N4TVZg = 144 - INTEGER(IntKi), PARAMETER :: N5TVXg = 145 - INTEGER(IntKi), PARAMETER :: N5TVYg = 146 - INTEGER(IntKi), PARAMETER :: N5TVZg = 147 - INTEGER(IntKi), PARAMETER :: N6TVXg = 148 - INTEGER(IntKi), PARAMETER :: N6TVYg = 149 - INTEGER(IntKi), PARAMETER :: N6TVZg = 150 - INTEGER(IntKi), PARAMETER :: N7TVXg = 151 - INTEGER(IntKi), PARAMETER :: N7TVYg = 152 - INTEGER(IntKi), PARAMETER :: N7TVZg = 153 - INTEGER(IntKi), PARAMETER :: N8TVXg = 154 - INTEGER(IntKi), PARAMETER :: N8TVYg = 155 - INTEGER(IntKi), PARAMETER :: N8TVZg = 156 - INTEGER(IntKi), PARAMETER :: N9TVXg = 157 - INTEGER(IntKi), PARAMETER :: N9TVYg = 158 - INTEGER(IntKi), PARAMETER :: N9TVZg = 159 - INTEGER(IntKi), PARAMETER :: N1RVXg = 160 - INTEGER(IntKi), PARAMETER :: N1RVYg = 161 - INTEGER(IntKi), PARAMETER :: N1RVZg = 162 - INTEGER(IntKi), PARAMETER :: N2RVXg = 163 - INTEGER(IntKi), PARAMETER :: N2RVYg = 164 - INTEGER(IntKi), PARAMETER :: N2RVZg = 165 - INTEGER(IntKi), PARAMETER :: N3RVXg = 166 - INTEGER(IntKi), PARAMETER :: N3RVYg = 167 - INTEGER(IntKi), PARAMETER :: N3RVZg = 168 - INTEGER(IntKi), PARAMETER :: N4RVXg = 169 - INTEGER(IntKi), PARAMETER :: N4RVYg = 170 - INTEGER(IntKi), PARAMETER :: N4RVZg = 171 - INTEGER(IntKi), PARAMETER :: N5RVXg = 172 - INTEGER(IntKi), PARAMETER :: N5RVYg = 173 - INTEGER(IntKi), PARAMETER :: N5RVZg = 174 - INTEGER(IntKi), PARAMETER :: N6RVXg = 175 - INTEGER(IntKi), PARAMETER :: N6RVYg = 176 - INTEGER(IntKi), PARAMETER :: N6RVZg = 177 - INTEGER(IntKi), PARAMETER :: N7RVXg = 178 - INTEGER(IntKi), PARAMETER :: N7RVYg = 179 - INTEGER(IntKi), PARAMETER :: N7RVZg = 180 - INTEGER(IntKi), PARAMETER :: N8RVXg = 181 - INTEGER(IntKi), PARAMETER :: N8RVYg = 182 - INTEGER(IntKi), PARAMETER :: N8RVZg = 183 - INTEGER(IntKi), PARAMETER :: N9RVXg = 184 - INTEGER(IntKi), PARAMETER :: N9RVYg = 185 - INTEGER(IntKi), PARAMETER :: N9RVZg = 186 - INTEGER(IntKi), PARAMETER :: N1TAXl = 187 - INTEGER(IntKi), PARAMETER :: N1TAYl = 188 - INTEGER(IntKi), PARAMETER :: N1TAZl = 189 - INTEGER(IntKi), PARAMETER :: N2TAXl = 190 - INTEGER(IntKi), PARAMETER :: N2TAYl = 191 - INTEGER(IntKi), PARAMETER :: N2TAZl = 192 - INTEGER(IntKi), PARAMETER :: N3TAXl = 193 - INTEGER(IntKi), PARAMETER :: N3TAYl = 194 - INTEGER(IntKi), PARAMETER :: N3TAZl = 195 - INTEGER(IntKi), PARAMETER :: N4TAXl = 196 - INTEGER(IntKi), PARAMETER :: N4TAYl = 197 - INTEGER(IntKi), PARAMETER :: N4TAZl = 198 - INTEGER(IntKi), PARAMETER :: N5TAXl = 199 - INTEGER(IntKi), PARAMETER :: N5TAYl = 200 - INTEGER(IntKi), PARAMETER :: N5TAZl = 201 - INTEGER(IntKi), PARAMETER :: N6TAXl = 202 - INTEGER(IntKi), PARAMETER :: N6TAYl = 203 - INTEGER(IntKi), PARAMETER :: N6TAZl = 204 - INTEGER(IntKi), PARAMETER :: N7TAXl = 205 - INTEGER(IntKi), PARAMETER :: N7TAYl = 206 - INTEGER(IntKi), PARAMETER :: N7TAZl = 207 - INTEGER(IntKi), PARAMETER :: N8TAXl = 208 - INTEGER(IntKi), PARAMETER :: N8TAYl = 209 - INTEGER(IntKi), PARAMETER :: N8TAZl = 210 - INTEGER(IntKi), PARAMETER :: N9TAXl = 211 - INTEGER(IntKi), PARAMETER :: N9TAYl = 212 - INTEGER(IntKi), PARAMETER :: N9TAZl = 213 - INTEGER(IntKi), PARAMETER :: N1RAXl = 214 - INTEGER(IntKi), PARAMETER :: N1RAYl = 215 - INTEGER(IntKi), PARAMETER :: N1RAZl = 216 - INTEGER(IntKi), PARAMETER :: N2RAXl = 217 - INTEGER(IntKi), PARAMETER :: N2RAYl = 218 - INTEGER(IntKi), PARAMETER :: N2RAZl = 219 - INTEGER(IntKi), PARAMETER :: N3RAXl = 220 - INTEGER(IntKi), PARAMETER :: N3RAYl = 221 - INTEGER(IntKi), PARAMETER :: N3RAZl = 222 - INTEGER(IntKi), PARAMETER :: N4RAXl = 223 - INTEGER(IntKi), PARAMETER :: N4RAYl = 224 - INTEGER(IntKi), PARAMETER :: N4RAZl = 225 - INTEGER(IntKi), PARAMETER :: N5RAXl = 226 - INTEGER(IntKi), PARAMETER :: N5RAYl = 227 - INTEGER(IntKi), PARAMETER :: N5RAZl = 228 - INTEGER(IntKi), PARAMETER :: N6RAXl = 229 - INTEGER(IntKi), PARAMETER :: N6RAYl = 230 - INTEGER(IntKi), PARAMETER :: N6RAZl = 231 - INTEGER(IntKi), PARAMETER :: N7RAXl = 232 - INTEGER(IntKi), PARAMETER :: N7RAYl = 233 - INTEGER(IntKi), PARAMETER :: N7RAZl = 234 - INTEGER(IntKi), PARAMETER :: N8RAXl = 235 - INTEGER(IntKi), PARAMETER :: N8RAYl = 236 - INTEGER(IntKi), PARAMETER :: N8RAZl = 237 - INTEGER(IntKi), PARAMETER :: N9RAXl = 238 - INTEGER(IntKi), PARAMETER :: N9RAYl = 239 - INTEGER(IntKi), PARAMETER :: N9RAZl = 240 + INTEGER(IntKi), PARAMETER :: N1TDxr = 79 + INTEGER(IntKi), PARAMETER :: N1TDyr = 80 + INTEGER(IntKi), PARAMETER :: N1TDzr = 81 + INTEGER(IntKi), PARAMETER :: N2TDxr = 82 + INTEGER(IntKi), PARAMETER :: N2TDyr = 83 + INTEGER(IntKi), PARAMETER :: N2TDzr = 84 + INTEGER(IntKi), PARAMETER :: N3TDxr = 85 + INTEGER(IntKi), PARAMETER :: N3TDyr = 86 + INTEGER(IntKi), PARAMETER :: N3TDzr = 87 + INTEGER(IntKi), PARAMETER :: N4TDxr = 88 + INTEGER(IntKi), PARAMETER :: N4TDyr = 89 + INTEGER(IntKi), PARAMETER :: N4TDzr = 90 + INTEGER(IntKi), PARAMETER :: N5TDxr = 91 + INTEGER(IntKi), PARAMETER :: N5TDyr = 92 + INTEGER(IntKi), PARAMETER :: N5TDzr = 93 + INTEGER(IntKi), PARAMETER :: N6TDxr = 94 + INTEGER(IntKi), PARAMETER :: N6TDyr = 95 + INTEGER(IntKi), PARAMETER :: N6TDzr = 96 + INTEGER(IntKi), PARAMETER :: N7TDxr = 97 + INTEGER(IntKi), PARAMETER :: N7TDyr = 98 + INTEGER(IntKi), PARAMETER :: N7TDzr = 99 + INTEGER(IntKi), PARAMETER :: N8TDxr = 100 + INTEGER(IntKi), PARAMETER :: N8TDyr = 101 + INTEGER(IntKi), PARAMETER :: N8TDzr = 102 + INTEGER(IntKi), PARAMETER :: N9TDxr = 103 + INTEGER(IntKi), PARAMETER :: N9TDyr = 104 + INTEGER(IntKi), PARAMETER :: N9TDzr = 105 + INTEGER(IntKi), PARAMETER :: N1RDxr = 106 + INTEGER(IntKi), PARAMETER :: N1RDyr = 107 + INTEGER(IntKi), PARAMETER :: N1RDzr = 108 + INTEGER(IntKi), PARAMETER :: N2RDxr = 109 + INTEGER(IntKi), PARAMETER :: N2RDyr = 110 + INTEGER(IntKi), PARAMETER :: N2RDzr = 111 + INTEGER(IntKi), PARAMETER :: N3RDxr = 112 + INTEGER(IntKi), PARAMETER :: N3RDyr = 113 + INTEGER(IntKi), PARAMETER :: N3RDzr = 114 + INTEGER(IntKi), PARAMETER :: N4RDxr = 115 + INTEGER(IntKi), PARAMETER :: N4RDyr = 116 + INTEGER(IntKi), PARAMETER :: N4RDzr = 117 + INTEGER(IntKi), PARAMETER :: N5RDxr = 118 + INTEGER(IntKi), PARAMETER :: N5RDyr = 119 + INTEGER(IntKi), PARAMETER :: N5RDzr = 120 + INTEGER(IntKi), PARAMETER :: N6RDxr = 121 + INTEGER(IntKi), PARAMETER :: N6RDyr = 122 + INTEGER(IntKi), PARAMETER :: N6RDzr = 123 + INTEGER(IntKi), PARAMETER :: N7RDxr = 124 + INTEGER(IntKi), PARAMETER :: N7RDyr = 125 + INTEGER(IntKi), PARAMETER :: N7RDzr = 126 + INTEGER(IntKi), PARAMETER :: N8RDxr = 127 + INTEGER(IntKi), PARAMETER :: N8RDyr = 128 + INTEGER(IntKi), PARAMETER :: N8RDzr = 129 + INTEGER(IntKi), PARAMETER :: N9RDxr = 130 + INTEGER(IntKi), PARAMETER :: N9RDyr = 131 + INTEGER(IntKi), PARAMETER :: N9RDzr = 132 + INTEGER(IntKi), PARAMETER :: N1TVXg = 133 + INTEGER(IntKi), PARAMETER :: N1TVYg = 134 + INTEGER(IntKi), PARAMETER :: N1TVZg = 135 + INTEGER(IntKi), PARAMETER :: N2TVXg = 136 + INTEGER(IntKi), PARAMETER :: N2TVYg = 137 + INTEGER(IntKi), PARAMETER :: N2TVZg = 138 + INTEGER(IntKi), PARAMETER :: N3TVXg = 139 + INTEGER(IntKi), PARAMETER :: N3TVYg = 140 + INTEGER(IntKi), PARAMETER :: N3TVZg = 141 + INTEGER(IntKi), PARAMETER :: N4TVXg = 142 + INTEGER(IntKi), PARAMETER :: N4TVYg = 143 + INTEGER(IntKi), PARAMETER :: N4TVZg = 144 + INTEGER(IntKi), PARAMETER :: N5TVXg = 145 + INTEGER(IntKi), PARAMETER :: N5TVYg = 146 + INTEGER(IntKi), PARAMETER :: N5TVZg = 147 + INTEGER(IntKi), PARAMETER :: N6TVXg = 148 + INTEGER(IntKi), PARAMETER :: N6TVYg = 149 + INTEGER(IntKi), PARAMETER :: N6TVZg = 150 + INTEGER(IntKi), PARAMETER :: N7TVXg = 151 + INTEGER(IntKi), PARAMETER :: N7TVYg = 152 + INTEGER(IntKi), PARAMETER :: N7TVZg = 153 + INTEGER(IntKi), PARAMETER :: N8TVXg = 154 + INTEGER(IntKi), PARAMETER :: N8TVYg = 155 + INTEGER(IntKi), PARAMETER :: N8TVZg = 156 + INTEGER(IntKi), PARAMETER :: N9TVXg = 157 + INTEGER(IntKi), PARAMETER :: N9TVYg = 158 + INTEGER(IntKi), PARAMETER :: N9TVZg = 159 + INTEGER(IntKi), PARAMETER :: N1RVXg = 160 + INTEGER(IntKi), PARAMETER :: N1RVYg = 161 + INTEGER(IntKi), PARAMETER :: N1RVZg = 162 + INTEGER(IntKi), PARAMETER :: N2RVXg = 163 + INTEGER(IntKi), PARAMETER :: N2RVYg = 164 + INTEGER(IntKi), PARAMETER :: N2RVZg = 165 + INTEGER(IntKi), PARAMETER :: N3RVXg = 166 + INTEGER(IntKi), PARAMETER :: N3RVYg = 167 + INTEGER(IntKi), PARAMETER :: N3RVZg = 168 + INTEGER(IntKi), PARAMETER :: N4RVXg = 169 + INTEGER(IntKi), PARAMETER :: N4RVYg = 170 + INTEGER(IntKi), PARAMETER :: N4RVZg = 171 + INTEGER(IntKi), PARAMETER :: N5RVXg = 172 + INTEGER(IntKi), PARAMETER :: N5RVYg = 173 + INTEGER(IntKi), PARAMETER :: N5RVZg = 174 + INTEGER(IntKi), PARAMETER :: N6RVXg = 175 + INTEGER(IntKi), PARAMETER :: N6RVYg = 176 + INTEGER(IntKi), PARAMETER :: N6RVZg = 177 + INTEGER(IntKi), PARAMETER :: N7RVXg = 178 + INTEGER(IntKi), PARAMETER :: N7RVYg = 179 + INTEGER(IntKi), PARAMETER :: N7RVZg = 180 + INTEGER(IntKi), PARAMETER :: N8RVXg = 181 + INTEGER(IntKi), PARAMETER :: N8RVYg = 182 + INTEGER(IntKi), PARAMETER :: N8RVZg = 183 + INTEGER(IntKi), PARAMETER :: N9RVXg = 184 + INTEGER(IntKi), PARAMETER :: N9RVYg = 185 + INTEGER(IntKi), PARAMETER :: N9RVZg = 186 + INTEGER(IntKi), PARAMETER :: N1TAXl = 187 + INTEGER(IntKi), PARAMETER :: N1TAYl = 188 + INTEGER(IntKi), PARAMETER :: N1TAZl = 189 + INTEGER(IntKi), PARAMETER :: N2TAXl = 190 + INTEGER(IntKi), PARAMETER :: N2TAYl = 191 + INTEGER(IntKi), PARAMETER :: N2TAZl = 192 + INTEGER(IntKi), PARAMETER :: N3TAXl = 193 + INTEGER(IntKi), PARAMETER :: N3TAYl = 194 + INTEGER(IntKi), PARAMETER :: N3TAZl = 195 + INTEGER(IntKi), PARAMETER :: N4TAXl = 196 + INTEGER(IntKi), PARAMETER :: N4TAYl = 197 + INTEGER(IntKi), PARAMETER :: N4TAZl = 198 + INTEGER(IntKi), PARAMETER :: N5TAXl = 199 + INTEGER(IntKi), PARAMETER :: N5TAYl = 200 + INTEGER(IntKi), PARAMETER :: N5TAZl = 201 + INTEGER(IntKi), PARAMETER :: N6TAXl = 202 + INTEGER(IntKi), PARAMETER :: N6TAYl = 203 + INTEGER(IntKi), PARAMETER :: N6TAZl = 204 + INTEGER(IntKi), PARAMETER :: N7TAXl = 205 + INTEGER(IntKi), PARAMETER :: N7TAYl = 206 + INTEGER(IntKi), PARAMETER :: N7TAZl = 207 + INTEGER(IntKi), PARAMETER :: N8TAXl = 208 + INTEGER(IntKi), PARAMETER :: N8TAYl = 209 + INTEGER(IntKi), PARAMETER :: N8TAZl = 210 + INTEGER(IntKi), PARAMETER :: N9TAXl = 211 + INTEGER(IntKi), PARAMETER :: N9TAYl = 212 + INTEGER(IntKi), PARAMETER :: N9TAZl = 213 + INTEGER(IntKi), PARAMETER :: N1RAXl = 214 + INTEGER(IntKi), PARAMETER :: N1RAYl = 215 + INTEGER(IntKi), PARAMETER :: N1RAZl = 216 + INTEGER(IntKi), PARAMETER :: N2RAXl = 217 + INTEGER(IntKi), PARAMETER :: N2RAYl = 218 + INTEGER(IntKi), PARAMETER :: N2RAZl = 219 + INTEGER(IntKi), PARAMETER :: N3RAXl = 220 + INTEGER(IntKi), PARAMETER :: N3RAYl = 221 + INTEGER(IntKi), PARAMETER :: N3RAZl = 222 + INTEGER(IntKi), PARAMETER :: N4RAXl = 223 + INTEGER(IntKi), PARAMETER :: N4RAYl = 224 + INTEGER(IntKi), PARAMETER :: N4RAZl = 225 + INTEGER(IntKi), PARAMETER :: N5RAXl = 226 + INTEGER(IntKi), PARAMETER :: N5RAYl = 227 + INTEGER(IntKi), PARAMETER :: N5RAZl = 228 + INTEGER(IntKi), PARAMETER :: N6RAXl = 229 + INTEGER(IntKi), PARAMETER :: N6RAYl = 230 + INTEGER(IntKi), PARAMETER :: N6RAZl = 231 + INTEGER(IntKi), PARAMETER :: N7RAXl = 232 + INTEGER(IntKi), PARAMETER :: N7RAYl = 233 + INTEGER(IntKi), PARAMETER :: N7RAZl = 234 + INTEGER(IntKi), PARAMETER :: N8RAXl = 235 + INTEGER(IntKi), PARAMETER :: N8RAYl = 236 + INTEGER(IntKi), PARAMETER :: N8RAZl = 237 + INTEGER(IntKi), PARAMETER :: N9RAXl = 238 + INTEGER(IntKi), PARAMETER :: N9RAYl = 239 + INTEGER(IntKi), PARAMETER :: N9RAZl = 240 ! Applied Loads: - INTEGER(IntKi), PARAMETER :: N1PFxl = 241 - INTEGER(IntKi), PARAMETER :: N1PFyl = 242 - INTEGER(IntKi), PARAMETER :: N1PFzl = 243 - INTEGER(IntKi), PARAMETER :: N2PFxl = 244 - INTEGER(IntKi), PARAMETER :: N2PFyl = 245 - INTEGER(IntKi), PARAMETER :: N2PFzl = 246 - INTEGER(IntKi), PARAMETER :: N3PFxl = 247 - INTEGER(IntKi), PARAMETER :: N3PFyl = 248 - INTEGER(IntKi), PARAMETER :: N3PFzl = 249 - INTEGER(IntKi), PARAMETER :: N4PFxl = 250 - INTEGER(IntKi), PARAMETER :: N4PFyl = 251 - INTEGER(IntKi), PARAMETER :: N4PFzl = 252 - INTEGER(IntKi), PARAMETER :: N5PFxl = 253 - INTEGER(IntKi), PARAMETER :: N5PFyl = 254 - INTEGER(IntKi), PARAMETER :: N5PFzl = 255 - INTEGER(IntKi), PARAMETER :: N6PFxl = 256 - INTEGER(IntKi), PARAMETER :: N6PFyl = 257 - INTEGER(IntKi), PARAMETER :: N6PFzl = 258 - INTEGER(IntKi), PARAMETER :: N7PFxl = 259 - INTEGER(IntKi), PARAMETER :: N7PFyl = 260 - INTEGER(IntKi), PARAMETER :: N7PFzl = 261 - INTEGER(IntKi), PARAMETER :: N8PFxl = 262 - INTEGER(IntKi), PARAMETER :: N8PFyl = 263 - INTEGER(IntKi), PARAMETER :: N8PFzl = 264 - INTEGER(IntKi), PARAMETER :: N9PFxl = 265 - INTEGER(IntKi), PARAMETER :: N9PFyl = 266 - INTEGER(IntKi), PARAMETER :: N9PFzl = 267 - INTEGER(IntKi), PARAMETER :: N1PMxl = 268 - INTEGER(IntKi), PARAMETER :: N1PMyl = 269 - INTEGER(IntKi), PARAMETER :: N1PMzl = 270 - INTEGER(IntKi), PARAMETER :: N2PMxl = 271 - INTEGER(IntKi), PARAMETER :: N2PMyl = 272 - INTEGER(IntKi), PARAMETER :: N2PMzl = 273 - INTEGER(IntKi), PARAMETER :: N3PMxl = 274 - INTEGER(IntKi), PARAMETER :: N3PMyl = 275 - INTEGER(IntKi), PARAMETER :: N3PMzl = 276 - INTEGER(IntKi), PARAMETER :: N4PMxl = 277 - INTEGER(IntKi), PARAMETER :: N4PMyl = 278 - INTEGER(IntKi), PARAMETER :: N4PMzl = 279 - INTEGER(IntKi), PARAMETER :: N5PMxl = 280 - INTEGER(IntKi), PARAMETER :: N5PMyl = 281 - INTEGER(IntKi), PARAMETER :: N5PMzl = 282 - INTEGER(IntKi), PARAMETER :: N6PMxl = 283 - INTEGER(IntKi), PARAMETER :: N6PMyl = 284 - INTEGER(IntKi), PARAMETER :: N6PMzl = 285 - INTEGER(IntKi), PARAMETER :: N7PMxl = 286 - INTEGER(IntKi), PARAMETER :: N7PMyl = 287 - INTEGER(IntKi), PARAMETER :: N7PMzl = 288 - INTEGER(IntKi), PARAMETER :: N8PMxl = 289 - INTEGER(IntKi), PARAMETER :: N8PMyl = 290 - INTEGER(IntKi), PARAMETER :: N8PMzl = 291 - INTEGER(IntKi), PARAMETER :: N9PMxl = 292 - INTEGER(IntKi), PARAMETER :: N9PMyl = 293 - INTEGER(IntKi), PARAMETER :: N9PMzl = 294 - INTEGER(IntKi), PARAMETER :: N1DFxl = 295 - INTEGER(IntKi), PARAMETER :: N1DFyl = 296 - INTEGER(IntKi), PARAMETER :: N1DFzl = 297 - INTEGER(IntKi), PARAMETER :: N2DFxl = 298 - INTEGER(IntKi), PARAMETER :: N2DFyl = 299 - INTEGER(IntKi), PARAMETER :: N2DFzl = 300 - INTEGER(IntKi), PARAMETER :: N3DFxl = 301 - INTEGER(IntKi), PARAMETER :: N3DFyl = 302 - INTEGER(IntKi), PARAMETER :: N3DFzl = 303 - INTEGER(IntKi), PARAMETER :: N4DFxl = 304 - INTEGER(IntKi), PARAMETER :: N4DFyl = 305 - INTEGER(IntKi), PARAMETER :: N4DFzl = 306 - INTEGER(IntKi), PARAMETER :: N5DFxl = 307 - INTEGER(IntKi), PARAMETER :: N5DFyl = 308 - INTEGER(IntKi), PARAMETER :: N5DFzl = 309 - INTEGER(IntKi), PARAMETER :: N6DFxl = 310 - INTEGER(IntKi), PARAMETER :: N6DFyl = 311 - INTEGER(IntKi), PARAMETER :: N6DFzl = 312 - INTEGER(IntKi), PARAMETER :: N7DFxl = 313 - INTEGER(IntKi), PARAMETER :: N7DFyl = 314 - INTEGER(IntKi), PARAMETER :: N7DFzl = 315 - INTEGER(IntKi), PARAMETER :: N8DFxl = 316 - INTEGER(IntKi), PARAMETER :: N8DFyl = 317 - INTEGER(IntKi), PARAMETER :: N8DFzl = 318 - INTEGER(IntKi), PARAMETER :: N9DFxl = 319 - INTEGER(IntKi), PARAMETER :: N9DFyl = 320 - INTEGER(IntKi), PARAMETER :: N9DFzl = 321 - INTEGER(IntKi), PARAMETER :: N1DMxl = 322 - INTEGER(IntKi), PARAMETER :: N1DMyl = 323 - INTEGER(IntKi), PARAMETER :: N1DMzl = 324 - INTEGER(IntKi), PARAMETER :: N2DMxl = 325 - INTEGER(IntKi), PARAMETER :: N2DMyl = 326 - INTEGER(IntKi), PARAMETER :: N2DMzl = 327 - INTEGER(IntKi), PARAMETER :: N3DMxl = 328 - INTEGER(IntKi), PARAMETER :: N3DMyl = 329 - INTEGER(IntKi), PARAMETER :: N3DMzl = 330 - INTEGER(IntKi), PARAMETER :: N4DMxl = 331 - INTEGER(IntKi), PARAMETER :: N4DMyl = 332 - INTEGER(IntKi), PARAMETER :: N4DMzl = 333 - INTEGER(IntKi), PARAMETER :: N5DMxl = 334 - INTEGER(IntKi), PARAMETER :: N5DMyl = 335 - INTEGER(IntKi), PARAMETER :: N5DMzl = 336 - INTEGER(IntKi), PARAMETER :: N6DMxl = 337 - INTEGER(IntKi), PARAMETER :: N6DMyl = 338 - INTEGER(IntKi), PARAMETER :: N6DMzl = 339 - INTEGER(IntKi), PARAMETER :: N7DMxl = 340 - INTEGER(IntKi), PARAMETER :: N7DMyl = 341 - INTEGER(IntKi), PARAMETER :: N7DMzl = 342 - INTEGER(IntKi), PARAMETER :: N8DMxl = 343 - INTEGER(IntKi), PARAMETER :: N8DMyl = 344 - INTEGER(IntKi), PARAMETER :: N8DMzl = 345 - INTEGER(IntKi), PARAMETER :: N9DMxl = 346 - INTEGER(IntKi), PARAMETER :: N9DMyl = 347 - INTEGER(IntKi), PARAMETER :: N9DMzl = 348 + INTEGER(IntKi), PARAMETER :: N1PFxl = 241 + INTEGER(IntKi), PARAMETER :: N1PFyl = 242 + INTEGER(IntKi), PARAMETER :: N1PFzl = 243 + INTEGER(IntKi), PARAMETER :: N2PFxl = 244 + INTEGER(IntKi), PARAMETER :: N2PFyl = 245 + INTEGER(IntKi), PARAMETER :: N2PFzl = 246 + INTEGER(IntKi), PARAMETER :: N3PFxl = 247 + INTEGER(IntKi), PARAMETER :: N3PFyl = 248 + INTEGER(IntKi), PARAMETER :: N3PFzl = 249 + INTEGER(IntKi), PARAMETER :: N4PFxl = 250 + INTEGER(IntKi), PARAMETER :: N4PFyl = 251 + INTEGER(IntKi), PARAMETER :: N4PFzl = 252 + INTEGER(IntKi), PARAMETER :: N5PFxl = 253 + INTEGER(IntKi), PARAMETER :: N5PFyl = 254 + INTEGER(IntKi), PARAMETER :: N5PFzl = 255 + INTEGER(IntKi), PARAMETER :: N6PFxl = 256 + INTEGER(IntKi), PARAMETER :: N6PFyl = 257 + INTEGER(IntKi), PARAMETER :: N6PFzl = 258 + INTEGER(IntKi), PARAMETER :: N7PFxl = 259 + INTEGER(IntKi), PARAMETER :: N7PFyl = 260 + INTEGER(IntKi), PARAMETER :: N7PFzl = 261 + INTEGER(IntKi), PARAMETER :: N8PFxl = 262 + INTEGER(IntKi), PARAMETER :: N8PFyl = 263 + INTEGER(IntKi), PARAMETER :: N8PFzl = 264 + INTEGER(IntKi), PARAMETER :: N9PFxl = 265 + INTEGER(IntKi), PARAMETER :: N9PFyl = 266 + INTEGER(IntKi), PARAMETER :: N9PFzl = 267 + INTEGER(IntKi), PARAMETER :: N1PMxl = 268 + INTEGER(IntKi), PARAMETER :: N1PMyl = 269 + INTEGER(IntKi), PARAMETER :: N1PMzl = 270 + INTEGER(IntKi), PARAMETER :: N2PMxl = 271 + INTEGER(IntKi), PARAMETER :: N2PMyl = 272 + INTEGER(IntKi), PARAMETER :: N2PMzl = 273 + INTEGER(IntKi), PARAMETER :: N3PMxl = 274 + INTEGER(IntKi), PARAMETER :: N3PMyl = 275 + INTEGER(IntKi), PARAMETER :: N3PMzl = 276 + INTEGER(IntKi), PARAMETER :: N4PMxl = 277 + INTEGER(IntKi), PARAMETER :: N4PMyl = 278 + INTEGER(IntKi), PARAMETER :: N4PMzl = 279 + INTEGER(IntKi), PARAMETER :: N5PMxl = 280 + INTEGER(IntKi), PARAMETER :: N5PMyl = 281 + INTEGER(IntKi), PARAMETER :: N5PMzl = 282 + INTEGER(IntKi), PARAMETER :: N6PMxl = 283 + INTEGER(IntKi), PARAMETER :: N6PMyl = 284 + INTEGER(IntKi), PARAMETER :: N6PMzl = 285 + INTEGER(IntKi), PARAMETER :: N7PMxl = 286 + INTEGER(IntKi), PARAMETER :: N7PMyl = 287 + INTEGER(IntKi), PARAMETER :: N7PMzl = 288 + INTEGER(IntKi), PARAMETER :: N8PMxl = 289 + INTEGER(IntKi), PARAMETER :: N8PMyl = 290 + INTEGER(IntKi), PARAMETER :: N8PMzl = 291 + INTEGER(IntKi), PARAMETER :: N9PMxl = 292 + INTEGER(IntKi), PARAMETER :: N9PMyl = 293 + INTEGER(IntKi), PARAMETER :: N9PMzl = 294 + INTEGER(IntKi), PARAMETER :: N1DFxl = 295 + INTEGER(IntKi), PARAMETER :: N1DFyl = 296 + INTEGER(IntKi), PARAMETER :: N1DFzl = 297 + INTEGER(IntKi), PARAMETER :: N2DFxl = 298 + INTEGER(IntKi), PARAMETER :: N2DFyl = 299 + INTEGER(IntKi), PARAMETER :: N2DFzl = 300 + INTEGER(IntKi), PARAMETER :: N3DFxl = 301 + INTEGER(IntKi), PARAMETER :: N3DFyl = 302 + INTEGER(IntKi), PARAMETER :: N3DFzl = 303 + INTEGER(IntKi), PARAMETER :: N4DFxl = 304 + INTEGER(IntKi), PARAMETER :: N4DFyl = 305 + INTEGER(IntKi), PARAMETER :: N4DFzl = 306 + INTEGER(IntKi), PARAMETER :: N5DFxl = 307 + INTEGER(IntKi), PARAMETER :: N5DFyl = 308 + INTEGER(IntKi), PARAMETER :: N5DFzl = 309 + INTEGER(IntKi), PARAMETER :: N6DFxl = 310 + INTEGER(IntKi), PARAMETER :: N6DFyl = 311 + INTEGER(IntKi), PARAMETER :: N6DFzl = 312 + INTEGER(IntKi), PARAMETER :: N7DFxl = 313 + INTEGER(IntKi), PARAMETER :: N7DFyl = 314 + INTEGER(IntKi), PARAMETER :: N7DFzl = 315 + INTEGER(IntKi), PARAMETER :: N8DFxl = 316 + INTEGER(IntKi), PARAMETER :: N8DFyl = 317 + INTEGER(IntKi), PARAMETER :: N8DFzl = 318 + INTEGER(IntKi), PARAMETER :: N9DFxl = 319 + INTEGER(IntKi), PARAMETER :: N9DFyl = 320 + INTEGER(IntKi), PARAMETER :: N9DFzl = 321 + INTEGER(IntKi), PARAMETER :: N1DMxl = 322 + INTEGER(IntKi), PARAMETER :: N1DMyl = 323 + INTEGER(IntKi), PARAMETER :: N1DMzl = 324 + INTEGER(IntKi), PARAMETER :: N2DMxl = 325 + INTEGER(IntKi), PARAMETER :: N2DMyl = 326 + INTEGER(IntKi), PARAMETER :: N2DMzl = 327 + INTEGER(IntKi), PARAMETER :: N3DMxl = 328 + INTEGER(IntKi), PARAMETER :: N3DMyl = 329 + INTEGER(IntKi), PARAMETER :: N3DMzl = 330 + INTEGER(IntKi), PARAMETER :: N4DMxl = 331 + INTEGER(IntKi), PARAMETER :: N4DMyl = 332 + INTEGER(IntKi), PARAMETER :: N4DMzl = 333 + INTEGER(IntKi), PARAMETER :: N5DMxl = 334 + INTEGER(IntKi), PARAMETER :: N5DMyl = 335 + INTEGER(IntKi), PARAMETER :: N5DMzl = 336 + INTEGER(IntKi), PARAMETER :: N6DMxl = 337 + INTEGER(IntKi), PARAMETER :: N6DMyl = 338 + INTEGER(IntKi), PARAMETER :: N6DMzl = 339 + INTEGER(IntKi), PARAMETER :: N7DMxl = 340 + INTEGER(IntKi), PARAMETER :: N7DMyl = 341 + INTEGER(IntKi), PARAMETER :: N7DMzl = 342 + INTEGER(IntKi), PARAMETER :: N8DMxl = 343 + INTEGER(IntKi), PARAMETER :: N8DMyl = 344 + INTEGER(IntKi), PARAMETER :: N8DMzl = 345 + INTEGER(IntKi), PARAMETER :: N9DMxl = 346 + INTEGER(IntKi), PARAMETER :: N9DMyl = 347 + INTEGER(IntKi), PARAMETER :: N9DMzl = 348 + + + ! Applied loads mapped to root (includes distributed and point): + + INTEGER(IntKi), PARAMETER :: RootAppliedFxr = 349 + INTEGER(IntKi), PARAMETER :: RootAppliedFyr = 350 + INTEGER(IntKi), PARAMETER :: RootAppliedFzr = 351 + INTEGER(IntKi), PARAMETER :: RootAppliedMxr = 352 + INTEGER(IntKi), PARAMETER :: RootAppliedMyr = 353 + INTEGER(IntKi), PARAMETER :: RootAppliedMzr = 354 + INTEGER(IntKi), PARAMETER :: RootAppliedFxg = 355 + INTEGER(IntKi), PARAMETER :: RootAppliedFyg = 356 + INTEGER(IntKi), PARAMETER :: RootAppliedFzg = 357 + INTEGER(IntKi), PARAMETER :: RootAppliedMxg = 358 + INTEGER(IntKi), PARAMETER :: RootAppliedMyg = 359 + INTEGER(IntKi), PARAMETER :: RootAppliedMzg = 360 ! Pitch Actuator: - INTEGER(IntKi), PARAMETER :: PAngInp = 349 - INTEGER(IntKi), PARAMETER :: PAngAct = 350 - INTEGER(IntKi), PARAMETER :: PRatAct = 351 - INTEGER(IntKi), PARAMETER :: PAccAct = 352 + INTEGER(IntKi), PARAMETER :: PAngInp = 361 + INTEGER(IntKi), PARAMETER :: PAngAct = 362 + INTEGER(IntKi), PARAMETER :: PRatAct = 363 + INTEGER(IntKi), PARAMETER :: PAccAct = 364 ! The maximum number of output channels which can be output by the code. - INTEGER(IntKi), PARAMETER :: MaxOutPts = 352 + INTEGER(IntKi), PARAMETER :: MaxOutPts = 364 !End of code generated by Matlab script ! =================================================================================================== @@ -1159,15 +1175,16 @@ END SUBROUTINE BD_ReadBladeFile !---------------------------------------------------------------------------------------------------------------------------------- !********************************************************************************************************************************** ! NOTE: The following lines of code were generated by a Matlab script called "Write_ChckOutLst.m" -! using the parameters listed in the "OutListParameters.xlsx" Excel file. Any changes to these -! lines should be modified in the Matlab script and/or Excel worksheet as necessary. -! This code was generated by Write_ChckOutLst.m at 29-Sep-2015 10:23:41. +! using the parameters listed in the "OutListParameters.xlsx" Excel file. Any changes to these +! lines should be modified in the Matlab script and/or Excel worksheet as necessary. !---------------------------------------------------------------------------------------------------------------------------------- -!> This routine checks to see if any requested output channel names (stored in the OutList(:)) are invalid. It returns a +!> This routine checks to see if any requested output channel names (stored in the OutList(:)) are invalid. It returns a !! warning if any of the channels are not available outputs from the module. !! It assigns the settings for OutParam(:) (i.e, the index, name, and units of the output channels, WriteOutput(:)). !! the sign is set to 0 if the channel is invalid. !! It sets assumes the value p%NumOuts has been set before this routine has been called, and it sets the values of p%OutParam here. +!! +!! This routine was generated by Write_ChckOutLst.m using the parameters listed in OutListParameters.xlsx at 08-May-2025 15:51:30. SUBROUTINE SetOutParam(OutList, p, ErrStat, ErrMsg ) IMPLICIT NONE @@ -1191,162 +1208,232 @@ SUBROUTINE SetOutParam(OutList, p, ErrStat, ErrMsg ) CHARACTER(ChanLen) :: OutListTmp ! A string to temporarily hold OutList(I) CHARACTER(*), PARAMETER :: RoutineName = "SetOutParam" - CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry(352) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically - "N1DFXL ","N1DFYL ","N1DFZL ","N1DMXL ","N1DMYL ","N1DMZL ","N1FXL ", & - "N1FYL ","N1FZL ","N1MXL ","N1MYL ","N1MZL ","N1PFXL ","N1PFYL ", & - "N1PFZL ","N1PMXL ","N1PMYL ","N1PMZL ","N1RAXL ","N1RAYL ","N1RAZL ", & - "N1RDXR ","N1RDYR ","N1RDZR ","N1RVXG ","N1RVYG ","N1RVZG ","N1TAXL ", & - "N1TAYL ","N1TAZL ","N1TDXR ","N1TDYR ","N1TDZR ","N1TVXG ","N1TVYG ", & - "N1TVZG ","N2DFXL ","N2DFYL ","N2DFZL ","N2DMXL ","N2DMYL ","N2DMZL ", & - "N2FXL ","N2FYL ","N2FZL ","N2MXL ","N2MYL ","N2MZL ","N2PFXL ", & - "N2PFYL ","N2PFZL ","N2PMXL ","N2PMYL ","N2PMZL ","N2RAXL ","N2RAYL ", & - "N2RAZL ","N2RDXR ","N2RDYR ","N2RDZR ","N2RVXG ","N2RVYG ","N2RVZG ", & - "N2TAXL ","N2TAYL ","N2TAZL ","N2TDXR ","N2TDYR ","N2TDZR ","N2TVXG ", & - "N2TVYG ","N2TVZG ","N3DFXL ","N3DFYL ","N3DFZL ","N3DMXL ","N3DMYL ", & - "N3DMZL ","N3FXL ","N3FYL ","N3FZL ","N3MXL ","N3MYL ","N3MZL ", & - "N3PFXL ","N3PFYL ","N3PFZL ","N3PMXL ","N3PMYL ","N3PMZL ","N3RAXL ", & - "N3RAYL ","N3RAZL ","N3RDXR ","N3RDYR ","N3RDZR ","N3RVXG ","N3RVYG ", & - "N3RVZG ","N3TAXL ","N3TAYL ","N3TAZL ","N3TDXR ","N3TDYR ","N3TDZR ", & - "N3TVXG ","N3TVYG ","N3TVZG ","N4DFXL ","N4DFYL ","N4DFZL ","N4DMXL ", & - "N4DMYL ","N4DMZL ","N4FXL ","N4FYL ","N4FZL ","N4MXL ","N4MYL ", & - "N4MZL ","N4PFXL ","N4PFYL ","N4PFZL ","N4PMXL ","N4PMYL ","N4PMZL ", & - "N4RAXL ","N4RAYL ","N4RAZL ","N4RDXR ","N4RDYR ","N4RDZR ","N4RVXG ", & - "N4RVYG ","N4RVZG ","N4TAXL ","N4TAYL ","N4TAZL ","N4TDXR ","N4TDYR ", & - "N4TDZR ","N4TVXG ","N4TVYG ","N4TVZG ","N5DFXL ","N5DFYL ","N5DFZL ", & - "N5DMXL ","N5DMYL ","N5DMZL ","N5FXL ","N5FYL ","N5FZL ","N5MXL ", & - "N5MYL ","N5MZL ","N5PFXL ","N5PFYL ","N5PFZL ","N5PMXL ","N5PMYL ", & - "N5PMZL ","N5RAXL ","N5RAYL ","N5RAZL ","N5RDXR ","N5RDYR ","N5RDZR ", & - "N5RVXG ","N5RVYG ","N5RVZG ","N5TAXL ","N5TAYL ","N5TAZL ","N5TDXR ", & - "N5TDYR ","N5TDZR ","N5TVXG ","N5TVYG ","N5TVZG ","N6DFXL ","N6DFYL ", & - "N6DFZL ","N6DMXL ","N6DMYL ","N6DMZL ","N6FXL ","N6FYL ","N6FZL ", & - "N6MXL ","N6MYL ","N6MZL ","N6PFXL ","N6PFYL ","N6PFZL ","N6PMXL ", & - "N6PMYL ","N6PMZL ","N6RAXL ","N6RAYL ","N6RAZL ","N6RDXR ","N6RDYR ", & - "N6RDZR ","N6RVXG ","N6RVYG ","N6RVZG ","N6TAXL ","N6TAYL ","N6TAZL ", & - "N6TDXR ","N6TDYR ","N6TDZR ","N6TVXG ","N6TVYG ","N6TVZG ","N7DFXL ", & - "N7DFYL ","N7DFZL ","N7DMXL ","N7DMYL ","N7DMZL ","N7FXL ","N7FYL ", & - "N7FZL ","N7MXL ","N7MYL ","N7MZL ","N7PFXL ","N7PFYL ","N7PFZL ", & - "N7PMXL ","N7PMYL ","N7PMZL ","N7RAXL ","N7RAYL ","N7RAZL ","N7RDXR ", & - "N7RDYR ","N7RDZR ","N7RVXG ","N7RVYG ","N7RVZG ","N7TAXL ","N7TAYL ", & - "N7TAZL ","N7TDXR ","N7TDYR ","N7TDZR ","N7TVXG ","N7TVYG ","N7TVZG ", & - "N8DFXL ","N8DFYL ","N8DFZL ","N8DMXL ","N8DMYL ","N8DMZL ","N8FXL ", & - "N8FYL ","N8FZL ","N8MXL ","N8MYL ","N8MZL ","N8PFXL ","N8PFYL ", & - "N8PFZL ","N8PMXL ","N8PMYL ","N8PMZL ","N8RAXL ","N8RAYL ","N8RAZL ", & - "N8RDXR ","N8RDYR ","N8RDZR ","N8RVXG ","N8RVYG ","N8RVZG ","N8TAXL ", & - "N8TAYL ","N8TAZL ","N8TDXR ","N8TDYR ","N8TDZR ","N8TVXG ","N8TVYG ", & - "N8TVZG ","N9DFXL ","N9DFYL ","N9DFZL ","N9DMXL ","N9DMYL ","N9DMZL ", & - "N9FXL ","N9FYL ","N9FZL ","N9MXL ","N9MYL ","N9MZL ","N9PFXL ", & - "N9PFYL ","N9PFZL ","N9PMXL ","N9PMYL ","N9PMZL ","N9RAXL ","N9RAYL ", & - "N9RAZL ","N9RDXR ","N9RDYR ","N9RDZR ","N9RVXG ","N9RVYG ","N9RVZG ", & - "N9TAXL ","N9TAYL ","N9TAZL ","N9TDXR ","N9TDYR ","N9TDZR ","N9TVXG ", & - "N9TVYG ","N9TVZG ","PACCACT ","PANGACT ","PANGINP ","PRATACT ","ROOTFXR ", & - "ROOTFYR ","ROOTFZR ","ROOTMXR ","ROOTMYR ","ROOTMZR ","TIPRAXL ","TIPRAYL ", & - "TIPRAZL ","TIPRDXR ","TIPRDYR ","TIPRDZR ","TIPRVXG ","TIPRVYG ","TIPRVZG ", & - "TIPTAXL ","TIPTAYL ","TIPTAZL ","TIPTDXR ","TIPTDYR ","TIPTDZR ","TIPTVXG ", & - "TIPTVYG ","TIPTVZG "/) - INTEGER(IntKi), PARAMETER :: ParamIndxAry(352) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) - N1DFxl , N1DFyl , N1DFzl , N1DMxl , N1DMyl , N1DMzl , N1Fxl , & - N1Fyl , N1Fzl , N1Mxl , N1Myl , N1Mzl , N1PFxl , N1PFyl , & - N1PFzl , N1PMxl , N1PMyl , N1PMzl , N1RAXl , N1RAYl , N1RAZl , & - N1RDxr , N1RDyr , N1RDzr , N1RVXg , N1RVYg , N1RVZg , N1TAXl , & - N1TAYl , N1TAZl , N1TDxr , N1TDyr , N1TDzr , N1TVXg , N1TVYg , & - N1TVZg , N2DFxl , N2DFyl , N2DFzl , N2DMxl , N2DMyl , N2DMzl , & - N2Fxl , N2Fyl , N2Fzl , N2Mxl , N2Myl , N2Mzl , N2PFxl , & - N2PFyl , N2PFzl , N2PMxl , N2PMyl , N2PMzl , N2RAXl , N2RAYl , & - N2RAZl , N2RDxr , N2RDyr , N2RDzr , N2RVXg , N2RVYg , N2RVZg , & - N2TAXl , N2TAYl , N2TAZl , N2TDxr , N2TDyr , N2TDzr , N2TVXg , & - N2TVYg , N2TVZg , N3DFxl , N3DFyl , N3DFzl , N3DMxl , N3DMyl , & - N3DMzl , N3Fxl , N3Fyl , N3Fzl , N3Mxl , N3Myl , N3Mzl , & - N3PFxl , N3PFyl , N3PFzl , N3PMxl , N3PMyl , N3PMzl , N3RAXl , & - N3RAYl , N3RAZl , N3RDxr , N3RDyr , N3RDzr , N3RVXg , N3RVYg , & - N3RVZg , N3TAXl , N3TAYl , N3TAZl , N3TDxr , N3TDyr , N3TDzr , & - N3TVXg , N3TVYg , N3TVZg , N4DFxl , N4DFyl , N4DFzl , N4DMxl , & - N4DMyl , N4DMzl , N4Fxl , N4Fyl , N4Fzl , N4Mxl , N4Myl , & - N4Mzl , N4PFxl , N4PFyl , N4PFzl , N4PMxl , N4PMyl , N4PMzl , & - N4RAXl , N4RAYl , N4RAZl , N4RDxr , N4RDyr , N4RDzr , N4RVXg , & - N4RVYg , N4RVZg , N4TAXl , N4TAYl , N4TAZl , N4TDxr , N4TDyr , & - N4TDzr , N4TVXg , N4TVYg , N4TVZg , N5DFxl , N5DFyl , N5DFzl , & - N5DMxl , N5DMyl , N5DMzl , N5Fxl , N5Fyl , N5Fzl , N5Mxl , & - N5Myl , N5Mzl , N5PFxl , N5PFyl , N5PFzl , N5PMxl , N5PMyl , & - N5PMzl , N5RAXl , N5RAYl , N5RAZl , N5RDxr , N5RDyr , N5RDzr , & - N5RVXg , N5RVYg , N5RVZg , N5TAXl , N5TAYl , N5TAZl , N5TDxr , & - N5TDyr , N5TDzr , N5TVXg , N5TVYg , N5TVZg , N6DFxl , N6DFyl , & - N6DFzl , N6DMxl , N6DMyl , N6DMzl , N6Fxl , N6Fyl , N6Fzl , & - N6Mxl , N6Myl , N6Mzl , N6PFxl , N6PFyl , N6PFzl , N6PMxl , & - N6PMyl , N6PMzl , N6RAXl , N6RAYl , N6RAZl , N6RDxr , N6RDyr , & - N6RDzr , N6RVXg , N6RVYg , N6RVZg , N6TAXl , N6TAYl , N6TAZl , & - N6TDxr , N6TDyr , N6TDzr , N6TVXg , N6TVYg , N6TVZg , N7DFxl , & - N7DFyl , N7DFzl , N7DMxl , N7DMyl , N7DMzl , N7Fxl , N7Fyl , & - N7Fzl , N7Mxl , N7Myl , N7Mzl , N7PFxl , N7PFyl , N7PFzl , & - N7PMxl , N7PMyl , N7PMzl , N7RAXl , N7RAYl , N7RAZl , N7RDxr , & - N7RDyr , N7RDzr , N7RVXg , N7RVYg , N7RVZg , N7TAXl , N7TAYl , & - N7TAZl , N7TDxr , N7TDyr , N7TDzr , N7TVXg , N7TVYg , N7TVZg , & - N8DFxl , N8DFyl , N8DFzl , N8DMxl , N8DMyl , N8DMzl , N8Fxl , & - N8Fyl , N8Fzl , N8Mxl , N8Myl , N8Mzl , N8PFxl , N8PFyl , & - N8PFzl , N8PMxl , N8PMyl , N8PMzl , N8RAXl , N8RAYl , N8RAZl , & - N8RDxr , N8RDyr , N8RDzr , N8RVXg , N8RVYg , N8RVZg , N8TAXl , & - N8TAYl , N8TAZl , N8TDxr , N8TDyr , N8TDzr , N8TVXg , N8TVYg , & - N8TVZg , N9DFxl , N9DFyl , N9DFzl , N9DMxl , N9DMyl , N9DMzl , & - N9Fxl , N9Fyl , N9Fzl , N9Mxl , N9Myl , N9Mzl , N9PFxl , & - N9PFyl , N9PFzl , N9PMxl , N9PMyl , N9PMzl , N9RAXl , N9RAYl , & - N9RAZl , N9RDxr , N9RDyr , N9RDzr , N9RVXg , N9RVYg , N9RVZg , & - N9TAXl , N9TAYl , N9TAZl , N9TDxr , N9TDyr , N9TDzr , N9TVXg , & - N9TVYg , N9TVZg , PAccAct , PAngAct , PAngInp , PRatAct , RootFxr , & - RootFyr , RootFzr , RootMxr , RootMyr , RootMzr , TipRAXl , TipRAYl , & - TipRAZl , TipRDxr , TipRDyr , TipRDzr , TipRVXg , TipRVYg , TipRVZg , & - TipTAXl , TipTAYl , TipTAZl , TipTDxr , TipTDyr , TipTDzr , TipTVXg , & - TipTVYg , TipTVZg /) - CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry(352) = (/ & ! This lists the units corresponding to the allowed parameters - "(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N) ", & - "(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(N) ","(N) ", & - "(N) ","(N-m) ","(N-m) ","(N-m) ","(deg/s^2) ","(deg/s^2) ","(deg/s^2) ", & - "(-) ","(-) ","(-) ","(deg/s) ","(deg/s) ","(deg/s) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(m/s) ","(m/s) ", & - "(m/s) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(N) ", & - "(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(deg/s^2) ","(deg/s^2) ", & - "(deg/s^2) ","(-) ","(-) ","(-) ","(deg/s) ","(deg/s) ","(deg/s) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(m/s) ", & - "(m/s) ","(m/s) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ", & - "(N-m/m) ","(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ", & - "(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(deg/s^2) ", & - "(deg/s^2) ","(deg/s^2) ","(-) ","(-) ","(-) ","(deg/s) ","(deg/s) ", & - "(deg/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(m/s) ","(m/s) ","(m/s) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ", & - "(N-m/m) ","(N-m/m) ","(N) ","(N) ","(N) ","(N-m) ","(N-m) ", & - "(N-m) ","(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ", & - "(deg/s^2) ","(deg/s^2) ","(deg/s^2) ","(-) ","(-) ","(-) ","(deg/s) ", & - "(deg/s) ","(deg/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(m/s) ","(m/s) ","(m/s) ","(N/m) ","(N/m) ","(N/m) ", & - "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N) ","(N) ","(N) ","(N-m) ", & - "(N-m) ","(N-m) ","(N) ","(N) ","(N) ","(N-m) ","(N-m) ", & - "(N-m) ","(deg/s^2) ","(deg/s^2) ","(deg/s^2) ","(-) ","(-) ","(-) ", & - "(deg/s) ","(deg/s) ","(deg/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(m/s) ","(m/s) ","(m/s) ","(N/m) ","(N/m) ", & - "(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N) ","(N) ","(N) ", & - "(N-m) ","(N-m) ","(N-m) ","(N) ","(N) ","(N) ","(N-m) ", & - "(N-m) ","(N-m) ","(deg/s^2) ","(deg/s^2) ","(deg/s^2) ","(-) ","(-) ", & - "(-) ","(deg/s) ","(deg/s) ","(deg/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(m/s) ","(m/s) ","(m/s) ","(N/m) ", & - "(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N) ","(N) ", & - "(N) ","(N-m) ","(N-m) ","(N-m) ","(N) ","(N) ","(N) ", & - "(N-m) ","(N-m) ","(N-m) ","(deg/s^2) ","(deg/s^2) ","(deg/s^2) ","(-) ", & - "(-) ","(-) ","(deg/s) ","(deg/s) ","(deg/s) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(m/s) ","(m/s) ","(m/s) ", & - "(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N) ", & - "(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(N) ","(N) ", & - "(N) ","(N-m) ","(N-m) ","(N-m) ","(deg/s^2) ","(deg/s^2) ","(deg/s^2) ", & - "(-) ","(-) ","(-) ","(deg/s) ","(deg/s) ","(deg/s) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(m/s) ","(m/s) ", & - "(m/s) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & - "(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(N) ", & - "(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(deg/s^2) ","(deg/s^2) ", & - "(deg/s^2) ","(-) ","(-) ","(-) ","(deg/s) ","(deg/s) ","(deg/s) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(m/s) ", & - "(m/s) ","(m/s) ","(deg/s^2) ","(deg) ","(deg) ","(deg/s) ","(N) ", & - "(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(deg/s^2) ","(deg/s^2) ", & - "(deg/s^2) ","(-) ","(-) ","(-) ","(deg/s) ","(deg/s) ","(deg/s) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(m/s) ", & - "(m/s) ","(m/s) "/) + CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry(364) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + "N1DFXL ","N1DFYL ","N1DFZL ","N1DMXL ","N1DMYL ", & + "N1DMZL ","N1FXL ","N1FYL ","N1FZL ","N1MXL ", & + "N1MYL ","N1MZL ","N1PFXL ","N1PFYL ","N1PFZL ", & + "N1PMXL ","N1PMYL ","N1PMZL ","N1RAXL ","N1RAYL ", & + "N1RAZL ","N1RDXR ","N1RDYR ","N1RDZR ","N1RVXG ", & + "N1RVYG ","N1RVZG ","N1TAXL ","N1TAYL ","N1TAZL ", & + "N1TDXR ","N1TDYR ","N1TDZR ","N1TVXG ","N1TVYG ", & + "N1TVZG ","N2DFXL ","N2DFYL ","N2DFZL ","N2DMXL ", & + "N2DMYL ","N2DMZL ","N2FXL ","N2FYL ","N2FZL ", & + "N2MXL ","N2MYL ","N2MZL ","N2PFXL ","N2PFYL ", & + "N2PFZL ","N2PMXL ","N2PMYL ","N2PMZL ","N2RAXL ", & + "N2RAYL ","N2RAZL ","N2RDXR ","N2RDYR ","N2RDZR ", & + "N2RVXG ","N2RVYG ","N2RVZG ","N2TAXL ","N2TAYL ", & + "N2TAZL ","N2TDXR ","N2TDYR ","N2TDZR ","N2TVXG ", & + "N2TVYG ","N2TVZG ","N3DFXL ","N3DFYL ","N3DFZL ", & + "N3DMXL ","N3DMYL ","N3DMZL ","N3FXL ","N3FYL ", & + "N3FZL ","N3MXL ","N3MYL ","N3MZL ","N3PFXL ", & + "N3PFYL ","N3PFZL ","N3PMXL ","N3PMYL ","N3PMZL ", & + "N3RAXL ","N3RAYL ","N3RAZL ","N3RDXR ","N3RDYR ", & + "N3RDZR ","N3RVXG ","N3RVYG ","N3RVZG ","N3TAXL ", & + "N3TAYL ","N3TAZL ","N3TDXR ","N3TDYR ","N3TDZR ", & + "N3TVXG ","N3TVYG ","N3TVZG ","N4DFXL ","N4DFYL ", & + "N4DFZL ","N4DMXL ","N4DMYL ","N4DMZL ","N4FXL ", & + "N4FYL ","N4FZL ","N4MXL ","N4MYL ","N4MZL ", & + "N4PFXL ","N4PFYL ","N4PFZL ","N4PMXL ","N4PMYL ", & + "N4PMZL ","N4RAXL ","N4RAYL ","N4RAZL ","N4RDXR ", & + "N4RDYR ","N4RDZR ","N4RVXG ","N4RVYG ","N4RVZG ", & + "N4TAXL ","N4TAYL ","N4TAZL ","N4TDXR ","N4TDYR ", & + "N4TDZR ","N4TVXG ","N4TVYG ","N4TVZG ","N5DFXL ", & + "N5DFYL ","N5DFZL ","N5DMXL ","N5DMYL ","N5DMZL ", & + "N5FXL ","N5FYL ","N5FZL ","N5MXL ","N5MYL ", & + "N5MZL ","N5PFXL ","N5PFYL ","N5PFZL ","N5PMXL ", & + "N5PMYL ","N5PMZL ","N5RAXL ","N5RAYL ","N5RAZL ", & + "N5RDXR ","N5RDYR ","N5RDZR ","N5RVXG ","N5RVYG ", & + "N5RVZG ","N5TAXL ","N5TAYL ","N5TAZL ","N5TDXR ", & + "N5TDYR ","N5TDZR ","N5TVXG ","N5TVYG ","N5TVZG ", & + "N6DFXL ","N6DFYL ","N6DFZL ","N6DMXL ","N6DMYL ", & + "N6DMZL ","N6FXL ","N6FYL ","N6FZL ","N6MXL ", & + "N6MYL ","N6MZL ","N6PFXL ","N6PFYL ","N6PFZL ", & + "N6PMXL ","N6PMYL ","N6PMZL ","N6RAXL ","N6RAYL ", & + "N6RAZL ","N6RDXR ","N6RDYR ","N6RDZR ","N6RVXG ", & + "N6RVYG ","N6RVZG ","N6TAXL ","N6TAYL ","N6TAZL ", & + "N6TDXR ","N6TDYR ","N6TDZR ","N6TVXG ","N6TVYG ", & + "N6TVZG ","N7DFXL ","N7DFYL ","N7DFZL ","N7DMXL ", & + "N7DMYL ","N7DMZL ","N7FXL ","N7FYL ","N7FZL ", & + "N7MXL ","N7MYL ","N7MZL ","N7PFXL ","N7PFYL ", & + "N7PFZL ","N7PMXL ","N7PMYL ","N7PMZL ","N7RAXL ", & + "N7RAYL ","N7RAZL ","N7RDXR ","N7RDYR ","N7RDZR ", & + "N7RVXG ","N7RVYG ","N7RVZG ","N7TAXL ","N7TAYL ", & + "N7TAZL ","N7TDXR ","N7TDYR ","N7TDZR ","N7TVXG ", & + "N7TVYG ","N7TVZG ","N8DFXL ","N8DFYL ","N8DFZL ", & + "N8DMXL ","N8DMYL ","N8DMZL ","N8FXL ","N8FYL ", & + "N8FZL ","N8MXL ","N8MYL ","N8MZL ","N8PFXL ", & + "N8PFYL ","N8PFZL ","N8PMXL ","N8PMYL ","N8PMZL ", & + "N8RAXL ","N8RAYL ","N8RAZL ","N8RDXR ","N8RDYR ", & + "N8RDZR ","N8RVXG ","N8RVYG ","N8RVZG ","N8TAXL ", & + "N8TAYL ","N8TAZL ","N8TDXR ","N8TDYR ","N8TDZR ", & + "N8TVXG ","N8TVYG ","N8TVZG ","N9DFXL ","N9DFYL ", & + "N9DFZL ","N9DMXL ","N9DMYL ","N9DMZL ","N9FXL ", & + "N9FYL ","N9FZL ","N9MXL ","N9MYL ","N9MZL ", & + "N9PFXL ","N9PFYL ","N9PFZL ","N9PMXL ","N9PMYL ", & + "N9PMZL ","N9RAXL ","N9RAYL ","N9RAZL ","N9RDXR ", & + "N9RDYR ","N9RDZR ","N9RVXG ","N9RVYG ","N9RVZG ", & + "N9TAXL ","N9TAYL ","N9TAZL ","N9TDXR ","N9TDYR ", & + "N9TDZR ","N9TVXG ","N9TVYG ","N9TVZG ","PACCACT ", & + "PANGACT ","PANGINP ","PRATACT ","ROOTAPPLIEDFXG","ROOTAPPLIEDFXR", & + "ROOTAPPLIEDFYG","ROOTAPPLIEDFYR","ROOTAPPLIEDFZG","ROOTAPPLIEDFZR","ROOTAPPLIEDMXG", & + "ROOTAPPLIEDMXR","ROOTAPPLIEDMYG","ROOTAPPLIEDMYR","ROOTAPPLIEDMZG","ROOTAPPLIEDMZR", & + "ROOTFXR ","ROOTFYR ","ROOTFZR ","ROOTMXR ","ROOTMYR ", & + "ROOTMZR ","TIPRAXL ","TIPRAYL ","TIPRAZL ","TIPRDXR ", & + "TIPRDYR ","TIPRDZR ","TIPRVXG ","TIPRVYG ","TIPRVZG ", & + "TIPTAXL ","TIPTAYL ","TIPTAZL ","TIPTDXR ","TIPTDYR ", & + "TIPTDZR ","TIPTVXG ","TIPTVYG ","TIPTVZG "/) + INTEGER(IntKi), PARAMETER :: ParamIndxAry(364) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + N1DFxl , N1DFyl , N1DFzl , N1DMxl , N1DMyl , & + N1DMzl , N1Fxl , N1Fyl , N1Fzl , N1Mxl , & + N1Myl , N1Mzl , N1PFxl , N1PFyl , N1PFzl , & + N1PMxl , N1PMyl , N1PMzl , N1RAXl , N1RAYl , & + N1RAZl , N1RDxr , N1RDyr , N1RDzr , N1RVXg , & + N1RVYg , N1RVZg , N1TAXl , N1TAYl , N1TAZl , & + N1TDxr , N1TDyr , N1TDzr , N1TVXg , N1TVYg , & + N1TVZg , N2DFxl , N2DFyl , N2DFzl , N2DMxl , & + N2DMyl , N2DMzl , N2Fxl , N2Fyl , N2Fzl , & + N2Mxl , N2Myl , N2Mzl , N2PFxl , N2PFyl , & + N2PFzl , N2PMxl , N2PMyl , N2PMzl , N2RAXl , & + N2RAYl , N2RAZl , N2RDxr , N2RDyr , N2RDzr , & + N2RVXg , N2RVYg , N2RVZg , N2TAXl , N2TAYl , & + N2TAZl , N2TDxr , N2TDyr , N2TDzr , N2TVXg , & + N2TVYg , N2TVZg , N3DFxl , N3DFyl , N3DFzl , & + N3DMxl , N3DMyl , N3DMzl , N3Fxl , N3Fyl , & + N3Fzl , N3Mxl , N3Myl , N3Mzl , N3PFxl , & + N3PFyl , N3PFzl , N3PMxl , N3PMyl , N3PMzl , & + N3RAXl , N3RAYl , N3RAZl , N3RDxr , N3RDyr , & + N3RDzr , N3RVXg , N3RVYg , N3RVZg , N3TAXl , & + N3TAYl , N3TAZl , N3TDxr , N3TDyr , N3TDzr , & + N3TVXg , N3TVYg , N3TVZg , N4DFxl , N4DFyl , & + N4DFzl , N4DMxl , N4DMyl , N4DMzl , N4Fxl , & + N4Fyl , N4Fzl , N4Mxl , N4Myl , N4Mzl , & + N4PFxl , N4PFyl , N4PFzl , N4PMxl , N4PMyl , & + N4PMzl , N4RAXl , N4RAYl , N4RAZl , N4RDxr , & + N4RDyr , N4RDzr , N4RVXg , N4RVYg , N4RVZg , & + N4TAXl , N4TAYl , N4TAZl , N4TDxr , N4TDyr , & + N4TDzr , N4TVXg , N4TVYg , N4TVZg , N5DFxl , & + N5DFyl , N5DFzl , N5DMxl , N5DMyl , N5DMzl , & + N5Fxl , N5Fyl , N5Fzl , N5Mxl , N5Myl , & + N5Mzl , N5PFxl , N5PFyl , N5PFzl , N5PMxl , & + N5PMyl , N5PMzl , N5RAXl , N5RAYl , N5RAZl , & + N5RDxr , N5RDyr , N5RDzr , N5RVXg , N5RVYg , & + N5RVZg , N5TAXl , N5TAYl , N5TAZl , N5TDxr , & + N5TDyr , N5TDzr , N5TVXg , N5TVYg , N5TVZg , & + N6DFxl , N6DFyl , N6DFzl , N6DMxl , N6DMyl , & + N6DMzl , N6Fxl , N6Fyl , N6Fzl , N6Mxl , & + N6Myl , N6Mzl , N6PFxl , N6PFyl , N6PFzl , & + N6PMxl , N6PMyl , N6PMzl , N6RAXl , N6RAYl , & + N6RAZl , N6RDxr , N6RDyr , N6RDzr , N6RVXg , & + N6RVYg , N6RVZg , N6TAXl , N6TAYl , N6TAZl , & + N6TDxr , N6TDyr , N6TDzr , N6TVXg , N6TVYg , & + N6TVZg , N7DFxl , N7DFyl , N7DFzl , N7DMxl , & + N7DMyl , N7DMzl , N7Fxl , N7Fyl , N7Fzl , & + N7Mxl , N7Myl , N7Mzl , N7PFxl , N7PFyl , & + N7PFzl , N7PMxl , N7PMyl , N7PMzl , N7RAXl , & + N7RAYl , N7RAZl , N7RDxr , N7RDyr , N7RDzr , & + N7RVXg , N7RVYg , N7RVZg , N7TAXl , N7TAYl , & + N7TAZl , N7TDxr , N7TDyr , N7TDzr , N7TVXg , & + N7TVYg , N7TVZg , N8DFxl , N8DFyl , N8DFzl , & + N8DMxl , N8DMyl , N8DMzl , N8Fxl , N8Fyl , & + N8Fzl , N8Mxl , N8Myl , N8Mzl , N8PFxl , & + N8PFyl , N8PFzl , N8PMxl , N8PMyl , N8PMzl , & + N8RAXl , N8RAYl , N8RAZl , N8RDxr , N8RDyr , & + N8RDzr , N8RVXg , N8RVYg , N8RVZg , N8TAXl , & + N8TAYl , N8TAZl , N8TDxr , N8TDyr , N8TDzr , & + N8TVXg , N8TVYg , N8TVZg , N9DFxl , N9DFyl , & + N9DFzl , N9DMxl , N9DMyl , N9DMzl , N9Fxl , & + N9Fyl , N9Fzl , N9Mxl , N9Myl , N9Mzl , & + N9PFxl , N9PFyl , N9PFzl , N9PMxl , N9PMyl , & + N9PMzl , N9RAXl , N9RAYl , N9RAZl , N9RDxr , & + N9RDyr , N9RDzr , N9RVXg , N9RVYg , N9RVZg , & + N9TAXl , N9TAYl , N9TAZl , N9TDxr , N9TDyr , & + N9TDzr , N9TVXg , N9TVYg , N9TVZg , PAccAct , & + PAngAct , PAngInp , PRatAct , RootAppliedFxg , RootAppliedFxr , & + RootAppliedFyg , RootAppliedFyr , RootAppliedFzg , RootAppliedFzr , RootAppliedMxg , & + RootAppliedMxr , RootAppliedMyg , RootAppliedMyr , RootAppliedMzg , RootAppliedMzr , & + RootFxr , RootFyr , RootFzr , RootMxr , RootMyr , & + RootMzr , TipRAXl , TipRAYl , TipRAZl , TipRDxr , & + TipRDyr , TipRDzr , TipRVXg , TipRVYg , TipRVZg , & + TipTAXl , TipTAYl , TipTAZl , TipTDxr , TipTDyr , & + TipTDzr , TipTVXg , TipTVYg , TipTVZg /) + CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry(364) = (/ & ! This lists the units corresponding to the allowed parameters + "(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ", & + "(N-m/m) ","(N) ","(N) ","(N) ","(N-m) ", & + "(N-m) ","(N-m) ","(N) ","(N) ","(N) ", & + "(N-m) ","(N-m) ","(N-m) ","(deg/s^2)","(deg/s^2)", & + "(deg/s^2)","(-) ","(-) ","(-) ","(deg/s) ", & + "(deg/s) ","(deg/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(m/s) ","(m/s) ", & + "(m/s) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ", & + "(N-m/m) ","(N-m/m) ","(N) ","(N) ","(N) ", & + "(N-m) ","(N-m) ","(N-m) ","(N) ","(N) ", & + "(N) ","(N-m) ","(N-m) ","(N-m) ","(deg/s^2)", & + "(deg/s^2)","(deg/s^2)","(-) ","(-) ","(-) ", & + "(deg/s) ","(deg/s) ","(deg/s) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(m/s) ", & + "(m/s) ","(m/s) ","(N/m) ","(N/m) ","(N/m) ", & + "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N) ","(N) ", & + "(N) ","(N-m) ","(N-m) ","(N-m) ","(N) ", & + "(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ", & + "(deg/s^2)","(deg/s^2)","(deg/s^2)","(-) ","(-) ", & + "(-) ","(deg/s) ","(deg/s) ","(deg/s) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(m/s) ","(m/s) ","(m/s) ","(N/m) ","(N/m) ", & + "(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N) ", & + "(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ", & + "(N) ","(N) ","(N) ","(N-m) ","(N-m) ", & + "(N-m) ","(deg/s^2)","(deg/s^2)","(deg/s^2)","(-) ", & + "(-) ","(-) ","(deg/s) ","(deg/s) ","(deg/s) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(m/s) ","(m/s) ","(m/s) ","(N/m) ", & + "(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ", & + "(N) ","(N) ","(N) ","(N-m) ","(N-m) ", & + "(N-m) ","(N) ","(N) ","(N) ","(N-m) ", & + "(N-m) ","(N-m) ","(deg/s^2)","(deg/s^2)","(deg/s^2)", & + "(-) ","(-) ","(-) ","(deg/s) ","(deg/s) ", & + "(deg/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(m/s) ","(m/s) ","(m/s) ", & + "(N/m) ","(N/m) ","(N/m) ","(N-m/m) ","(N-m/m) ", & + "(N-m/m) ","(N) ","(N) ","(N) ","(N-m) ", & + "(N-m) ","(N-m) ","(N) ","(N) ","(N) ", & + "(N-m) ","(N-m) ","(N-m) ","(deg/s^2)","(deg/s^2)", & + "(deg/s^2)","(-) ","(-) ","(-) ","(deg/s) ", & + "(deg/s) ","(deg/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(m/s) ","(m/s) ", & + "(m/s) ","(N/m) ","(N/m) ","(N/m) ","(N-m/m) ", & + "(N-m/m) ","(N-m/m) ","(N) ","(N) ","(N) ", & + "(N-m) ","(N-m) ","(N-m) ","(N) ","(N) ", & + "(N) ","(N-m) ","(N-m) ","(N-m) ","(deg/s^2)", & + "(deg/s^2)","(deg/s^2)","(-) ","(-) ","(-) ", & + "(deg/s) ","(deg/s) ","(deg/s) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(m/s) ", & + "(m/s) ","(m/s) ","(N/m) ","(N/m) ","(N/m) ", & + "(N-m/m) ","(N-m/m) ","(N-m/m) ","(N) ","(N) ", & + "(N) ","(N-m) ","(N-m) ","(N-m) ","(N) ", & + "(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ", & + "(deg/s^2)","(deg/s^2)","(deg/s^2)","(-) ","(-) ", & + "(-) ","(deg/s) ","(deg/s) ","(deg/s) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(m/s) ","(m/s) ","(m/s) ","(N/m) ","(N/m) ", & + "(N/m) ","(N-m/m) ","(N-m/m) ","(N-m/m) ","(N) ", & + "(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ", & + "(N) ","(N) ","(N) ","(N-m) ","(N-m) ", & + "(N-m) ","(deg/s^2)","(deg/s^2)","(deg/s^2)","(-) ", & + "(-) ","(-) ","(deg/s) ","(deg/s) ","(deg/s) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(m/s) ","(m/s) ","(m/s) ","(deg/s^2)", & + "(deg) ","(deg) ","(deg/s) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N-m) ", & + "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ", & + "(N) ","(N) ","(N) ","(N-m) ","(N-m) ", & + "(N-m) ","(deg/s^2)","(deg/s^2)","(deg/s^2)","(-) ", & + "(-) ","(-) ","(deg/s) ","(deg/s) ","(deg/s) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(m/s) ","(m/s) ","(m/s) "/) + + INTEGER, PARAMETER :: RootAppliedLd(12) = (/ & ! all applied load mapped to root outputs. For convenience in setting calculation flag + RootAppliedFxr, RootAppliedFyr, RootAppliedFzr, RootAppliedMxr, RootAppliedMyr, RootAppliedMzr, & + RootAppliedFxg, RootAppliedFyg, RootAppliedFzg, RootAppliedMxg, RootAppliedMyg, RootAppliedMzg /) ! Initialize values @@ -1357,7 +1444,7 @@ SUBROUTINE SetOutParam(OutList, p, ErrStat, ErrMsg ) ! ..... Developer must add checking for invalid inputs here: ..... DO I = p%NNodeOuts+1,9 ! Invalid nodes - + InvalidOutput( NFl( i,:) ) = .true. InvalidOutput( NMl( i,:) ) = .true. InvalidOutput( NTDr(i,:) ) = .true. @@ -1458,6 +1545,7 @@ SUBROUTINE SetOutParam(OutList, p, ErrStat, ErrMsg ) p%OutParam(I)%Units = ParamUnitsAry(Indx) ! it's a valid output if ( p%OutParam(I)%Indx >= N1DFxl .and. p%OutParam(I)%Indx <= N9DMzl ) p%OutInputs = .true. + if ( any(RootAppliedLd==p%OutParam(I)%Indx) ) p%CompAppliedLdAtRoot = .true. ! need to setup meshes END IF ELSE ! this channel isn't valid p%OutParam(I)%Indx = Time ! pick any valid channel (I just picked "Time" here because it's universal) @@ -1911,11 +1999,46 @@ SUBROUTINE Calc_WriteOutput( p, AllOuts, y, m, ErrStat, ErrMsg, CalcWriteOutput end do ! nodes end if - - end if - + ! compute mapping of applied distributed loads to the root location + ! FIXME: currently not mapping the PointLoads over since there is no motion mesh associated with the PointLoad + ! To get the PointLoads mapped, the following is necessary + ! 1. create a y%BldMotionFE mesh at the finite element points (this would be very useful someday) + ! - take position info directly from uuu and state information etc. + ! - Add output channels for this for comparison + ! 2. make u%PointLoad a sibling of y%BldMotionFE + ! 3. Setup m%Map_u_PtLoad_to_R + ! 4. map loads and do summation here (remember Transfer zero's out forces/moments, so add temp arrays to hold those) + if (p%CompAppliedLdAtRoot .and. p%BldMotionNodeLoc == BD_MESH_QP) then + + ! shorthand to simplify life + associate(RF => m%LoadsAtRoot%Force, RM => m%LoadsAtRoot%Moment) + + ! mapping of distributed loads to LoadsAtRoot + call Transfer_Line2_to_Point( m%u2%DistrLoad, m%LoadsAtRoot, m%Map_u_DistrLoad_to_R, ErrStat2, ErrMsg2, y%BldMotion, m%u2%RootMotion ) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + + ! Global coords + AllOuts( RootAppliedFxg ) = RF(1,1) + AllOuts( RootAppliedFyg ) = RF(2,1) + AllOuts( RootAppliedFzg ) = RF(3,1) + AllOuts( RootAppliedMxg ) = RM(1,1) + AllOuts( RootAppliedMyg ) = RM(2,1) + AllOuts( RootAppliedMzg ) = RM(3,1) + + ! Root coords + temp_vec = MATMUL(m%u2%RootMotion%Orientation(:,:,1),RF(:,1)) + AllOuts( RootAppliedFxr ) = temp_vec(1) + AllOuts( RootAppliedFyr ) = temp_vec(2) + AllOuts( RootAppliedFzr ) = temp_vec(3) + temp_vec = MATMUL(m%u2%RootMotion%Orientation(:,:,1),RM(:,1)) + AllOuts( RootAppliedMxr ) = temp_vec(1) + AllOuts( RootAppliedMyr ) = temp_vec(2) + AllOuts( RootAppliedMzr ) = temp_vec(3) + + end associate + endif END SUBROUTINE Calc_WriteOutput diff --git a/modules/beamdyn/src/BeamDyn_Types.f90 b/modules/beamdyn/src/BeamDyn_Types.f90 index 81632c30ff..81b34982b8 100644 --- a/modules/beamdyn/src/BeamDyn_Types.f90 +++ b/modules/beamdyn/src/BeamDyn_Types.f90 @@ -237,6 +237,7 @@ MODULE BeamDyn_Types LOGICAL :: RotStates = .false. !< Orient states in rotating frame during linearization? (flag) [-] LOGICAL :: RelStates = .false. !< Define states relative to root motion during linearization? (flag) [-] LOGICAL :: CompAeroMaps = .FALSE. !< flag to determine if BeamDyn is computing aero maps (true) or running a normal simulation (false) [-] + LOGICAL :: CompAppliedLdAtRoot = .FALSE. !< flag to determine if BeamDyn should compute the applied loads at root [-] END TYPE BD_ParameterType ! ======================= ! ========= BD_InputType ======= @@ -295,8 +296,10 @@ MODULE BeamDyn_Types TYPE, PUBLIC :: BD_MiscVarType TYPE(MeshType) :: u_DistrLoad_at_y !< input loads at output node locations [-] TYPE(MeshType) :: y_BldMotion_at_u !< output motions at input node locations (displacements necessary for mapping loads) [-] + TYPE(MeshType) :: LoadsAtRoot !< Applied loads mapped to root [-] TYPE(MeshMapType) :: Map_u_DistrLoad_to_y !< mapping of input loads to output node locations [-] TYPE(MeshMapType) :: Map_y_BldMotion_to_u !< mapping of output motions to input node locations (for load transfer) [-] + TYPE(MeshMapType) :: Map_u_DistrLoad_to_R !< mapping of input loads to root location [-] INTEGER(IntKi) :: Un_Sum = 0_IntKi !< unit number of summary file [-] TYPE(EqMotionQP) :: qp !< Quadrature point calculation info [-] REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: lin_A !< A (dXdx) matrix used in linearization (before RotState is applied) [-] @@ -1685,6 +1688,7 @@ subroutine BD_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) DstParamData%RotStates = SrcParamData%RotStates DstParamData%RelStates = SrcParamData%RelStates DstParamData%CompAeroMaps = SrcParamData%CompAeroMaps + DstParamData%CompAppliedLdAtRoot = SrcParamData%CompAppliedLdAtRoot end subroutine subroutine BD_DestroyParam(ParamData, ErrStat, ErrMsg) @@ -1899,6 +1903,7 @@ subroutine BD_PackParam(RF, Indata) call RegPack(RF, InData%RotStates) call RegPack(RF, InData%RelStates) call RegPack(RF, InData%CompAeroMaps) + call RegPack(RF, InData%CompAppliedLdAtRoot) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -2013,6 +2018,7 @@ subroutine BD_UnPackParam(RF, OutData) call RegUnpack(RF, OutData%RotStates); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%RelStates); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%CompAeroMaps); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%CompAppliedLdAtRoot); if (RegCheckErr(RF, RoutineName)) return end subroutine subroutine BD_CopyInput(SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg) @@ -2747,12 +2753,18 @@ subroutine BD_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) call MeshCopy(SrcMiscData%y_BldMotion_at_u, DstMiscData%y_BldMotion_at_u, CtrlCode, ErrStat2, ErrMsg2 ) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return + call MeshCopy(SrcMiscData%LoadsAtRoot, DstMiscData%LoadsAtRoot, CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return call NWTC_Library_CopyMeshMapType(SrcMiscData%Map_u_DistrLoad_to_y, DstMiscData%Map_u_DistrLoad_to_y, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return call NWTC_Library_CopyMeshMapType(SrcMiscData%Map_y_BldMotion_to_u, DstMiscData%Map_y_BldMotion_to_u, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return + call NWTC_Library_CopyMeshMapType(SrcMiscData%Map_u_DistrLoad_to_R, DstMiscData%Map_u_DistrLoad_to_R, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return DstMiscData%Un_Sum = SrcMiscData%Un_Sum call BD_CopyEqMotionQP(SrcMiscData%qp, DstMiscData%qp, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) @@ -3138,10 +3150,14 @@ subroutine BD_DestroyMisc(MiscData, ErrStat, ErrMsg) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) call MeshDestroy( MiscData%y_BldMotion_at_u, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call MeshDestroy( MiscData%LoadsAtRoot, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) call NWTC_Library_DestroyMeshMapType(MiscData%Map_u_DistrLoad_to_y, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) call NWTC_Library_DestroyMeshMapType(MiscData%Map_y_BldMotion_to_u, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call NWTC_Library_DestroyMeshMapType(MiscData%Map_u_DistrLoad_to_R, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) call BD_DestroyEqMotionQP(MiscData%qp, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (allocated(MiscData%lin_A)) then @@ -3247,8 +3263,10 @@ subroutine BD_PackMisc(RF, Indata) if (RF%ErrStat >= AbortErrLev) return call MeshPack(RF, InData%u_DistrLoad_at_y) call MeshPack(RF, InData%y_BldMotion_at_u) + call MeshPack(RF, InData%LoadsAtRoot) call NWTC_Library_PackMeshMapType(RF, InData%Map_u_DistrLoad_to_y) call NWTC_Library_PackMeshMapType(RF, InData%Map_y_BldMotion_to_u) + call NWTC_Library_PackMeshMapType(RF, InData%Map_u_DistrLoad_to_R) call RegPack(RF, InData%Un_Sum) call BD_PackEqMotionQP(RF, InData%qp) call RegPackAlloc(RF, InData%lin_A) @@ -3296,8 +3314,10 @@ subroutine BD_UnPackMisc(RF, OutData) if (RF%ErrStat /= ErrID_None) return call MeshUnpack(RF, OutData%u_DistrLoad_at_y) ! u_DistrLoad_at_y call MeshUnpack(RF, OutData%y_BldMotion_at_u) ! y_BldMotion_at_u + call MeshUnpack(RF, OutData%LoadsAtRoot) ! LoadsAtRoot call NWTC_Library_UnpackMeshMapType(RF, OutData%Map_u_DistrLoad_to_y) ! Map_u_DistrLoad_to_y call NWTC_Library_UnpackMeshMapType(RF, OutData%Map_y_BldMotion_to_u) ! Map_y_BldMotion_to_u + call NWTC_Library_UnpackMeshMapType(RF, OutData%Map_u_DistrLoad_to_R) ! Map_u_DistrLoad_to_R call RegUnpack(RF, OutData%Un_Sum); if (RegCheckErr(RF, RoutineName)) return call BD_UnpackEqMotionQP(RF, OutData%qp) ! qp call RegUnpackAlloc(RF, OutData%lin_A); if (RegCheckErr(RF, RoutineName)) return diff --git a/modules/beamdyn/src/Registry_BeamDyn.txt b/modules/beamdyn/src/Registry_BeamDyn.txt index 448cd81abe..1500bd2a20 100644 --- a/modules/beamdyn/src/Registry_BeamDyn.txt +++ b/modules/beamdyn/src/Registry_BeamDyn.txt @@ -250,6 +250,7 @@ typedef ^ ParameterType Integer Jac_nx - typedef ^ ParameterType logical RotStates - - - "Orient states in rotating frame during linearization? (flag)" - typedef ^ ParameterType Logical RelStates - - - "Define states relative to root motion during linearization? (flag)" - typedef ^ ParameterType LOGICAL CompAeroMaps - .FALSE. - "flag to determine if BeamDyn is computing aero maps (true) or running a normal simulation (false)" - +typedef ^ ParameterType LOGICAL CompAppliedLdAtRoot - .FALSE. - "flag to determine if BeamDyn should compute the applied loads at root" - # ..... Inputs @@ -330,8 +331,10 @@ typedef ^ EqMotionQP ^ Yd :::: - - "Dissipative # e.g. indices for searching in an array, large arrays that are local variables in any routine called multiple times, etc. typedef ^ MiscVarType MeshType u_DistrLoad_at_y - - - "input loads at output node locations" - typedef ^ MiscVarType MeshType y_BldMotion_at_u - - - "output motions at input node locations (displacements necessary for mapping loads)" - +typedef ^ MiscVarType MeshType LoadsAtRoot - - - "Applied loads mapped to root" - typedef ^ MiscVarType MeshMapType Map_u_DistrLoad_to_y - - - "mapping of input loads to output node locations" - typedef ^ MiscVarType MeshMapType Map_y_BldMotion_to_u - - - "mapping of output motions to input node locations (for load transfer)" - +typedef ^ MiscVarType MeshMapType Map_u_DistrLoad_to_R - - - "mapping of input loads to root location" - typedef ^ MiscVarType IntKi Un_Sum - - - "unit number of summary file" - typedef ^ MiscVarType EqMotionQP qp - - - "Quadrature point calculation info" - typedef ^ MiscVarType R8Ki lin_A {:}{:} - - "A (dXdx) matrix used in linearization (before RotState is applied)" - diff --git a/modules/icefloe/src/icefloe/intermittentCrushing.F90 b/modules/icefloe/src/icefloe/intermittentCrushing.F90 index e88caf4172..feb3601701 100644 --- a/modules/icefloe/src/icefloe/intermittentCrushing.F90 +++ b/modules/icefloe/src/icefloe/intermittentCrushing.F90 @@ -80,7 +80,7 @@ subroutine initInterCrushing (iceInput, myIceParams, iceLog) end subroutine initInterCrushing !**************************************************************************** -! Continuous crushing uses the standard inerpolation routine +! Continuous crushing uses the standard interpolation routine ! of the precalculated time series function outputInterCrushLoad (myIceParams, iceLog, time) result(iceLoads) type(iceFloe_ParameterType), intent(in) :: myIceParams @@ -91,4 +91,4 @@ function outputInterCrushLoad (myIceParams, iceLog, time) result(iceLoads) iceLoads = outputCrushLoadISO (myIceParams, iceLog, time) end function outputInterCrushLoad -end module iceIntermittentCrushing \ No newline at end of file +end module iceIntermittentCrushing diff --git a/modules/icefloe/src/icefloe/randomCrushing.F90 b/modules/icefloe/src/icefloe/randomCrushing.F90 index 9996a40321..c55af26098 100644 --- a/modules/icefloe/src/icefloe/randomCrushing.F90 +++ b/modules/icefloe/src/icefloe/randomCrushing.F90 @@ -163,7 +163,7 @@ end subroutine randomCrushLoadTimeSeries end subroutine initRandomCrushing ! containing subroutine !**************************************************************************** -! Continuous crushing uses the standard inerpolation routine +! Continuous crushing uses the standard interpolation routine ! of the precalculated time series function outputRandomCrushLoad (myIceParams, iceLog, time) result(iceLoads) type(iceFloe_ParameterType), intent(in) :: myIceParams @@ -174,4 +174,4 @@ function outputRandomCrushLoad (myIceParams, iceLog, time) result(iceLoads) iceLoads = outputCrushLoadISO (myIceParams, iceLog, time) end function outputRandomCrushLoad -end module randomCrushing \ No newline at end of file +end module randomCrushing diff --git a/modules/openfast-library/src/FAST_Registry.txt b/modules/openfast-library/src/FAST_Registry.txt index 3c1c797b1f..4c1915047b 100644 --- a/modules/openfast-library/src/FAST_Registry.txt +++ b/modules/openfast-library/src/FAST_Registry.txt @@ -714,7 +714,7 @@ typedef ^ FAST_ModuleMapType MeshMapType TStC_P_2_ED_P_T {:} - - "Map ServoDyn/T typedef ^ FAST_ModuleMapType MeshMapType ED_L_2_BStC_P_B {:}{:} - - "Map ElastoDyn blade line2 mesh to ServoDyn/BStC point mesh" typedef ^ FAST_ModuleMapType MeshMapType BStC_P_2_ED_P_B {:}{:} - - "Map ServoDyn/BStC point mesh to ElastoDyn point load mesh on the blade" typedef ^ FAST_ModuleMapType MeshMapType BD_L_2_BStC_P_B {:}{:} - - "Map BeamDyn blade line2 mesh to ServoDyn/BStC point mesh" -typedef ^ FAST_ModuleMapType MeshMapType BStC_P_2_BD_P_B {:}{:} - - "Map ServoDyn/BStC point mesh to BeamDyn point load mesh on the blade" +typedef ^ FAST_ModuleMapType MeshMapType BStC_P_2_BD_P_B {:}{:} - - "Map ServoDyn/BStC point mesh to BeamDyn distributed load mesh on the blade" # ED/SD <-> SrvD/StC -- Platform TMD typedef ^ FAST_ModuleMapType MeshMapType SStC_P_P_2_SubStructure {:} - - "Map ServoDyn/SStC platform point mesh load to SubDyn/ElastoDyn point load mesh" typedef ^ FAST_ModuleMapType MeshMapType SubStructure_2_SStC_P_P {:} - - "Map SubDyn y3mesh or ED platform mesh motion to ServoDyn/SStC point mesh" diff --git a/modules/openfast-library/src/FAST_Subs.f90 b/modules/openfast-library/src/FAST_Subs.f90 index 8e3f970ca2..b06742ce67 100644 --- a/modules/openfast-library/src/FAST_Subs.f90 +++ b/modules/openfast-library/src/FAST_Subs.f90 @@ -3642,7 +3642,7 @@ SUBROUTINE FAST_ReadPrimaryFile( InputFile, p, m_FAST, OverrideAbortErrLev, ErrS IF (p%WrVTK == VTK_ModeShapes) THEN p%n_VTKTime = 1 ELSE IF (TmpTime > p%TMax) THEN - p%n_VTKTime = HUGE(p%n_VTKTime) + p%n_VTKTime = NINT( p%TMax / p%DT ) ! write at init and last step only ELSE p%n_VTKTime = NINT( TmpTime / p%DT ) ! I'll warn if p%n_VTKTime*p%DT is not TmpTime diff --git a/modules/openfast-library/src/FAST_Types.f90 b/modules/openfast-library/src/FAST_Types.f90 index 4b37025174..64b9ac18be 100644 --- a/modules/openfast-library/src/FAST_Types.f90 +++ b/modules/openfast-library/src/FAST_Types.f90 @@ -735,7 +735,7 @@ MODULE FAST_Types TYPE(MeshMapType) , DIMENSION(:,:), ALLOCATABLE :: ED_L_2_BStC_P_B !< Map ElastoDyn blade line2 mesh to ServoDyn/BStC point mesh [-] TYPE(MeshMapType) , DIMENSION(:,:), ALLOCATABLE :: BStC_P_2_ED_P_B !< Map ServoDyn/BStC point mesh to ElastoDyn point load mesh on the blade [-] TYPE(MeshMapType) , DIMENSION(:,:), ALLOCATABLE :: BD_L_2_BStC_P_B !< Map BeamDyn blade line2 mesh to ServoDyn/BStC point mesh [-] - TYPE(MeshMapType) , DIMENSION(:,:), ALLOCATABLE :: BStC_P_2_BD_P_B !< Map ServoDyn/BStC point mesh to BeamDyn point load mesh on the blade [-] + TYPE(MeshMapType) , DIMENSION(:,:), ALLOCATABLE :: BStC_P_2_BD_P_B !< Map ServoDyn/BStC point mesh to BeamDyn distributed load mesh on the blade [-] TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: SStC_P_P_2_SubStructure !< Map ServoDyn/SStC platform point mesh load to SubDyn/ElastoDyn point load mesh [-] TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: SubStructure_2_SStC_P_P !< Map SubDyn y3mesh or ED platform mesh motion to ServoDyn/SStC point mesh [-] TYPE(MeshMapType) :: ED_P_2_SrvD_P_P !< Map ElastoDyn/Simplified-ElastoDyn platform point mesh motion to ServoDyn point mesh -- for passing to controller [-] diff --git a/modules/subdyn/src/SD_FEM.f90 b/modules/subdyn/src/SD_FEM.f90 index c72f30e425..abd7aa3a47 100644 --- a/modules/subdyn/src/SD_FEM.f90 +++ b/modules/subdyn/src/SD_FEM.f90 @@ -24,7 +24,6 @@ MODULE SD_FEM INTEGER(IntKi), PARAMETER :: MaxMemJnt = 20 ! Maximum number of members at one joint - INTEGER(IntKi), PARAMETER :: MaxOutChs = 2000 ! Max number of Output Channels to be read in INTEGER(IntKi), PARAMETER :: nDOFL_TP = 6 !TODO rename me ! 6 degrees of freedom (length of u subarray [UTP]) ! values of these parameters are ordered by their place in SubDyn input file: diff --git a/modules/subdyn/src/SubDyn.f90 b/modules/subdyn/src/SubDyn.f90 index db36131b94..f07a614f53 100644 --- a/modules/subdyn/src/SubDyn.f90 +++ b/modules/subdyn/src/SubDyn.f90 @@ -25,6 +25,7 @@ Module SubDyn USE NWTC_Library USE SubDyn_Types + USE SubDyn_Output_Params, only: MaxOutPts USE SubDyn_Output USE SubDyn_Tests USE SD_FEM @@ -1560,7 +1561,7 @@ SUBROUTINE SD_Input(SDInputFile, Init, p, ErrStat,ErrMsg) ! OutList - list of requested parameters to output to a file CALL ReadCom( UnIn, SDInputFile, 'SSOutList',ErrStat2, ErrMsg2, UnEc ); if(Failed()) return -ALLOCATE(Init%SSOutList(MaxOutChs), STAT=ErrStat2) +ALLOCATE(Init%SSOutList(MaxOutPts + p%OutAllInt*p%OutAllDims), STAT=ErrStat2) If (Check( ErrStat2 /= ErrID_None ,'Error allocating SSOutList arrays')) return CALL ReadOutputList ( UnIn, SDInputFile, Init%SSOutList, p%NumOuts, 'SSOutList', 'List of outputs requested', ErrStat2, ErrMsg2, UnEc ); if(Failed()) return CALL CleanUp() diff --git a/modules/subdyn/src/SubDyn_Output.f90 b/modules/subdyn/src/SubDyn_Output.f90 index 37b1bac1b2..920c84dad9 100644 --- a/modules/subdyn/src/SubDyn_Output.f90 +++ b/modules/subdyn/src/SubDyn_Output.f90 @@ -22,13 +22,10 @@ MODULE SubDyn_Output USE SubDyn_Types USE SD_FEM USE SubDyn_Output_Params, only: MNfmKe, MNfmMe, MNTDss, MNRDe, MNTRAe, IntfSS, IntfTRss, IntfTRAss, ReactSS, OutStrLenM1 - USE SubDyn_Output_Params, only: ParamIndxAry, ParamUnitsAry, ValidParamAry, SSqm01, SSqmd01, SSqmdd01 + USE SubDyn_Output_Params, only: ParamIndxAry, ParamUnitsAry, ValidParamAry, SSqm01, SSqmd01, SSqmdd01, MaxOutPts IMPLICIT NONE - ! The maximum number of output channels which can be output by the code. - INTEGER(IntKi),PUBLIC, PARAMETER :: MaxOutPts = 21705 - PRIVATE ! ..... Public Subroutines ................................................................................................... PUBLIC :: SDOut_CloseSum diff --git a/modules/subdyn/src/SubDyn_Output_Params.f90 b/modules/subdyn/src/SubDyn_Output_Params.f90 index f530c38508..f789c117fc 100644 --- a/modules/subdyn/src/SubDyn_Output_Params.f90 +++ b/modules/subdyn/src/SubDyn_Output_Params.f90 @@ -21757,7 +21757,7 @@ module SubDyn_Output_Params ! The maximum number of output channels which can be output by the code. - !INTEGER(IntKi), PARAMETER :: MaxOutPts = 21705 + INTEGER(IntKi), PARAMETER :: MaxOutPts = 21705 INTEGER(IntKi), PARAMETER ::MNfmKe(6,9,99) = reshape((/ & diff --git a/openfast_io/openfast_io/FAST_reader.py b/openfast_io/openfast_io/FAST_reader.py index a8f1441cfd..dc9f1d37b4 100644 --- a/openfast_io/openfast_io/FAST_reader.py +++ b/openfast_io/openfast_io/FAST_reader.py @@ -236,7 +236,7 @@ def loop_dict(vartree, search_var, branch): var = var.replace(' ', '') loop_dict(vartree_head, var, []) - def read_outlist_freeForm(self,f,module): + def read_outlist_freeForm(self, f, module): ''' Replacement for set_outlist that doesn't care about whether the channel is in the outlist vartree Easier, but riskier because OpenFAST can crash @@ -244,37 +244,78 @@ def read_outlist_freeForm(self,f,module): Inputs: f - file handle module - of OpenFAST, e.g. SubDyn, SeaState (these modules use this) ''' + all_channels = [] data = f.readline() - while data.split()[0] != 'END': - pattern = r'"?(.*?)"?' # grab only the text between quotes - data = re.findall(pattern, data)[0] - channels = data.split(',') # split on commas - channels = [c.strip() for c in channels] # strip whitespace - for c in channels: - self.fst_vt['outlist'][module][c] = True + + # Handle the case if there are blank lines before actual data + while data.strip() == '': + data = f.readline() + + while not data.strip().startswith('END'): + # Get part before the dash (comment) + line = data.split('-')[0] + + # Replace all delimiters with spaces + for delim in ['"', "'", ',', ';', '\t']: + line = line.replace(delim, ' ') + + # Split into words and add non-empty ones to the channel list + line_channels = [word.strip() for word in line.split() if word.strip()] + if line_channels: + all_channels.extend(line_channels) + + # Read next line data = f.readline() + + # Handle the case if there are blank lines + while data.strip() == '': + data = f.readline() + + # Store all channels in the outlist + for channel in all_channels: + self.fst_vt['outlist'][module][channel] = True - def read_outlist(self,f,module): + def read_outlist(self, f, module): ''' - Read the outlist section of the FAST input file, genralized for most modules + Read the outlist section of the FAST input file, generalized for most modules Inputs: f - file handle module - of OpenFAST, e.g. ElastoDyn, ServoDyn, AeroDyn, AeroDisk, etc. + Returns: List of channel names ''' - data = f.readline().split()[0] # to counter if we dont have any quotes - while data != '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'][module], channel_list) - data = f.readline().split()[0] # to counter if we dont have any quotes + all_channels = [] + data = f.readline() + + # Handle the case if there are blank lines before actual data + while data.strip() == '': + data = f.readline() + + while not data.strip().startswith('END'): + # Get part before the dash (comment) + line = data.split('-')[0] + + # Replace all delimiters with spaces + for delim in ['"', "'", ',', ';', '\t']: + line = line.replace(delim, ' ') + + # Split into words and add non-empty ones to the channel list + line_channels = [word.strip() for word in line.split() if word.strip()] + if line_channels: + all_channels.extend(line_channels) + + # Read next line + data = f.readline() + + # Handle the case if there are blank lines + while data.strip() == '': + data = f.readline() + + # Store all channels in the outlist + if all_channels: + self.set_outlist(self.fst_vt['outlist'][module], all_channels) + + return all_channels def read_MainInput(self): # Main FAST v8.16-v8.17 Input File @@ -557,38 +598,10 @@ def read_ElastoDyn(self, ed_file): self.fst_vt['ElastoDyn']['BldGagNd'] = read_array(f,self.fst_vt['ElastoDyn']['NBlGages'], array_type=int) 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() - # else: - # # there is a blank line between the outlist and the END of the file - # f.readline() - - # Handle the case if there are blank lines before the END statement, check if blank line - while data.split().__len__() == 0: - 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']['ElastoDyn'], channel_list) - data = f.readline() + self.read_outlist(f,'ElastoDyn') # ElastoDyn optional outlist try: @@ -597,19 +610,7 @@ def read_ElastoDyn(self, ed_file): self.fst_vt['ElastoDyn']['BldNd_BlOutNd'] = f.readline().split()[0] f.readline() - data = f.readline() - while data.split()[0] != 'END': - if data.find('"')>=0: - channels = data.split('"') - opt_channel_list = channels[1].split(',') - else: - row_string = data.split(',') - if len(row_string)==1: - opt_channel_list = row_string[0].split('\n')[0] - else: - opt_channel_list = row_string - self.set_outlist(self.fst_vt['outlist']['ElastoDyn_Nodes'], opt_channel_list) - data = f.readline() + self.read_outlist(f,'ElastoDyn') except: # The optinal outlist does not exist. None @@ -856,13 +857,9 @@ def read_BeamDyn(self, bd_file, BladeNumber = 0): self.fst_vt['BeamDyn'][BladeNumber]['OutNd'] = [idx.strip() for idx in f.readline().split('OutNd')[0].split(',')] # BeamDyn Outlist f.readline() - data = f.readline() - while data.split()[0] != 'END': - channels = data.split('"') - channel_list = channels[1].split(',') - self.set_outlist(self.fst_vt['outlist']['BeamDyn'], channel_list) - data = f.readline() - + + self.read_outlist(f,'BeamDyn') + # BeamDyn optional outlist try: f.readline() @@ -870,19 +867,8 @@ def read_BeamDyn(self, bd_file, BladeNumber = 0): self.fst_vt['BeamDyn'][BladeNumber]['BldNd_BlOutNd'] = f.readline().split()[0] f.readline() - data = f.readline() - while data.split()[0] != 'END': - if data.find('"')>=0: - channels = data.split('"') - opt_channel_list = channels[1].split(',') - else: - row_string = data.split(',') - if len(row_string)==1: - opt_channel_list = row_string[0].split('\n')[0] - else: - opt_channel_list = row_string - self.set_outlist(self.fst_vt['outlist']['BeamDyn_Nodes'], opt_channel_list) - data = f.readline() + + self.read_outlist(f,'BeamDyn_Nodes') except: # The optinal outlist does not exist. None @@ -1025,19 +1011,7 @@ def read_InflowWind(self): # InflowWind Outlist f.readline() - 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() + self.read_outlist(f,'InflowWind') f.close() @@ -1194,26 +1168,10 @@ def read_AeroDyn(self): # AeroDyn Outlist f.readline() - data = f.readline() - # Handle the case if there are blank lines before the END statement, check if blank line - while data.split().__len__() == 0: - data = f.readline() + self.read_outlist(f,'AeroDyn') - 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']['AeroDyn'], channel_list) - data = f.readline() - # AeroDyn optional outlist try: f.readline() @@ -1221,19 +1179,7 @@ def read_AeroDyn(self): self.fst_vt['AeroDyn']['BldNd_BlOutNd'] = f.readline().split()[0] f.readline() - data = f.readline() - while data.split()[0] != 'END': - if data.find('"')>=0: - channels = data.split('"') - opt_channel_list = channels[1].split(',') - else: - row_string = data.split(',') - if len(row_string)==1: - opt_channel_list = row_string[0].split('\n')[0] - else: - opt_channel_list = row_string - self.set_outlist(self.fst_vt['outlist']['AeroDyn_Nodes'], opt_channel_list) - data = f.readline() + self.read_outlist(f,'AeroDyn_Nodes') except: # The optinal outlist does not exist. None @@ -1702,12 +1648,7 @@ def read_ServoDyn(self): # ServoDyn Outlist f.readline() - data = f.readline() - while data.split()[0] != 'END': - channels = data.split('"') - channel_list = channels[1].split(',') - self.set_outlist(self.fst_vt['outlist']['ServoDyn'], channel_list) - data = f.readline() + self.read_outlist(f,'ServoDyn') f.close() @@ -1717,7 +1658,10 @@ def read_StC(self,filename): ''' StC_vt = {} - with open(os.path.join(self.FAST_directory, filename)) as f: + # Inputs should be relative to ServoDyn, like in OpenFAST + SvD_dir = os.path.dirname(self.fst_vt['Fst']['ServoFile']) + + with open(os.path.join(self.FAST_directory, SvD_dir, filename)) as f: f.readline() f.readline() @@ -2400,19 +2344,7 @@ def read_HydroDyn(self, hd_file): # HydroDyn Outlist f.readline() - 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']['AeroDyn'], channel_list) - data = f.readline() + self.read_outlist(f, 'HydroDyn') f.close() @@ -3397,7 +3329,8 @@ def read_MoorDyn(self, moordyn_file): if option_name.upper() == 'WATERKIN': self.fst_vt['MoorDyn']['WaterKin'] = option_value.strip('"') WaterKin_file = os.path.normpath(os.path.join(os.path.dirname(moordyn_file), self.fst_vt['MoorDyn']['WaterKin'])) - self.read_WaterKin(WaterKin_file) + if self.fst_vt['MoorDyn']['WaterKin'].upper() not in ['0','UNUSED']: + self.read_WaterKin(WaterKin_file) self.fst_vt['MoorDyn']['option_values'].append(float_read(option_value.strip('"'))) # some options values can be strings or floats self.fst_vt['MoorDyn']['option_names'].append(option_name) diff --git a/openfast_io/openfast_io/FAST_writer.py b/openfast_io/openfast_io/FAST_writer.py index 69510e16c7..20da59f8a4 100644 --- a/openfast_io/openfast_io/FAST_writer.py +++ b/openfast_io/openfast_io/FAST_writer.py @@ -65,9 +65,9 @@ def int_default_out(val, trim = False): """ if type(val) is float: if trim: - return '{:d}'.format(val) + return '{:d}'.format(int(val)) else: - return '{:<22d}'.format(val) + return '{:<22d}'.format(int(val)) else: if trim: return '{:}'.format(val) @@ -250,7 +250,7 @@ def execute(self): self.write_MAP() elif self.fst_vt['Fst']['CompMooring'] == 3: self.write_MoorDyn() - if 'option_names' in self.fst_vt['MoorDyn'] and 'WATERKIN' in self.fst_vt['MoorDyn']['option_names']: + if self.fst_vt['WaterKin']: # will be empty if not read self.write_WaterKin(os.path.join(self.FAST_runDirectory,self.fst_vt['MoorDyn']['WaterKin_file'])) # # look at if the self.fst_vt['BeamDyn'] is an array, if so, loop through the array @@ -2634,10 +2634,14 @@ def write_MoorDyn(self): # TODO: see TODO's in FAST_reader/read_MoorDyn.py and m f.write('---------------------- SOLVER OPTIONS ---------------------------------------\n') for i in range(len(self.fst_vt['MoorDyn']['option_values'])): - if 'WATERKIN' in self.fst_vt['MoorDyn']['option_names'][i]: + if self.fst_vt['MoorDyn']['option_names'][i].upper() == 'WATERKIN' and self.fst_vt['WaterKin']: + # WATERKIN needs to be a string, and should have already been read in and part of fst_vt self.fst_vt['MoorDyn']['WaterKin_file'] = self.FAST_namingOut + '_WaterKin.dat' f.write('{:<22} {:<11} {:}'.format('"'+self.fst_vt['MoorDyn']['WaterKin_file']+'"', self.fst_vt['MoorDyn']['option_names'][i], self.fst_vt['MoorDyn']['option_descriptions'][i]+'\n')) - else: # if not waterkin handle normally + elif self.fst_vt['MoorDyn']['option_names'][i].upper() in ['INERTIALF','WATERKIN']: + # These options need to be an integer + f.write('{:<22} {:<11} {:}'.format(int_default_out(self.fst_vt['MoorDyn']['option_values'][i]), self.fst_vt['MoorDyn']['option_names'][i], self.fst_vt['MoorDyn']['option_descriptions'][i]+'\n')) + else: # if not handle normally f.write('{:<22} {:<11} {:}'.format(float_default_out(self.fst_vt['MoorDyn']['option_values'][i]), self.fst_vt['MoorDyn']['option_names'][i], self.fst_vt['MoorDyn']['option_descriptions'][i]+'\n')) f.write('------------------------ OUTPUTS --------------------------------------------\n') diff --git a/openfast_io/pyproject.toml b/openfast_io/pyproject.toml index 6eb3e86f8d..dff12fefa0 100644 --- a/openfast_io/pyproject.toml +++ b/openfast_io/pyproject.toml @@ -5,7 +5,7 @@ build-backend = "hatchling.build" [project] name = "openfast_io" # dynamic = ["version"] -version = "4.0.4" +version = "4.0.5" description = "Readers and writers for OpenFAST files." license = {file = "../LICENSE"} authors = [ @@ -39,7 +39,6 @@ classifiers = [ # Optional # 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.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", diff --git a/reg_tests/CTestList.cmake b/reg_tests/CTestList.cmake index b5ca00e1fe..bbc30bc64b 100644 --- a/reg_tests/CTestList.cmake +++ b/reg_tests/CTestList.cmake @@ -344,9 +344,9 @@ of_regression("5MW_OC4Jckt_ExtPtfm" "openfast;elastodyn;extpt of_regression("HelicalWake_OLAF" "openfast;aerodyn;olaf") of_regression("EllipticalWing_OLAF" "openfast;aerodyn;olaf") of_regression("StC_test_OC4Semi" "openfast;servodyn;hydrodyn;moordyn;offshore;stc") -of_regression("MHK_RM1_Fixed" "openfast;elastodyn;aerodyn;mhk") -of_regression("MHK_RM1_Floating" "openfast;elastodyn;aerodyn;hydrodyn;moordyn;mhk") -of_regression("MHK_RM1_Floating_wNacDrag" "openfast;elastodyn;aerodyn;hydrodyn;moordyn;mhk") +of_regression("MHK_RM1_Fixed" "openfast;elastodyn;aerodyn;mhk;offshore") +of_regression("MHK_RM1_Floating" "openfast;elastodyn;aerodyn;hydrodyn;moordyn;mhk;offshore") +of_regression("MHK_RM1_Floating_wNacDrag" "openfast;elastodyn;aerodyn;hydrodyn;moordyn;mhk;offshore") of_regression("Tailfin_FreeYaw1DOF_PolarBased" "openfast;elastodyn;aerodyn") of_regression("Tailfin_FreeYaw1DOF_Unsteady" "openfast;elastodyn;aerodyn") of_regression("5MW_Land_DLL_WTurb_ADsk" "openfast;elastodyn;aerodisk") diff --git a/reg_tests/r-test b/reg_tests/r-test index f1f723b37c..e9934226ce 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit f1f723b37cb9beecd2d7578936bb0ef6b5ab7044 +Subproject commit e9934226ce92b8f0cbcdc740d67e26231910f859